diff --git a/stable b/stable index ab871086e..03121e379 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v0.8.19 \ No newline at end of file +v0.8.21 \ No newline at end of file diff --git a/v0.8 b/v0.8 index ab871086e..03121e379 120000 --- a/v0.8 +++ b/v0.8 @@ -1 +1 @@ -v0.8.19 \ No newline at end of file +v0.8.21 \ No newline at end of file diff --git a/v0.8.21/.documenter-siteinfo.json b/v0.8.21/.documenter-siteinfo.json new file mode 100644 index 000000000..7bd1d199a --- /dev/null +++ b/v0.8.21/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-18T01:31:52","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/v0.8.21/API/index.html b/v0.8.21/API/index.html new file mode 100644 index 000000000..02fcb19d3 --- /dev/null +++ b/v0.8.21/API/index.html @@ -0,0 +1,657 @@ + +API · QuantumClifford.jl

Full API

States

Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.

Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.

Lastly, for Pauli frame simulations there is the PauliFrame type, a tableau in which each row represents a different Pauli frame.

There are convenience constructors for common types of states and operators.

Operations

Acting on quantum states can be performed either:

  • In a "linear algebra" language where unitaries, measurements, and other operations have separate interfaces. This is an explicitly deterministic lower-level interface, which provides a great deal of control over how tableaux are manipulated. See the Stabilizer Tableau Algebra Manual as a primer on these approaches.
  • Or in a "circuit" language, where the operators (and measurements and noise) are represented as circuit gates. This is a higher-level interface in which the outcome of an operation can be stochastic. The API for it is centered around the apply! function. Particularly useful for Monte Carlo simulations and Perturbative Expansion Symbolic Results.

See the full list of operations for a list of implemented operations.

Autogenerated API list

QuantumClifford.BellMeasurementType

A Bell measurement performing the correlation measurement corresponding to the given pauli projections on the qubits at the selected indices.

source
QuantumClifford.CliffordOperatorType

Clifford Operator specified by the mapping of the basis generators.

julia> tCNOT
+X₁ ⟼ + XX
+X₂ ⟼ + _X
+Z₁ ⟼ + Z_
+Z₂ ⟼ + ZZ
+
+julia> phase_gate = C"Y
+                      Z"
+X₁ ⟼ + Y
+Z₁ ⟼ + Z
+
+julia> stab = S"XI
+                IZ";
+
+
+julia> entangled = tCNOT*stab
++ XX
++ ZZ
+
+julia> CliffordOperator(T"YY")
+ERROR: DimensionMismatch: Input tableau should be of size 2n×n (top half is the X mappings and the bottom half are the Z mappings).
+[...]

Destabilizer can also be converted.

julia> d = Destabilizer(S"Y")
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z
+𝒮𝓉𝒶𝒷
++ Y
+
+julia> CliffordOperator(d)
+X₁ ⟼ + Z
+Z₁ ⟼ + Y
source
QuantumClifford.DestabilizerType

A tableau representation of a pure stabilizer state. The tableau tracks the destabilizers as well, for efficient projections. On initialization there are no checks that the provided state is indeed pure. This enables the use of this data structure for mixed stabilizer state, but a better choice would be to use MixedDestabilizer.

source
QuantumClifford.MixedDestabilizerType

A tableau representation for mixed stabilizer states that keeps track of the destabilizers in order to provide efficient projection operations.

The rank r of the n-qubit tableau is tracked, either so that it can be used to represent a mixed stabilizer state, or so that it can be used to represent an n-r logical-qubit code over n physical qubits. The "logical" operators are tracked as well.

When the constructor is called on an incomplete Stabilizer it automatically calculates the destabilizers and logical operators, following chapter 4 of (Gottesman, 1997). Under the hood the conversion uses the canonicalize_gott! canonicalization. That canonicalization permutes the columns of the tableau, but we automatically undo the column permutation in the preparation of a MixedDestabilizer so that qubits are not reindexed. The boolean keyword arguments undoperm and reportperm can be used to control this behavior and to report the permutations explicitly.

See also: stabilizerview, destabilizerview, logicalxview, logicalzview

source
QuantumClifford.PauliFrameType
struct PauliFrame{T, S} <: QuantumClifford.AbstractQCState

This is a wrapper around a tableau. This "frame" tableau is not to be viewed as a normal stabilizer tableau, although it does conjugate the same under Clifford operations. Each row in the tableau refers to a single frame. The row represents the Pauli operation by which the frame and the reference differ.

source
QuantumClifford.PauliFrameMethod
PauliFrame(
+    frames,
+    qubits,
+    measurements
+) -> PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}}
+

Prepare an empty set of Pauli frames with the given number of frames and qubits. Preallocates spaces for measurement number of measurements.

source
QuantumClifford.PauliOperatorType

A multi-qubit Pauli operator ($±\{1,i\}\{I,Z,X,Y\}^{\otimes n}$).

A Pauli can be constructed with the P custom string macro or by building up one through products and tensor products of smaller operators.

julia> pauli3 = P"-iXYZ"
+-iXYZ
+
+julia> pauli4 = 1im * pauli3 ⊗ X
++ XYZX
+
+julia> Z*X
++iY

We use a typical F(2,2) encoding internally. The X and Z bits are stored in a single concatenated padded array of UInt chunks of a bit array.

julia> p = P"-IZXY";
+
+
+julia> p.xz
+2-element Vector{UInt64}:
+ 0x000000000000000c
+ 0x000000000000000a

You can access the X and Z bits through getters and setters or through the xview, zview, xbit, and zbit functions.

julia> p = P"XYZ"; p[1]
+(true, false)
+
+julia> p[1] = (true, true); p
++ YYZ
source
QuantumClifford.RegisterType

A register, representing the state of a computer including both a tableaux and an array of classical bits (e.g. for storing measurement results)

source
QuantumClifford.ResetType

Reset the specified qubits to the given state.

Be careful, this operation implies first tracing out the qubits, which can lead to mixed states if these qubits were entangled with the rest of the system.

See also: sMRZ

source
QuantumClifford.SingleQubitOperatorType

A "symbolic" general single-qubit operator which permits faster multiplication than an operator expressed as an explicit tableau.

julia> op = SingleQubitOperator(2, true, true, true, false, true, true) # Tableau components and phases
+SingleQubitOperator on qubit 2
+X₁ ⟼ - Y
+Z₁ ⟼ - X
+
+julia> typeof(op)
+SingleQubitOperator
+
+julia> t_op = CliffordOperator(op, 3) # Transforming it back into an explicit tableau representation (specifying the size)
+X₁ ⟼ + X__
+X₂ ⟼ - _Y_
+X₃ ⟼ + __X
+Z₁ ⟼ + Z__
+Z₂ ⟼ - _X_
+Z₃ ⟼ + __Z
+
+julia> typeof(t_op)
+CliffordOperator{QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}}
+
+julia> CliffordOperator(op, 1, compact=true) # You can also extract just the non-trivial part of the tableau
+X₁ ⟼ - Y
+Z₁ ⟼ - X

See also: sHadamard, sPhase, sId1, sX, sY, sZ, CliffordOperator

Or simply consult subtypes(QuantumClifford.AbstractSingleQubitOperator) and subtypes(QuantumClifford.AbstractTwoQubitOperator) for a full list. You can think of the s prefix as "symbolic" or "sparse".

source
QuantumClifford.SparseGateType

A Clifford gate, applying the given cliff operator to the qubits at the selected indices.

apply!(state, cliff, indices) and apply!(state, SparseGate(cliff, indices)) give the same result.

source
QuantumClifford.StabMixtureType
mutable struct StabMixture{T, F}

Represents mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is a pure stabilizer state.

julia> StabMixture(S"-X")
+A mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z
+𝒮𝓉𝒶𝒷
+- X
+with ϕᵢⱼ | Pᵢ | Pⱼ:
+ 1.0+0.0im | + _ | + _
+
+julia> pcT
+A unitary Pauli channel P = ∑ ϕᵢ Pᵢ with the following branches:
+with ϕᵢ | Pᵢ
+ 0.853553+0.353553im | + _
+ 0.146447-0.353553im | + Z
+
+julia> apply!(StabMixture(S"-X"), pcT)
+A mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z
+𝒮𝓉𝒶𝒷
+- X
+with ϕᵢⱼ | Pᵢ | Pⱼ:
+ 0.0+0.353553im | + _ | + Z
+ 0.0-0.353553im | + Z | + _
+ 0.853553+0.0im | + _ | + _
+ 0.146447+0.0im | + Z | + Z

See also: PauliChannel

source
QuantumClifford.StabilizerType

Stabilizer, i.e. a list of commuting multi-qubit Hermitian Pauli operators.

Instances can be created with the S custom string macro or as direct sum of other stabilizers.

Stabilizers and Destabilizers

In many cases you probably would prefer to use the MixedDestabilizer data structure, as it caries a lot of useful additional information, like tracking rank and destabilizer operators. Stabilizer has mostly a pedagogical value, and it is also used for slightly faster simulation of a particular subset of Clifford operations.

julia> s = S"XXX
+             ZZI
+             IZZ"
++ XXX
++ ZZ_
++ _ZZ
+
+julia> s⊗s
++ XXX___
++ ZZ____
++ _ZZ___
++ ___XXX
++ ___ZZ_
++ ____ZZ

It has an indexing API, looking like a list of PauliOperators.

julia> s[2]
++ ZZ_

Pauli operators can act directly on the a stabilizer.

julia> P"YYY" * s
+- XXX
++ ZZ_
++ _ZZ

There are a number of ways to create a Stabilizer, including:

  • generate Stabilizers from a list of Pauli operators
julia> Stabilizer([P"XX", P"ZZ"])
++ XX
++ ZZ
  • generate Stabilizers from boolean matrices
julia> a = [true true; false false]; b = [false true; true true];
+
+julia> Stabilizer(a, b)
++ XY
++ ZZ
+
+julia> Stabilizer([0x0, 0x2], a, b)
++ XY
+- ZZ
  • initialize an empty Stabilizer and fill it through indexing
julia> s = zero(Stabilizer, 2)
++ __
++ __
+
+julia> s[1,1] = (true, false); s
++ X_
++ __

There are no automatic checks for correctness (i.e. independence of all rows, commutativity of all rows, hermiticity of all rows). The rank (number of rows) is permitted to be less than the number of qubits (number of columns): canonilization, projection, etc. continue working in that case. To great extent this library uses the Stabilizer data structure simply as a tableau. This might be properly abstracted away in future versions.

See also: PauliOperator, canonicalize!

source
QuantumClifford.UnitaryPauliChannelType

A Pauli channel datastructure, mainly for use with StabMixture.

More convenient to use than PauliChannel when you know your Pauli channel is unitary.

julia> Tgate = UnitaryPauliChannel(
+           (I, Z),
+           ((1+exp(im*π/4))/2, (1-exp(im*π/4))/2)
+       )
+A unitary Pauli channel P = ∑ ϕᵢ Pᵢ with the following branches:
+with ϕᵢ | Pᵢ
+ 0.853553+0.353553im | + _
+ 0.146447-0.353553im | + Z
+
+julia> PauliChannel(Tgate)
+Pauli channel ρ ↦ ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† with the following branches:
+with ϕᵢⱼ | Pᵢ | Pⱼ:
+ 0.853553+0.0im | + _ | + _
+ 0.0+0.353553im | + _ | + Z
+ 0.0-0.353553im | + Z | + _
+ 0.146447+0.0im | + Z | + Z
source
QuantumClifford.VerifyOpType

A "probe" to verify that the state of the qubits corresponds to a desired good_state, e.g. at the end of the execution of a circuit.

source
QuantumClifford.sMRZType

Measure a qubit in the Z basis and reset to the |0⟩ state.

It does not trace out the qubit!

As described below there is a difference between measuring the qubit (followed by setting it to a given known state) and "tracing out" the qubit. By reset here we mean "measuring and setting to a known state", not "tracing out".

julia> s = MixedDestabilizer(S"XXX ZZI IZZ") # |000⟩+|111⟩
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z__
++ _X_
++ __X
+𝒮𝓉𝒶𝒷━
++ XXX
++ ZZ_
++ Z_Z
+
+julia> traceout!(copy(s), 1) # = I⊗(|00⟩⟨00| + |11⟩⟨11|)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ _X_
+𝒳ₗ━━━
++ _XX
++ Z__
+𝒮𝓉𝒶𝒷━
++ _ZZ
+𝒵ₗ━━━
++ Z_Z
++ XXX
+
+julia> projectZ!(traceout!(copy(s), 1), 1)[1] # = |000⟩⟨000|+|011⟩⟨011| or |100⟩⟨100|+|111⟩⟨111| (use projectZrand! to actually get a random result)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ _X_
++ XXX
+𝒳ₗ━━━
++ _XX
+𝒮𝓉𝒶𝒷━
++ _ZZ
++ Z__
+𝒵ₗ━━━
++ Z_Z
+
+julia> projectZ!(copy(s), 1)[1] # = |000⟩ or |111⟩ (use projectZrand! to actually get a random result)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ XXX
++ _X_
++ __X
+𝒮𝓉𝒶𝒷━
++ Z__
++ ZZ_
++ Z_Z
julia> apply!(Register(copy(s)), sMRZ(1)) |> quantumstate # |000⟩ or |011⟩, depending on randomization
+𝒟ℯ𝓈𝓉𝒶𝒷
++ XXX
++ _X_
++ __X
+𝒮𝓉𝒶𝒷━
++ Z__
+- ZZ_
+- Z_Z

See also: Reset, sMZ

source
QuantumClifford.PauliErrorFunction

A convenient constructor for various types of Pauli errors, that can be used as circuit gates in simulations. Returns more specific types when necessary.

source
QuantumClifford.applybranchesFunction

Compute all possible new states after the application of the given operator. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Perturbative Expansion interface.

source
QuantumClifford.applynoise!Function

A method modifying a given state by applying the corresponding noise model. It is non-deterministic, part of the Noise interface.

source
QuantumClifford.bellFunction

Prepare one or more Bell pairs (with optional phases).

julia> bell()
++ XX
++ ZZ
+
+julia> bell(2)
++ XX__
++ ZZ__
++ __XX
++ __ZZ
+
+julia> bell((true, false))
+- XX
++ ZZ
+
+julia> bell([true, false, true, true])
+- XX__
++ ZZ__
+- __XX
+- __ZZ
source
QuantumClifford.bigramMethod
bigram(
+    state::QuantumClifford.AbstractStabilizer;
+    clip
+) -> Matrix{Int64}
+

Get the bigram of a tableau.

It is the list of endpoints of a tableau in the clipped gauge.

If clip=true (the default) the tableau is converted to the clipped gauge in-place before calculating the bigram. Otherwise, the clip gauge conversion is skipped (for cases where the input is already known to be in the correct gauge).

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in (Li et al., 2019) and (Gullans et al., 2020).

See also: canonicalize_clip!

source
QuantumClifford.canonicalize!Method
canonicalize!(
+    state::QuantumClifford.AbstractStabilizer;
+    phases,
+    ranks
+) -> Any
+

Canonicalize a stabilizer (in place).

Assumes the input is a valid stabilizer (all operators commute and have real phases). It permits redundant generators and identity generators.

julia> ghz = S"XXXX
+               ZZII
+               IZZI
+               IIZZ";
+
+
+julia> canonicalize!(ghz)
++ XXXX
++ Z__Z
++ _Z_Z
++ __ZZ
+
+julia> canonicalize!(S"XXXX
+                       IZZI
+                       IIZZ")
++ XXXX
++ _Z_Z
++ __ZZ

Not all rows in the tableau in the next example are independent:

julia> canonicalize!(S"XXXX
+                       ZZII
+                       IZZI
+                       IZIZ
+                       IIZZ")
++ XXXX
++ Z__Z
++ _Z_Z
++ __ZZ
++ ____

In cases of lower rank, more advanced tableau structures might be better. For instance the MixedStabilizer or MixedDestabilizer structures (you can read more about them in the Data Structures section of the documentation).

If phases=false is set, the canonicalization does not track the phases in the tableau, leading to significant (constant factor) speedup.

julia> s = S"-ZX
+              XZ"
+- ZX
++ XZ
+
+julia> canonicalize!(copy(s), phases=false)
+- XZ
++ ZX
+
+julia> canonicalize!(copy(s))
++ XZ
+- ZX

If ranks=true is set, the last pivot indices for the X and Z stage of the canonicalization are returned as well.

julia> s = S"XXXX
+             ZZII
+             IZIZ
+             ZIIZ";
+
+
+julia> _, ix, iz = canonicalize!(s, ranks=true); ix, iz
+(1, 3)
+
+julia> s
++ XXXX
++ Z__Z
++ _Z_Z
++ ____

Based on (Garcia et al., 2012).

See also: canonicalize_rref!, canonicalize_gott!

source
QuantumClifford.canonicalize_clip!Method
canonicalize_clip!(
+    state::QuantumClifford.AbstractStabilizer;
+    phases
+) -> QuantumClifford.AbstractStabilizer
+

Fix the clipped gauge of a stabilizer (in place).

Assumes the input is a valid full-rank stabilizer (all operators commute and have real phases).

julia> s = S"- X_ZX_X
+             + XXYZ__
+             - YZ_Z_X
+             - XZX__Y
+             + _Z_Y_Y
+             - ____Z_";
+
+
+julia> canonicalize_clip!(s)
+- X_XY__
++ YZY___
++ _XZX__
+- _ZYX_Z
+- __YZ_X
+- ____Z_

If phases=false is set, the canonicalization does not track the phases in the tableau, leading to a significant speedup.

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019)

See also: canonicalize!, canonicalize_rref!, canonicalize_gott!.

source
QuantumClifford.canonicalize_gott!Method

Inplace Gottesman canonicalization of a tableau.

This uses different canonical form from canonicalize!. It is used in the computation of the logical X and Z operators of a MixedDestabilizer.

It returns the (in place) modified state, the indices of the last pivot of both Gaussian elimination steps, and the permutations that have been used to put the X and Z tableaux in standard form.

Based on (Gottesman, 1997).

See also: canonicalize!, canonicalize_rref!

source
QuantumClifford.canonicalize_rref!Method
canonicalize_rref!(
+    state::QuantumClifford.AbstractStabilizer,
+    colindices;
+    phases
+) -> Tuple{QuantumClifford.AbstractStabilizer, Any}
+

Canonicalize a stabilizer (in place) along only some columns.

This uses different canonical form from canonicalize!. It also indexes in reverse in order to make its use in traceout! more efficient. Its use in traceout! is its main application.

It returns the (in place) modified state and the index of the last pivot.

Based on (Audenaert and Plenio, 2005).

See also: canonicalize!, canonicalize_gott!

source
QuantumClifford.commMethod

Check whether two operators commute.

0x0 if they commute, 0x1 if they anticommute.

julia> P"XX"*P"ZZ", P"ZZ"*P"XX"
+(- YY, - YY)
+
+julia> comm(P"ZZ", P"XX")
+0x00
+
+julia> comm(P"IZ", P"XX")
+0x01
source
QuantumClifford.compactify_circuitMethod

Convert a list of gates to a more optimized "sum type" format which permits faster dispatch.

Generally, this should be called on a circuit before it is used in a simulation.

source
QuantumClifford.fastcolumnFunction

Convert a tableau to a memory layout that is fast for column operations.

In this layout a column of the tableau is stored (mostly) contiguously in memory. Due to bitpacking, e.g., packing 64 bits into a single UInt64, the memory layout is not perfectly contiguous, but it is still optimal given that some bitwrangling is required to extract a given bit.

See also: fastrow

source
QuantumClifford.fastrowFunction

Convert a tableau to a memory layout that is fast for row operations.

In this layout a Pauli string (a row of the tableau) is stored contiguously in memory.

See also: fastrow

source
QuantumClifford.generate!Method

Generate a Pauli operator by using operators from a given the Stabilizer.

It assumes the stabilizer is already canonicalized. It modifies the Pauli operator in place, generating it in reverse, up to a phase. That phase is left in the modified operator, which should be the identity up to a phase. Returns the new operator and the list of indices denoting the elements of stabilizer that were used for the generation.

julia> ghz = S"XXXX
+               ZZII
+               IZZI
+               IIZZ";
+
+
+julia> canonicalize!(ghz)
++ XXXX
++ Z__Z
++ _Z_Z
++ __ZZ
+
+julia> generate!(P"-ZIZI", ghz)
+(- ____, [2, 4])

When the Pauli operator can not be generated by the given tableau, nothing is returned.

julia> generate!(P"XII",canonicalize!(S"ZII")) === nothing
+true
+
+julia> generate!(P"XII",canonicalize!(S"XII")) === nothing
+false
source
QuantumClifford.ghzFunction

Prepare a GHZ state of n qubits.

julia> ghz()
++ XXX
++ ZZ_
++ _ZZ
+
+julia> ghz(2)
++ XX
++ ZZ
+
+julia> ghz(4)
++ XXXX
++ ZZ__
++ _ZZ_
++ __ZZ
source
QuantumClifford.graph_gateMethod

A helper function converting the gate indices from graphstate into a Clifford operator.

julia> s = S" XXX
+              YZ_
+             -_ZZ";
+
+
+julia> graph, h_idx, ip_idx, z_idx = graphstate(s);
+
+
+julia> gate = graph_gate(h_idx, ip_idx, z_idx, nqubits(s));
+
+
+julia> apply!(s, gate) # This is now a graph state (notice you need to multiply row 1 by row 2)
++ YYZ
++ XZ_
++ _ZX
+
+julia> canonicalize!(s) == canonicalize!(Stabilizer(graph))
+true

See also: graph_gatesequence

source
QuantumClifford.graph_gatesequenceMethod

A helper function converting the gate indices from graphstate into a sequence of gates.

julia> s = S" XXX
+              YZ_
+             -_ZZ";
+
+
+julia> graph, h_idx, ip_idx, z_idx = graphstate(s);
+
+
+julia> gates = graph_gatesequence(h_idx, ip_idx, z_idx);
+
+
+julia> for gate in vcat(gates...) apply!(s, gate) end
+
+
+julia> s # This is now a graph state (notice you need to multiply row 1 by row 2)
++ YYZ
++ XZ_
++ _ZX
+
+julia> canonicalize!(s) == canonicalize!(Stabilizer(graph))
+true

See also: graph_gatesequence

source
QuantumClifford.graphstateMethod

Convert any stabilizer state to a graph state

Graph states are a special type of entangled stabilizer states that can be represented by a graph. For a graph $G=(V,E)$ the corresponding stabilizers are $S_v = X_v \prod_{u ∈ N(v)} Z_u$. Notice that such tableau rows contain only a single X operator. There is a set of single qubit gates that converts any stabilizer state to a graph state.

This function returns the graph state corresponding to a stabilizer and the gates that might be necessary to convert the stabilizer into a state representable as a graph.

For a tableau stab you can convert it with:

graph, hadamard_idx, iphase_idx, flips_idx = graphstate()

where graph is the graph representation of stab, and the rest specifies the single-qubit gates converting stab to graph: hadamard_idx are the qubits that require a Hadamard gate (mapping X ↔ Z), iphase_idx are (different) qubits that require an inverse Phase gate (Y → X), and flips_idx are the qubits that require a phase flip (Pauli Z gate), after the previous two sets of gates.

julia> using Graphs
+
+julia> s = S" XXX
+              ZZ_
+             -_ZZ";
+
+
+julia> g, h_idx, ip_idx, z_idx = graphstate(s);
+
+
+julia> collect(edges(g))
+2-element Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}:
+ Edge 1 => 2
+ Edge 1 => 3
+
+julia> h_idx
+2-element Vector{Int64}:
+ 2
+ 3
+
+julia> ip_idx
+Int64[]
+
+julia> z_idx
+1-element Vector{Int64}:
+ 3

The Graphs.jl library provides many graph-theory tools and the MakieGraphs.jl library provides plotting utilities for graphs.

You can directly call the graph constructor on a stabilizer, if you just want the graph and do not care about the Clifford operation necessary to convert an arbitrary state to a state representable as a graph:

julia> collect(edges( Graph(bell()) ))
+1-element Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}:
+ Edge 1 => 2

For a version that does not copy the stabilizer, but rather performs transformations in-place, use graphstate!. It would perform canonicalize_gott! on its argument as it finds a way to convert it to a graph state.

source
QuantumClifford.logdotMethod

Logarithm of the inner product between to Stabilizer states.

If the result is nothing, the dot inner product is zero. Otherwise the inner product is 2^(-logdot/2).

The actual inner product can be computed with LinearAlgebra.dot.

Based on (Garcia et al., 2012).

source
QuantumClifford.pfmeasurementsMethod
pfmeasurements(frame::PauliFrame) -> Any
+

Returns the measurement results for each frame in the PauliFrame instance.

Relative measurements

The return measurements are relative to the reference measurements, i.e. they only say whether the reference measurements have been flipped in the given frame.

source
QuantumClifford.pfmeasurementsMethod
pfmeasurements(register::Register, frame::PauliFrame) -> Any
+

Takes the references measurements from the given Register and applies the flips as prescribed by the PauliFrame relative measurements. The result is the actual (non-relative) measurement results for each frame.

source
QuantumClifford.pftrajectoriesMethod
pftrajectories(
+    circuit;
+    trajectories,
+    threads
+) -> PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}, Matrix{Bool}}
+

The main method for running Pauli frame simulations of circuits. See the other methods for lower level access.

Multithreading is enabled by default, but can be disabled by setting threads=false. Do not forget to launch Julia with multiple threads enabled, e.g. julia -t4, if you want to use multithreading.

See also: mctrajectories, petrajectories

source
QuantumClifford.pftrajectoriesMethod
pftrajectories(
+    register::Register,
+    circuit;
+    trajectories
+) -> Tuple{Register, PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}, Matrix{Bool}}}
+

For a given Register and circuit, simulates the reference circuit acting on the register and then also simulate numerous PauliFrame trajectories. Returns the register and the PauliFrame instance.

Use pfmeasurements to get the measurement results.

source
QuantumClifford.phasesMethod

The phases of a given tableau. It is a view, i.e. if you modify this array, the original tableau caries these changes.

source
QuantumClifford.prodphaseMethod

Get the phase of the product of two Pauli operators.

Phase is encoded as F(4) in the low qubits of an UInt8.

julia> P"ZZZ"*P"XXX"
+-iYYY
+
+julia> prodphase(P"ZZZ", P"XXX")
+0x03
+
+julia> prodphase(P"XXX", P"ZZZ")
+0x01
source
QuantumClifford.random_pauliMethod

A random Pauli operator on n qubits.

Use realphase=true to get operators with phase ±1 (excluding ±i). nophase=true sets the phase to +1.

Optionally, a "flip" probability p can be provided specified, in which case each bit is set to I with probability 1-p and to X, Y, or Z, each with probability p. Useful for simulating Pauli noise.

source
QuantumClifford.stabilizerplotFunction

A Makie.jl recipe for pictorial representation of a tableau.

Requires a Makie.jl backend to be loaded, e.g. using CairoMakie.

Alternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S"XXX ZZZ").

Consult the documentation for more details on visualization options.

source
QuantumClifford.stabilizerplot_axisFunction

A Makie.jl recipe for pictorial representation of a tableau.

Requires a Makie.jl backend to be loaded, e.g. using CairoMakie.

Alternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S"XXX ZZZ").

Consult the documentation for more details on visualization options.

source
QuantumClifford.tabMethod

Extract the underlying tableau structure.

julia> s = S"X"
++ X
+
+julia> tab(s)
++ X
+
+julia> tab(Destabilizer(s))
++ Z
++ X
+
+julia> tab(MixedDestabilizer(s))
++ Z
++ X
+
+julia> tab(tHadamard)
++ Z
++ X
+
+julia> typeof(tab(tHadamard))
+QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}

See also: stabilizerview, destabilizerview, logicalxview, logicalzview

source
QuantumClifford.xbitMethod

Extract as a new bit array the X part of the UInt array of packed qubits of a given Pauli operator.

source
QuantumClifford.zbitMethod

Extract as a new bit array the Z part of the UInt array of packed qubits of a given Pauli operator.

source
QuantumInterface.apply!Function

In QuantumClifford the apply! function is used to apply any quantum operation to a stabilizer state, including unitary Clifford operations, Pauli measurements, and noise. Thus, this function may result in a random/stochastic result (e.g. with measurements or noise).

source
QuantumInterface.embedMethod

Embed a Pauli operator in a larger Pauli operator.

julia> embed(5, 3, P"-Y")
+- __Y__
+
+julia> embed(5, (3,5), P"-YX")
+- __Y_X
source
QuantumInterface.entanglement_entropyFunction

Get bipartite entanglement entropy of a subsystem

Defined as entropy of the reduced density matrix.

It can be calculated with multiple different algorithms, the most performant one depending on the particular case.

Currently implemented are the :clip (clipped gauge), :graph (graph state), and :rref (Gaussian elimination) algorithms. Benchmark your particular case to choose the best one.

source
QuantumInterface.entanglement_entropyMethod

Get bipartite entanglement entropy by first converting the state to a graph and computing the rank of the adjacency matrix.

Based on "Entanglement in graph states and its applications".

source
QuantumInterface.expectMethod
expect(p::PauliOperator, st::AbstractStabilizer)

Compute the expectation value of a Pauli operator p on a stabilizer state st. This function will allocate a temporary copy of the stabilizer state st.

source
QuantumInterface.project!Method
project!(
+    state,
+    pauli::PauliOperator;
+    keep_result,
+    phases
+) -> Tuple{MixedStabilizer, Any, Any}
+

Project the state of a Stabilizer on the two eigenspaces of a Pauli operator.

Assumes the input is a valid stabilizer. The projection is done inplace on that stabilizer and it does not modify the projection operator.

It returns

  • a stabilizer that might not be in canonical form
  • the index of the row where the non-commuting operator was (that row is now equal to pauli; its phase is not updated and for a faithful measurement simulation it needs to be randomized by the user)
  • and the result of the projection if there was no non-commuting operator (nothing otherwise)

If keep_result==false that result of the projection in case of anticommutation is not computed, sparing a canonicalization operation. This canonicalization operation is the only one potentially of cubic complexity. The rest of the calculations are of quadratic complexity.

If you need to measure a single qubit instead of a multiqubit Pauli operator, the faster projectX!, projectY!, and projectZ! are available.

For less boilerplate and automatic randomization of the phase use projectrand!.

Here is an example of a projection destroying entanglement:

julia> ghz = S"XXXX
+               ZZII
+               IZZI
+               IIZZ";
+
+
+julia> canonicalize!(ghz)
++ XXXX
++ Z__Z
++ _Z_Z
++ __ZZ
+
+julia> state, anticom_index, result = project!(ghz, P"ZIII");
+
+
+julia> state
++ Z___
++ Z__Z
++ _Z_Z
++ __ZZ
+
+julia> canonicalize!(state)
++ Z___
++ _Z__
++ __Z_
++ ___Z
+
+julia> anticom_index, result
+(1, nothing)

And an example of projection consistent with the stabilizer state.

julia> s = S"ZII
+             IXI
+             IIY";
+
+
+julia> canonicalize!(s)
++ _X_
++ __Y
++ Z__
+
+julia> state, anticom_index, result = project!(s, P"-ZII");
+
+
+julia> state
++ _X_
++ __Y
++ Z__
+
+julia> anticom_index, result
+(0, 0x02)

While not the best choice, Stabilizer can be used for mixed states, simply by providing an incomplete tableau. In that case it is possible to attempt to project on an operator that can not be generated by the provided stabilizer operators. In that case we have anticom_index==rank and result===nothing, where rank is the the new rank of the tableau, one more than the number of rows in the initial tableau. However, if keep_result was set to false, then anticom_index would stay at zero.

julia> s = S"XZI
+             IZI";
+
+
+julia> project!(s, P"IIX")[1]
++ X__
++ _Z_

If we had used MixedStabilizer we would have added the projector to the list of stabilizers.

julia> s = one(MixedStabilizer, 2, 3)
++ Z__
++ _Z_
+
+julia> project!(s, P"IIX")[1]
++ Z__
++ _Z_
++ __X

However, MixedDestabilizer would be an even better choice as it has $\mathcal{O}(n^2)$ complexity instead of the $\mathcal{O}(n^3)$ complexity of *Stabilizer.

julia> s = one(MixedDestabilizer, 2, 3)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ X__
++ _X_
+𝒳ₗ━━━
++ __X
+𝒮𝓉𝒶𝒷━
++ Z__
++ _Z_
+𝒵ₗ━━━
++ __Z
+
+julia> project!(s, P"IIX")[1]
+𝒟ℯ𝓈𝓉𝒶𝒷
++ X__
++ _X_
++ __Z
+𝒮𝓉𝒶𝒷━
++ Z__
++ _Z_
++ __X

See the "Datastructure Choice" section in the documentation for more details.

See also: projectX!, projectY!, projectZ!, projectrand!

source
QuantumInterface.project!Method
project!(
+    state::MixedStabilizer,
+    pauli::PauliOperator;
+    phases
+) -> Tuple{MixedStabilizer, Any, Any}
+

When using project! on MixedStabilizer it automates some of the extra steps we encounter when implicitly using the Stabilizer datastructure to represent mixed states. Namely, it helps when the projector is not among the list of stabilizers:

julia> s = S"XZI
+             IZI";
+
+
+julia> ms = MixedStabilizer(s)
++ X__
++ _Z_
+
+julia> project!(ms, P"IIY")[1]
++ X__
++ _Z_
++ __Y

Similarly to project! on Stabilizer, this function has cubic complexity when the Pauli operator commutes with all rows of the tableau. Most of the time it is better to simply use MixedDestabilizer representation.

Unlike other project! methods, this one does not allow for keep_result=false, as the correct rank or anticommutation index can not be calculated without the expensive (cubic) canonicalization operation required by keep_result=true.

See the "Datastructure Choice" section in the documentation for more details.

See also: projectX!, projectY!, projectZ!.

source
QuantumInterface.reset_qubits!Method
reset_qubits!(
+    s::Stabilizer,
+    newstate,
+    qubits;
+    phases
+) -> Any
+

Reset a given set of qubits to be in the state newstate. These qubits are traced out first, which could lead to "nonlocal" changes in the tableau.

source

Private API

Private Implementation Details

These functions are used internally by the library and might be drastically modified or deleted without warning or deprecation.

QuantumClifford.TableauType

Internal Tableau type for storing a list of Pauli operators in a compact form. No special semantic meaning is attached to this type, it is just a convenient way to store a list of Pauli operators. E.g. it is not used to represent a stabilizer state, or a stabilizer group, or a Clifford circuit.

source
Base.invMethod
inv(
+    c::CliffordOperator;
+    phases
+) -> CliffordOperator{QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}}
+

Inverse of a CliffordOperator

source
QuantumClifford._remove_rowcol!Method

Unexported low-level function that removes a row (by shifting all rows up as necessary)

Because MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.

Used on its own, this function will break invariants. Meant to be used with projectremove!.

source
QuantumClifford._rowmove!Method

Unexported low-level function that moves row i to row j.

Used on its own, this function will break invariants. Meant to be used in _remove_rowcol!.

source
QuantumClifford.applynoise_branchesFunction

Compute all possible new states after the application of the given noise model. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Noise interface.

source
QuantumClifford.initZ!Method
initZ!(frame::PauliFrame) -> PauliFrame
+

Inject random Z errors over all frames and qubits for the supplied PauliFrame with probability 0.5.

Calling this after initialization is essential for simulating any non-deterministic circuit. It is done automatically by most PauliFrame constructors.

source
QuantumClifford.make_sumtype_methodFunction

``` julia> makesumtypemethod([sCNOT], :apply!, (:s,)) quote function QuantumClifford.apply!(s, g::CompactifiedGate) @cases g begin sCNOT(q1, q2) => apply!(s, sCNOT(q1, q2)) end end end

source
QuantumClifford.projectremoverand!Method

Unexported low-level function that projects a qubit and returns the result while making the tableau smaller by a qubit.

Because MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.

source
QuantumClifford.remove_column!Method

Unexported low-level function that removes a column (by shifting all columns to the right of the target by one step to the left)

Because Tableau is not mutable we return a new Tableau with the same (modified) xzs array.

source
QuantumClifford.rowdecomposeMethod

Decompose a Pauli $P$ in terms of stabilizer and destabilizer rows from a given tableaux.

For given tableaux of rows destabilizer rows $\{d_i\}$ and stabilizer rows $\{s_i\}$, there are boolean vectors $b$ and $c$ such that $P = i^p \prod_i d_i^{b_i} \prod_i s_i^{c_i}$.

This function returns p, b, c.

julia> s = MixedDestabilizer(ghz(2))
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z_
++ _X
+𝒮𝓉𝒶𝒷
++ XX
++ ZZ
+
+julia> phase, destab_rows, stab_rows = QuantumClifford.rowdecompose(P"XY", s)
+(3, Bool[1, 0], Bool[1, 1])
+
+julia> im^3 * P"Z_" * P"XX" * P"ZZ"
++ XY
source
QuantumClifford.to_cpuFunction

copies the memory content of the object to CPU

You can only use this function if CUDA.jl is imported

For more advanced users to_cpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your CPU architecture, if working with matrices of UInt32 is faster than UInt64, you can use to_cpu(data, UInt32)

julia> using QuantumClifford: to_cpu, to_gpu
+
+julia> using CUDA # without this import, to_cpu, to_gpu are just function
+
+julia> stab = S"- X_Z\n+ _ZZ\n+ __Z"
+- X_Z
++ _ZZ
++ __Z
+
+julia> stab_gpu = to_gpu(stab);
+
+julia> apply!(stab_gpu, sHadamard(1));
+
+julia> stab_result_cpu = to_cpu(stab_gpu)
+- Z_Z
++ _ZZ
++ __Z
julia> using QuantumClifford: to_cpu, to_gpu
+
+julia> using CUDA # without this import, to_cpu, to_gpu are just function
+
+julia> pf_gpu = to_gpu(PauliFrame(1000, 2, 2));
+julia> circuit = [sMZ(1, 1), sHadamard(2), sMZ(2, 2)];
+julia> pftrajectories(pf_gpu, circuit);
+julia> measurements = to_cpu(pf_gpu.measurements);

See also: to_gpu

source
QuantumClifford.to_gpuFunction

copies the memory content of the object to GPU

You can only use this function if CUDA.jl is imported

For more advanced users to_gpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your GPU architecture, if working with matrices of UInt64 is faster than UInt32, you can use to_gpu(data, UInt64)

julia> using QuantumClifford: to_cpu, to_gpu
+
+julia> using CUDA # without this import, to_cpu, to_gpu are just function
+
+julia> stab = S"- X_Z\n+ _ZZ\n+ __Z"
+- X_Z
++ _ZZ
++ __Z
+
+julia> stab_gpu = to_gpu(stab);
+
+julia> apply!(stab_gpu, sHadamard(1));
+
+julia> stab_result_cpu = to_cpu(stab_gpu)
+- Z_Z
++ _ZZ
++ __Z
julia> using QuantumClifford: to_cpu, to_gpu
+
+julia> using CUDA # without this import, to_cpu, to_gpu are just function
+
+julia> pf_gpu = to_gpu(PauliFrame(1000, 2, 2));
+julia> circuit = [sMZ(1, 1), sHadamard(2), sMZ(2, 2)];
+julia> pftrajectories(pf_gpu, circuit);
+julia> measurements = to_cpu(pf_gpu.measurements);

See also: to_cpu

source
diff --git a/v0.8.21/ECC_API/index.html b/v0.8.21/ECC_API/index.html new file mode 100644 index 000000000..045770328 --- /dev/null +++ b/v0.8.21/ECC_API/index.html @@ -0,0 +1,140 @@ + +API · QuantumClifford.jl

Full ECC API (autogenerated)

QuantumClifford.ECC.CSSType

An arbitrary CSS error correcting code defined by its X and Z checks.

julia> CSS([0 1 1 0; 1 1 0 0], [1 1 1 1]) |> parity_checks
++ _XX_
++ XX__
++ ZZZZ
source
QuantumClifford.ECC.ShorSyndromeECCSetupType

Configuration for ECC evaluators that simulate the Shor-style syndrome measurement (without a flag qubit).

The simulated circuit includes:

  • perfect noiseless encoding (encoding and its fault tolerance are not being studied here)
  • one round of "memory noise" after the encoding but before the syndrome measurement
  • perfect preparation of entangled ancillary qubits
  • noisy Shor-style syndrome measurement (only two-qubit gate noise)
  • noiseless "logical state measurement" (providing the comparison data when evaluating the decoder)

See also: CommutationCheckECCSetup, NaiveSyndromeECCSetup

source
QuantumClifford.ECC.TableDecoderType

A simple look-up table decoder for error correcting codes.

The lookup table contains only weight=1 errors, thus it is small, but at best it provides only for distance=3 decoding.

The size of the lookup table would grow exponentially quickly for higher distances.

source
QuantumClifford.ECC.evaluate_decoderMethod

Evaluate the performance of an error-correcting circuit.

This method requires you give the circuit that performs both syndrome measurements and (probably noiseless) logical state measurements. The faults matrix that translates an error vector into corresponding logical errors is necessary as well.

This is a relatively barebones method that assumes the user prepares necessary circuits, etc. It is a method that is used internally by more user-frienly methods providing automatic conversion of codes and noise models to the necessary noisy circuits.

source
QuantumClifford.ECC.faults_matrixMethod

Error-to-logical-observable map (a.k.a. fault matrix) of a code.

For a code with n physical qubits and k logical qubits this function returns a 2k × 2n binary matrix O such that O[i,j] is true if the logical observable of index i is flipped by the single physical qubit error of index j. Indexing is such that:

  • O[1:k,:] is the error-to-logical-X-observable map (logical X observable, i.e. triggered by logical Z errors)
  • O[k+1:2k,:] is the error-to-logical-Z-observable map
  • O[:,1:n] is the X-physical-error-to-logical-observable map
  • O[n+1:2n,:] is the Z-physical-error-to-logical-observable map

E.g. for k=1, n=10, then if O[2,5] is true, then the logical Z observable is flipped by a X₅ error; and if O[1,12] is true, then the logical X observable is flipped by a Z₂ error.

Of note is that there is a lot of freedom in choosing the logical operations! A logical operator multiplied by a stabilizer operator is still a logical operator. Similarly there is a different fault matrix for each choice of logical operators. But once the logical operators are picked, the fault matrix is fixed.

Below we show an example that uses the Shor code. While it is not the smallest code, it is a convenient choice to showcase the importance of the fault matrix when dealing with degenerate codes where a correction operation and an error do not need to be the same.

First, consider a single-qubit error, potential correction operations, and their effect on the Shor code:

julia> using QuantumClifford.ECC: faults_matrix, Shor9
+
+julia> state = MixedDestabilizer(Shor9())
+𝒟ℯ𝓈𝓉𝒶𝒷━━━━━
++ Z________
++ ___Z_____
++ _X_______
++ __X______
++ ____X____
++ _____X___
++ ______X__
++ _______X_
+𝒳ₗ━━━━━━━━━
++ ______XXX
+𝒮𝓉𝒶𝒷━━━━━━━
++ XXX___XXX
++ ___XXXXXX
++ ZZ_______
++ Z_Z______
++ ___ZZ____
++ ___Z_Z___
++ ______Z_Z
++ _______ZZ
+𝒵ₗ━━━━━━━━━
++ Z__Z____Z
+
+julia> err_Z₁ = single_z(9,1) # the error we will simulate
++ Z________
+
+julia> cor_Z₂ = single_z(9,2) # the correction operation we will perform
++ _Z_______
+
+julia> err_Z₁ * state # observe that one of the syndrome bits is now flipped
+𝒟ℯ𝓈𝓉𝒶𝒷━━━━━
++ Z________
++ ___Z_____
++ _X_______
++ __X______
++ ____X____
++ _____X___
++ ______X__
++ _______X_
+𝒳ₗ━━━━━━━━━
++ ______XXX
+𝒮𝓉𝒶𝒷━━━━━━━
+- XXX___XXX
++ ___XXXXXX
++ ZZ_______
++ Z_Z______
++ ___ZZ____
++ ___Z_Z___
++ ______Z_Z
++ _______ZZ
+𝒵ₗ━━━━━━━━━
++ Z__Z____Z
+
+julia> cor_Z₂ * err_Z₁ * state # we are back to a good code state
+𝒟ℯ𝓈𝓉𝒶𝒷━━━━━
++ Z________
++ ___Z_____
+- _X_______
++ __X______
++ ____X____
++ _____X___
++ ______X__
++ _______X_
+𝒳ₗ━━━━━━━━━
++ ______XXX
+𝒮𝓉𝒶𝒷━━━━━━━
++ XXX___XXX
++ ___XXXXXX
++ ZZ_______
++ Z_Z______
++ ___ZZ____
++ ___Z_Z___
++ ______Z_Z
++ _______ZZ
+𝒵ₗ━━━━━━━━━
++ Z__Z____Z
+
+julia> bad_Z₆Z₉ = single_z(9,6) * single_z(9,9) # a different "correction" operation
++ _____Z__Z
+
+julia> bad_Z₆Z₉ * err_Z₁ * state # the syndrome is trivial, but now we have a logical error
+𝒟ℯ𝓈𝓉𝒶𝒷━━━━━
++ Z________
++ ___Z_____
++ _X_______
++ __X______
++ ____X____
+- _____X___
++ ______X__
++ _______X_
+𝒳ₗ━━━━━━━━━
+- ______XXX
+𝒮𝓉𝒶𝒷━━━━━━━
++ XXX___XXX
++ ___XXXXXX
++ ZZ_______
++ Z_Z______
++ ___ZZ____
++ ___Z_Z___
++ ______Z_Z
++ _______ZZ
+𝒵ₗ━━━━━━━━━
++ Z__Z____Z

The success of cor_Z₂ and the failure of bad_Z₆Z₉ can be immediately seen through the fault matrix, as the wrong "correction" does not result in the same logical flips ad the error:

julia> O = faults_matrix(Shor9())
+2×18 BitMatrix:
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1
+ 1  0  0  1  0  0  0  0  1  0  0  0  0  0  0  0  0  0
+
+julia> O * stab_to_gf2(err_Z₁)
+2-element Vector{Int64}:
+ 0
+ 0
+
+julia> O * stab_to_gf2(cor_Z₂)
+2-element Vector{Int64}:
+ 0
+ 0
+
+julia> O * stab_to_gf2(bad_Z₆Z₉)
+2-element Vector{Int64}:
+ 1
+ 0

While its use in this situation is rather contrived, the fault matrix is incredibly useful when running large scale simulations in which we want a separate fast error sampling process, (e.g. with Pauli frames) and a syndrome decoding process, without coupling between them. We just gather all our syndrome measurement and logical observables from the Pauli frame simulations, and then use them with the fault matrix in the syndrome decoding simulation.

source
QuantumClifford.ECC.isdegenerateFunction

Check if the code is degenerate with respect to a given set of error or with respect to all "up to d physical-qubit" errors (defaulting to d=1).

julia> using QuantumClifford.ECC
+
+julia> isdegenerate(Shor9(), [single_z(9,1), single_z(9,2)])
+true
+
+julia> isdegenerate(Shor9(), [single_z(9,1), single_x(9,1)])
+false
+
+julia> isdegenerate(Steane7(), 1)
+false
+
+julia> isdegenerate(Steane7(), 2)
+true
source
QuantumClifford.ECC.naive_encoding_circuitMethod

Encoding physical qubits into a larger logical code.

The initial physical qubits to be encoded have to be at indices n-k+1:n.

Encoding circuits are not fault-tolerant

Encoding circuits are not fault-tolerant, and thus should not be used in practice. Instead, you should measure the stabilizers of the code and the logical observables, thus projecting into the code space (which can be fault-tolerant).

The canonicalization operation performed on the code may permute the qubits (see canonicalize_gott!). That permutation is corrected for with SWAP gates by default (controlled by the undoperm keyword argument).

Based on (Cleve and Gottesman, 1997) and (Gottesman, 1997), however it seems the published algorithm has some errors. Consult the erratum, as well as the more recent (Grassl, 2002) and (Grassl, 2011), and be aware that this implementation also uses H instead of Z gates.

source
QuantumClifford.ECC.naive_syndrome_circuitFunction

Generate the non-fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.

Use the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts.

Returns the circuit, the number of ancillary qubits that were added, and a list of bit indices that will store the measurement results.

See also: shor_syndrome_circuit

source
QuantumClifford.ECC.shor_syndrome_circuitFunction

Generate the Shor fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.

Use the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts. Ancillary qubits

Returns:

  • The ancillary cat state preparation circuit.
  • The Shor syndrome measurement circuit.
  • The number of ancillary qubits that were added.
  • The list of bit indices that store the final measurement results.

See also: naive_syndrome_circuit

source
diff --git a/v0.8.21/ECC_evaluating/19758e32.png b/v0.8.21/ECC_evaluating/19758e32.png new file mode 100644 index 000000000..168e94122 Binary files /dev/null and b/v0.8.21/ECC_evaluating/19758e32.png differ diff --git a/v0.8.21/ECC_evaluating/f2e21775.png b/v0.8.21/ECC_evaluating/f2e21775.png new file mode 100644 index 000000000..257c35410 Binary files /dev/null and b/v0.8.21/ECC_evaluating/f2e21775.png differ diff --git a/v0.8.21/ECC_evaluating/index.html b/v0.8.21/ECC_evaluating/index.html new file mode 100644 index 000000000..10756d455 --- /dev/null +++ b/v0.8.21/ECC_evaluating/index.html @@ -0,0 +1,56 @@ + +Evaluating codes and decoders · QuantumClifford.jl

Evaluating an ECC code and decoders

The documentation is incomplete

While waiting for a better documentation than the small example below, consider looking into evaluate_decoder, TableDecoder, BeliefPropDecoder, PyBeliefPropDecoder, PyMatchingDecoder, CommutationCheckECCSetup, NaiveSyndromeECCSetup, ShorSyndromeECCSetup

This is a quick and durty example on how to use some of the decoders.

A function to plot the results of

using CairoMakie
+
+function make_decoder_figure(phys_errors, results, title="")
+    minlim = min(minimum(phys_errors),minimum(results[results.!=0]))
+    maxlim = min(1, max(maximum(phys_errors),maximum(results[results.!=0])))
+
+    fresults = copy(results)
+    fresults[results.==0] .= NaN
+
+    f = Figure()
+    a = Axis(f[1,1],
+        xscale=log10, yscale=log10,
+        limits=(minlim,maxlim,minlim,maxlim),
+        aspect=DataAspect(),
+        xlabel="physical error rate",
+        ylabel="logical error rate",
+        title=title)
+    lines!(a, [minlim,maxlim],[minlim,maxlim], color=:black)
+    for (i,sresults) in enumerate(eachslice(fresults, dims=1))
+        scatter!(a, phys_errors, sresults[:,1], marker=:+, color=Cycled(i))
+        scatter!(a, phys_errors, sresults[:,2], marker=:x, color=Cycled(i))
+    end
+    f
+end
make_decoder_figure (generic function with 2 methods)

Testing out a lookup table decoder on a small code.

using QuantumClifford
+using QuantumClifford.ECC
+
+mem_errors = 0.001:0.0005:0.01
+codes = [Shor9()]
+results = zeros(length(codes), length(mem_errors), 2)
+
+for (ic, c) in pairs(codes)
+    for (i,m) in pairs(mem_errors)
+        setup = CommutationCheckECCSetup(m)
+        decoder = TableDecoder(c)
+        r = evaluate_decoder(decoder, setup, 10000)
+        results[ic,i,:] .= r
+    end
+end
+
+make_decoder_figure(mem_errors, results, "Shor's code with a lookup table decoder")
Example block output

Testing out the toric code with a decoder provided by the python package pymatching (provided in julia by the meta package PyQDecoders.jl).

import PyQDecoders
+
+mem_errors = 0.001:0.005:0.1
+codes = [Toric(4,4), Toric(6,6)]
+results = zeros(length(codes), length(mem_errors), 2)
+
+for (ic, c) in pairs(codes)
+    for (i,m) in pairs(mem_errors)
+        setup = ShorSyndromeECCSetup(m, 0)
+        decoder = PyMatchingDecoder(c)
+        r = evaluate_decoder(decoder, setup, 1000)
+        results[ic,i,:] .= r
+    end
+end
+
+make_decoder_figure(mem_errors, results, "Toric code with a MWPM decoder")
Example block output
diff --git a/v0.8.21/allops/index.html b/v0.8.21/allops/index.html new file mode 100644 index 000000000..f21cbc637 --- /dev/null +++ b/v0.8.21/allops/index.html @@ -0,0 +1,13 @@ + +All Gates · QuantumClifford.jl

Operations - Gates, Measurements, and More

Operations

Acting on quantum states can be performed either:

  • In a "linear algebra" language where unitaries, measurements, and other operations have separate interfaces. This is an explicitly deterministic lower-level interface, which provides a great deal of control over how tableaux are manipulated. See the Stabilizer Tableau Algebra Manual as a primer on these approaches.
  • Or in a "circuit" language, where the operators (and measurements and noise) are represented as circuit gates. This is a higher-level interface in which the outcome of an operation can be stochastic. The API for it is centered around the apply! function. Particularly useful for Monte Carlo simulations and Perturbative Expansion Symbolic Results.

In the circuit language, all operations can be applied on a state with the apply! function. Whether they are deterministic and their computational complexity is listed in the table below. A list of lower-level "linear algebra style" functions for more control over how an operation is performed is also given.

TypeDeterministic𝒪(nˣ)Low-level functions
AbstractOperation
├─ AbstractCliffordOperator
│ ├─ AbstractSymbolicOperator
│ │ ├─ AbstractSingleQubitOperator
│ │ │ ├─ SingleQubitOperator✔️n
│ │ │ ├─ sHadamard✔️n
│ │ │ ├─ sId1✔️n
│ │ │ ├─ sInvPhase✔️n
│ │ │ ├─ sPhase✔️n
│ │ │ ├─ sX✔️n
│ │ │ ├─ sY✔️n
│ │ │ └─ sZ✔️n
│ │ └─ AbstractTwoQubitOperator
│ │ ├─ sCNOT✔️n
│ │ ├─ sCPHASE✔️n
│ │ └─ sSWAP✔️n
│ │
│ ├─ CliffordOperator✔️
│ ├─ PauliOperator✔️
│ └─ SparseGate✔️kn²
├─ AbstractMeasurement
│ ├─ PauliMeasurementproject!, projectrand!
│ ├─ sMXprojectX!
│ ├─ sMYprojectY!
│ └─ sMZprojectZ!
├─ BellMeasurement
├─ NoiseOp?applynoise!
├─ NoiseOpAll?applynoise!
├─ NoisyGate?applynoise!
└─ Reset✔️kn²reset_qubits!

Details of Operations Supported by apply!

Unitary Gates

We distinguish between symbolic gates like sCNOT that have specialized (fast) apply! methods (usually just for single and two qubit gates) and general tableau representation of gates like CliffordOperator that can represent any multi-qubit gate.

Predefined unitary gates are available, like sCNOT, sHadamard, etc.

[sCNOT(2,4),sHadamard(2),sCPHASE(1,3),sSWAP(2,4)]
Example block output

Any arbitrary tableaux can be used as a gate too.

They can be specified by giving a Clifford operator tableaux and the indices on which it acts (particularly useful for gates acting on a small part of a circuit):

SparseGate(tCNOT, [2,4])
Example block output

The Clifford operator tableaux can be completely arbitrary.

SparseGate(random_clifford(3), [2,4,5])
Example block output

If the Clifford operator acts on all qubits, we do not need to specify indices, just use the operator.

Noisy Gates

Each gate can be followed by noise applied to the qubits on which it has acted. This is done by wrapping the given gate into a NoisyGate

ε = 0.03 # X/Y/Z error probability
+noise = UnbiasedUncorrelatedNoise(ε)
+noisy_gate = NoisyGate(SparseGate(tCNOT, [2,4]), noise)
Example block output

In circuit diagrams the noise is not depicted, but after each application of the gate defined in noisy_gate, a noise operator will also be applied. The example above is of Pauli Depolarization implemented by UnbiasedUncorrelatedNoise.

One can also apply only the noise operator by using NoiseOp which acts only on specified qubits. Or alternatively, one can use NoiseOpAll in order to apply noise to all qubits.

[NoiseOp(noise, [4,5]), NoiseOpAll(noise)]
Example block output

The machinery behind noise processes and different types of noise is detailed in the section on noise

Coincidence Measurements

Global parity measurements involving single-qubit projections and classical communication are implemented with BellMeasurement. One needs to specify the axes of measurement and the qubits being measured. If the parity is trivial, the circuit continues, if the parity is non-trivial, the circuit ends and reports a detected failure. This operator is frequently used in the simulation of entanglement purification.

BellMeasurement([sMX(1), sMY(3), sMZ(4)])
Example block output

There is also NoisyBellMeasurement that takes the bit-flip probability of a single-qubit measurement as a third argument.

Stabilizer Measurements

A measurement over one or more qubits can also be performed, e.g., a direct stabilizer measurement on multiple qubits without the use of ancillary qubits. When applied to multiple qubits, this differs from BellMeasurement as it performs a single projection, unlike BellMeasurement which performs a separate projection for every single qubit involved. This measurement is implemented in PauliMeasurement which requires a Pauli operator on which to project and the index of the classical bit in which to store the result. Alternatively, there are sMX, sMZ, sMY if you are measuring a single qubit.

[PauliMeasurement(P"XYZ", 1), sMZ(2, 2)]
Example block output

Reset Operations

The Reset operations lets you trace out the specified qubits and set their state to a specific tableau.

new_state = random_stabilizer(3)
+qubit_indices = [1,2,3]
+Reset(new_state, qubit_indices)
Example block output

It can be done anywhere in a circuit, not just at the beginning.

diff --git a/v0.8.21/assets/documenter.js b/v0.8.21/assets/documenter.js new file mode 100644 index 000000000..c6562b558 --- /dev/null +++ b/v0.8.21/assets/documenter.js @@ -0,0 +1,1050 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function (event) { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + let animationSpeed = event.noToggleAnimation ? 0 : 400; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(animationSpeed); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(animationSpeed); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let meta = $("div[data-docstringscollapsed]").data(); + + if (meta?.docstringscollapsed) { + $("#documenter-article-toggle-button").trigger({ + type: "click", + noToggleAnimation: true, + }); + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +/* +To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +PSEUDOCODE: + +Searching happens automatically as the user types or adjusts the selected filters. +To preserve responsiveness, as much as possible of the slow parts of the search are done +in a web worker. Searching and result generation are done in the worker, and filtering and +DOM updates are done in the main thread. The filters are in the main thread as they should +be very quick to apply. This lets filters be changed without re-searching with minisearch +(which is possible even if filtering is on the worker thread) and also lets filters be +changed _while_ the worker is searching and without message passing (neither of which are +possible if filtering is on the worker thread) + +SEARCH WORKER: + +Import minisearch + +Build index + +On message from main thread + run search + find the first 200 unique results from each category, and compute their divs for display + note that this is necessary and sufficient information for the main thread to find the + first 200 unique results from any given filter set + post results to main thread + +MAIN: + +Launch worker + +Declare nonconstant globals (worker_is_running, last_search_text, unfiltered_results) + +On text update + if worker is not running, launch_search() + +launch_search + set worker_is_running to true, set last_search_text to the search text + post the search query to worker + +on message from worker + if last_search_text is not the same as the text in the search field, + the latest search result is not reflective of the latest search query, so update again + launch_search() + otherwise + set worker_is_running to false + + regardless, display the new search results to the user + save the unfiltered_results as a global + update_search() + +on filter click + adjust the filter selection + update_search() + +update_search + apply search filters by looping through the unfiltered_results and finding the first 200 + unique results that match the filters + + Update the DOM +*/ + +/////// SEARCH WORKER /////// + +function worker_function(documenterSearchIndex, documenterBaseURL, filters) { + importScripts( + "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" + ); + + let data = documenterSearchIndex.map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; + }); + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", + ]); + + let index = new MiniSearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + + word = word.toLowerCase(); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not + // find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + prefix: true, + boost: { title: 100 }, + fuzzy: 2, + }, + }); + + index.addAll(data); + + /** + * Used to map characters to HTML entities. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }; + + /** + * Used to match HTML entities and HTML characters. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** + * Escape function from lodash + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + function escape(string) { + return string && reHasUnescapedHtml.test(string) + ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) + : string || ""; + } + + /** + * Make the result component given a minisearch result data object and the value + * of the search input as queryString. To view the result object structure, refer: + * https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ + function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`${querystring}`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + text = text.length ? escape(text) : ""; + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`${escape(querystring)}`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${escape(result.title)}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; + } + + self.onmessage = function (e) { + let query = e.data; + let results = index.search(query, { + filter: (result) => { + // Only return relevant results + return result.score >= 1; + }, + }); + + // Pre-filter to deduplicate and limit to 200 per category to the extent + // possible without knowing what the filters are. + let filtered_results = []; + let counts = {}; + for (let filter of filters) { + counts[filter] = 0; + } + let present = {}; + + for (let result of results) { + cat = result.category; + cnt = counts[cat]; + if (cnt < 200) { + id = cat + "---" + result.location; + if (present[id]) { + continue; + } + present[id] = true; + filtered_results.push({ + location: result.location, + category: cat, + div: make_search_result(result, query), + }); + } + } + + postMessage(filtered_results); + }; +} + +// `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! +const filters = [ + ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), +]; +const worker_str = + "(" + + worker_function.toString() + + ")(" + + JSON.stringify(documenterSearchIndex["docs"]) + + "," + + JSON.stringify(documenterBaseURL) + + "," + + JSON.stringify(filters) + + ")"; +const worker_blob = new Blob([worker_str], { type: "text/javascript" }); +const worker = new Worker(URL.createObjectURL(worker_blob)); + +/////// SEARCH MAIN /////// + +// Whether the worker is currently handling a search. This is a boolean +// as the worker only ever handles 1 or 0 searches at a time. +var worker_is_running = false; + +// The last search text that was sent to the worker. This is used to determine +// if the worker should be launched again when it reports back results. +var last_search_text = ""; + +// The results of the last search. This, in combination with the state of the filters +// in the DOM, is used compute the results to display on calls to update_search. +var unfiltered_results = []; + +// Which filter is currently selected +var selected_filter = ""; + +$(document).on("input", ".documenter-search-input", function (event) { + if (!worker_is_running) { + launch_search(); + } +}); + +function launch_search() { + worker_is_running = true; + last_search_text = $(".documenter-search-input").val(); + worker.postMessage(last_search_text); +} + +worker.onmessage = function (e) { + if (last_search_text !== $(".documenter-search-input").val()) { + launch_search(); + } else { + worker_is_running = false; + } + + unfiltered_results = e.data; + update_search(); +}; + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + selected_filter = ""; + } else { + selected_filter = $(this).text().toLowerCase(); + } + + // This updates search results and toggles classes for UI: + update_search(); +}); + +/** + * Make/Update the search component + */ +function update_search() { + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + if (selected_filter == "") { + results = unfiltered_results; + } else { + results = unfiltered_results.filter((result) => { + return selected_filter == result.category.toLowerCase(); + }); + } + + let search_result_container = ``; + let modal_filters = make_modal_body_filters(); + let search_divider = `
`; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + for (var i = 0, n = results.length; i < n && count < 200; ++i) { + let result = results[i]; + if (result.location && !links.includes(result.location)) { + search_results += result.div; + count++; + links.push(result.location); + } + } + + if (count == 1) { + count_str = "1 result"; + } else if (count == 200) { + count_str = "200+ results"; + } else { + count_str = count + " results"; + } + let result_count = `
${count_str}
`; + + search_result_container = ` +
+ ${modal_filters} + ${search_divider} + ${result_count} +
+ ${search_results} +
+
+ `; + } else { + search_result_container = ` +
+ ${modal_filters} + ${search_divider} +
0 result(s)
+
+
No result found!
+ `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(` +
Type something to get started!
+ `); + } +} + +/** + * Make the modal filter html + * + * @returns string + */ +function make_modal_body_filters() { + let str = filters + .map((val) => { + if (selected_filter == val.toLowerCase()) { + return `${val}`; + } else { + return `${val}`; + } + }) + .join(""); + + return ` +
+ Filters: + ${str} +
`; +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let search_modal_header = ` + + `; + + let initial_search_body = ` +
Type something to get started!
+ `; + + let search_modal_footer = ` + + `; + + $(document.body).append( + ` + + ` + ); + + document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); + }); + + document + .querySelector(".close-search-modal") + .addEventListener("click", () => { + closeModal(); + }); + + $(document).on("click", ".search-result-link", function () { + closeModal(); + }); + + document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; + }); + + // Functions to open and close a modal + function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); + } + + function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
Type something to get started!
+ `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); + } + + document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v0.8.21/assets/themes/documenter-dark.css b/v0.8.21/assets/themes/documenter-dark.css new file mode 100644 index 000000000..53889fb99 --- /dev/null +++ b/v0.8.21/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v0.8.21/assets/themes/documenter-light.css b/v0.8.21/assets/themes/documenter-light.css new file mode 100644 index 000000000..2f168c77b --- /dev/null +++ b/v0.8.21/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v0.8.21/assets/themeswap.js b/v0.8.21/assets/themeswap.js new file mode 100644 index 000000000..9f5eebe6a --- /dev/null +++ b/v0.8.21/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v0.8.21/assets/warner.js b/v0.8.21/assets/warner.js new file mode 100644 index 000000000..3f6f5d008 --- /dev/null +++ b/v0.8.21/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v0.8.21/bench_intsize.png b/v0.8.21/bench_intsize.png new file mode 100644 index 000000000..a7161e08d Binary files /dev/null and b/v0.8.21/bench_intsize.png differ diff --git a/v0.8.21/bench_intsize_clifford.png b/v0.8.21/bench_intsize_clifford.png new file mode 100644 index 000000000..ce097f396 Binary files /dev/null and b/v0.8.21/bench_intsize_clifford.png differ diff --git a/v0.8.21/bench_threaded_apply.png b/v0.8.21/bench_threaded_apply.png new file mode 100644 index 000000000..0c8446348 Binary files /dev/null and b/v0.8.21/bench_threaded_apply.png differ diff --git a/v0.8.21/bench_threaded_apply_threadtime.png b/v0.8.21/bench_threaded_apply_threadtime.png new file mode 100644 index 000000000..31396d026 Binary files /dev/null and b/v0.8.21/bench_threaded_apply_threadtime.png differ diff --git a/v0.8.21/canonicalization/2f1ee3f0.png b/v0.8.21/canonicalization/2f1ee3f0.png new file mode 100644 index 000000000..77e80f5ca Binary files /dev/null and b/v0.8.21/canonicalization/2f1ee3f0.png differ diff --git a/v0.8.21/canonicalization/5b8c66e9.png b/v0.8.21/canonicalization/5b8c66e9.png new file mode 100644 index 000000000..8609de5b6 Binary files /dev/null and b/v0.8.21/canonicalization/5b8c66e9.png differ diff --git a/v0.8.21/canonicalization/bceadab4.png b/v0.8.21/canonicalization/bceadab4.png new file mode 100644 index 000000000..29c5f7b40 Binary files /dev/null and b/v0.8.21/canonicalization/bceadab4.png differ diff --git a/v0.8.21/canonicalization/c8e0c467.png b/v0.8.21/canonicalization/c8e0c467.png new file mode 100644 index 000000000..c6fe6ee89 Binary files /dev/null and b/v0.8.21/canonicalization/c8e0c467.png differ diff --git a/v0.8.21/canonicalization/index.html b/v0.8.21/canonicalization/index.html new file mode 100644 index 000000000..96affa425 --- /dev/null +++ b/v0.8.21/canonicalization/index.html @@ -0,0 +1,14 @@ + +Canonicalization · QuantumClifford.jl

Canonicalization operations

Different types of canonicalization operations are implemented. All of them are types of Gaussian elimination.

canonicalize!

First do elimination on all X components and only then perform elimination on the Z components. Based on (Garcia et al., 2012). It is used in logdot for inner products of stabilizer states.

The final tableaux, if square should look like the following

If the tableaux is shorter than a square, the diagonals might not reach all the way to the right.

using QuantumClifford, CairoMakie
+f=Figure()
+stabilizerplot_axis(f[1,1], canonicalize!(random_stabilizer(20,30)))
+f
Example block output

canonicalize_rref!

Cycle between elimination on X and Z for each qubit. Particularly useful for tracing out qubits. Based on (Audenaert and Plenio, 2005). For convenience reasons, the canonicalization starts from the bottom row, and you can specify as a second argument which columns to be canonicalized (useful for tracing out arbitrary qubits, e.g., in traceout!).

The tableau canonicalization is done in recursive steps, each one of which results in something akin to one of these three options

using QuantumClifford, CairoMakie
+f=Figure()
+stabilizerplot_axis(f[1,1], canonicalize_rref!(random_stabilizer(20,30),1:30)[1])
+f
Example block output

canonicalize_gott!

First do elimination on all X components and only then perform elimination on the Z components, but without touching the qubits that were eliminated during the X pass. Unlike other canonicalization operations, qubit columns are reordered, providing for a straight diagonal in each block. Particularly useful as certain blocks of the new created matrix are related to logical operations of the corresponding code, e.g. computing the logical X and Z operators of a MixedDestabilizer. Based on (Gottesman, 1997).

A canonicalized tableau would look like the following (the right-most block does not exist for square tableaux).

using QuantumClifford, CairoMakie
+f=Figure()
+stabilizerplot_axis(f[1,1], canonicalize_gott!(random_stabilizer(30))[1])
+f
Example block output

canonicalize_clip!

Convert to the "clipped" gauge of a stabilizer state resulting in a "river" of non-identity operators around the diagonal.

using QuantumClifford, CairoMakie
+f=Figure()
+stabilizerplot_axis(f[1,1], canonicalize_clip!(random_stabilizer(30)))
+f
Example block output

The properties of the clipped gauge are:

  1. Each qubit is the left/right "endpoint" of exactly two stabilizer rows.
  2. For the same qubit the two endpoints are always different Pauli operators.

This canonicalization is used to derive the bigram a stabilizer state, which is also related to entanglement entropy in the state.

Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019).

diff --git a/v0.8.21/canonicalize.png b/v0.8.21/canonicalize.png new file mode 100644 index 000000000..9aba7ab98 Binary files /dev/null and b/v0.8.21/canonicalize.png differ diff --git a/v0.8.21/canonicalize.tex b/v0.8.21/canonicalize.tex new file mode 100644 index 000000000..8fb0d5f2e --- /dev/null +++ b/v0.8.21/canonicalize.tex @@ -0,0 +1,17 @@ +\documentclass[]{standalone} +\usepackage{adjustbox} +\usepackage{amsmath} +\usepackage{graphicx} +\begin{document} +$\left[ +\begin{array}{ccc} + \ddots & ^{\scriptscriptstyle \text{any Pauli}} & \\ + & {\rotatebox[origin=c]{-35}{$\scriptscriptstyle XY\text{ diagonal}$}} & \\ + & ^{\scriptscriptstyle I\text{s or }Z\text{s}} & \ddots \\ + \hline + \ddots & ^{\scriptscriptstyle I\text{s or }Z\text{s}} & \\ + & {\rotatebox[origin=c]{-35}{$\scriptscriptstyle \ \ Z\text{ diagonal}$}} & \\ + & ^{\scriptscriptstyle I\text{s only}} & \ddots +\end{array} +\right]$ +\end{document} \ No newline at end of file diff --git a/v0.8.21/canonicalize_gott.png b/v0.8.21/canonicalize_gott.png new file mode 100644 index 000000000..5e3a92bfa Binary files /dev/null and b/v0.8.21/canonicalize_gott.png differ diff --git a/v0.8.21/canonicalize_gott.tex b/v0.8.21/canonicalize_gott.tex new file mode 100644 index 000000000..d117c573c --- /dev/null +++ b/v0.8.21/canonicalize_gott.tex @@ -0,0 +1,16 @@ +\documentclass[]{standalone} +\usepackage{adjustbox} +\usepackage{amsmath} +\usepackage{graphicx} +\begin{document} +$\left[ +\begin{array}{ccc|ccc|c} + \ddots & ^{\scriptscriptstyle I\text{s or }Z\text{s}} &&&&& \\ + & {\rotatebox[origin=c]{-35}{$\scriptscriptstyle XY\text{ diagonal}$}} &&& ^{\scriptscriptstyle I\text{s or }X\text{s}} && \\ + & & \ddots &&&&{\scriptscriptstyle \text{any}} \\ + &&&\ddots & &&^{\scriptscriptstyle \text{Pauli}} \\ + & ^{\scriptscriptstyle I\text{s or }Z\text{s}} &&& {\rotatebox[origin=c]{-35}{$\scriptscriptstyle \ \ Z\text{ diagonal}$}} && \\ + &&&& ^{\scriptscriptstyle I\text{s only}} & \ddots & +\end{array} +\right]$ +\end{document} \ No newline at end of file diff --git a/v0.8.21/canonicalize_rref.png b/v0.8.21/canonicalize_rref.png new file mode 100644 index 000000000..e5b0093bf Binary files /dev/null and b/v0.8.21/canonicalize_rref.png differ diff --git a/v0.8.21/canonicalize_rref.tex b/v0.8.21/canonicalize_rref.tex new file mode 100644 index 000000000..735b6d9a5 --- /dev/null +++ b/v0.8.21/canonicalize_rref.tex @@ -0,0 +1,33 @@ +\documentclass[]{standalone} +\usepackage{adjustbox} +\usepackage{amsmath} +\usepackage{graphicx} +\begin{document} +$ +\left[ +\begin{array}{c|c} +I & \\ +\vdots & \mbox{RREF}' \\ +I & +\end{array} +\right],\quad +\left[ +\begin{array}{c|c} +I & \\ +\vdots & \mbox{RREF}' \\ +I & \\ \hline +\sigma & * \ldots * +\end{array} +\right] +\mbox{ and } +\left[ +\begin{array}{c|c} +I & \\ +\vdots & \mbox{RREF}' \\ +I & \\ \hline +\sigma_1 & * \ldots * \\ +\sigma_2 & * \ldots * \\ +\end{array} +\right] +$ +\end{document} \ No newline at end of file diff --git a/v0.8.21/commonstates/index.html b/v0.8.21/commonstates/index.html new file mode 100644 index 000000000..d3d07600f --- /dev/null +++ b/v0.8.21/commonstates/index.html @@ -0,0 +1,75 @@ + +Useful States · QuantumClifford.jl

Useful States and Operators

States

Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.

Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.

Below are convenience constructors for common types of states and operators, already implemented in this library.

Pauli Operators

Single qubit PauliOperator is implemented in [single_z] and [single_x].

julia> single_z(4,2)
++ _Z__
+
+julia> single_x(4,3)
++ __X_

All identity operators use zero.

julia> zero(PauliOperator, 3)
++ ___
+
+julia> zero(P"XYZXYZ")
++ ______

Random Pauli operators are implemented as well (with or without a random phase).

julia> using StableRNGs; rng = StableRNG(42);
+
+julia> random_pauli(rng, 4)
++i_ZZ_
+
+julia> random_pauli(rng, 4; nophase=true)
++ ZXZY

Stabilizer States

An all-identity stabilizer can be created with zero.

julia> zero(Stabilizer, 3)
++ ___
++ ___
++ ___
+
+julia> zero(Stabilizer, 2, 3)
++ ___
++ ___
+
+julia> zero(S"XIZ
+              YZX")
++ ___
++ ___

Diagonal stabilizers in different bases are available as well, through one.

julia> one(Stabilizer, 3)
++ Z__
++ _Z_
++ __Z
+
+julia> one(Stabilizer, 3; basis=:Y)
++ Y__
++ _Y_
++ __Y
+
+julia> one(S"XX
+             ZZ")
++ Z_
++ _Z

A random stabilizer (or destabilizers or Clifford operators) can be created as well. We use the algorithm described in (Bravyi and Maslov, 2021).

julia> random_stabilizer(rng, 2,5)
++ YZXZZ
+- XZYYY

Mixed States

Similarly, one can create a diagonal mixed state.

julia> one(MixedDestabilizer, 2, 3)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ X__
++ _X_
+𝒳ₗ━━━
++ __X
+𝒮𝓉𝒶𝒷━
++ Z__
++ _Z_
+𝒵ₗ━━━
++ __Z

Enumerating all Clifford Operations

The algorithm from (Koenig and Smolin, 2014) can be used to enumerate all Clifford operations on a given number of qubits through enumerate_cliffords. Or one can use random_clifford, random_stabilizer to directly sample from that set.

julia> length(enumerate_cliffords(1))
+6
+
+julia> length(enumerate_cliffords(2))
+720

To also enumerate possible phases, you can use enumerate_phases.

julia> length(collect(enumerate_phases(tCNOT)))
+16
+
+julia> length(collect(enumerate_phases(enumerate_cliffords(2))))
+11520

Common entangled states

Bell states and GHZ states have convenience constructors:

julia> bell()
++ XX
++ ZZ
+
+julia> bell(2)
++ XX__
++ ZZ__
++ __XX
++ __ZZ
+
+julia> ghz(4)
++ XXXX
++ ZZ__
++ _ZZ_
++ __ZZ
diff --git a/v0.8.21/datastructures/index.html b/v0.8.21/datastructures/index.html new file mode 100644 index 000000000..cb6222a41 --- /dev/null +++ b/v0.8.21/datastructures/index.html @@ -0,0 +1,2 @@ + +Datastructure Choice · QuantumClifford.jl

Data Structures Options

Choosing Appropriate Tableau Data Structure

There are four different data structures used to represent stabilizer states. If you will never need projective measurements you probably would want to use Stabilizer. If you require projective measurements, but only on pure states, Destabilizer should be the appropriate data structure. If mixed stabilizer states are involved, MixedStabilizer would be necessary.

Stabilizer is simply a list of Pauli operators in a tableau form. As a data structure it does not enforce the requirements for a pure stabilizer state (the rows of the tableau do not necessarily commute, nor are they forced to be Hermitian; the tableau might be underdetermined, redundant, or contradictory). It is up to the user to ensure that the initial values in the tableau are meaningful and consistent.

canonicalize!, project!, and generate! can accept an under determined (mixed state) Stabilizer instance and operate correctly. canonicalize! can also accept a redundant Stabilizer (i.e. not all rows are independent), leaving as many identity rows at the bottom of the canonicalized tableau as the number of redundant stabilizers in the initial tableau.

canonicalize! takes $\mathcal{O}(n^3)$ steps. generate! expects a canonicalized input and then takes $\mathcal{O}(n^2)$ steps. project! takes $\mathcal{O}(n^3)$ for projecting on commuting operators due to the need to call canonicalize! and generate!. If the projections is on an anticommuting operator (or if keep_result=false) then it takes $\mathcal{O}(n^2)$ steps.

MixedStabilizer provides explicit tracking of the rank of the mixed state and works properly when the projection is on a commuting operator not in the stabilizer (see table below for details). Otherwise it has the same performance as Stabilizer.

The canonicalization can be made unnecessary if we track the destabilizer generators. There are two data structures capable of that.

Destabilizer stores both the destabilizer and stabilizer states. project! called on it never requires a stabilizer canonicalization, hence it runs in $\mathcal{O}(n^2)$. However, project! will raise an exception if you try to project on a commuting state that is not in the stabilizer as that would be an expensive $\mathcal{O}(n^3)$ operation.

MixedDestabilizer tracks both the destabilizer operators and the logical operators in addition to the stabilizer generators. It does not require canonicalization for measurements and its project! operations always takes $\mathcal{O}(n^2)$.

For the operation _, anticom_index, result = project!(...) we have the following behavior:

projectionStabilizerMixedStabilizerDestabilizerMixedDestabilizer
on anticommuting operator anticom_index>0 result===nothingcorrect result in $\mathcal{O}(n^2)$ stepssame as Stabilizersame as Stabilizersame as Stabilizer
on commuting operator in the stabilizer anticom_index==0 result!==nothing$\mathcal{O}(n^3)$; or $\mathcal{O}(n^2)$ if keep_result=false$\mathcal{O}(n^3)$$\mathcal{O}(n^2)$ if the state is pure, throws exception otherwise$\mathcal{O}(n^2)$
on commuting operator out of the stabilizer[1] anticom_index==rank result===nothing$\mathcal{O}(n^3)$, but the user needs to manually include the new operator to the stabilizer; or $\mathcal{O}(n^2)$ if keep_result=false but then result indistinguishable from cell above and anticom_index==0$\mathcal{O}(n^3)$ and rank goes up by onenot applicable if the state is pure, throws exception otherwise$\mathcal{O}(n^2)$ and rank goes up by one

Notice the results when the projection operator commutes with the state but is not generated by the stabilizers of the state (the last row of the table). In that case we have _, anticom_index, result = project!(...) where both anticom_index==rank and result===nothing, with rank being the new rank after projection, one more than the number of rows in the tableau before the measurement.

Bit Packing in Integers and Array Order

We do not use boolean arrays to store information about the qubits as this would be wasteful (7 out of 8 bits in the boolean would be unused). Instead, we use all 8 qubits in a byte and perform bitwise logical operations as necessary. Implementation details of the object in RAM can matter for performance. The library permits any of the standard UInt types to be used for packing the bits, and larger UInt types (like UInt64) are usually faster as they permit working on 64 qubits at a time (instead of 1 if we used a boolean, or 8 if we used a byte).

Moreover, how a tableau is stored in memory can affect performance, as a row-major storage usually permits more efficient use of the CPU cache (for the particular algorithms we use).

Both of these parameters are benchmarked (testing the application of a Pauli operator, which is an $\mathcal{O}(n^2)$ operation; and testing the canonicalization of a Stabilizer, which is an $\mathcal{O}(n^3)$ operation). Row-major UInt64 is the best performing and it is used by default in this library.

  • 1This can occur only if the state being projected is mixed. Both Stabilizer and Destabilizer can be used for mixed states by simply providing fewer stabilizer generators than qubits at initialization. This can be useful for low-level code that tries to avoid the extra memory cost of using MixedStabilizer and MixedDestabilizer but should be avoided otherwise. project! works correctly or raises an explicit warning on all 4 data structures.
diff --git a/v0.8.21/ecc_example_sim/86fcd35a.png b/v0.8.21/ecc_example_sim/86fcd35a.png new file mode 100644 index 000000000..1e4cdc9f3 Binary files /dev/null and b/v0.8.21/ecc_example_sim/86fcd35a.png differ diff --git a/v0.8.21/ecc_example_sim/882783a8.png b/v0.8.21/ecc_example_sim/882783a8.png new file mode 100644 index 000000000..f6912d902 Binary files /dev/null and b/v0.8.21/ecc_example_sim/882783a8.png differ diff --git a/v0.8.21/ecc_example_sim/index.html b/v0.8.21/ecc_example_sim/index.html new file mode 100644 index 000000000..5251f63c1 --- /dev/null +++ b/v0.8.21/ecc_example_sim/index.html @@ -0,0 +1,26 @@ + +ECC example · QuantumClifford.jl

ECC example with Pauli Frames

The documentation is incomplete

Waiting for a better documentation than the small example below. Check out also the page on ECC performance evaluators

Consider Steane 7-qubit code:

using QuantumClifford
+using QuantumClifford.ECC: Steane7, naive_syndrome_circuit, naive_encoding_circuit, parity_checks, code_s, code_n
+using Quantikz
+
+code = Steane7()
+H = parity_checks(code)
+ ___XXXX
++ _XX__XX
++ X_X_X_X
++ ___ZZZZ
++ _ZZ__ZZ
++ Z_Z_Z_Z

... and the corresponding encoding circuit

ecirc = naive_encoding_circuit(code)
Example block output

... and the corresponding syndrome measurement circuit (the non-fault tolerant one)

scirc, _ = naive_syndrome_circuit(code)
(QuantumClifford.AbstractOperation[sXCX(4,8), sXCX(5,8), sXCX(6,8), sXCX(7,8), sMRZ(8, 1), sXCX(2,9), sXCX(3,9), sXCX(6,9), sXCX(7,9), sMRZ(9, 2)  …  sCNOT(2,12), sCNOT(3,12), sCNOT(6,12), sCNOT(7,12), sMRZ(12, 5), sCNOT(1,13), sCNOT(3,13), sCNOT(5,13), sCNOT(7,13), sMRZ(13, 6)], 6, 1:6)

The most straightforward way to start sampling syndromes is to set up a table of Pauli frames.

circuit = [ecirc..., scirc...]
+nframes = 4
+frames = pftrajectories(circuit; trajectories=nframes) # run the sims
+pfmeasurements(frames)                                 # extract the measurements
4×6 Matrix{Bool}:
+ 0  0  0  0  0  0
+ 0  0  0  0  0  0
+ 0  0  0  0  0  0
+ 0  0  0  0  0  0

The pftrajectories function is multithreaded. If you want more low-level control over these Pauli frame simulations, check out the PauliFrame structure, the other methods of pftrajectories, and the circuit compactifaction function compactify_circuit.

If you want to model Pauli errors, use:

errprob = 0.1
+errors = [PauliError(i,errprob) for i in 1:code_n(code)]
+fullcircuit = [ecirc..., errors..., scirc...]
Example block output

And running this noisy simulation:

frames = pftrajectories(fullcircuit; trajectories=nframes)
+pfmeasurements(frames)
4×6 Matrix{Bool}:
+ 0  0  0  0  0  0
+ 0  1  0  0  1  0
+ 1  1  1  1  1  1
+ 0  0  0  0  0  0
diff --git a/v0.8.21/ghz4graph.png b/v0.8.21/ghz4graph.png new file mode 100644 index 000000000..1624c6d71 Binary files /dev/null and b/v0.8.21/ghz4graph.png differ diff --git a/v0.8.21/graphs/index.html b/v0.8.21/graphs/index.html new file mode 100644 index 000000000..73b203937 --- /dev/null +++ b/v0.8.21/graphs/index.html @@ -0,0 +1,46 @@ + +Graph States · QuantumClifford.jl

Graph States

The `graphstate` API is not considered stable

graphstate returns a lot of information about encoding a given stabilizer state in a graph. A different API is being designed that streamlines the work with graph states.

Conversion to and from graph states is possible.

Consider a GHZ state:

ghz(4)
+ XXXX
++ ZZ__
++ _ZZ_
++ __ZZ

It can be converted to a graph state with graphstate

graphstate(ghz(4))[1]

Notice that the initial GHZ state was not in the typical graph state form. We can see that explicitly by converting back and forth between the two forms:

julia> using Graphs, QuantumClifford
+
+julia> ghz(4)
++ XXXX
++ ZZ__
++ _ZZ_
++ __ZZ
+
+julia> Stabilizer(Graph(ghz(4)))
++ XZZZ
++ ZX__
++ Z_X_
++ Z__X

There is a set of single-qubit operations that can convert any stabilizer tableau into a state representable as a graph. These transformations are performed implicitly by the Graph constructor when converting from a Stabilizer. If you need the explicit transformation you can use the graphstate function that specifies which qubits require a Hadamard, Inverse Phase, or Phase Flip gate. The graph_gatesequence or graph_gate helper functions can be used to generate the exact operations:

julia> s = ghz(4)
++ XXXX
++ ZZ__
++ _ZZ_
++ __ZZ
+
+julia> g, h_idx, ip_idx, z_idx = graphstate(s);
+
+julia> gate = graph_gate(h_idx, ip_idx, z_idx, nqubits(s))
+X₁ ⟼ + X___
+X₂ ⟼ + _Z__
+X₃ ⟼ + __Z_
+X₄ ⟼ + ___Z
+Z₁ ⟼ + Z___
+Z₂ ⟼ + _X__
+Z₃ ⟼ + __X_
+Z₄ ⟼ + ___X
+
+julia> canonicalize!(apply!(s,gate)) == canonicalize!(Stabilizer(g))
+true

These converters also provides for a convenient way to create graph and cluster states, by using the helper constructors provided in Graphs.jl.

julia> Stabilizer(grid([4,1])) # Linear cluster state
++ XZ__
++ ZXZ_
++ _ZXZ
++ __ZX
+
+julia> Stabilizer(grid([2,2])) # Small 2D cluster state
++ XZZ_
++ ZX_Z
++ Z_XZ
++ _ZZX

Graphs are represented with the Graphs.jl package and plotting can be done both in Plots.jl and Makie.jl (with GraphMakie).

diff --git a/v0.8.21/index.html b/v0.8.21/index.html new file mode 100644 index 000000000..f64fdb722 --- /dev/null +++ b/v0.8.21/index.html @@ -0,0 +1,18 @@ + +QuantumClifford.jl · QuantumClifford.jl

QuantumClifford.jl

QuantumClifford.jl is a Julia library for simulation of Clifford circuits, which are a subclass of quantum circuits that can be efficiently simulated on a classical computer.

This library uses the tableaux formalism[1] with the destabilizer improvements[2]. Pauli frames are supported for faster repeated simulation of noisy circuits. Various symbolic and algebraic tools for manipulating, converting, and visualizing states and circuits are also implemented.

The library consists of two main parts: Tools for working with the algebra of Stabilizer Tableaux and tools specifically for efficient Circuit Simulation.

Stabilizer Tableau Algebra

The Stabilizer Tableau Algebra component of QuantumClifford.jl efficiently handles pure and mixed stabilizer states of thousands of qubits, along with support for sparse or dense Clifford operations acting upon them. It provides operations such as canonicalization, projection, generation , and partial traces. The code is vectorized and multithreaded, offering fast, in-place, and allocation-free implementations. Tools for conversion to graph states and for visualization of tableaux are available.

See the Stabilizer Tableau Algebra manual or the curated list of useful functions.

Example Usage

julia> using QuantumClifford
+
+julia> P"X" * P"Z"
+-iY
+
+julia> P"X" ⊗ P"Z"
++ XZ
+
+julia> S"-XX
+         +ZZ"
+- XX
++ ZZ
+
+julia> tCNOT * S"-XX
+                 +ZZ"
+- X_
++ _Z

Circuit Simulation

The circuit simulation component of QuantumClifford.jl enables Monte Carlo (or symbolic) simulations of noisy Clifford circuits. It provides three main simulation methods: mctrajectories, pftrajectories, and petrajectories. These methods offer varying levels of efficiency, accuracy, and insight.

Monte Carlo Simulations with Stabilizer Tableaux (mctrajectories)

The mctrajectories method runs Monte Carlo simulations using a Stabilizer tableau representation for the quantum states.

Monte Carlo Simulations with Pauli Frames (pftrajectories)

The pftrajectories method runs Monte Carlo simulations of Pauli frames over a single reference Stabilizer tableau simulation. This approach is much more efficient but supports a smaller class of circuits.

Symbolic Depth-First Traversal of Quantum Trajectories (petrajectories)

The petrajectories method performs a depth-first traversal of the most probable quantum trajectories, providing a fixed-order approximation of the circuit's behavior. This approach gives symbolic expressions for various figures of merit instead of just a numeric value.

diff --git a/v0.8.21/mixed/index.html b/v0.8.21/mixed/index.html new file mode 100644 index 000000000..4159e80f0 --- /dev/null +++ b/v0.8.21/mixed/index.html @@ -0,0 +1,60 @@ + +Mixed States · QuantumClifford.jl

Mixed Stabilizer States

The Stabilizer and Destabilizer have some support for mixed states (by being initialized with an incomplete list of stabilizer generators), but for most purposes one would use the Mixed* data structures.

Mixed stabilizer states are implemented with MixedStabilizer and MixedDestabilizer, the latter of which is the preferred data structure for most tasks as it is much faster by virtue of tracking the destabilizer generators.

julia> s = S"XXX
+             IZZ";
+
+julia> Destabilizer(s)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z__
++ _X_
+𝒮𝓉𝒶𝒷━
++ XXX
++ _ZZ

Unlike Destabilizer, MixedDestabilizer also tracks the logical operation generators.

julia> m = MixedDestabilizer(s)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z__
++ _X_
+𝒳ₗ━━━
++ _XX
+𝒮𝓉𝒶𝒷━
++ XXX
++ _ZZ
+𝒵ₗ━━━
++ Z_Z
+
+julia> stabilizerview(m)
++ XXX
++ _ZZ
+
+julia> destabilizerview(m)
++ Z__
++ _X_
+
+julia> logicalxview(m)
++ _XX
+
+julia> logicalzview(m)
++ Z_Z

Gottesman Canonicalization

To obtain the logical operators we perform a different type of canonicalization, described in Gottesman's thesis and implemented in canonicalize_gott!. Unlike canonicalize! which uses only row operations, canonicalize_gott! performs column swaps as well. MixedDestabilizer undoes those swaps by default when instantiated, but that behavior can be turned off, if you prefer to work with the canonicalized tableau.

julia> s = S"XXX
+             ZIZ";
+
+julia> MixedDestabilizer(s)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z__
++ __X
+𝒳ₗ━━━
++ _X_
+𝒮𝓉𝒶𝒷━
++ XXX
++ Z_Z
+𝒵ₗ━━━
++ ZZ_
+
+julia> MixedDestabilizer(s; undoperm=false)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z__
++ _X_
+𝒳ₗ━━━
++ __X
+𝒮𝓉𝒶𝒷━
++ XXX
++ ZZ_
+𝒵ₗ━━━
++ Z_Z

Destabilizer and MixedStabilizer do not use any column swaps on instantiation as they do not track the logical operators.

diff --git a/v0.8.21/noise/index.html b/v0.8.21/noise/index.html new file mode 100644 index 000000000..4ff3d267b --- /dev/null +++ b/v0.8.21/noise/index.html @@ -0,0 +1,2 @@ + +Noise Processes · QuantumClifford.jl
diff --git a/v0.8.21/noisycircuits/index.html b/v0.8.21/noisycircuits/index.html new file mode 100644 index 000000000..4ad67f864 --- /dev/null +++ b/v0.8.21/noisycircuits/index.html @@ -0,0 +1,2 @@ + +Simulation of Noisy Circuits · QuantumClifford.jl

Simulation of Noisy Clifford Circuits

Unstable

This is unfinished experimental functionality that will change significantly.

We have experimental support for simulation of noisy Clifford circuits which can be imported with using QuantumClifford.Experimental.NoisyCircuits.

Both Monte Carlo and Perturbative Expansion approaches are supported. When performing a perturbative expansion in the noise parameter, the expansion can optionally be performed symbolically, to arbitrary high orders.

Multiple notebooks with examples are also available. For instance, see this tutorial on entanglement purification for many examples.

diff --git a/v0.8.21/noisycircuits_API/index.html b/v0.8.21/noisycircuits_API/index.html new file mode 100644 index 000000000..65f056765 --- /dev/null +++ b/v0.8.21/noisycircuits_API/index.html @@ -0,0 +1,2 @@ + +API · QuantumClifford.jl

Full API (autogenerated)

Unstable

This is experimental functionality with an unstable API.

diff --git a/v0.8.21/noisycircuits_mc/index.html b/v0.8.21/noisycircuits_mc/index.html new file mode 100644 index 000000000..66feb2451 --- /dev/null +++ b/v0.8.21/noisycircuits_mc/index.html @@ -0,0 +1,21 @@ + +Monte Carlo · QuantumClifford.jl

Monte Carlo simulations of noisy Clifford circuits

Unstable

This is experimental functionality with an unstable API.

Import with using QuantumClifford.Experimental.NoisyCircuits.

This module enables the simulation of noisy Clifford circuits through a Monte Carlo method where the same circuit is evaluated multiple times with random errors interspersed through it as prescribed by a given error model.

Below is an example of a purification circuit. We first prepare the circuit we desire to use, including a noise model. Quantikz.jl was is used to visualize the circuit.

good_bell_state = S"XX
+                    ZZ"
+initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)
+
+g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)
+g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)
+m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4
+v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair
+epsilon = 0.01 # The error rate
+n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))
+
+# This circuit performs a depolarization at rate `epsilon` to all qubits,
+# then bilater CNOT operations
+# then a Bell measurement
+# followed by checking whether the final result indeed corresponds to the correct Bell pair.
+circuit = [n,g1,g2,m,v]
Example block output

And we can run a Monte Carlo simulation of that circuit with mctrajectories.

mctrajectories(initial_state, circuit, trajectories=500)
Dict{CircuitStatus, Float64} with 4 entries:
+  continue:CircuitStatus(0)      => 0.0
+  false_success:CircuitStatus(2) => 23.0
+  failure:CircuitStatus(3)       => 18.0
+  true_success:CircuitStatus(1)  => 459.0

For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification for many examples.

Interface for custom operations

If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.

applywstatus!(s::T, g::Operation)::Tuple{T,Symbol} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation. Predefined statuses are kept in the registered_statuses list, but you can add more. Be sure to expand this list if you want the trajectory simulators using your custom statuses to output all trajectories.

There is also applynoise! which is convenient wait to create a noise model that can then be plugged into the NoisyGate struct, letting you reuse the predefined perfect gates and measurements. However, you can also just make up your own noise operator simply by implementing applywstatus! for it.

You can also consult the list of implemented operators.

diff --git a/v0.8.21/noisycircuits_ops/index.html b/v0.8.21/noisycircuits_ops/index.html new file mode 100644 index 000000000..a3b677e3b --- /dev/null +++ b/v0.8.21/noisycircuits_ops/index.html @@ -0,0 +1,13 @@ + +Circuit Operations · QuantumClifford.jl

Operators in Circuit Simulations

Unstable

This is experimental functionality with an unstable API.

Import with using QuantumClifford.Experimental.NoisyCircuits.

Too see a condensed list of all operations check out the API docs.

Unitary Gates

We distinguish between symbolic gates like sCNOT that have specialized (fast) apply! methods (usually just for single and two qubit gates) and general tableau representation of gates like CliffordOperator that can represent any multi-qubit gate.

Predefined unitary gates are available, like sCNOT, sHadamard, etc.

[sCNOT(2,4),sHadamard(2),sCPHASE(1,3),sSWAP(2,4)]
Example block output

Any arbitrary tableaux can be used as a gate too.

They can be specified by giving a Clifford operator tableaux and the indices on which it acts (particularly useful for gates acting on a small part of a circuit):

SparseGate(tCNOT, [2,4])
Example block output

The Clifford operator tableaux can be completely arbitrary.

SparseGate(random_clifford(3), [2,4,5])
Example block output

If the Clifford operator acts on all qubits, we do not need to specify indices, just use the operator.

Noisy Gates

Each gate can be followed by noise applied to the qubits on which it has acted. This is done by wrapping the given gate into a NoisyGate

ε = 0.03 # X/Y/Z error probability
+noise = UnbiasedUncorrelatedNoise(ε)
+noisy_gate = NoisyGate(SparseGate(tCNOT, [2,4]), noise)
Example block output

In circuit diagrams the noise is not depicted, but after each application of the gate defined in noisy_gate, a noise operator will also be applied. The example above is of Pauli Depolarization implemented by UnbiasedUncorrelatedNoise.

One can also apply only the noise operator by using NoiseOp which acts only on specified qubits. Or alternatively, one can use NoiseOpAll in order to apply noise to all qubits.

[NoiseOp(noise, [4,5]), NoiseOpAll(noise)]
Example block output

Coincidence Measurements

Global parity measurements involving single-qubit projections and classical communication are implemented with BellMeasurement. One needs to specify the axes of measurement and the qubits being measured. If the parity is trivial, the circuit continues, if the parity is non-trivial, the circuit ends and reports a detected failure. This operator is frequently used in the simulation of entanglement purification.

BellMeasurement([sMX(1), sMY(3), sMZ(4)])
Example block output

There is also NoisyBellMeasurement that takes the bit-flip probability of a single-qubit measurement as a third argument.

Stabilizer Measurements

A measurement over one or more qubits can also be performed, e.g., a direct stabilizer measurement on multiple qubits without the use of ancillary qubits. When applied to multiple qubits, this differs from BellMeasurement as it performs a single projection, unlike BellMeasurement which performs a separate projection for every single qubit involved. This measurement is implemented in PauliMeasurement which requires a Pauli operator on which to project and the index of the classical bit in which to store the result. Alternatively, there are sMX, sMZ, sMY if you are measuring a single qubit.

[PauliMeasurement(P"XYZ", 1), sMZ(2, 2)]
Example block output

TODO: SparseMeasurement, NoisyMeasurement

Verification Operations

At the end of many circuits one might want to check whether they performed correctly. The VerifyOp operation corresponds to an unphysical perfect tomographic operation, checking whether the state of the qubits at the given indices is indeed what is expected. If it is, the operation reports a success, otherwise it reports an undetected error.

desired_state = random_stabilizer(5)
+qubit_indices = [1,2,3,4,7]
+VerifyOp(desired_state, qubit_indices)
Example block output

Reset Operations

The Reset operations lets you trace out the specified qubits and set their state to a specific tableau.

new_state = random_stabilizer(3)
+qubit_indices = [1,2,3]
+Reset(new_state, qubit_indices)
Example block output

It can be done anywhere in a circuit, not just at the beginning.

Gates Conditioned on Classical Bits

ConditionalGate is a conditional gate that performs one of two provided gates, depending on the value of a given classical bit.

DecisionGate is a conditional gate that performs one of the supplied gates, depending on the output of decisionfunction applied to the entire classical bit register.

gate1 = SparseGate(tCNOT,   [1,2])
+gate2 = sCPHASE(1,2)
+gate3 = SparseGate(tSWAP,   [1,3])
+cg = ConditionalGate(gate1, gate2, 2)
+dg = DecisionGate([gate1,gate2,gate3], bit_register->1) # it will always perform gate1
+[sMX(4,1), sMZ(5,2), cg, dg]
Example block output

TODO: Split ConditionalGate into quantum conditional and classical conditional

diff --git a/v0.8.21/noisycircuits_perturb/index.html b/v0.8.21/noisycircuits_perturb/index.html new file mode 100644 index 000000000..3b9cb38c4 --- /dev/null +++ b/v0.8.21/noisycircuits_perturb/index.html @@ -0,0 +1,23 @@ + +Perturbative Expansions · QuantumClifford.jl

Perturbative expansions for simulating noisy Clifford circuits

Unstable

This is experimental functionality with an unstable API.

Import with using QuantumClifford.Experimental.NoisyCircuits.

This module enables the simulation of noisy Clifford circuits through a perturbative expansion in the noise parameter (assuming the noise is small). Instead of simulating many Monte Carlo trajectories, only the leading order trajectories are exhaustively enumerated and simulated.

Here is an example of a purification circuit (the same circuit seen in the Monte Carlo example)

good_bell_state = S"XX
+                    ZZ"
+canonicalize_rref!(good_bell_state)
+initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)
+
+g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)
+g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)
+m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4
+v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair
+epsilon = 0.01 # The error rate
+n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))
+
+# This circuit performs a depolarization at rate `epsilon` to all qubits,
+# then bilater CNOT operations
+# then a Bell measurement
+# followed by checking whether the final result indeed corresponds to the correct Bell pair.
+circuit = [n,g1,g2,m,v]
+
+petrajectories(initial_state, circuit)
Dict{CircuitStatus, Float64} with 3 entries:
+  false_success:CircuitStatus(2) => 0.0547604
+  failure:CircuitStatus(3)       => 0.0365069
+  true_success:CircuitStatus(1)  => 0.903546

For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification.

Symbolic expansions

The perturbative expansion method works with symbolic variables as well. One can use any of the symbolic libraries available in Julia and simply plug symbolic parameters in lieu of numeric parameters. A detailed example is available as a Jupyter notebook.

Interface for custom operations

If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.

applyop_branches!(s::T, g::Operation; max_order=1)::Vector{Tuple{T,Symbol,Real,Int}} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation, the Real is the probability for that branch, and the Int is the order of that branch.

There is also applynoise_branches! which is convenient for use in NoisyGate, but you can also just make up your own noise operator simply by implementing applyop_branches! for it.

You can also consult the list of implemented operators.

diff --git a/v0.8.21/notebooks/Noisy_Circuits_Tutorial_with_Purification_Circuits.ipynb b/v0.8.21/notebooks/Noisy_Circuits_Tutorial_with_Purification_Circuits.ipynb new file mode 100644 index 000000000..5340338b8 --- /dev/null +++ b/v0.8.21/notebooks/Noisy_Circuits_Tutorial_with_Purification_Circuits.ipynb @@ -0,0 +1,1565 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "using QuantumClifford\n", + "using QuantumClifford.Experimental.NoisyCircuits\n", + "using QuantumCliffordPlots\n", + "using AbstractAlgebra\n", + "using Plots\n", + "using LaTeXStrings\n", + "using Quantikz: displaycircuit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# States of interest\n", + "\n", + "All of the states will be expressed in one of the many canonical forms available, so that comparisons can be performed easily." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A typical Bell pair" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "+ ZZ\n", + "+ XX" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_bell_state = S\"XX\n", + " ZZ\"\n", + "canonicalize_rref!(good_bell_state)[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A typical GHZ state" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "+ _ZZ\n", + "+ Z_Z\n", + "+ XXX" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_ghz3_state = S\"XXX\n", + " ZZI\n", + " IZZ\"\n", + "canonicalize_rref!(good_ghz3_state)[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The bi-colored graph state version of a GHZ state" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "+ _ZZ\n", + "+ ZXX\n", + "+ X_Z" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_ghz3_state = S\"ZXX\n", + " XZI\n", + " XIZ\"\n", + "canonicalize_rref!(good_ghz3_state)[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Warmup example: Purifying a Bell pair\n", + "\n", + "We will first run a typical purification circuit on two perfect Bell pairs. Given that all gates and initial states are perfect, the circuit is redundant, but running this calculation is a good sanity check. After all, if the circuit is not preserving perfect Bell pairs, there is little chance it would be doing any purification either.\n", + "\n", + "There are three components to the circuit: the bilateral CPHASE (or CNOT) gates, the coincidence measurement performed by Alice and Bob to check for errors, and a \"verify\" step at the end of the simulation. Experimentally, Alice and Bob do not have access to this operation, but we add it in our calculation in order to verify whether the final state obtained by this procedure is indeed the state we want.\n", + "\n", + "In terms of library features, we use the `SparseGate` and `BellMeasurement` objects for the \"real\" part of the circuit and the `VerifyOp` for the verification step." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "4-element Vector{AbstractOperation}:\n", + " Symbolic two-qubit gate on qubit 1 and 3\n", + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n", + "\n", + " Symbolic two-qubit gate on qubit 2 and 4\n", + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n", + "\n", + " BellMeasurement(QuantumClifford.AbstractMeasurement[sMX{Nothing}(3, nothing), sMX{Nothing}(4, nothing)])\n", + " VerifyOp(+ ZZ\n", + "+ XX, [1, 2])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n", + "circuit = [\n", + " sCPHASE(1,3),\n", + " sCPHASE(2,4),\n", + " BellMeasurement([sMX(3),sMX(4)]),\n", + " VerifyOp(good_bell_state, [1,2])\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can run a Monte Carlo simulation with `mctrajectories`, or a Perturbative Expansion calculation with `petrajectories`. Given that there is no noise source in this circuit, all Monte Carlo samples will give the same result." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Float64} with 3 entries:\n", + " failure:CircuitStatus(3) => 0.0\n", + " false_success:CircuitStatus(2) => 0.0\n", + " true_success:CircuitStatus(1) => 1.0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "petrajectories(initial_state, circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Int64} with 1 entry:\n", + " true_success:CircuitStatus(1) => 100" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mctrajectories(initial_state, circuit, trajectories=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The possible final statuses (`:undetected_failure`, `:detected_failure`, `:true_success`) come from the definitions of the various circuit operations. `SparseGate` always generates `:continue`, which tells the simulator to continue to the next operation. `BellMeasurement` can report `:detected_failure` or `:continue`, depending whether there was an anti-coincidence or a coincidence. Finally `VerifyOp` reports either `:true_success` if we indeed obtained the desired state, or a `:undetected_failure` if the obtained state is not the desired one even though the measurement step had reported `:continue`. Custom statuses can be implemented as well, as seen later on." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Later on we will also need to compare these results against no purification so we define this circuit for convenience:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "nopurification_circuit = [VerifyOp(good_bell_state, [1,2])];" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define a network noise parameter to be used for the rest of the notebook\n", + "\n", + "For a more interesting calculation, we will now introduce network noise with the `NoiseOpAll` operation, which causes depolarization of certain strength to all of the qubits." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "netnoise_value = 0.10\n", + "one_third_netnoise = netnoise_value/3 # The probability for X, Y, or Z error\n", + "netnoise = UnbiasedUncorrelatedNoise(one_third_netnoise)\n", + "netnoise_opall = NoiseOpAll(netnoise);" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "5-element Vector{AbstractOperation}:\n", + " NoiseOpAll(UnbiasedUncorrelatedNoise{Float64}(0.03333333333333333))\n", + " Symbolic two-qubit gate on qubit 1 and 3\n", + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n", + "\n", + " Symbolic two-qubit gate on qubit 2 and 4\n", + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n", + "\n", + " BellMeasurement(QuantumClifford.AbstractMeasurement[sMX{Nothing}(3, nothing), sMX{Nothing}(4, nothing)])\n", + " VerifyOp(+ ZZ\n", + "+ XX, [1, 2])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[netnoise_opall,circuit...] # The explosions denote depolarization noise" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Float64} with 3 entries:\n", + " failure:CircuitStatus(3) => 0.1944\n", + " false_success:CircuitStatus(2) => 0.0972\n", + " true_success:CircuitStatus(1) => 0.6561" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pe_netnoise = petrajectories(initial_state, [netnoise_opall,circuit...])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Float64} with 3 entries:\n", + " failure:CircuitStatus(3) => 0.0\n", + " false_success:CircuitStatus(2) => 0.186667\n", + " true_success:CircuitStatus(1) => 0.813333" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pe_netnoise_nopurification = petrajectories(good_bell_state,\n", + " [netnoise_opall,nopurification_circuit...],max_order=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "Therefore a network depolarization rate of 0.1\n", + "causes the fidelity to drop to\n", + "$F_{0}=\n", + "0.813\n", + "$.\n" + ], + "text/plain": [ + "L\"Therefore a network depolarization rate of 0.1\n", + "causes the fidelity to drop to\n", + "$F_{0}=\n", + "0.813\n", + "$.\n", + "\"" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "latexstring(\"\"\"\n", + " Therefore a network depolarization rate of $(3*one_third_netnoise)\n", + " causes the fidelity to drop to\n", + " \\$F_{0}=\n", + " $(round(pe_netnoise_nopurification[true_success_stat],digits=3))\n", + " \\$.\n", + " \"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "But purification can increase the fidelity to\n", + "$\\frac{\\mathrm{true\\ success}}{\\mathrm{true\\ success}+\\mathrm{undetected\\ failure}}=\n", + "0.871\n", + "$.\n" + ], + "text/plain": [ + "L\"But purification can increase the fidelity to\n", + "$\\frac{\\mathrm{true\\ success}}{\\mathrm{true\\ success}+\\mathrm{undetected\\ failure}}=\n", + "0.871\n", + "$.\n", + "\"" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "latexstring(\"\"\"\n", + " But purification can increase the fidelity to\n", + " \\$\\\\frac{\\\\mathrm{true\\\\ success}}{\\\\mathrm{true\\\\ success}+\\\\mathrm{undetected\\\\ failure}}=\n", + " $(round(pe_netnoise[true_success_stat] / (pe_netnoise[true_success_stat]+pe_netnoise[false_success_stat]),digits=3))\n", + " \\$.\n", + " \"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "With a rate of positive coincidence measurements of\n", + "$\\mathrm{true\\ success}+\\mathrm{undetected\\ failure}=\n", + "0.85\n", + "$.\n" + ], + "text/plain": [ + "L\"With a rate of positive coincidence measurements of\n", + "$\\mathrm{true\\ success}+\\mathrm{undetected\\ failure}=\n", + "0.85\n", + "$.\n", + "\"" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "latexstring(\"\"\"\n", + " With a rate of positive coincidence measurements of\n", + " \\$\\\\mathrm{true\\\\ success}+\\\\mathrm{undetected\\\\ failure}=\n", + " $(round(pe_netnoise[true_success_stat]+pe_netnoise[failure_stat],digits=3))\n", + " \\$.\n", + " \"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Monte Carlo instead of Perturbative Expansions\n", + "\n", + "The 10% network error rate we have picked is not all that small, and the perturbative expansion will not be all that accurate. We can attempt Monte Carlo simulations. For very large circuits this would be cheaper than perturbative expansions. Choosing the best method is a balancing act that depends on the desired accuracy, the size of the circuit, and the number of noisy components." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Int64} with 3 entries:\n", + " failure:CircuitStatus(3) => 2209\n", + " false_success:CircuitStatus(2) => 1133\n", + " true_success:CircuitStatus(1) => 6658" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mc_netnoise = mctrajectories(initial_state, [netnoise_opall,circuit...],\n", + " trajectories=10000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic Perturbative Expansions\n", + "\n", + "The perturbative expansions can be done with any of the available symbolic libraries under Julia (including the Julia interface to the SymPy Python library). Here we give an example with `AbstractAlgebra.jl`, part of Nemo. Fractions are a bit clunky, so we treat the numerator and denominator separately. `SymPy` would be simpler to use, but it can be a bit slower.\n", + "\n", + "We will define two symbols, one for the network noise, and one for the gate noise to be used later." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "using AbstractAlgebra\n", + "field = RealField # If you want to use multiprecision floats\n", + "# field = QQ # If you want to use rationals\n", + "R, (e_netn, e_gate) = PolynomialRing(field, [\"e_n\", \"e_g\"],\n", + " ordering=:deglex)\n", + "sym_unity = R(1);" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "sym_netnoise = UnbiasedUncorrelatedNoise(1//3*e_netn)\n", + "sym_netnoise_opall = NoiseOpAll(sym_netnoise);" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "sym_pe_netnoise = petrajectories(initial_state, [sym_netnoise_opall,circuit...],\n", + " branch_weight=sym_unity)\n", + "\n", + "sym_true_success = sym_pe_netnoise[true_success_stat]\n", + "sym_coincidence_prob = (sym_pe_netnoise[true_success_stat]+sym_pe_netnoise[failure_stat]);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can print out the symbolic expression:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$e_n^4 - 4.0*e_n^3 + 6.0*e_n^2 - 4.0*e_n + 1$" + ], + "text/plain": [ + "L\"$e_n^4 - 4.0*e_n^3 + 6.0*e_n^2 - 4.0*e_n + 1$\"" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "latexstring(sym_true_success)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And evaluate it to compare it with the numerical calculation:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.65609999999999998852059750198417731326117063872516155242919921875" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sym_true_success(netnoise_value, 0) # evaluate at e_n = netnoise_value, e_g = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6561" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pe_netnoise[true_success_stat]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Higher order expansions\n", + "\n", + "Higher order expansions are also possible with this library, however the cost of the simulation grows exponentially in the order, due to the combinatorial explosion of trajectories that need to be followed. See the example below where we see the number of branches for the depolarization acting on all qubits." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(order = 0, nb_of_branches = 1, total_probability = 0.6561)\n", + "(order = 1, nb_of_branches = 13, total_probability = 0.9476999999999999)\n", + "(order = 2, nb_of_branches = 67, total_probability = 0.9963000000000005)\n", + "(order = 3, nb_of_branches = 175, total_probability = 0.9999000000000001)\n", + "(order = 4, nb_of_branches = 256, total_probability = 1.0000000000000007)\n" + ] + } + ], + "source": [ + "for order in [0,1,2,3,4]\n", + " branches = applynoise_branches(initial_state, netnoise, [1,2,3,4], max_order=order)\n", + " println((order = order, nb_of_branches = length(branches), total_probability = sum(b[2] for b in branches)))\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us compute the whole circuits to the given order" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.019745 seconds (36.96 k allocations: 1.864 MiB, 74.66% compilation time)\n", + " 0.008585 seconds (85.03 k allocations: 4.112 MiB)\n", + " 0.012967 seconds (123.58 k allocations: 5.922 MiB)\n" + ] + } + ], + "source": [ + "@time sym_pe_netnoise2 = petrajectories(initial_state, [sym_netnoise_opall,circuit...],\n", + " branch_weight=sym_unity, max_order=2);\n", + "@time sym_pe_netnoise3 = petrajectories(initial_state, [sym_netnoise_opall,circuit...],\n", + " branch_weight=sym_unity, max_order=3);\n", + "@time sym_pe_netnoise4 = petrajectories(initial_state, [sym_netnoise_opall,circuit...],\n", + " branch_weight=sym_unity, max_order=4);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### All of the results together" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot(title=\"Purified Fidelity vs Initial Fidelity\\naccording to different calculation methods\")\n", + "\n", + "netnoise_pe_samples = 0.0:0.005:0.4\n", + "netnoise_mc_samples = 0.0:0.05:0.4\n", + "mc_trajectories = [50, 5000]\n", + "\n", + "# No purification\n", + "exact_solution_no_purification = petrajectories(good_bell_state,\n", + " [sym_netnoise_opall,nopurification_circuit...],\n", + " branch_weight=sym_unity,\n", + " max_order=100)\n", + "F0 = exact_solution_no_purification[true_success_stat].(netnoise_pe_samples,0)\n", + "plot!(F0,F0,color=:black,alpha=0.3,label=false)\n", + "\n", + "# Symbolic perturbative expansions\n", + "for (order,sym_result) in enumerate(\n", + " [sym_pe_netnoise,sym_pe_netnoise2,sym_pe_netnoise3,sym_pe_netnoise4])\n", + " ts = sym_result[true_success_stat].(netnoise_pe_samples, 0)\n", + " uf = sym_result[failure_stat].(netnoise_pe_samples, 0)\n", + " Fout = ts ./ (ts .+ uf)\n", + " plot!(F0, Fout, label=\"expansion to order=$(order)\", lw=2)\n", + "end\n", + "\n", + "# Monte Carlo approach\n", + "F0 = exact_solution_no_purification[true_success_stat].(netnoise_mc_samples,0)\n", + "for m in mc_trajectories\n", + " Fout_mc = []\n", + " for n in netnoise_mc_samples\n", + " one_third_netnoise = n/3 # The probability for X, Y, or Z error\n", + " netnoise = UnbiasedUncorrelatedNoise(one_third_netnoise)\n", + " netnoise_opall = NoiseOpAll(netnoise)\n", + " mc_netnoise = mctrajectories(initial_state, [netnoise_opall,circuit...],\n", + " trajectories=m)\n", + " push!(Fout_mc, mc_netnoise[true_success_stat]/(mc_netnoise[true_success_stat]+get(mc_netnoise,failure_stat,0)))\n", + " end\n", + " plot!(F0, Fout_mc, label=\"MC $(m) trajectories\", line=false, marker=true)\n", + "end \n", + "\n", + "plot!(legend=:outertopright, xlabel=\"Input Fidelity\", ylabel=\"Output Fidelity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Local Operational Noise in Addition to the Network Noise\n", + "\n", + "Up to here we considered imperfect initial states purified by perfect circuits. Now we will introduce imperfect gates as well, and study a few different regimes of the gate error model. We will add a small chance of depolarization to all of the gates and a chance for flipping a qubit to all measurements." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# A helper function to add noise to ops and lists of ops.\n", + "make_noisy(g::SparseGate, noise) = NoisyGate(g, UnbiasedUncorrelatedNoise(1//3*noise))\n", + "make_noisy(m::BellMeasurement, noise) = NoisyBellMeasurement(m, noise)\n", + "make_noisy(other_op, noise) = other_op\n", + "make_noisy(circuit::AbstractVector, noise) = [make_noisy(op, noise) for op in circuit];" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "sym_pe_allnoise = petrajectories(\n", + " initial_state,\n", + " [sym_netnoise_opall,make_noisy(circuit, e_gate)...],\n", + " branch_weight=sym_unity)\n", + "\n", + "sym_true_success = sym_pe_allnoise[true_success_stat]\n", + "sym_coincidence_prob = (sym_pe_allnoise[true_success_stat]+sym_pe_allnoise[failure_stat]);" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$2.0*e_n^4*e_g^2 - 2.0*e_n^4*e_g - 8.0*e_n^3*e_g^2 + e_n^4 + 8.0*e_n^3*e_g + 12.0*e_n^2*e_g^2 - 4.0*e_n^3 - 12.0*e_n^2*e_g - 8.0*e_n*e_g^2 + 6.0*e_n^2 + 8.0*e_n*e_g + 2.0*e_g^2 - 4.0*e_n - 2.0*e_g + 1$" + ], + "text/plain": [ + "L\"$2.0*e_n^4*e_g^2 - 2.0*e_n^4*e_g - 8.0*e_n^3*e_g^2 + e_n^4 + 8.0*e_n^3*e_g + 12.0*e_n^2*e_g^2 - 4.0*e_n^3 - 12.0*e_n^2*e_g - 8.0*e_n*e_g^2 + 6.0*e_n^2 + 8.0*e_n*e_g + 2.0*e_g^2 - 4.0*e_n - 2.0*e_g + 1$\"" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "latexstring(sym_true_success) # Not all that legible # TODO print this better" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMsAAACPCAIAAADbULgeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAG5dJREFUeAHtwQFQVHXiB/Bv+jNe+sw9W2u7tnrKps+CfFzLzdpfzqWo6ITauiWh1oCkSQqP9S5SVAJuZdBDDxVqu6CAOT3XgISk4ZXOsCfriCdeW8OcTOH51Edu51ZrrfnMp/xndoYZGOUOdZfe6ft8yMDAAFSqiCFQqSKJQKWKJAKVKpIIVOFQWlpaUlKCa0hJSUlxcTGuGoEqTEwm07Zt23BNyMjIQJgQqMKEoiiGYXBNoCgKYUKgUkUSgUoVSQQqVSQRqFSRRKBSRRKBShVJBCpVJBGoVJFEoFJFEoFKFUkEqjF0/vx5WZajoqIuXLhw/vz5CRMmADh//vyFCxcIIbIsT5gwAZdDlmW3263RaIxGIxSJQDWGTp48+d5777322mspKSmrVq2Ki4sDcPTo0ZdffnlgYKC4uPjBBx/Ef1RbW9vZ2dnQ0ABgYGAgPT197dq1Dz744MGDB++8804oD4FqDOl0ut/+9rd79+6dNGlSXFwcQmbMmPHEE088//zzNE3jv5k5c+aPP/6IkEOHDp07d85gMHg8Hr1eD0UiUI25rKysZ555pqqqatKkSQj54YcfaJrGKPwqBCHff//9TTfdBGDmzJlQKoIx0dvby7IsVCGPPvrolClTmpqaMjMzAXR1dZlMJoS0trZ+8803AwMDU6dOtVgs27Zta2lpycvL6+3t/fbbb3Nzc8vKyiRJ2rhx4/Hjx99///3PP//8rbfeio6O3r9//+nTp61W6wMPPFBdXX3ixAmbzTZ79mwMOnny5BtvvLFy5cobb7wRY4hgTOzevZtlWahCxo8f//zzz9fV1WVmZgLweDy///3vAezcubOlpaWurg6AxWKZOXNmRkZGY2NjR0dHRkZGVVXV5MmT8/LyUlJSANx5551PP/30Z599tmTJEgBarTYzM7O8vBwAGzJ79mwMceLEiR07duTn5994440YQwRjYu/evXl5eVANyszMXLdu3eHDh2+//fabbrrphhtuAFBZWblw4cKvvvoKQGxs7Mcff3zvvffeeOONc+bMueeeezZv3gxgwoQJuJS4uLibb765q6vLZDKdOHFi0aJFGO7+++//9NNPMeYIxoTH44FqiFmzZplMpoaGhnvvvffJJ59EyJdffvnjjz9++eWXAJ5++uk77rgDIVOmTMEo5ObmOp3OmJgYmqahGASRJwiCKIpQDZeVlVVWVvbKK6/o9XqExMfHT5gwIS4uDiFffPHFrbfeilGzWq2FhYVbtmzJzMzEpfzwww8TJ07E2CKIPEEQAAiCwDAMVIMWLlxot9vvvvtuDPrDH/6Qk5NjtVq1Wm17e/uMGTO+//77QCBw4sSJH374YeLEiefPn//yyy9Pnz596tSpiRMn/vvf/z516tTXX389derUG264ISoqKiMj48iRIzfddBMu4vF4Hn744ePHj996660YQwSRJ4oiAEEQGIbBcJIkURSF69LNN9/scDiefPJJDJo+ffp77733wQcfUBT1wAMPzJw58+OPP87OzgbQ09Pzy1/+MhgMHjp0aM2aNfv27YuNjQ0Gg/n5+R9//PEzzzwzfvx4AA899NCMGTNwKUajsbGxcdq0aRhbBGElyzIhBMMJggBAFEUMEQwGS0tL29raDhw4QNM0rku/+93vMNwtt9ySnZ2NQY8++iiGmDJlyrPPPotBGRkZCDl27Njf//53q9V64sSJxx57DJdCUdQTTzyBMUcQboWFhQsWLJg3bx4G9ff3AxAEAYPcbnd2drYgCCtWrKBpGqqr09/f//7779M0HRcXB4UhCCtCyPLly+fOncuybHl5OcuyAARBANDf3w8gEAgUFBTU1tYCqKystNvtUF21uXPn3nHHHRMnTtRqtVAYgnDTaDS7du2Kj4+PjY212Wzl5eWiKGq1WlEU29racnNzRVEEUFlZabfboQqTu+66C4pEEAF6vb69vT0hIaG+vt7lcgEwm827d+9ua2ujKApAZWWl3W7HlRIEoaioyOv1ms1mh8Oh0WigUiqCyOA4rrGxMTU1lWVZn89nMpkEQeA4rqmpyel0LlmyBFcqGAwmJiYKggCgp6enu7t73759UCkVwcgKCgr8fj+uiMPh6O3t1el0PT0927ZtM5vNU6ZMWbZsWUxMDMuyfr+/oKAAV8Tn8wmCgEFdXV1paWk0TeMn5fV6NRoNriEtLS2CIODy/d///V9OTg4GEYRVX1+fx+MBUF9fT9M0x3EpKSmyLGs0Gr1en5KS4na7ExMT9Xq93+9PTk7WaDRQjeDChQvjxo3DEAcPHtyzZw8GjRs37oUXXjh9+rTL5RoYGMCgxx9/nGVZKAPByCoqKjA6fX19LperubnZ6/ViUDAY9IQQQjZt2mQwGHieJ4QAEEURAM/z6enpL730kslkwqgFAoHY2FhRFBFiMpkaGxvxUystLXW73Qifs2fPrlmzxuFwYIjGxsZjx4796le/AnD48OF3333XZrN5vd6tW7cuXrwYwNmzZ1euXDlnzhyWZXF1LBZLcXExrhpBOBQVFblcLoPBkJSUZDAYoqOjGYYxGAwA4uLi2traBEGQJAnAyZMnaZoWRVGWZUEQAPT29hJCjEYjRkej0XR2dubm5vI8n5OTU15ejmvRwMDAuXPnMNycOXMee+yxxMTECxcuzJ8/f/Pmzbfccoter1+0aNGSJUsArFy58rnnnnvooYegGATh4HQ6t23bhousXbsWgCiKJSEAWlpabDabXq8HwDAMrgjDMMuXL+d5vqamBteTjIwMhFRWVt52223PPfccgJgQAPv3729sbPzHP/4BJSEIB41Gg0v58MMPAaxevbq4uLinp6epqam5udlms0F1FQ4dOrR58+bu7m4McebMmRdeeOHtt9+ePHkylIQgYkRR9Hg8HMetWrUKgNPpdLvdPM8Hg0GapqG6SG9vb319PUJkWd67d++KFSsQcvfdd+fm5gKQZTkzM7OysnLatGkYYtWqVUlJSYmJiVAYgojheZ4QUldXRwgBoNVqnU5nWlpaW1tbeno6VBdhWXbt2rUIkSSppKRk7dq1GG7t2rUzZ858+umnAezZsycmJmbq1Kl79uxpb28/ePAggL6+vrNnz953331QBoKI2b59e3l5OcdxGGQN+fDDD9PT06G6fF6v99133z148CBC/vSnP9ntdqPRmJOT09DQMHHiRAA7d+787rvv7rvvPigDQWQEg0FZlu12O4ZzOp3x8fGSJFEUBdVlWr9+fSAQePDBBxHS39+/YsUKl8t17NixF154ASHffvut3W6HYhBEBs/zTqeTEILhtFptRUUFz/MWiwWq/2jcuHEYbsuWLbiIyWTKycmBUhFEhtls1mq1uBSr1crzPFT/EUVRhYWF+N9HEBlarRYjS05Ohuq/mTx5Mv73EahUkUSgUkUSgUoVSQQqVSQRqFSRRDAmJEmiKAqqUbtw4cJnn33GcRyGyMzM/PTTT1NTU++///6ysrKoqKg9e/a8/fbb77zzzu233/7GG2/85je/GRgYqK2tNRqNUAaCMcHzvMVigWrUfvzxR5fLxXEchqitrU1NTZ01a5bJZDp58mRPT09UVNTLL7/8/fff/+tf/5o+ffq5c+ecTqfRaIRiEIyJvXv3WiwWqK7OhAkTysvLFy5c+Oijj+bn5//sZz8DMH78eLvdPnv27PXr1991110JCQlQEoIx4fF4oAqHuLi4Bx54oKmp6fDhwxg0ceLElStX5ubm7t+/HwpDEHmBQKCnpweq/+bcuXPffPMNQiRJOn369FdffYWQqKgojUaDkHvuuefTTz+lKApD3HPPPYSQW2+9FQpDEHmCIASDwUAgoNFooBrZsWPHPvjgA4TIsnzo0KG//vWvCLn99tvT09MBBAKBLVu2/OIXv9iyZUtmZiYGORyOzMzM0tLSd999F0pCEHmiKAIQBIHjOKhGFh0dvWzZMoRIkvT1118vW7YMw23atMlms2VmZiYnJ6enp0dFRQFwu93nz593Op2xsbH//Oc/7733XigGQeQJggBAFEWO4zCEKIq7d+/OysqCanQOHDiwefPmzs7OGTNmREdHl5WV2e32QCDw+uuvP/vss4SQ559//rXXXquurmYYBspAEFaSJHV1dZnNZgzR398PQBAEDFFdXV1YWEjTtNVqpWkaqlGoq6t74oknvvjiixkzZuj1+uPHj3u93p6enujo6FOnTgE4f/78tGnT2tvbc3NzoQwEYUVRlN/vT0xMrKys5DgOIYIgAOjv70dIX1/fiy++6Ha7WZbdtWsXTdNQXWT8+PGzZs3CcG+++SYG1dbWIuShhx7CoNWrV0NhCMLNarUKghAXF2ez2YqLiw0GgyiKhBBBEGRZ3rhxY1FRkSRJLMt2dHTodDqoLmXChAnZ2dn430cQAa+++urRo0erq6tdLldeXl5fX5/BYOju7k5ISOjq6gLAsmxHR4dOp4MC+P3+3bt3x4RAFW4EkVFZWSmKYktLS21tbTAYTE5Orq+v12g0FEUxDNPR0aHT6aAALS0tixYtCgaDAPLy8qqqqqAKK4KRiaIoyzKuCMMwdXV1Xq+XoqjMzEyj0Thr1qyGhgaWZTs7OymKEgQBV8Hn8wEQBAFXQZbl7OzsYDCIkOrq6vnz5xuNRly+QCCAa0sgEBAEAZePpmmtVotBBCNLSEgQBAFXJCcnp6WlJRAImM1mo9GYlJTk9/sJIV6vNzU1dcGCBQUFBbhq06dPR1ilpaXhSpnNZlxDNobg8mVlZdXV1WEQwcg6OztlWcboSJLE83xzc7PH4wFQW1tLUZTRaBRFcevWrcFgsLm5ORgM0jTtDiGEWK3Wl156iWEYXL6urq6MjIwjR47gKsiyHBcXFwwGMWjbtm0mkwmXb9OmTV6vF9cQu92en5+Py0fTNIYgGJler8folJaWrl+/PhgMIoSmaYPBwDCMXq+vrq5mWfapp56yWq0+n6+4uPjs2bM+n0+SJFEUS0tLWZZdvHix0WjE5RAEAQDDMLg6NTU12dnZkiQByMvLS09PxxXRaDS4tmg0GoZhcNUIwiE6OvrVV1+Njo42GAwMw+h0OoS0tLRUV1e3tbXp9Xqe5yVJSkpKMhqNUIz09PR58+bdeeedf/nLX2w2G1ThRhAONpsNl9La2gogJiamvb09NjY2GAy2trYajUYoiV6vB6DX66GKAIKIkWW5ra2NEFJXV6fT6ZxOZ1pamsvlcjgcUF03CCLG4/H4/f6SkhKO4wBYQ5qamrxeL8dxUF0fCCKmtbXVaDSuWrUKg5xOp9vtbmtr4zgOqusDQcTwPL9jxw5CCAZptVqn01lWVrZ69Wqorg8EkeH1ehcvXsyyLIazWq3bt2/v6+szGAxQXQcIIsPv99vtdlyK0+lsamoyGAy4tnR1dU2fPh3XBJ/PZzabEQ4EkZGUlIQRaLVai8WCa8uTTz5599134xrCcRzCgeCnoNPpcG3hQqC6CIFKFUkEKlUkEahUkUSgUkUSgUoVSQRjore3l2VZqK4/BGOC53mWZaG6/hCMif3790N1XSIYEx6PB6rR8fl8PM9jZIQQhmE4jqNpGopHEHmCIIiiCNXo9Pb2vvjii3q9HiOQZVkURYqikpOT8/PzzWYzFIwg8gRBACAIAsMwUI2CXq8/cuQIRiZJEs/zDQ0NiYmJFoulpqZGq9VCkQgiTxRFAIIgMAyD4SRJoigKqstEUZQlxOv1ZmRkzJ07d+fOnSzLQnkIwkqWZUIIhhMEAYAoihgiGAwWFRXxPH/gwAGapqG6IhzHHThw4PHHH3/qqaf27dun0WigMAThVlRU9PDDD5vNZgzq7+8HIAgCBrnd7uzsbEEQSkpKaJqG6irQNL1z5874+Phly5bV1dVBYQjCihCyfPny+Ph4lmUdDkdMTAwAQRAA9Pf3AwgEAsuWLauvrwdQWVlpt9uhGgW/33/8+PFJkybNmDGjp6cHwOzZs6OiohCi0WhqamoSExPz8/M5joOSEIQbTdO7du2Kj4+Pi4uz2Wzl5eWiKGq1WkEQWlpali5dKooigMrKSrvdDtXo8DxfVFQ0ffr0+vr61NTUO+64o6amJjY2FoPMZvO8efPeeOONmpoaKAlBBOj1+vb29oSEhPr6epfLBcBsNu8OoSgKQGVlpd1ux5USBGHDhg0AcnNzHQ6HVqvFtc5ms912220rV66cPHnyhQsX2tratFothnvuuefKysqgMASRwXFcY2Njamoqy7J+v99kMgmCwHFcU1NTXV1dVlYWrlQgEEhISBBFEcBbb73l9Xr37duH68Ajjzyybt26lJSUrKwsrVaLi5jN5tzcXJ/Pp9PpoBgEIysoKPD7/bgiDoejt7dXp9N5vd7Gxkaz2RwVFVVYWBgTE8MwjN/vLygowBXx+XyiKGJQV1dXWloaTdO4OuvWrWtoaIAC+Hw+jKCkpOThhx/euXMnLoVhGAB9fX06nQ6KQRBWfX19Ho8HQH19PUVRRqPRYrHIsqzRaPR6fUpKyu7duxMTE/V6vc/nS05O1mq1UI1ad3f3+PHju7q6fv3rX+MihBAoD8HIKioqMDp9fX0ul6u5udnr9WKQJEmeEFmWN2zYYDAYeJ6nKAqAKIoAdu/ebbVaX3nlFZPJhFELBAKxsbGiKCLEZDI1Njbi6tTX1y9fvtxsNkMB3G53dnY2LnLmzJmqqqr333+/sLAwOTl53LhxGK6vrw+AwWCAkhCEQ1FRUVNTE8MwycnJDMNER0cbDAaGYQDExcXxPC8IgiRJAI4fP67RaHw+nyRJoijKstzb20sIMRqNGB2NRtPZ2VlYWNjd3Z2UlORwOHB9+POf/5wcUltb63K5nn32WQzndrv1er1Op4OSEISD0+nctm0bLrJmzRoAoiiWl5cXFhYCaGtrs9lsOp0OAMMwuCIMw2zbtg3XE6fTWV5enpmZCWDatGnLly8/c+bM4sWLMcTWrVuTk5OhMAThoNFocCkfffQRgNWrV69YseLgwYNNTU3Nzc02mw2qy5SYmDh79uxp06YBePnllxcuXPjzn/8cQ7jdbo/HU1VVBYUhiBhRFD0eD8dxq1atAuB0Ot1uN8/zwWCQpmmoLgcbgpDY2FgMFwgEXnzxRZvNxnEcFIYgYniepyiqrq6OEAJAq9U6nc60tLSWlhabzQZVmASDwdTUVEJIVVUVlIcgYrZv3+5wODiOwyBryEcffWSz2aAKB6/Xm5GRIcvyzp07NRoNlIcgMoLBoCzLdrsdwzmdzvj4eEmSKIqC6kpJksTz/Pbt210uV0pKSl1dnVarhSIRRAbP806nkxCC4bRabUVFBc/zFosFqhGIojh9+nSMQJZlURQpikpKSuro6DCbzVAwgsiYN2+eTqfDpVit1ra2NqhGwLJsTU0NhvP7/QUFBRUVFVqt1u/3FxQUfPLJJyzLQvEIIkOn02FkKSkpUI1Ap9NlZWVhOEEQCgoKrFYrwzCCIBQUFFAUhf8FBCpVJBGoVJFEoFJFEoFKFUkEKlUkEYwJSZIoioLq+kMwJniet1gsUF1/CMbE3/72N4vFAtX1h2BMdHV1QXVdIoi8QCDQ09MD1eh0dXVlZGRgOFmWASQkJBBCZFkGsGnTpszMTI7joGwEkScIQjAYDAQCGo0Gqv9GkqRgMFhRUYERyLJ8+PBhnuc3btxoNpvLy8tNJhOUiiDyRFEEIAgCx3FQjQJN01lZWfiPysvLe3p6ioqKEhISKioq7HY7FIkg8gRBACCKIsdxGEIQBLfbnZWVBdUViYmJ2bFjR21tbW5u7qlTp4qLi6E8BGElSVJXV5fZbMYQ/f39AARBwBDV1dWFhYUajcZqtdI0DdWVysnJoWk6IyNjzpw5FosFCkMQVhRF+f3+xMTEyspKjuMQIggCgP7+foT09vbm5ua63W6WZTs6OmiahurqpKenHzx4cOnSpcnJyRRFQUkIws1qtQqCEBcXl56e7nA4DAaDKIqEEEEQZFneuHFjUVGRJEksy3Z0dOh0OqhGoaGhYceOHbfccsvrr79ut9sHBgYcDkdsbCwGrVq1qjYkLy8PSkIQAa+++urRo0erq6ubmpqWLFnS19dnMBi6u7vnzp3b3d0NgGXZjo4OnU4HBRBFEYAoilCw1NTU7u7uM2fO6PX6zz//vLCwcNasWRhCo9FkZWU1Nzfn5eVBSQgio7Ky0ufzNTU11dfXB4PB5OTk+vp6o9FI07TBYGhvb9fpdFCAlpaWRYsWAVi0aNH+/furqqqgSFOnTi0tLY2Njd2+ffuUKVNsNhsusmDBgurqakmSKIqCYhCMTBRFWZZxRRiGqamp6e7uJoQsXrzYaDQyDONyuQwGQ2dnJ0VRgiDgpybLcnZ2djAYREh1dfX8+fONRiN+Uj6fD5cyderUpUuXZmZmtre341JiYmJkWe7r64uJiYFiEIwsISFBEARckZycnJaWlkAgYDab54UEAgGapru7u1NTUxcsWFBQUADlSUtLgwIwDINLmT9//rhx4ziOw6XodDoAfr8fSkIwss7OTlmWMTqSJPE839zc7PF4ANTW1lIUxXGcKIrvvPOOz+fbunWr3++nKModQgixWCyLFy9mWRY/EVmW4+PjA4EABjU2NhqNRvykurq6CgsLcSl//OMfH3nkkfLy8g0bNuAifr8fgFarhZIQjEyv12N0SktL169fHwwGEULTtCFEp9NVV1cbDIa0tDSLxeLz+RwOx+nTp30+nyRJPp9v3bp1BoPhpZdeMhqN+CnU1dVlZGRIkgQgLy/ParXipyYIAi7lk08+EQRh7969MTEx+fn5d911F4bzer2EEIPBACUhCIfo6Ojly5czDGMI0Wq1CGlpaamuruZ5Xq/X8zwvSZLZbDYajVAMi8XyxRdfeDyemBAoVTAYLCkpWbp06cSJE3Nzc4uKit58881JkyZhiA8//HDevHkURUFJCMLBZrPhUlpbWwHExMTs2rUrLi5OFMXW1laj0Qgl0ev16enpULa1a9d+9913PT09AI4ePXrs2LENGza8/vrrGBQIBOrr6x0OBxSGIGJkWW5rayOE1NXVabXaysrKtLQ0l8vlcDigukxr1qzBoOrqalykrKyMpumcnBwoDEHEeDwev9/vcDg4jgNgDWlqavJ6vRzHQRU+Lpdr/fr1O3bsoCgKCkMQMa2trSaTacWKFRjkdDrdbndrayvHcVCFSW1tbW5ubklJicVigfIQRAzP8zt27CCEYJBWq3U6nWVlZcXFxVBdtd7e3sLCwra2toqKCrvdDkUiiAyv17t48WKWZTGc1Wrdvn17X1+fwWCAagTBYLC+vh4jkGX58OHDPM97vV6z2dzZ2WkymaBUBJHh8/nsdjsuxel0NjU1GQwGqC6FoiiapktLSzEyg8GQkpJSV1fHcRyUjSAykpOTMQKtVmuxWKAagclkOnLkCK4VBD8FnU4H1fWBQKWKpP8HtI0ppy60vBYAAAAASUVORK5CYII=", + "text/plain": [ + "5-element Vector{AbstractOperation}:\n", + " NoiseOpAll(UnbiasedUncorrelatedNoise{AbstractAlgebra.Generic.MPoly{BigFloat}}(0.3333333333333333333333333333333333333333333333333333333333333333333333333333348*e_n))\n", + " Symbolic two-qubit gate on qubit 1 and 3\n", + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n", + "\n", + " Symbolic two-qubit gate on qubit 2 and 4\n", + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n", + "\n", + " NoisyBellMeasurement{AbstractAlgebra.Generic.MPoly{BigFloat}}(BellMeasurement(QuantumClifford.AbstractMeasurement[sMX{Nothing}(3, nothing), sMX{Nothing}(4, nothing)]), e_g)\n", + " VerifyOp(+ ZZ\n", + "+ XX, [1, 2])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sym_allnoise_circuit = [sym_netnoise_opall,make_noisy(circuit, e_gate)...]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.004539 seconds (42.61 k allocations: 2.234 MiB)\n" + ] + } + ], + "source": [ + "@time sym_pe_allnoise2 = petrajectories(\n", + " initial_state,\n", + " sym_allnoise_circuit,\n", + " branch_weight=sym_unity,\n", + " max_order=2);" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.013718 seconds (127.60 k allocations: 6.721 MiB)\n" + ] + } + ], + "source": [ + "@time sym_pe_allnoise3 = petrajectories(\n", + " initial_state,\n", + " sym_allnoise_circuit,\n", + " branch_weight=sym_unity,\n", + " max_order=3);" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.033118 seconds (228.99 k allocations: 12.078 MiB)\n" + ] + } + ], + "source": [ + "@time sym_pe_allnoise4 = petrajectories(\n", + " initial_state,\n", + " sym_allnoise_circuit,\n", + " branch_weight=sym_unity,\n", + " max_order=4);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### All of the noisy circuit results together" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot(title=\"Purified Fidelity vs Initial Fidelity\\nboth network and local noise\\naccording to different calculation methods\")\n", + "\n", + "netnoise_pe_samples = 0.0:0.005:0.4\n", + "netnoise_mc_samples = 0.0:0.05:0.4\n", + "local_noise_samples = [0.0, 0.01, 0.05]\n", + "mc_trajectories = 10000\n", + "\n", + "line_styles = [:dot, :dashdot, :dash, :solid]\n", + "\n", + "# No purification\n", + "exact_solution_no_purification = petrajectories(good_bell_state,\n", + " [sym_netnoise_opall,nopurification_circuit...],\n", + " branch_weight=sym_unity,\n", + " max_order=100)\n", + "F0 = exact_solution_no_purification[true_success_stat].(netnoise_pe_samples,0)\n", + "plot!(F0,F0,color=:black,alpha=0.3,label=false)\n", + "\n", + "# Symbolic perturbative expansions\n", + "for (li, local_noise) in enumerate(local_noise_samples)\n", + " for (order,sym_result) in enumerate(\n", + " [sym_pe_allnoise,sym_pe_allnoise2,sym_pe_allnoise3,sym_pe_allnoise4])\n", + " ts = sym_result[true_success_stat].(netnoise_pe_samples, local_noise)\n", + " uf = sym_result[failure_stat].(netnoise_pe_samples, local_noise)\n", + " Fout = ts ./ (ts .+ uf)\n", + " plot!(F0, Fout,\n", + " label = order==4 ? \"gate error rate of $(local_noise)\" : nothing,\n", + " lw = order==4 ? 2 : 1.5,\n", + " color=li, linestyle=line_styles[order],\n", + " )\n", + " end\n", + "end\n", + "\n", + " \n", + "# Monte Carlo approach\n", + "F0 = exact_solution_no_purification[true_success_stat].(netnoise_mc_samples,0)\n", + "for (li, local_noise) in enumerate(local_noise_samples)\n", + " Fout_mc = []\n", + " for n in netnoise_mc_samples\n", + " one_third_netnoise = n/3 # The probability for X, Y, or Z error\n", + " netnoise = UnbiasedUncorrelatedNoise(one_third_netnoise)\n", + " netnoise_opall = NoiseOpAll(netnoise)\n", + " c = [netnoise_opall,circuit...]\n", + " c = make_noisy(c, local_noise)\n", + " mc_netnoise = mctrajectories(initial_state, c,\n", + " trajectories=mc_trajectories)\n", + " push!(Fout_mc, mc_netnoise[true_success_stat]/(mc_netnoise[true_success_stat]+get(mc_netnoise,failure_stat,0)))\n", + " end\n", + " plot!(F0, Fout_mc, label=nothing, line=false, marker=true, color=li)\n", + "end\n", + "\n", + "# Legend\n", + "for (li, style) in enumerate(line_styles)\n", + " plot!([-1], [-1], linestyle = style, label = \"perturbation to order $(li)\", color = \"black\")\n", + "end\n", + "plot!([-1], [-1], line=false, marker=true, label = \"10 000 MC trajectories\", color = \"black\")\n", + "plot!(xlim=(0.39,1.01))\n", + "plot!(ylim=(0.35,1.03))\n", + "plot!(legend=:outertopright, xlabel=\"Input Fidelity\", ylabel=\"Output Fidelity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reproducibility information" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Julia Version 1.9.0-DEV.573\n", + "Commit 35aaf68470 (2022-05-13 09:54 UTC)\n", + "Platform Info:\n", + " OS: Linux (x86_64-pc-linux-gnu)\n", + " CPU: 8 × Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz\n", + " WORD_SIZE: 64\n", + " LIBM: libopenlibm\n", + " LLVM: libLLVM-13.0.1 (ORCJIT, skylake)\n", + " Threads: 4 on 8 virtual cores\n", + "Environment:\n", + " JULIA_NUM_THREADS = 4\n", + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + " \u001b[90m[0525e862] \u001b[39mQuantumClifford v0.5.0-dev `QuantumClifford`\n" + ] + } + ], + "source": [ + "versioninfo()\n", + "using Pkg\n", + "Pkg.status(\"QuantumClifford\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia (4 Threads)", + "language": "julia", + "name": "julia" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/v0.8.21/notebooks/Perturbative_Expansions_vs_Monte_Carlo_Simulations.ipynb b/v0.8.21/notebooks/Perturbative_Expansions_vs_Monte_Carlo_Simulations.ipynb new file mode 100644 index 000000000..52a60116a --- /dev/null +++ b/v0.8.21/notebooks/Perturbative_Expansions_vs_Monte_Carlo_Simulations.ipynb @@ -0,0 +1,1631 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "using QuantumClifford\n", + "using QuantumClifford.Experimental.NoisyCircuits\n", + "using QuantumCliffordPlots\n", + "using Plots\n", + "using ProgressMeter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Monte Carlo error vs Perturbative expansion error\n", + "\n", + "The Monte Carlo method requires large number of samples to obtain a result with a small stochastic error. The scaling is $\\mathrm{error}\\propto\\frac{1}{\\sqrt{N}}$ where $N$ is the number of samples.\n", + "\n", + "The perturbative expansion method's computational complexity grows exponentially in the order of the expansion, however at low order it can be more efficient than the Monte Carlo method for the same error. The error scales as $\\varepsilon^n$ where $\\varepsilon$ is the perturbative parameter (e.g. a small error rate) and $n$ is the order of the expansion. $n=1$ is the default for this software. The software supports symbolic evaluation (e.g. it provides analytical expansions).\n", + "\n", + "Below we compare results obtained with either method and explore the accuracy of the result as a function of the $N$ and $\\varepsilon$ parameters. The toy circuit on which we test these methods is the purification of a noisy Bell pair by the sacrifice of another noisy Bell pair. We report the rate of successful purification, detected failed purification, and undetected failures of purification (which are the source of imperfection afther the purification)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Relative error\n", + "\n", + "Comparing the two simulation methods in the case of a perfect purification circuit that purifies one Bell pair by sacrificing another Bell pair. Both pairs are subjected to depolarization noise before being used.\n", + "\n", + "We run the Monte Carlo simulation with a 1000 samples and show how averaging over that many samples leads to a small stochastic error in the estimate. We report the histogram (distribution) of such relative errors over multiple runs of the Monte Carlo simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "5-element Vector{AbstractOperation}:\n", + " NoiseOpAll(UnbiasedUncorrelatedNoise{Float64}(0.01))\n", + " Symbolic two-qubit gate on qubit 1 and 3\n", + "X_ ⟼ + XX\n", + "_X ⟼ + _X\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + ZZ\n", + "\n", + " Symbolic two-qubit gate on qubit 2 and 4\n", + "X_ ⟼ + XX\n", + "_X ⟼ + _X\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + ZZ\n", + "\n", + " BellMeasurement(QuantumClifford.AbstractMeasurement[sMX{Nothing}(3, nothing), sMX{Nothing}(4, nothing)])\n", + " VerifyOp(+ ZZ\n", + "+ XX, [1, 2])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_bell_state = S\"XX\n", + " ZZ\"\n", + "initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n", + "\n", + "g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\n", + "g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\n", + "m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\n", + "v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\n", + "epsilon = 0.01 # The error rate\n", + "n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n", + "\n", + "# This circuit performs a depolarization at rate `epsilon` to all qubits,\n", + "# then bilater CNOT operations\n", + "# then a Bell measurement\n", + "# followed by checking whether the final result indeed corresponds to the correct Bell pair.\n", + "circuit = [n,g1,g2,m,v]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "N = 1000 # Nb of trajectories\n", + "relative_error(a,b, symbol) = abs(a[symbol]/N-b[symbol]) / (a[symbol]/N+b[symbol]+1e-5)\n", + "df = [] # store relative error in the detected failure rate\n", + "uf = [] # store relative error in the undetected failure rate\n", + "ts = [] # store relative error in the true success rate\n", + "pe = petrajectories(initial_state, circuit) # perturbative expansion\n", + "for i in 1:1000\n", + " mc = mctrajectories(initial_state, circuit, trajectories=N) # Monte Carlo\n", + " append!(df,relative_error(mc,pe,failure_stat))\n", + " append!(uf,relative_error(mc,pe,false_success_stat))\n", + " append!(ts,relative_error(mc,pe,true_success_stat))\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the results according to the perturbative expansion:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Float64} with 3 entries:\n", + " failure:CircuitStatus(3) => 0.0365069\n", + " false_success:CircuitStatus(2) => 0.0547604\n", + " true_success:CircuitStatus(1) => 0.903546" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pe" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the MC results to the perturbative expansion results:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot(histogram(df, label=\"Detected Failures\",\n", + " title=\"Histogram of differences between\\nfirst-order perturbative expansion and MC simulations\"),\n", + " histogram(uf, label=\"Undetected Failures\", color=2),\n", + " histogram(ts, label=\"True Successes\", color=3,\n", + " xaxis=\"relative difference (MC averaged over $(N) repetitions)\"),\n", + " layout=(3,1),legend=true)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that the sum of probabilities in the perturbative expansion is less than one, as only the leading order is kept." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9948135699999998" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(values(pe))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is instructive to see how the purification procedure compares to no purification:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Float64} with 3 entries:\n", + " failure:CircuitStatus(3) => 0.0\n", + " false_success:CircuitStatus(2) => 0.0547604\n", + " true_success:CircuitStatus(1) => 0.940053" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pe_nopurification = petrajectories(initial_state, [n,v])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Larger number of samples lowers the MC error\n", + "\n", + "As already mentioned the stochastic error in the MC approach scales as $\\frac{1}{\\sqrt{N}}$. The plot below demonstrates how using larger number of samples makes the answer from the Monte Carlo approach more precise." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:02\u001b[39m\n", + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:00\u001b[39m\n", + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:02\u001b[39m\n" + ] + } + ], + "source": [ + "Ns = [50,100,10^0.5*100,1000,10000]\n", + "reps = 20\n", + "pe = petrajectories(initial_state, circuit) # perturbative expansion\n", + "DF,UF,TS = [],[],[]\n", + "for N in Ns\n", + " df,uf,ts = [],[],[]\n", + " @showprogress for i in 1:reps\n", + " mc = mctrajectories(initial_state, circuit, trajectories=N) # Monte Carlo\n", + " push!(df,get(mc,failure_stat,0)/N)\n", + " push!(uf,get(mc,false_success_stat,0)/N)\n", + " push!(ts,get(mc,true_success_stat,0)/N)\n", + " end\n", + " push!(DF,df)\n", + " push!(UF,uf)\n", + " push!(TS,ts)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot()\n", + "for (N, df, uf, ts) in zip(Ns, DF, UF, TS)\n", + " scatter!(ones(reps)*N*0.9,df,label=\"\",color=1,markerstrokewidth=0,alpha=0.3)\n", + " scatter!(ones(reps)*N, uf,label=\"\",color=2,markerstrokewidth=0,alpha=0.3)\n", + " scatter!(ones(reps)*N*1.1,ts,label=\"\",color=3,markerstrokewidth=0,alpha=0.3)\n", + "end\n", + "hline!([pe[failure_stat]], color=1,lw=2,label=\"detected failure\")\n", + "hline!([pe[false_success_stat]],color=2,lw=2,label=\"undetected failure\")\n", + "hline!([pe[true_success_stat]], color=3,lw=2,label=\"true success\")\n", + "plot!(xaxis=:log10,legend=:outertopright,\n", + " xlabel=\"Number of Monte Carlo Samples\",\n", + " ylabel=\"Fraction\",\n", + " title=\"Monte Carlo (dots)\\nvs\\nPerturbative expansion (lines)\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Large perturbation lowers the precision of the perturbative approach\n", + "\n", + "We already saw that the probabilities in the perturbative solution do not sum up to unity. Here we see how this imprecision grows as $\\varepsilon$ grows." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:26\u001b[39m\n" + ] + } + ], + "source": [ + "N = 100000\n", + "εs = 0.01:0.003:0.08\n", + "PE = []\n", + "MC = []\n", + "@showprogress for ε in εs\n", + " nε = NoiseOpAll(UnbiasedUncorrelatedNoise(ε))\n", + " circuit = [nε,g1,g2,m,v]\n", + " pe = petrajectories(initial_state, circuit) # perturbative expansion\n", + " mc = mctrajectories(initial_state, circuit, trajectories=N) # Monte Carlo\n", + " push!(PE,pe)\n", + " push!(MC,mc)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot( εs, [pe[failure_stat] for pe in PE], color=1, label=\"detected failure (perturb.)\")\n", + "plot!(εs, [pe[false_success_stat] for pe in PE], color=2, label=\"undetected failure (perturb.)\")\n", + "plot!(εs, [pe[true_success_stat] for pe in PE], color=3, label=\"true success (perturb.)\")\n", + "plot!(εs, [sum(values(pe)) for pe in PE], color=:black, label=\"total probability (perturb.)\")\n", + "plot!(εs, [mc[failure_stat]/N for mc in MC], color=1, line=:dash, label=\"detected failure (MC)\")\n", + "plot!(εs, [mc[false_success_stat]/N for mc in MC], color=2, line=:dash, label=\"undetected failure (MC)\")\n", + "plot!(εs, [mc[true_success_stat]/N for mc in MC], color=3, line=:dash, label=\"true success (MC)\")\n", + "plot!(legend=:outertopright, xlabel=\"ε\", ylabel=\"Fraction\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As seen above, the error in the perturbative approach can be much too large for large $\\varepsilon$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reproducibility information" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Julia Version 1.9.0-DEV.573\n", + "Commit 35aaf68470 (2022-05-13 09:54 UTC)\n", + "Platform Info:\n", + " OS: Linux (x86_64-pc-linux-gnu)\n", + " CPU: 8 × Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz\n", + " WORD_SIZE: 64\n", + " LIBM: libopenlibm\n", + " LLVM: libLLVM-13.0.1 (ORCJIT, skylake)\n", + " Threads: 4 on 8 virtual cores\n", + "Environment:\n", + " JULIA_NUM_THREADS = 4\n", + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + " \u001b[90m[0525e862] \u001b[39mQuantumClifford v0.5.0-dev `QuantumClifford`\n" + ] + } + ], + "source": [ + "versioninfo()\n", + "using Pkg\n", + "Pkg.status(\"QuantumClifford\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia (4 Threads)", + "language": "julia", + "name": "julia" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/v0.8.21/notebooks/Stabilizer_Codes_Based_on_Random_Circuits.ipynb b/v0.8.21/notebooks/Stabilizer_Codes_Based_on_Random_Circuits.ipynb new file mode 100644 index 000000000..407f22db4 --- /dev/null +++ b/v0.8.21/notebooks/Stabilizer_Codes_Based_on_Random_Circuits.ipynb @@ -0,0 +1,3368 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stabilizer Codes Based on Random Circuits\n", + "\n", + "A brielf tutorial describing the use of the Julia library `QuantumClifford` for the simulation and evaluation of error correcting codes derived from the evolution of local Clifford circuits. Inspired by \"Quantum coding with low-depth random circuits\" by Michael J. Gullans, Stefan Krastanov, David A. Huse, Liang Jiang, Steven T. Flammia, [arXiv:2010.09775](https://arxiv.org/abs/2010.09775)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "using QuantumClifford\n", + "using Plots # For plotting. It takes a while to precompile the first time\n", + "using QuantumCliffordPlots # Recipes to plot Clifford tableaux\n", + "using BenchmarkTools" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To install these libraries go to package mode (press `]`) and type\n", + "`add QuantumClifford Plots`, etc.\n", + "\n", + "Some of this code can be much faster by using the newer GPU accelerated types." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initial Example with a Small Number of Qubits" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting up the tableaux data structures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to create a tableau that will track what our brickwork circuit is doing. We can do that with a Stabilizer string literal:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "+ XXX\n", + "- ZZ_\n", + "+ _ZZ" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "state = S\"+XXX\n", + " -ZZI\n", + " +IZZ\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But one can create specific tableaux programatically as well (useful for large tableaux). The julia function `one` is typically used to create identity elements of a given class." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "+ Z_______________________________________________________________\n", + "+ _Z______________________________________________________________\n", + "+ __Z_____________________________________________________________\n", + "+ ___Z____________________________________________________________\n", + "+ ____Z___________________________________________________________\n", + "+ _____Z__________________________________________________________\n", + "+ ______Z_________________________________________________________\n", + "+ _______Z________________________________________________________\n", + "+ ________Z_______________________________________________________\n", + "+ _________Z______________________________________________________\n", + "+ __________Z_____________________________________________________\n", + "+ ___________Z____________________________________________________\n", + "+ ____________Z___________________________________________________\n", + "+ _____________Z__________________________________________________\n", + "+ ______________Z_________________________________________________\n", + "+ _______________Z________________________________________________\n", + "+ ________________Z_______________________________________________\n", + "+ _________________Z______________________________________________\n", + "+ __________________Z_____________________________________________\n", + "+ ___________________Z____________________________________________\n", + "+ ____________________Z___________________________________________\n", + "+ _____________________Z__________________________________________\n", + "+ ______________________Z_________________________________________\n", + "+ _______________________Z________________________________________\n", + "+ ________________________Z_______________________________________\n", + "+ _________________________Z______________________________________\n", + "+ __________________________Z_____________________________________\n", + "+ ___________________________Z____________________________________\n", + "+ ____________________________Z___________________________________\n", + "+ _____________________________Z__________________________________\n", + "+ ______________________________Z_________________________________\n", + "+ _______________________________Z________________________________\n", + "+ ________________________________Z_______________________________\n", + "+ _________________________________Z______________________________\n", + "+ __________________________________Z_____________________________\n", + "+ ___________________________________Z____________________________\n", + "+ ____________________________________Z___________________________\n", + "+ _____________________________________Z__________________________\n", + "+ ______________________________________Z_________________________\n", + "+ _______________________________________Z________________________\n", + "+ ________________________________________Z_______________________\n", + "+ _________________________________________Z______________________\n", + "+ __________________________________________Z_____________________\n", + "+ ___________________________________________Z____________________\n", + "+ ____________________________________________Z___________________\n", + "+ _____________________________________________Z__________________\n", + "+ ______________________________________________Z_________________\n", + "+ _______________________________________________Z________________\n", + "+ ________________________________________________Z_______________\n", + "+ _________________________________________________Z______________\n", + "+ __________________________________________________Z_____________\n", + "+ ___________________________________________________Z____________\n", + "+ ____________________________________________________Z___________\n", + "+ _____________________________________________________Z__________\n", + "+ ______________________________________________________Z_________\n", + "+ _______________________________________________________Z________\n", + "+ ________________________________________________________Z_______\n", + "+ _________________________________________________________Z______\n", + "+ __________________________________________________________Z_____\n", + "+ ___________________________________________________________Z____\n", + "+ ____________________________________________________________Z___\n", + "+ _____________________________________________________________Z__\n", + "+ ______________________________________________________________Z_\n", + "+ _______________________________________________________________Z" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "N = 2^6 # Number of qubits for our examples\n", + "initial_state = one(Stabilizer, N) # Use `one` to create the \"identity\" object of given class and size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is easier to view large stabilizer states as matrix plots:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot(initial_state, xzcomponents=:together)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clifford Operator data structures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This library provides not only tableaux but also varios operators that can act on the tableax, representing a quantum Clifford gate. They are implemented in multiple different data structures, depending on what operations are to be done most efficiently. The most common one is `CliffordOperator` that simply stores the transformation of the diagonal tableaux. It can be instantiated with a literal:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "X_ ⟼ + XZ\n", + "_X ⟼ + ZX\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _Z\n" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "op = C\"XZ\n", + " ZX\n", + " ZI\n", + " IZ\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `CPHASE`, `CNOT`, `Hadamard`, `Phase` gates are built in. A prefix `t` specifies a gate represented as a dense tableau, and an `s` prefix specifies a gate with a sparse symbolic representation which can be much faster. We will have a performance comparison below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tensor products between gates is implemented as well:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "X_ ⟼ + Y_\n", + "_X ⟼ + _Z\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + _X\n" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tPhase ⊗ tHadamard # Use the slash+tab key combination to enter latex symbols" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The brickwork layers of local Clifford Operators" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To construct our brick layers, we can use `tensor_pow` to make the first layer for bricks, and `permute` to shift it by one and create the second layer of bricks. We mark them as `const` because Julia can be slow when non-const global variables are used." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "const brick_layer1 = tensor_pow(tCNOT, N÷2); # Get the tensor product of N÷2 CNOT gates\n", + "# ÷ implies integer division (instead of float division with /)\n", + "const brick_layer2 = permute(brick_layer1, [(2:N)...,1]);" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p1 = plot(brick_layer1*initial_state, xzcomponents=:together, title=\"action of brick layer 1\", xlabel=\"index of physical qubit\", ylabel=\"index of time-evolved logical operator\")\n", + "p2 = plot(brick_layer2*initial_state, xzcomponents=:together, title=\"action of brick layer 2\", xlabel=\"index of physical qubit\")\n", + "plot(p1,p2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In between these brick layers we will put layers of random single-qubit unitaries." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we can make a function that applies the layers (with a set of random single-qubit unitaries in between). We will try two different implementations.\n", + "\n", + "We use the `apply!(state, operator)` syntax instead of `operator*state`, as this performs the operation in-place, without copies and new memory allocations. We also turn off the calculation of relative phases. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"Applying just the random single-qubit operations.\"\"\"\n", + "function apply_random_singlequbitops!(state)\n", + " for i in 1:nqubits(state)\n", + " apply!(state, random_clifford1(i), phases=false)\n", + " end\n", + "end\n", + "\n", + "\"\"\"Applying also the brick layers, using a pre-computed dense tableau. An n³ operation.\"\"\"\n", + "function apply_single_layer_a!(state; random_single_q=true)\n", + " n = nqubits(state) # Find the size of the state\n", + " random_single_q && apply_random_singlequbitops!(state)\n", + " apply!(state, brick_layer1, phases=false)\n", + " random_single_q && apply_random_singlequbitops!(state)\n", + " apply!(state, brick_layer2, phases=false)\n", + " return state\n", + "end\n", + "\n", + "const l1 = [sCNOT(2i-1,2i) for i in 1:N÷2]\n", + "const l2 = [sCNOT(2i,(2i+1)%nqubits(state)) for i in 1:N÷2]\n", + "\n", + "\"\"\"Applying also the brick layers, using a symbolic sparse gates. A sequence of n operations of n² complexity.\"\"\"\n", + "function apply_single_layer_b!(state; random_single_q=true)\n", + " n = nqubits(state) # Find the size of the state\n", + " random_single_q && apply_random_singlequbitops!(state)\n", + " for i in 1:n÷2\n", + " apply!(state, l1[i], phases=false)\n", + " end\n", + " random_single_q && apply_random_singlequbitops!(state)\n", + " for i in 1:n÷2\n", + " apply!(state, l2[i], phases=false)\n", + " end\n", + " return state\n", + "end;" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BenchmarkTools.Trial: 10000 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m19.457 μs\u001b[22m\u001b[39m … \u001b[35m108.595 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m21.791 μs \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m22.755 μs\u001b[22m\u001b[39m ± \u001b[32m 2.885 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n", + "\n", + " \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m█\u001b[39m▇\u001b[39m▂\u001b[39m \u001b[39m \u001b[39m \u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▃\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m▇\u001b[39m▆\u001b[39m▄\u001b[39m▄\u001b[32m▃\u001b[39m\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▂\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m▂\n", + " 19.5 μs\u001b[90m Histogram: frequency by time\u001b[39m 31.3 μs \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m2.03 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m38\u001b[39m." + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@benchmark apply_single_layer_a!(s; random_single_q=false) setup=(s=copy(initial_state))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BenchmarkTools.Trial: 10000 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m39.878 μs\u001b[22m\u001b[39m … \u001b[35m113.894 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m43.474 μs \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m45.828 μs\u001b[22m\u001b[39m ± \u001b[32m 6.749 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n", + "\n", + " \u001b[39m▂\u001b[39m▂\u001b[39m▄\u001b[39m█\u001b[39m \u001b[39m▂\u001b[39m▂\u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▅\u001b[39m█\u001b[39m█\u001b[34m▅\u001b[39m\u001b[39m▇\u001b[39m█\u001b[39m▄\u001b[32m▄\u001b[39m\u001b[39m▄\u001b[39m▃\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m▂\n", + " 39.9 μs\u001b[90m Histogram: frequency by time\u001b[39m 72.9 μs \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m6.03 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m193\u001b[39m." + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@benchmark apply_single_layer_b!(s; random_single_q=false) setup=(s=copy(initial_state))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will use option \"a\" below and reimplement it / inline it in another function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will visualize the results of repeated applications of these brick layers below. Notice we use the `copy` function if we want to save intermediary results." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const apply_single_layer! = apply_single_layer_a!\n", + "test_state = copy(initial_state)\n", + "apply_single_layer!(test_state)\n", + "first_application = copy(test_state)\n", + "apply_single_layer!(test_state)\n", + "second_application = copy(test_state)\n", + "apply_single_layer!(test_state)\n", + "third_application = copy(test_state)\n", + "plot(\n", + " plot(initial_state, xzcomponents=:together, title=\"initial state\"),\n", + " plot(first_application, xzcomponents=:together, title=\"after first layer\"),\n", + " plot(second_application, xzcomponents=:together, title=\"after second layer\"),\n", + " plot(third_application, xzcomponents=:together, title=\"after third layer\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extracting the stabilizer operators for the code\n", + "\n", + "We just need each odd row from the tableau." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "code = test_state[1:2:end]\n", + "plot(code,xzcomponents=:together)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extracting the generating set of syndromes\n", + "\n", + "The matrix S is the matrix of commutators between code stabilizer operators and error operators. Its rank carries information about the error correction probability of a perfect syndrome decoder." + ] + }, + { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABeEAAAK3CAYAAAACrIT7AAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7snQWYLcXx9nvxoMGJIAmBoAkWIDjBJWhwd7cQLAS/OBd3d0vQwMWT4ME1BAgWJIQQ3O32V7/Kv/frnTNzzpy9u3tX3nqe8+yeOT093W9X18y8VV3dEU2CRAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQ6HEExujxGlWhEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASHgCIiElyIIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQ6CUERML3ErCqVggIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIBIeOmAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIgV5CQCR8LwGraoWAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAiIhJcOCAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEOglBETC9xKwqlYICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISASHjpgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICIFeQkAkfC8Bq2qFgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAIiISXDggBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBDoJQREwvcSsKpWCAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgEh46YAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAiBXkJAJHwvAatqhYAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACIiElw4IASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQ6CUERML3ErCqVggIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIBIeOmAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIgV5CQCR8LwGraoWAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAiIhJcOCAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEOglBETC9xKwqlYICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISASHjpgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICIFeQkAkfC8Bq2qFgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAIiISXDggBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBDoJQREwvcSsKpWCAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgEh46YAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAiBXkJAJHwvAatqhYAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACIwlCISAEBACQkAICAEhIASEgBBojcDXX38d/vWvf4X33nsvjDHGGGGyySYL00wzTRhzzDHDq6++GqabbrrWlXSzxMcffxy++uor/3Ddscbq/mP8p59+Gr788kuva8IJJwzf+ta3utmq0Xca7f/888+9D8jkk08++hqjKw8KBPJ5McEEE4Txxx9/tPXrk08+6Zyjk0wySRh33HFrtaU/9aFWg7tRiHn/xRdf+NzH9k466aS1a8FujBw5slZ5MO/o6KhVVoWEgBAQAkJACNRBoCOa1CmoMkJACAgBISAEhIAQEAJCYKgiAOkzfPjw8PDDD4cZZpjBiRzI+Pnmmy+sv/76Yb311gu33nprr8Dz3//+N2y33XYBYg4y/qKLLgrTTz99rWv96U9/ctJ+rrnm6iy/6aabBuqkrr322iussMIKnb+988474Y477ghLLrlkmHLKKWtdY3QUOvvss8OIESMck2mnnTacdtppYeyxx+7zpvAqdd999wX+Lrzwwv2KtHvhhRfC3//+97DsssvWJnH7HMB+dMGtt946vPnmmz4vtt9++7DWWmuNttZhUz744ANvy1FHHRUWWGCBlm3BRu26667htdde83mx8847h9VXX73leT1RgLbeeeedYZlllul1p97hhx8e7r//fu8j9vfII4+s3YXDDjssPPvss7XKH3jggeGHP/xhrbIqJASEgBAQAkKgDgLdD6GpU7vKCAEh0G8QIPKDj2RoIkDE5uiM6BqaqKvXQkAIDBYEINz33ntvJzRvvPFGj75MwvGFFlrIybIyeffdd50EHxUhyhviCfL83nvv9QjwOvLkk086Kcb1n3rqKY/aR4YNGxYOPfTQcPrpp4ctttiiS1X7779/OPXUU8Pmm28ezjnnnDqXGS1l1l133TDjjDOGddZZJ4Bx3ejWnm7sc889F1ZZZRUfk1deeaVPHRcQ/xCv4403XkO3IChxDD3yyCPutNlggw0ayuhAVwQgXU844QQnvddcc83RCg9k8U477RTuuuuu8OGHH9ZqC5Hb++23X+Bc5jBzpK9kueWWCw888IBf87LLLuvVy+IswQmJPZx44onbutbVV18dHn/88TDnnHOGbbfd1p2NU001ldeBDUEHTjrpJCffv/vd77ZV92Au/J///Mdtm1YGDOZRVt+EgBDoCwREwvcFyrqGEOgHCJxxxhnh3HPP7QctURNGBwI/+MEPAi8eEiEgBISAEGgfgbvvvtvvoX/+85+7EPDUdPDBB4fXX3/dfysTCNrbbrttlKJDIT5+9KMfha222spJ+LqC85W0GqScyaPEv//974ff/e53TsIXhdQOXK+/p3ehT4suuminY6HYj776DgFOOh/SA+Hw7kthJcbtt98e1l577YbL4ij69re/7ePeLlHZUNkQOQDpesABBzgJP7qF1TY4wm644Ya2mkIfcLiceeaZbZ03qoV5znzwwQdrr9AZlethm1ZdddUw9dRTt10NDrtddtklHHLIIQ3BKS+//HK44oorwkQTTRSuvPLKUudW2xccJCfMO++87oTG7kqEgBAQAkKg+wiIhO8+djpTCAwoBFheS+SHZGgiUDdqcmiio14LASEgBJojQEoXyNbvfOc7DQXHGWccjzxdfvnlG3574403PDq6p7I/tptuBeL+mWeecTK2SJ5U1YVTgWjWH//4xw396W8HcBaM7shMyFKer8hP3deOC6KkP/vss9JhQV//+Mc/emoS9EBSD4GqeVHv7J4t1d19H0bHvCD6HTsIGd9X0h2nFytESDVUXB1KLn0i64n45u/cc8/dV93o99dhHxQczT11H+v3HVYDhYAQEAK9iIBI+F4EV1ULgf6KwFVXXTXaX1r7KzaDrV3k5zzxxBMHW7fUHyEgBIRAnyJAvmPITgiaMiIe8pXUKEW56aabiof6/DtR7+0IxNYcc8zRzilDvuwUU0wxWjAgFzYpNaoEIn6mmWaq+lnHhUCPItCXBHx3Gv7N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eO2113xzJvJtjhgxIpx00klOyJOLUyIEhIAQEAJCQAgIASEgBISAEBACQkAICAEhMDgQEAk/OMZRvRACQqAfIvDMM8+E+eabL0wyySTh6aefDjPOOGNDK3feeWePjId8X3311cPNN98cllxyyYZyOiAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhMDAREAk/MMdNrRYCQqBNBP7973+Hk08+Ofz3v//1T0dHR5h++unD5JNP7pHq5GfvSfnqq6/CNttsEyaddFIn1ssI+HQ9rk0k/BZbbOFE/B133BHmnXfenmyO6hICQkAICAEhIASEgBAQAkJACAgBISAEhIAQGE0IKOfBaAJelxUCQqBvEZhmmmnCsGHDwiabbBKuvvrqMOWUU4Zjjjkm7LPPPj1OwNOzE088MTzyyCNOwM8555wtOzvxxBOHo446yvPEDx8+vGV5FRACQkAICAEhIASEgBAQAkJACAgBISAEhIAQGBgIiIQfGOOkVgoBIdBDCNxyyy0eBb/77rv3UI2N1Xz44YfhvPPO87Qys802W2OBiiM/+MEPwlZbbRVuu+22MHLkyIpSOiwEhIAQEAJCQAgIASEgBISAEBACQkAICAEhMJAQEAk/kEZLbRUCQmCUEPjyyy891cu0007bND3MKF3ETn7zzTcD6W+WWmqpMOaYY7ZVHTni33///fDnP/+5rfNUWAgIASEgBISAEBACQkAItELg66+/Dg899FCrYvpdCAgBISAEhIAQ6GEERML3MKCqTggIgf6LALng//nPf4bZZ5+9VxtJJPwnn3zSreuQJuc73/lOuP/++3u1japcCAgBISAERh8CX3zxRbjyyitHXwN0ZSEgBIYsAs8880xYf/31h2z/1XEhIASEgBAQAqMLAZHwowt5XVcICIE+R+Bf//pXePfdd8Ncc83Vq9cmlUyMMYw99tjdug7nff755906VycJASEgBIRA/0fgjTfeCLvuumv/b6haKASEwKBD4Lvf/a7vQSQRAkJACAgBISAE+haBsfr2crqaEBACQmD0IfDEE094hPr888/fq4341re+FcYdd9wAydIdIZ3NzDPP3J1TdY4QEAJCQAgMAAQmnXTS8KMf/WgAtLTnmvjxxx/3XGVW0zjjjOMfiRAQAu0hMMUUU+g5sz3IVFoICAEhIASEQI8gIBK+R2BUJUJACAwEBK6//np/Ye9tEn6aaaYJECx/+tOfwoYbbugbwdaVyy67zKPoV1lllbqnqJwQEAJCQAgMMASIQu3te9GoQMJ9iPRtaVXXGGOMEb766qtALmnSpk088cSd1eflWAnG/iukVRt//PG7NOGiiy4KO+64Y49sPM69nHvswgsv3NDNhx9+OJxxxhnh73//e2AFHG3+9re/Haaffvqw7LLLhi222KKhbQ2V/N8B+n/77bf7ZusvvvhieOuttxyTySef3Otbb731whprrBHGGqveKxUY3nDDDeHSSy8NL7/8cnj77bf9GWGqqaZyp8xGG20Ulllmmdr10bezzz47jBgxIrz66qu+2o+9aIh0nmmmmcLWW28dFlpooaruNRznfPoKttT33nvvBQILqG+OOeYI2267bZhzzjkbzqs68J///CecfPLJ4a9//Wt47bXXAo4Y6mNvnp/+9Kdhp512CmxKX1f+8Y9/hFNPPTUQVPH666+HTz/91HWR+hZZZBFvH/pZV5566imv7+mnn3ZdQXfRlemmm851ZfPNNw8TTTRRrerQi7vvvjuceeaZrivsDfTNN9+EySabzPuInqy99toepNEdIYUV481cRGe4HvON//O5Rh/Qs1SOMvyPzaG/jMXPf/5z1w/ywj/++OPerkkmmaQ7zerxcwhgOfbYY71d6OBnn33mOsOYYDPRGfSxrvztb38Lp512mvedutGZNMaLLrqoz5F2dAb8sC/PP/+818eY8Myf7As6WNc5yLnsVXXhhReGF154wXWG8cJJgs4wLquvvnptnaG+a6+9Nlx++eXhpZde6rQvU089dfjhD38YNt5447DiiivWfi8Be+z2H//4R78fYB+wdeD/4x//OGy11VauS3Xfcz744AOfH8m+sAcWevm9730vzDrrrGH77bd3u1BXwB/7gs1HV7AvzAXswTzzzOP3mxlmmKFudQH7gq489thjbq/of7IvCy64YNhhhx0CWNYV6jnllFPCs88+67rCvGSeocvLLbdc2GabbVy3JUJACAwtBDrsBh6HVpfVWyEwNBH47W9/Gw4//HDv/FCc9qR34SGbh7wHH3yw15WAF+m//OUv4ZFHHvGX6zrCw+N8883n5EVPbczKw/Mmm2ziD8sQEhIhIASEQH9BALvMizMEUSKMIK0gISA0ElkF+QQBQBkIxpTyqyqSnBd7yNJWAnHw/e9/vzYhyyqljz76yNtAW7iX0l4IF9qbhGuzN0jamJv2QjRwLcgCSN25557b70UQDhCKkCN5Ha3a3tu/s2oMMumVV17xdtIX2sx9lOPLL7+8NwEMfvWrX3kfGEvID8bloIMOCpAWuYDdAgss4EQT5Fe7G5dTFyTGbbfdFpZYYolw0003dSF/IEz222+/cNxxxwWc4T/5yU+cOEaPGDuwh+iifZBe/N6MPGIc99prLyfMIZ3mnXdeJy5pNwT6o48+6vhw377gggtabvgOyYsDANINYoj6IMbQIQgz2gexvNZaa4VjjjnGnwWaCaTiuuuu622AsKMd6BgYQSo/+eST3m9IxsMOO8yJxypBRyE9GUscA/ST9oEjzyZcizoh0RhbyK2ikyWvG7246qqrXK/Bn2cQ6oOQZm5ATpGXHEIUQhNnRjNHBrYCYpHN66lvttlm89SCEFq0l2ctSFHmGWO71FJLNdUvbAqYDBs2zJ/R0AWcCxBi6CdjASHHGFx88cVO/jbTlXfeeScceOCB3hfOYa6wopG2Yrsguxkn2n3JJZeEWWaZpWooSo+D59577+3PhpCDEO0TTDCBk5fo0Pnnn9+ZAhEC+9xzz/Wx5/oQuuDBvDj++OO9LOPL7xCM6OVZZ50Vfvazn5Veu68OMg/YJ2PLLbd0Gw+xzdhgXxl/9nWCBAaLc845J2ywwQZNxwR7QF9//etfezkcZ3zABJ2mPpxMkKq///3vvf/NbBLn/O53vwsnnnii6z64Uh/n8BsOJ+YHBCv1QQI3k9y+MI7MD3SG+tAVdBC7gBMNnca2NhPO2XTTTX1PKe4l9AfdAEvsHvWhO6uuuqrrAdesEjBmvvP+wLsD+kJ9nJPsCzYfYhki+aijjgoTTjhhVXU+Zvfdd5+PGWNIfdgr7Cr2INkr7t0HH3ywk/Hod5WgKzgzaR9jy7sd+DEe1JHsC+OLk5J3smZjiz3A+bj77rs7Xtgp7nXoCnrE2FIv9WMPuH81s1fow5FHHunv3egwtop7EfYl3YuwVzj4sJPtOEqrMNFxISAEBhACZhQlQkAIDAEE9tlnHxxu/hmKYi+90R7Uor1w9Un37SUu2oNX/MUvfhHtJbPWNe0hNtpDXbRo+Frl6xSyB3fvt73w1SmuMkJACAiBPkPAXmzj8OHD42abbRaN0IhG+EWLNItGckQjtTrbYSRbNIIrGqnhdnXppZeORxxxRLQX8dK27rHHHtEIgWhkWDTCIRoxG42Y6vwccMAB0V6mo5Ea0QiG0jrKDhp5Hg855JBohJy310iEaC/Z8Q9/+EOX4hblF4349DJGtkaLpo0WSehl7rzzzmikUDSSJhqhE+2F3vtshF/ZJUf7MSMKHEsjCfxeZgRFQ5s4ZoRSNGI+cu+rGhdONLI6mgMjrrzyyt7vdj5GzMQZZ5zRx9UItC7tMILE77dGjvmYmEOgoZ1GjESLVPb7IXp07733NpRJByjLOBupG41YjUacNJQ18ihed9113h4j3qKRXw1l0gEj7F3fjHRyXTByqKEsGBpBG40AikbiOpZV8sADD/h1jRSL5pSI5uBoKGqEfjQiyPvA+IFRlfDcYaRXXGyxxaIR2tGIp4aiRgj6XKI+I/uikXENZTiAPhx66KFe3worrBCN3G8oy7lGwkcjx7y+3/zmN6W6lS6wyy67RCPR4nbbbRefe+65aBG/Xa7Nd3M6RIsudR0wJ0ZlfYybkdLRCLFoASrRyMuGfqDr6IqRZz4e5vBpKJMOGIEXzSkUjSyOJ5xwQjRSu6Es43PLLbe4PWDcsCXtCrgyLowRz/JGLvqcLGLB/MN+GikZjz76aP8/leGvOdj80rYxq/9N39ttT0+X33fffX1MzKHkbWOsc/vAd3PWuA2gHO81VbaGflqUtusMOKBn2I9ifRZp7vMSHTQStrJLSWd4RjdHYjTyt6E+I6PjaqutFo1YdfvCfaBK0AcjtaM5xiLP6WVznWuiM0aou840sy/MWXSL61599dWl9oX7rTklfF6a87e0TGqvOV79fmxkuetqmX0xAt71nfsD9+aiTc77bk6TaA6zaFHz0ZwB0ZxIXaBhHLEvzEfGjGeCZsL8ph/c35n3ZfVZ9Hk0J6DrCmNfZa+4NvbF9uOK5oyLtoK5YWyT7jEWlLPo+8rmMUdttYHbg2RfivdNytx1113RnAf+LGJEfGV9+kEICIHBh8DQZOMG3ziqR0KgJQJDnYTnQcgiGpq+dLcEsc0CkCs8hPGwzsNvlfASddJJJ3lZiJueFJHwPYmm6hICQqA3EIDsgpjlBb2KVOG6Fgnr5G0ZQZjaxfkQZ5AhFv3X0FxssUWxRYsAdUKiO2LRwu7ctKjNytN56YZkqSoDqWFR0ZXn95cfbr75Zu8rJEYzsajIaGk9mhXp/A2iFAIF50Q7JDxjip5YpGTDdXC8cA+1qPWG34oHIIssdYmTZWVOGAh42gjBfc899xRPb/iOnlkEqxNbEGdF4R6PbkOkQca3Eq5pEe3RUu2Ukl9cD/IOMrCMzC/Wf+ONN3p5SMkygQzHYbTkkkt2cX6VlUWvId4gtggcKJJLnIOTgbGAuKojFuHtAQg4O4pC/RB4kKQ8xxUJ52J55pWtDnDCD0dFmdjqBif6ILFbCfVZWhp/foToLApju9JKKzn5Cc6tBOcQRB+OoO6Q31yPtjB/mo095RZffPFSfaSNOJVmn332Vs3ts9+xxdgZ5lAdm4CTCjIUZ2aZQJKiUzjSiuR7sX7mBeQqOlM1PzmH+iBXi+cXv/Mcj7MNcpq5VRTGHedUXWcMddA++lxmXyCXcQhb1HuEeG4lFiXetD4cwjiebCVTqUOpWD+OSOYnOJQJTjNbbeA2NXeul5XlmKVvcf3G4Vc23yGsmb/cP8vsT7HeZF+qnCy8q6FL3K+Ljp+ysU1OIEj0MuF6tJ/3r1bC2OG8Bj+cExIhIASGBgJjDKCgfTVVCAgBIdAtBFg6yTJMlo7ag2y36ujOSSwTZ4k6y2tZdsmSSJY15sKydJY5s1yW5ZIsc5UIASEgBIYSAqSZsJdpX6pOmpcqIQUI6TzshbWqiC+dZ9k+dtdelhvKWcStL4tn+TxL2dsVI7eCkaSeIqEsH3mqj+XtLNUnr3SZsEye/NH9XYxg8VQCrZbLs59J3Vzh+++/v3ebdAbtCOlfSHlAKpRcSEVixHCw6OuwzjrrtKySlAKkszDixdORFIX7MjmLSSXQbIzTeegZeZiNbPI2FIW0BKSGsch7T1PSSrgmaU14bgHXopBWhNQ+9KFZipl0nhF+niqF5xFSIOSCnvKsYoRgMBLZ0zA0E1I/kJObtDAWuexpYIpC+kOetWyVS/Gn0u+0jdRF4FQU5rwFkbhtYKyapZTgXPSDtBKklzGHnae7yYVc7egKbSd1RyuhPlK1kPbGVsE0FL/11luDRSsHW13jubZbCbYJnEkBw3Nfu0JuacaMVCfNxp6UOmBQlc+e65MGpL+IrWzy9B/FFFZV7SOtFWOCbnDvyIW5BrbmZPBnb3S2mWDLSa/FX4vAD6TiyoUUUcw15q5Fmzeryn/DrtiqHNc9W4nQUN5WTgX0htzjpAlqJaRaIQ89c4H7V1GwB6SLIq0JaZ9aCalRSHeF/TUna0Nx0jRh8+kzdqGV/PKXv/T3G3K9F1NpMjbshUBqIdrXyr5wLVLRMDeZp+TzLwrtI20P/W41tpxL+ixzMLquMHdywR6Q/ogUZaTbafb8wXmMLfd0+kMbuY/nwpwiB7yR+W6zWgkpbcCZ69IviRAQAkMDgeo3naHRf/VSCAiBIYAAL6s8aJErtc4DYE9BwssiL7c8lPLCwEsBD248JJMbkFycvLTxl5djHmLJPygRAkJACAwVBMj1y6aS5Epdc801K7ttEXFONFh0Z2UZfoAIIK8rL8u5QKzwYnzFFVcESGA2XOyOQARDcEGCNdscELKTHLVVmx3ikCWPdH8WMGdDc+5lzXAnP/U111zj+a7rCPdD8p7jMCk6psvOhxAifzh5eSFyuI8msZUPnqeZ+yrkfCsSJZ0HibPbbrs5IUr+3lzIlwyBV4fQT+dBlEFMk48b/UhCvnLyOfMs0M4GpJBzkELkD8+FPNbUB9lPG+sIRBVtw0mCsx88k0Cik/sc4os5WEeojzzzPK8UnQR853mLcapbH/WQZxmsTj/99C5NgCRknjBWdQg3TsZJR/50cjjjREpCvyHfyZMN8d+K0E/nkeMbAh7iFB3MBYKeca1D6KfzeBbdc8893VaR87sdgWAGB/ZEaCbkB282Z6mjLp7NrtMTv7HnAjnLITeb5dnOr8XYUZ58+zw754KNh/xlftTtI9fFaQHRTf7+XNjXwCKbaxH66TzsPnnDcTCzV0YuzGnsT5WDtkvh//vC3gyQupZqxnOKJ8EecD8jLzvkel1hs1faBxmfC7acTVipr649B2PaBn4Q3gQ+JWH/ExxH2GgwrCvsxUE95NbPBQcpzwHYwCoHU/EaOFdspYXXV+wvznruc9jGurrCPYa9XMivj0M/F3DDmYTDsO69iOcI+gPu2E6JEBACgx8BkfCDf4zVQyEwZBEgIoGXfDYn5WGJh3YecHgx60uBcOBBj5c3XtiIyCD6nQ3keIEgOo5NySRCQAgIgaGGABGZbFBHJBpEQ5VAlEK+5gRssWzawLVIPkG+EXWI/bV8r05aFEn6Yl1V39kUlJd1SIxmAllmaQ4qi3A/6m4bKivt4R+IQiSaH8Kh2SZ+kExEg9d1ctN3xgIHNCRrTgqXdYFxhRgjurRIPnJfhaAnerzZComyeiF6cAJAbCVh00A2VYckhbxpR4g4Rzdw1CTh2QP9Jiq7HYGYtjzFHgELSZQEhxXXgDRvR5LOsskubUpiKVt808tW+ly8FkQ2qyN4fsmFgALIT0jGdoTIect13hA5jBOIaOa6Dod0TUv/404AVq0kIWoVPeIZrC7hls7F6YB+5U4HCEvsAbrSbJPaMhxsXwvX+7KVBGXl0zHKM39w8DUTNtlthhl9qeuEaHadnviNaHFsf5XDsuoalGeFKw6c3IYw5qx2aXavKKsTnWZM8xVKONQIpMHRUpdUTXXjGKRdOZHMd4hbnGJ1nVSpvlVWWcU3fs1JfcaZ+Wspkcq6VHmMsWcDVOZDXh/6zLoSua0AACAASURBVDsSq1naFeYvzpTcCYl9QNcs/Vdb1bFihAh6nLu5QKJzP8ImtCNsjspKBsYit6e0L22y2059M9iKCBw9OAWSEPCF04WVAe0GVLESI61GaqcdKisEhMDAREAk/MAcN7VaCAiBGghAuD/99NOemoAHIyLRIeWJEBodwoMoUWhEep177rnBctg2JZ1GRxt1TSEgBIRAtxEY+U0IfNoQ7DHEB5HlzYQo2VZL7XnxLUYO86LMsnacnpZT3NPQdFdSajOuUySDi3VCRjRLNQAJ0u6LevEavf09EZiQP81IS6L+LU9+W80h8pT0ADhhIPqbCfdtiCaiKYuRspBSOGggZtoVnCCWm9tJ9ySkaOB43bQY+TV51qB9pK9IAgEP0c/qt3YFopa5AdGWt4/rdMeBY5ssejV5+3C0QChZzuZ2m+cpPPLnKfoJwU+kd3faB0ZEIkNmJaF94NCuQMBCnObtg1xEVxjz7gikdk7qE+GLTbBc121XxxgiuUOkTiU4TcC2lZMDsp6I3CohKrldJ1NVXaNyHP0msrmuAy+/FjaJfuCIy1ezENzC6oV2BTwg7/MUKMk2tesg4Nq0j3RGuaOFVSe0FYddu4L+QSDnOpPmctKnduokcp73kjwtGKQ0DtW6Ueb59aiPvmGTkzAWXKOZE7eqzcx77i15ZD0OkmbOpaq6sMs4+rAtxfahK83ub2V14pAhgr1MV7pjX5jTjCH3OokQEAKDH4GxBn8X1UMhIASGKgJEPdTJvzpU8VG/hYAQGAQIkFpipC3/HmnRsokE/4bv9rG/0T4d33wZ4pefhA77hK8+t89nIX5l3+0v/4cvLB3H55Yf+IsPrdyndvzzEL+mnP3P3y+t/Ndf2P9W9murK6Wz4LcS6djXUiyMM2HJL42HiBompUgrEp6IvTrL44tL3kkhQeQ7kXM4P4m+7q6Q0gbnLuRWK1IBwq9ZdCwEfHeIDqJ5Ia7aFUgGCKa60a+MMYQf5VsRRpCRdfLfFttMmgfyrqMDEBplkaYQJrSDqHCim4sCQQMx1d1xZQzytECsoIMQ6Q5BCdlEH/IUO5BSYAkZ165A/FEf0flJwIPrtEsacX7SRxwaSSCl0IvuCPMg7yvjwIcI3+60D4zAivaluTEq7SNKOm8fuoKt6c68Ax/Oy8cCXWF+dEf3GEOkmH+82ThgUwgsQS+I2q4S9JlPs5zx/FYnEpvgFdvIs+pSlceZPzhEGYNmgi1jTLrjtKFeyNVkA9J1GPOEb7Nrl/3GebkTKM2V7rSPuYt+5KRvyiHeCpeytqF/zI88l39qX3f6S/u4D+X10b7u2Crayzxg/uekOXnxsTtF52lZ/4rHsEvUxXiCP3pCfd1tH+eVta/dFROpnWBXpivN7vvFPqbvjEVR96rK6rgQEAIDHwGR8AN/DNUDISAEhIAQEAJCYLAiAOH96Tshfvyf0PHpuyF+ZPmm33s1dLxveWbfey1EO5YI9xBtg7pokeiQ8ImI/xoi3khbqyeONW7oGPtbIdonjPN/f8ca33YbM1JvnAlCHHfC0DGRRcSOOY59t+NjjedlO+wv5/E9jDl26LBPDP/b7M7JtrEsbUfH/xZXerbpse3cmsIGmBALrZaXk9sZwrYdYWk9eb0hrMgT3Iosox1EVVZFBRONn9KzNIvcJE9vKxISAqw7RAxpMYgubFcgMXBCtFpNkOqFHCMqD4KiWe57ytOeVtiWtRcikOX8OMshF8kpnAvjQToWUgmUbUhIWYgLCL88BULZtaqOMd55ag/SYkD6FPPEV52fH4fMgijKo2YZYwgWdKdZuqWy+kkTQX35hvKkLLjrrrsaNqMsO794LBGA+VhBpDMHuyOs9siJXsYCYgrSkRUodR0+6dqMBfMmbx9jT3R8dwSHWR6IkXSlmNe9bt2cl69oYDwZH6KR242UTsRnOwQg+xdAQrKistkqGlZ2sAqnGf5gXMcZwYrN3JFRFyvGsU7fICzpS3euQVtIVcW45iQ0OpkTy3XbTDl0N7f/SReLG3rWqZM5gB3NHbZpLhMR304Od67HqhpwzTdLTXqXE/112kYZ2oYTKK+P9qFn3RFy1WOL87FAByCqExnfTr3MX5zqSU/RZ8amO/OXewn3ZXQtdz6l9rXTrlQWHcvtQdKV3FFXt17sCGPYnRVdda+hckJACPQfBETC95+xUEuEgBAQAkJACAiBoYAAEetfWvT5F5Z24dP3Qvj4bSPZ33KyvePT941Yt78f/zvEd14JHR+8biS6RbkbKR6NLHeCGyJ93IlDx3gThTDVj0P41rf/978R6f47f8eziO8JLMJ1vG/b77aR5fiTGVn+v42f/0efNwJddrzsGGe2e7zxasGJEkhWiIRmUe5EdbIEPycLyurLj0EQ7rDDDh61Th7nZkQyZSE82RiN/L9EfpaR6CyFh7Rgw8xmkYe33HJLS7IbUhyCsV0p5rStez79aUbKFeuBhIYEgfRoFikNHpC7zUjBYt35d8adDcpxmJAGIV/JAGnCuJBKqGrsIbkh3VgpAelVFk1fdX1SlbAx5qqrrtpZBEcAEZNsLNpuXuTnnnvOIzfpRxLwg5xBz9n8rx3BcUT/8tQj5FYmLzKEV7No6LLrkBYDvcvPw/nFfgk4QdpJmUM/yaXPhrRJqJsVLffff78TfHUirfN2suKB/RxyXSItEPNy+PDhbUVL4xjC8ZG3L+UJ705kN7rI3gPsI5AEHLEv7Dt0xBFHlEFeeYw0Gwh7YdQRSMQ//OEPbpcg4ZsJdgpnXSupk7Klat61qrvu78xXVtrQZvpYZner6krEJU60XNcYc+w4K2fasXmQoNg97HuSGSxVE3VDgDe7R5W1kSh1CGj2IEiC4wZSHp1pl4THhnDfyUn9ZGuwPe3WR7515mzuhGQsSPtFmpV2074wf7HFuXOZ1Cw4MHA6tEMwJ31n/6xcJ9i7gn1EGPt2xhZ7xJzDyZA7n2gfOGDP2lntgFMB+8KeX0lIw4VzHhzaFfSEexGbykuEgBAY/AgoJ/zgH2P1UAgIASEgBISAEBiNCMT3LHL5+dtDuOPQEM9bLcSjZw/x2LlDPGmREM9eMcRLNwjh2l1C+PMxITx3k4XjWY7sSWcIHYvuGMKWN4aOvf4eOnZ/InTs8mDo2OHO0LHNraFjM9tMcv2LQ8eap4WOlYwAWmrfEBbdNYQFjXyZx+qb7ZchTL9QCFPPZuvEv9NJwI9GGBouzcsqKRbY0K1Z6gQIQl7G65J6ELeUJzqajR1zIo5GEOmX58Um5zYv5hDKLFeHACgTNtjmt1bpWSjXKqc45BMET3eEpf3tftohLGgTG8syNhA7zXAHS8jldsjvYp9JFwSpAcmZBJIl1U3u+CohkhHi9s477/Q62hE21MQ5s8QSS3SeRl8helh10U6qECrA2UMkaJHE4xrXXnttO01zB9Wpp57asInoMsss4xHGe++9d1v1odfsjcPKkHwVByQ8Tod8w9E6FUNkQ2rlBCPnsWEsTq18w8I69RHd//DDD4dDDjmkS/E111zTHXB53v469VGe6Oq8ffSTTRNx+IBHO3LggQd6Wg02i0yCzrPPxHHHHeeEXDuCM4053MpOpDoh6cAHO8mGuFUCmci8rUMY13UAVF2rp44fdNBBnuan3RU+EOM4AIubFLOBM2R6uxHT6DM6ko8J94Utt9zSHZLt6gybIHP+Wmut1QUq2nfOOed0SYNVB0ucXsx99jpIgtOL+XzhhRfWqaKzDA4CHEps6Jqv4oAox7nECoiq+2DVhXB8cN/N9yKgr1wLx3Q7gsMBZ956663X5TQcBNgDnBjtCGOLzWKz9PxeldrX7koqnArcK/JN4LH9rNjC1qdVR3XbiA3h/sX+KxIhIAQGPwIi4Qf/GKuHQkAICAEhIASEQG8hQAoYi2QPbzwe4hNXhvCXo0O4wV5gL9s4xJMXDfEQ24CPvxx76Z4QJpwqdMyzfgiL727k+eGhY51zQ8d2fwodv30xdPzulRB2vDd0bGz1rGipV+Y2Mv07lqLDIt2DpYrxCHci3T0tjKWAGWNMdn/rrZ71er2JqFt33XWbXoso5/XXN8xqCC+/m2++uUcgnn322Q1kFFF5xx57bBfSn01FIU6bRXND6qRIvzz6rdgkrs+1W23OBgG38MILF0/vN9/J8w4J04wkhFyBDMmJye50gJQhkMo4QxKZSSocohchXVo5ECBIaeumm27qhE8duf3228OIESM8l30x+nabbbbx+upGN1MWEgyHDzqXr5KAuKV9EFQXXHBBnaZ5GTZwZ9PazTbbrMs5EEjk6SZSvy6xj87TJ/qJ7ueCnrIS4bzzzgtE09YR6hs2bJiT0kWSDBIOIok5CHFZR+gnkduQy0T658IcIdr3sMMO84jaOkJE6cEHH+wEfE6ScS7kIuQZZHzdlEOQgYwvdqrobGJ8OHbooYfWaZqXYdwuvfRSH+Nmzse8Qoh1dBvHXVFf83I4F9MGvK0ahBOqldB3UoG1+7nhhhtqz0VWn0CG4ojJc2w3axvlcKawOXDREQTpDRHMfSPPT96sPpxeaRPg4ooQHEOsWmJ/kbpEPA4F5hNztZgPHZ1B904++eRmTeryGw40ro8tySO5qRuHDimlWNHCaqA6cvTRR7ujb8cdzdFfkA033NCdmnXT0jAvme+QyMzTXCD1scus3sGJVEfoA/OXVQOMby44NHEcsEoJIryOQNpzj+K+XdxAHCcac4p7e929VugnTmpWWhRXHxDJTkQ8q1Xq2hewZjx23nnnpvvI1OmryggBITAwEOiwB8fycJ+B0X61UggIgZoI8MCS8ulq2tcEbRAUgyDZZJNNPDUCpIZECAiBbiIA2f5/udajpYjp+PfTIbzwlxCfv802NX3fyHAjxC1Xun8m/m7omOJHIX5/3tAx45IWjW4pGwYwWd5NxFqeRlQuhBSR7lXEEfer7bbbzgmrVsLLMS/tvFBTvkhgcv59993n6S3K8svvtNNOTpbygl0k2yAKSd8AYQy5UyX33HNPeOqpp7zNvSGQW0T6tysstYeAqJOnmbpvuukmJzsgC6ucJBA/pDiB2BxVIRIRUgMCJl2XiEywbkXCc23y3UPk8qxDZH2R+MrbB9kG2UsEKP8XN/OlLNG1Z555ppPqECpVbaC9RF1D5kD4ktqg7NqQ/WBJShEIoSoilRUA559/vvcF/eX6RYE8IwIWYhZ9Zu5U1QdpeNJJJwUIV4jzPJ1KqpdrQsZDVjEXm0VIE10Ooc9qD9JC5KsIUn3Mn0UXXdQJKhwdZfimssxZot1xyFEfZGxR2LgXMh6HEGRws/0H2LOBNtFOVlaUlUVXiIhls98jjzyyaRoKCH2uzThTX1lqJvQf5wZ17brrrqXjT5+wZUT44vRg/NpZLUBUN4QmEe5V50E4gyXjXNxfoYhp3e9gxHi2K9gbHBd190EAF+YP+K688so+JmU6DYboNAQx6WMgMMs29YbwZYUVZDz3BOZkVX0Q+sxNyFMipss2ZT7hhBOcUGflCOlbqKuqPuYnUetcm+jrMpu77777upMPcpr7TpnNSDrD/YqUWdhvCPcywfGAzWZe0t/i/Sudw1ynDmwaK34oXxRIdXQNhw62LfW3WI7vjAX30gMOOMBX7my77bYNxZiL4IaDmvry9FrFwpSF0MfJCIboQlHSyjhsFnOhDN90Do4rbDPpjnBilDm+IfPpIw4xsGume6yOwiFCWXSlyr5gv3fbbTd3zpXpE+1Dl3muoE1gjq7UnS9FTPRdCAiBAYYAJLxECAiBwY+ALefG4eYfydBBwF6Cor0oRHtYHTqdVk+FQE8g8PWXMb79Qhz5xB9ivG63GM9fI448eZE4ctgMceTB08aRJ/48xss3j/G+06IR8TG++lCM7/4zxi8/64mrD4k6LNd3tKjUaFGDpf014ivay328+OKLS3/PDxoZEI1Yi0aWRiMFSstTn5EP0Yi60t8tKjBaHtxoREXD7/byHY0gikYUNfyWDlhKhWiRwdHIhsoyo/qDkQ7RSJm2P0ZaRSNta1+esuZ0cEzLxAiNaA7eaERY2c/dOmaRodHIKL+u5RWuHKeyyo3EiEY2uz4ZwR7NuRM5lotFZkcj16MRKNEI/2ikc1lVfgx9sshE16dll102Gnnkx5KgS0bgR1uhEY1kjkZ+RkuPUVmf5RSPRr57Wf4a4dJQ1iKBo5FA0SLp4xZbbBGNkGookw4YKRstNY3314ivaERSpE1J6LuR2tEI6WgrPKKRQQ145JXTF8uXHC3SNFo0ZzQCrsu1jcyK5tSPRlZ5+yydRpfrFRtqzhkfRz5HHXVUtBUOXYowR8xR5s8mljc/ok/NxPLj+3WNhI4W8RuN6OxSHHwtYtn7YDmzo5G6ldVZxGs866yzfCwscj9SdxFrbBLjz5w3kjeiO1UC7ub8iUZ8un1gjhoh3qU4+FpEcDTSzvWpiG9V3ek4Ngm9sVUBlUWxp5dccknTcak8uR/8gP4zdhbpHc2J43PA9vXwD/PWyNloqyUcw1ZjzJhYiqVoqzXclli0fDTnUWd91In9YmzRA+p74oknKlFgPNE7dNCI0mgpybrUR/ssgjxaai63YVzP9m2orA9bYuS7z03bRDfaypyG+46tDIpGvEdLkRPNMRmZ81WC/nNvwx5wjjkvu9TH9ZJ9wabR3qKO5nWbU9T7wFhsvPHG0VZGdbk09sUcYtEcHX5NcyhEbESVmAPL7622oiCa06rB9lrUeOR9xRx3jp+tGqqqyo9bqp9oTlq3L1y7aHu5F3M/McLfx8scxpX1oSv0hb5aah/XPe57Sff4i+6ZI8F1BX0yR39lfczVM844w3XPVthFc3REnh9ysf1I3L6gy+ZcjHyXCAEhMHQQEBs3dMZaPR3iCIiE718KwEtgX4hI+L5AWdcY8Ah8aS9I770a4z+NuHnw3Bgv2/R/ZPsh00XL3x5HnrJEHHnJRjH++eg48lV7+YKgl4wyAhYx7i+hZSQ7pAGEEgRjTn6WXRQywSJ8/eWdF+acjEzleUm3aGAnEaukGQnPORYJGS26sYFQ5DdIRl7cIT4Hi1h0r5MctjogWrSoEwmQk5Cx9LVIhPZEvyHQcRzzzNIdsSjPaOkknNyCVFluueWcvIS8hSRl/CxKsYEUqbrWKaecEm0lmesWZA5kmEWQRkth4O2cdtppo6XSaSBxq+qDDAdTiDDOtSjNaNGeTkRzDYtCjyeeeGLV6V2OMybMD9pF32gnbYMgtOjQaBGdTnxZqpnSOVG8CPMIpwJEFPVBKELoQcaBJ2QbRBQOiToC8Qb+zHHaAuFNfYwxZCaEFqR1mUOirH6LgPXynGfRpU4Arr322j6nGQtb2eB4NiM/83pxTNnKFm8LuoJTA12xKHIfH3QFYrOu84rnLfCmr5D3OFSojzEFTxwcFlleW/eKGEDcQypaxL07v7CLOA8gSC0C30nigS62YtNxYzzAjHlhOdD9L9/RpaWXXjpy76gjENk43CBE0RHbaNYdGYwP39F1dKjosKuqG0LVosRd/xhnyHvah2OP+min5ZCv7Zy0lS4+b6mLOnDQYA8sKr/TRuCIriP0AUcUtgn9pW3UxRyE/Ma+2KqZaPnHa9kD6kOv0FuwBzdL4+TzhPEBA2ytRYbXaZ47p3FEJeyxydgrSG/mIPbFUsZEW01Wq76XX37Z7THzHvywA8x/6qBtOC+wEc2cK/mFKEd57AtjiV2F6Id0p/+MD/MZu1tHbNWa28t0L8KOWqouvxcxPugKjhscKBIhIASGFgJKRzPAVi6ouUKguwgoHU13kev581hKSUqBdjdW605LlI6mO6jpnCGBwKfvhvDSXSE8fW2Ibz8fwhcfhvCJHRt/stAxw4IhzmEb8FlKmQ7ysJOTnb+SHkeAJeykDyFNR0ptYS/XnlaEJeKkQ2B5eDMhbQjljHTwVAzkfEZIz0COcZaik6LGos08By6pBcqkWToayrN5IKlSyA9Mfu+Uz5mUOuT3Zel5s3zxZdfsz8dIXUA6GFImkJrAXpE8xQipDEgvkOc+76l+kA6INAnkpO/u0nzSVJBiAJ1ic0Ry/VIXKRsYH9IKGalSu8lGknh+Z3MWeVo3cCFVDumUwIM8xe2IkcSeeoC0EORNN8LHU8qQi5lNhI2caac6T09E+g3qY5xIncMeB7SP1DJ1845zUSN2fYNM5gxpMEgTZKSU48a4UF9ZCoaqBjMHmXekgiDdDHOIzS/ZYJZUExa53nTj32K9pIPAPvAMRWoLUn+Q9sOIxmARxT4urexFXid5m9EVsMNGkBaC+kjrQsoic5RUpiIqto3v77zzjusKKStISwWe9NGIXk+bQsqTURH0hZRC6BDplNBtNkYmDQg61I5ej0o7evNc+oTOsJknOkO6GHSODbGNpPYc3u2OMbihz6RvQmeMjPe0QKRNYnzaqY/zSVOEfSGNDjrOvYd0MdhF7Es7wj2K1CakhuH9AJ1hnqGD3bEvzFnsFCl20G10ArvCviqkgkG/64o5tAMpnpJ94X+wop+0j/ryjV1b1Ut9jC3jwB4a6DH2hZQs7CXB/M1z3reqD13BXpEajRRFpLyhPdgC9IVNbJvt9VKsn3Q46AqpfbAv3Eu435OmhucT6mtHV9Bd+ot9YX8F7Au6R0oy0muhK9h/iRAQAkMLAZHwQ2u81dshjIBI+P4x+OQ/5cGfh0Zy0bKxWW+KSPjeRFd1DxgEvrbNGt97LYS3nw3BcrnHl+8N4fVHfJPUMPmMoWPKmUOcatbQMcNCIUw504Dp1mBoKC/lkBm8kJM7lRdSXsoheiES64gt/XaysI5AJFblS25FwlM/JBs5tiFLyF/MS7tFv3oO+HbIyTptHYplIFXuvffehs0WhyIW6rMQqEIAshGC0CK5ZXeqQNJxISAEhIAQEAL9EIGx+mGb1CQhIASEQNsIEKHHBjf8JUqBSBI+bNiTiBFeWPikKIYUvULUWF8J0WUQDLSNjcEs3UJfXVrXEQJDD4F3Xgjx/jNDx8MXmm2wjVWRSWzT1J+uFcK6F4QwweSdmCgWafSoB1F6RIny6a6wUWRfCcT7gQce2FeXG3LXwRFjy/aHXL/VYSHQDgI82zbbkLKdulRWCAgBISAEhIAQ6DsERML3Hda6khAQAr2IAMvDbdMhX+Jo+U99mbxteuNL/ixnoV/Z8pMG2+gp2OZGvmyUZZ4bbLBBW0sfR6ULOABoE0vNWeLMUlGWELMcViIEhEAPIGBR7uHFu0J845HQ8aZFvH/4Zgjf/UkIS+0dOqaYOYSpZw1h0hmChVv3wMVUxWBDAMcs9xKi8wdDWofBNj7qjxAQAkJACAgBISAEhIAQGMgIiIQfyKOntgsBIdCJgG04FNZbbz3PAzhixAjPk0mO4DxXIXkzyedH/mByffalEKF/xBFHeC5T8iiSbuHRRx8NtkGSt0U5AftyNHStQYPAV5+GQG73524L8R7L8/3xf0MYd0JLMfPDEObfPHTMu7Hlcv9ffvBB02d1pMcROP3008OTTz7pq5S4d7BKifzKtildr6cM6/HOqEIhIASEgBAQAkJACAgBISAE+iUCIuH75bCoUUJACHQXgbSh1vDhwz0iHhIFIbrxqKOOCvvtt59vhtPXQr7iCy+80J0ALCEmypKNydhcjHzIbBgnEQJCoAYCI78J4V+Ph/DE7y3i/dEQ/vNc6JhwytAx+2ohzrRU6Jj8ByFMbBsldtTfeLHGVVVkECPAhnXrrrtupzMUpymftMHrIO66uiYEhIAQEAJCQAgIASEgBIRAHyEgEr6PgNZlhIAQ6BsEiCjfc889w9lnnx2GDRvmm/tNOOGE4eijjw4///nPRwsBjwMAZ8D7778fll122c40BzPMMEP43ve+57+RkmaaaabpG5B0FSEw0BD48hMj221T1VfuD+HxS0P8wNLMTDFjCNMvGDpWGBbCtPN7j5RkZqANbP9orzZU7R/joFYIASEgBISAEBACQkAICIHBjIBI+ME8uuqbEBiiCEwxxRQe1UiKASLNiUJfYIEFPPJ8dMgdd9zh0e6LL764p6HJhbz0119/fbjooovCHnvsMTqap2sKgf6LwKfvhPCobV788EUhfvx2CGOPa2lmtggd81mamXEnslQzXedT/+2IWiYEhIAQEAJCQAgIASEgBISAEBACQxkBrdUeyqOvvguBQYwAG6+OPfbYHg0/1VRThaWXXnq09Za870Ra/vCHlqe6IETCzzLLLJ4v/pVXXin+rO9CYOgh8MVHIf7t+hCu2THE4+cP8eELQ5xxidDxq9NDx57Pho4l9wxhIls1IgJ+6OmGeiwEhIAQEAI9gsAXX3zRI/WoEiEgBISAEBACQqA+AiLh62OlkkJACAwgBEg9M/XUU4dXX301rLzyyqNt49Prrrsu3HzzzR4FP95445UiSFt5Gdp33309D7FECAxJBL78NMS7jg/xiJlDuHLLEF99KHSsc07o2PXh0PHLo0OYZXnLN6OEM0NSN9RpISAEhIAQ6DEE/vWvf3kaRIkQEAJCQAgIASHQtwiIhO9bvHU1ISAE+giBu+66y18wvv7663DggQeOFnL7jTfeCNttt10g9/v3v//9yp6PO+64YfbZZw8jRowIf/vb3yrL6QchMOgQGPl1CH+/McTfbxXC8DlDx2OXhY4lfhM6trwxdOzyQAgWAS8RAoMRgddff933KZEIASEgBPoagc8++yy8++67fX1ZXU8ICAEhIASEwJBHQCT8kFcBASAEBhcCRJLff//94U9/+lO44IILwowzzuj52CHE+1rOO+88z0c/zzzzNL00m8nOO++8XmazzTbzqHiJEBisCMSRI0P4xPK7P3V1iMN/GuI1O4eOj/4dwqonhgDxvvjuttHqzwZr99UvIeAIjDnmmOHDDz8UGkJACAiBPkeA9IjTTjttn19XFxQCQkAICAEhMNQR0MasQ10DVwA83gAAIABJREFU1H8hMMgQeOSRR8Ktt94a9t9//zDWWGMFcsMfffTR4c477wwbbLBBn/X25ZdfDsccc0yYY445wjTTWP7qFjLGGGOEhRZayFPXnH/++WGbbbZpcYZ+FgIDEIFP/hvCnceG+PxtIXz6buiYe50Q5tkwhCktBc0YeiQZgCOqJncTgYkmmqilg7abVQ/I01i1xkow7uH//e9/ww9+8AN3TrOSjPtju0Kk71NPPeX1ffrpp2GmmWby+tiHpUzee++9sM4664Svvvqq7Oe2j7HCjf1gZp111tJz33777fD44497n+nfT37ykzD33HOHSSaZpLR8q4NvvvlmePjhh8M//vGPMM4444T55psv/PSnPw3f+ta3Wp3a8DvBDP/85z/Do48+Gl588cUw2WSTua7ONttsgX61K9T3/PPPe/to5+STTx7mn39+r48ghHblm2++CX//+9/DQw89FMBxuumm87GFWMa51a4Q+PDkk0+6rnz88ceuez/72c+83u4IdTzxxBM+vp9//nn48Y9/7PWRInF0C2PBB51DR5CR5hjvzhzrzb7QxmeeeSb89a9/9TFmb6cFF1zQsezuGFNf0hkCdOg/OtOdvmNfGN8HH3zQx/hHP/qR63R3HRsffPCB1/fYY4+FL7/80lfHotN13h/KxgHMmG9PP/2044V9QQe7a18IZAI75jE2INmXCSecsOzyTY8xtrwj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ZoaAIWAIGAKGgCFgCBgChoAhYAiMDwSMhB8fqFqZhoAhUIgAEjTIrpD9nSTsIevJQkwj6Cl45MiR8uyzz/os87J27733eo15sh07wnr37i277rqr30yWthZtIov8wX333eclfZDkMeuBCDjVGn/6KpElNhWZacHmBGDMKJGb9xH54g2pbXujSHch4L/7WOQJDXy8/oA4bZv8SlforHHM2A1VZ/it1CaarDn7w2plCBgChoAhYAgYAoaAIWAIGAKGgCHQJRAwEr5LdJNV0hDofggsuuii8vTTT3ut+CmmaKt7/cknn/iNV2ecccY2DWfDPAzy/sEHHyxNwkPaDx8+XGaaaSZBKqaj7Nhjj5XXXntN7r//fkEOB037KaecslXmgAAEbUFD/4knnhBkfO6+++52y/7vqHbaddoJgQf6aua1yrv0Pq5p5V3cvSd5orq21XVjJVnaqemdUgwZ/e8+JfLyHSLDByrxrhn9cy4jtT4n+/+bGQKGgCFgCBgC3REBnj8/+uijDn0m7o44WpsMAUPAEDAEDIGqCBgJXxUxO94QMAQyEeChnr8ytvPOO/vMb+RallpqqdZTRo0aJc8884z079/fE9bBpppqKvnggw/8R45BT76sjRgxwuuzQ+xPN910ZU8b5+OQNrj55pu9NE3fvn39JrRsVksggE1o33//ffnxxx/930orrSRDhgwZ73r149woK2C8IOC+fEszsS+W2p8OEZlo0vFyjXEu9Fklqp+8XGob9hOZ/Y/jXFynFcAc9eLN4oaeKDLiM83mn1Fqm10h8pslRSYvP690Wv3twt0CAe6VrIDqyHtStwDOGmEIGALjjMB///tf2XLLLX2CipkhYAgYAoaAIWAIdBwCRsJ3HNZ2JUOgWyNANvcDDzzgM2vI+v7HP/4hq6yyinz88ceCHjsSM3feeacnHNZbbz3p06ePnHPOOZ6c3n333WWJJZaQV199VU466STZf//9vXZ7bBtttJFcccUV8uc//1mee+45WXzxxQvxhODn2BdeeEHQW4fUv/HGG+V3v/udkInfEQbp/ve//1022WQTGTRokPz73//27RwzZozMOeecsswyy8hyyy0nm222mZetMeuZCNSev2lsAIsNWZvRXn9Q5Ka9RVbaX2SRJq1jEW4/fCny7CBxw64VUfmZGlgvtJbIvH8qOtN+NwTaHQHumSuvvLJfCWVmCBgChkBHIkBiCysxzQwBQ8AQMAQMAUOgYxEwxqdj8barGQLdFgE2UyWjHekVDAkYZGaQgFl99dWFrBuI5yApwzHbb7+9bLXVVnLTTTfJfvvtJ6uttprPHE/Tgj/rrLPk0UcflVNPPdWft/TSSxdiSbY8m6L+/ve/l+22284HAn7++edO2XzvD3/4g/BnZgjUIcBmoI9odvmfjx+rRV53QCd/8dM34m7cQyValpPaqod1cmUauLzKzsir94jcsp84mUDJ9/VF1j1DZIIJGyjMTjEE2gcB7o+2EWz7YGmlGAKGQDUEZp99dplnnnmqnWRHGwKGgCFgCBgChsA4I2Ak/DhDaAUYAoYACJDhnrasfuqpp84FCFmWTTfd1P8V2fLLLy/8lbVZZ51V+DMzBJoagTuPFplmdqktXjwGOrwdP34jcsO2ItPPI7VtVI6mK9mYkWM3un36anHffCC1FfaR2iJKwOtGq2aGQGcjAAlfZXPxzqhvlrxccjP1tOOSxxTVnzK+/vprv5ruiy++8LJts8wyS92eMUXlhN8pj3Lee+89L/kG6cg+M6xOa8RIIPj888/l3Xff9ZJ4lDfzzDN7ablGjDI+++wzXx6r4CiPoExaEkKZ8kkw+PTTT73M3aSTTur3mJl++unrNr4vUxbHsF8P+/MgA0hCA/0x7bTTZpZHAsVTT+keG+1kbFK/0047ZV7vm2++8XWjj/ETnvViCcMq1cBXvvzyS48dKzmRLiSBZPLJJ69STOux+Ar1CpKDwVcmmWSShsprz5NoHzJY+BoJKvQzbQe/Rn2vPesXlxX6mHHH+wU+TQZ/Ixbkv+gT2vub3/zG+824+Ax9/Pbbb7fOL5TX6PxCkhLtpDwShoLPMJYbMcpgJTIrrehXxhPzX6N9zKoJ5ivKw48pDx+aYIIJGqmeH2fM9WF+ob1580vRRb777jtfFnMgvkJ5Re+fWWWGe1HwlfAuSbJZo0bfgh3jjfkFX+nVq1ejxdl5hoAh0NUR0InGzBAwBHoAAocffjhi7f7PrOcgcPXVVzslQ9yCCy7YcxrdlVr65duupe8izj1wWvPVuqXFtfzrTNfyt7md++A/zVe/rBqNGa31He7cxWu6lpPmdO7GPZ0bMybraPu+ExFQ4sEp8eqUbHHffvut0xdp/2++47dg8XEcw7Ecl2VKSPoyyvwpGZpVTN33+gLtywx1DfWgTrElj6OuujeJP0Rf7N3DDz/sdHWY05Vd/v+60bhTYqzuep35BW3SvUrcQgst5JSAdSqf5lTKzal0nLv++utbq6aEo1NJNacEmVNiy80777xukUUWcbrnS6nqK1nkVLLOqXydv1cpqe2UeHJKTDsljNxee+3lXnzxxTb+kFcwOKv0nVtsscV8eUoY+T/KUoLM6R4tTsmQvCLa/EYfDxw40LdNCac25VHP888/36ncXenylNh2Kq3nlHBqUx5lcw2V8nNKEpYuj2ufcMIJrW0M7aU8zXR2t9xyix9XZe2VV15xBx98cGsf0Eb6BCxXWGEF969//ctpUKOuuMcff9zXgePAudG/4AN33XVX3TUYqyrp59Zee22PXewrfN5xxx2dyg+W9hXG6b333us0GNbqe7QB36PsI4880r3xxhsOHy9jSix6vJWgrPMVJfTdmWee6TQoVKao1GNUwtGptKH7y1/+4v761786TV5xquvuDjroIBfPY9dee61TSUenMo5u8803dxtvvLFTWURfJv6vZKwf27qi1I8TPj/00EOp1+zoL5kPdF8ot9Zaa7WZD4IPrr/++k6DPW3am1dH7gXMtyr9VTe/UGaYX/LKiH9jfrn11lv9PBfmgzBf4Te8aymRXtpnuJ8MHjzYz5/J+UUDDu7CCy+sNL8o8e7PUcLYt5cy+ePf9POAAQMq3WvwV3wH/02WN//887vbbrst914cY8c4Yn7ZZ599/HycLA9/VFlTR5+VMZ4LdK8t799xWaG9vXv3do899pjTldllivPXZR5T2dM6X6Fvd9hhBz+/lDXmF+Yx7ofJtlJH5tnXX3+9tK+Uva4dZwgYAs2PQI0qdvVAgtXfEDAEihE44ogj5JRTTvEH2rAvxqu7HKEP3LLtttvKAgss4DfBNWsyBB49T+ShM0X2e1o3BZ22uSr34i3ibtpXN2I9V2Th9Zqrblm1+elrcbceJLXX7xP3m6WlttrhIrP9TqTWWLZW1mXs+/ZBgP0xjj32WJ8BSJadvqj6jEwyeE8++WSfzYYpESaHHHKIz2omg5gMVTLxmN/SMvvOPvtsufTSS315ZMOFDGg+Y2Qdvvzyyz4Dmb1G2CekjJ177rmiZJXPcCXzOGQcI3vGBtzBzjvvPFGixmciUj8y89jPRMkyX68zzjhDlEj0v5G5pySRXHnllaIkZ5lqdNgxZD9y30C7HukKJRhTM4TJanzttde87BvtoG/KbJ5ORi77obBvDJmpxxxzjCi55bMryeQEa7Ciz5XckkMPPTQzMxpQqAd7zmhQw2f5HnXUUT7jkH6nPCXTPf70B+WxH03wiTRQyexmE3nk9JZddlnhOQp/4hwyGvEdyiRL/PLLL/f74OTZk08+6SX43nrrLb/6j7JD5iwSfvg8G9YruSWXXXaZ3zMmz/D/o48+2o+drbfeWpSY9eXxjEeW6d/+9jd59tln/b4zGpD3+9BkGdnbyP0pUeyx2nfffWWNNdbwY4TfKI+xqiRa60byyUxTzunXr5/39bSVkVnXDt8rwenHjZJqHtfYNBji20ffkqWOr2hygfcVxjPYsv8OPrvHHnv4/YX4Lcs4jusoSSYaaPLjl34Mvkc9GMdkv7JPEWM3rzwNFPlnreeff17++Mc/ev8Kmb1ci7667rrr/Nx2wQUXyDrrrJNVtczvWSnCmMFv8BP6njFHHZnjgpFBTkb1Flts4X1ISU8/vrg2v+EvzLPMqfgcn+eee+7UuTSzMuPhB+ZUfEiDCL5NjF/GMbjjg8OGDfP1JZNdCVHfP3lGdrQGIUQDLfLb3/5WNFjV2sf4DPPuaaed5svebbfd5MQTT8zFAJyYrzhPgxcef3BkPmD8sucU8wt151qs5MgzDTZ4eU3m2D/96U9y2GGH+exoygMLxix+g18yH6y66qp5xfl5FFy4XzJfK/nrV+owHzCmwY/9sRg3StTn3m84h7Ywh3C/oywwDPMl9Xv66af9ahnmxttvv937e54xt9B/jHP2ASMjnL7lWszd7JnFvIrc6JAhQ9r4dLJc7glKYvs5GOyXXHLJ1r6gPMYJ8zdjD0w0WJo7fjmOjYrvuOMO/9yBLzBfxvML79Bcl3mIPc3y9vECF8Ymvoc/MCew+g388Dey4tmzjJUdzGWMUTNDwBDoQQhAwpsZAoZA90fAMuG7fx+ntdAy4dNQaY7vWkZ86lpOXdC1PHFJc1QorsW3H7mWs5ZybohmkY8ul5XUqY2gjs/d6FrOWMK1nLuca3l2cKdWxy5eDQElB3xmHBljaVm2obSLL77YZ2+S7ZdnZGbrHiVOSZG6LDiyVXfZZZfWTFcyL6uakm1+VRkZh1lGVp2S8z7bPS2TlnoouZd1etN8T4asEhFOyaLUdoSKKrHsTj/99NL1JsNc94txSkw4+jXLOE5JVZ+ZfcABB7is/iKjkExyDTg7MoGzjBUHZBOT2UkWe1rfcO7w4cOdkjHeJ8n+zjIluX3mJJmS8QqB5PEq1+J9hoxcJWqTP7d+VmLLKfHoNHjgdB+c1OOos5JyPtucrOis7GqOUzLL+6ESXn5FQZYpEeSzNZU4dPhmlnFdVkYouVuXAUsGML8pWef7bM8996z0p0SanweUUG9zeSXIHFmtKh3idH+grKr5uWPvvfd2SmT6MZ7lK2S3k3msxLO75JJLMjPnVW7EMdbxPcZxvDonroSSqL7NZEfffffdmfXToKPTIJFvI9dtxMjq1QCXrxOrarKM+Ydsdw2epB7COMDPmsVYLURmP318/PHH183boZ5kF/O7BoB8BjSZ5GnG6o8VV1zRaeChcJ4mG545jszkLCODm/4l+5vVKlnzBitTWKXAigoNSGX6DHMAY4XVRU888UTWZZ0GN50Gw/zcoUGczOO41+FXzIHgmDX2WB1BRnze/MJFGOfMkaymUTI5szxWLGjAzfcb4yDNGDe8g4Ixq3I1iJRZHm3Ft1l1w/hLM3yAMphzWcWiAZTU8jTI6jRA4Mtj/tBgf1pxft5Yc801ncrrOA36ZvYt84nuX+ZxpuwsH+BeyH2D1Qi611nmXAiurDSjPCX9S6/uSG2EfWkIGAJdCgHThO9BARdrqiFgCBgChkDzIFB78nKRiVSfeOHqGXHjtRUskLtxz7EZT+trlv6Ena9jm9veltHibtYsoudvFllGNYRXO1Jk4sa0fHOvYz+ONwTQkyYzkezgPE1dMt7IWESLO8vIQCPrj6xAMtWTFrLkyW4lWzEvuzV5Lp8pmwxtsuDYTDzLKJdsQbJj07KtyUglq7fZTaVdfOYe2Ylp7Qj1HzRokM9uLGP6puSzCVUqwGcO520QSRZh//79fcYgWatKlogSKnWXIYOWlQdKnvuszSwjQ5+MZDKbyT4ka1+JpDaHszJDZS985jB1zNMGZxUFWZv4AuWRBZ5cBYAmPdmYZBv/85//zNUCZgN3rknmJO1EMz6ZVc4m9Uqy+SxfslVZUZFm9NeGG27o+0UJWZ9lPHTo0LpDVVLCZ6iy0oAM8qzyOJF2kF1N5inXpz3ByBxVElxUxsVnXCdxqLtw9AUYkbWvhGjdXgm77rqraCBElKyUxRdfPLMY5g7GN9rhZBUrCetXHiSNDFqyeykvb18GcCcDmXaxCgJfSe5fRDtZAYGfktmap/M833zz+Qx/suAPPPBAn3mb51vJevNZg01+7wQyxMkkzjJW2OBvrARJMzLl0TRvFmMVw0033SRKcIsGljKrBV5kDoMl+LFPlBKjdceTYU5mNfeBvD5G35ysZlYKkHmPf1Fu0rhfkIGPz7BSJcvIjL/mmmu879PHrJJKZrCToU+9OZby8nyA7HPGJ23QwJKfq5LjivmZcYO/9unTJ3efCvyBOYF7Ln7ICg7qERurLBhzrKBl3si7RzJ3M0+yeoEVKPfff38dNMxnzN2sHqDdefcR+pW+AEMNGPgVH8nrh3s4cy59kVUe5zFPMTaZ97iPsJonaRrc9dfhGMZyljEvsjKLOZ++AB/m1KSxwoTVCPhxcu6OjyUznhUQ9L8Glvw83cgKmeT17bMhYAg0PwLZ6/Sav+5WQ0PAEDAEDAFDoGsioJuGupfvEplnJZEpZ2quNjx1hbj3nhFZ/6zmJ+DffkzceSuKfPSCyub0l9qaJxoB31zeVFgblndDvrBsnqX+WQbRwPJ3JDLyTDNMvXxEkoCH5GdJOsvrISEgXJIv93nlht+QJmEpOWQB0ilZxjFIRGQFDFiSj7xOMxtkORI0kBxI0mQZfaNZ4Lnkd3wuxJNq/3qiNI+AD+dwfaQAIJggVZGFiA0SnGX/yEHkEfDhHAIokKqQq5pZXdcsAgps8sdveQRZOBHilWtDqiBBEBvYEDiCCMJ/80jacB5kMvI2+Gea5IauOPDkDr6cR5iH8sAYMpngEXILsUHEQiRBPoFxmfIgFqnDPffc04aEp1yCG7oKxX/P2C5jBLY0g9zLXVBubARVwBZ5F0iqLMItnANm1IEAAbhDtseG30FqQobnkbPhHPCA5MWvIGuTdsMNN3g5LXylTN8yL+FfEOgQqvhHFSNoheWNR37Hf/MIRa7L+G4GC9JOyOesu+66parEvYK5AJ9NzgcQqvgMgaUyfYzPEIAigMb/CWDEhs8wvyDhkkfAh3MoD3kjyGSCC0lDjgj5E6S7yswv+Ixqlft7CRhxL4tN90IQ5JrwJ+6jRcb8h/QZASTm7aRBclMvsCtzj0SWinsqMj3Iw8QWJMcg+osIeM5jfDOOmEMIolBmbLRdV075gBj336L5gHOZVyDOGaMEn2LjGhdddJF/HsgbL+Ec8CDAQ4CA+Td5D1eNej+/IAGWR8CH8qg/gQIwRALHzBAwBHoGAkbC94x+tlYaAoaAIWAINBEC7su3RD59RWRFzaJpJr3y0RoceFg14BdbX2Su5ZsIsURVnBIXT10p7soNlXRXnc2d7xb53ca8wTVvna1mqQhAYL355puesCCzLMvQjOWFleOyDNKP7HIIgaSR0U1mIi+8kGDJbMLk8VmfIWQgryCL8ggAsnrJGs4yzi1DcGSd3xHfk4VN0AGyOo98QmcYoigr6zZZVwgyyJSqOriQxWQBQ9gGoxzINkgbsuTLGrriZB/Sn2SmxgbZRpZlGVImnAfJRBY4WuJkKwcDG0hB9MfLkDLhPDLiyUIlQBUb5CrXgBBGK7qsgQ1Zl2RwxsQvJDdlQlhXMUhulaCoqx8EH9mmYEo2aBkDIzTn0ehP6ixD5pMlT2ZuFSMrF3IfrepgjFtWv0AuQqKVNbSuCQ5AhCZJ/auuuspnpVfJYA1Z0mT3B1K9bF2YV5g3WJmSZxyHD2UZ4zWJddax4/t7MpQhkSFXy9YpBKjoY0jt2BgzBMQgrKsY/sdKKrTaY8P30D1ProLIK5v5hXpB3pNtnqzfoosuWrjnQ3wO7WH1ED4YE7/M0ZD5lEegr6wxV0NOE5iOjdVb1Jn7JNcsa5RHkADdd8oIRlmsUGKFQd79MnkdSHPu5wS5YmMVE21mLivrK1yXlUX4CvWLjRUBBBzYU6OKsfKAACYkfmzc05gX2WeirDEWVZrNa9gnfa9sGXacIWAIdC0EjITvWv1ltTUEDAFDwBDo6ggoEVC7WZdPL6KbnU4/T/O0xml21aCdpTblDFLrc0rz1CtZk1E/iNx6gLh7jpfaGkdJbSfN7Jy0/Mtisjj73LkIsEklMjN5hBE1JKMuj6TnGLJWIT6QGIgN0pZsQeQZkpl6VVoP4Yu8AS//SQmTZDlsYJknq0Bd86R3kuV1xmcypzECDnkZ0pDOtLVsUIHNMCG0kht7FrWRTGgwI6M8GORt2Bww2e9F5akPgus+AAAgAElEQVQ2vJe5gcQKBsH1wgsvpEpcFJUHUUcdYmIVghmypkqAIFyHFR0QeAQegkHAs8KikfI4h/oQ9ArGqgRI+aIVJsm2q36yzxyO+yIcA0GGFAwbQSazdpPlcG3kKuhbxmjS8BUIqrIBnnA+5ZFRG9ePjGnmG7JUqxp1IADICoVg9Avls6KjqoX5rioJT3/hY2yumWdgDxGcZWBTlsTMKqO9vg9Br6rjl7mAfiZQE/sZfYL/JWVWiuqL30KIhnmP4yF82XS6kfFG5jeBssGDB7deGoKawBcZ91WNOhDcImgWLPhP1fHB+RDtzAVsDBssBEiL7rVpdaetBNWZk4NBKnPvYL6oYvgmRHYccOV8fIW2lllBEF+POiCbQ5CeVQjB8BVW9vBsUMWQ5KIeBBmCMc8jFZa3AXbWNQjMcT+My8s61r43BAyBro+AacJ3/T60FhgChoAhYAh0JQTef1rch8Ol1vuY5qr1q/eKe+1eqf31as0u79VcdQu1+UE1bAdpRuQn/5XaJheLzJ8vTdKcjbBaxQhASJChRiZznpHZWSQ1AgmMTExsLA9n+TgvuMhn5GXS512f38jGh1znZT5PioZjIfzyiAcIpyqZhqFuYFVEbGa1g2uWzUYkaxhCAUzRR88zsuXJ9C5rYFg1C56ywR1M40xQJBXoF4iUqgYeZIPSTrLYMUhvvi/ytbRrQUJBHkF0ByMLFNKnEVILyQiyQdEaJyseI0AAuVhGdiJZRyQcMOpHu7GXX37Z141gRFWDtEzTmIcgY7UJYxFsIUTT/A4fY/xDTBIIIYM0adQvTfM7eVzyMyQz7YJEDYavIH2St6ojWU74TP05L8581Y1W/VgskoZJKzOsYkhm1qcdG76j7pDrzBuh/9KOZzywCiFv5QWkXxkik6zy2J/Trpf2HaQnmehFfsUqBwIjVVYmhOsxBsCRPkHeKwT1mB8aKQ88yMBmfgoWCOWqJC3nMxdQP+5dwSC8mQ8YO1UNf8bfkFSB4MdC/dLGTlH59A11ZM4Lmdu6KbLvs0bmF/yN8co4C0ZfcI0yUk3J+jLPcc8GLwIuzBf0dSNzKfcx2kUQg78QAGd+YBVL2vyUrE/8mTaxoob2BqMvqGPV4DLnUz8win0v7/r2myFgCHRtBIyE79r9Z7U3BAwBQ8AQ6GIIuJfv1MxtJRtmWbR5aq4vDu5+1S79rb4Yzput/dypFf78dXEDNpfahProsrNiOO2cnVodu3j7IEDWIS+uZOXlGbISVck4svzWW289T9Ki05pFwPNSXmYpP5IJkAoQ8HkEF4RQkR42hE9eGVlYkA1J5ndVgzRgsztkC8oYZD/kOsRFUcABEi1L+z7tWhBJSc3+tOPSvuO8OAiB7/DXaFYvZGHcV7QbQqQqKUNdKYvzYrkXysMaqV/IDA5lUA7/DtdJwyfvu7CaIVm/cemLLE1zAibbbLONl7uA4CN7P2mQaxCAa6+9dmYQhb6umiEdrkO74vqNq6/Qh3FfUDf6uxHCMq0vkvgkP6OPDcHJqpO8+SpsOJtXL4jCMsQoGfdVZI9CnWlfGb8K/dPI+OBajNXQr+Ha4+Iz+Frcx6F+ob+SfZL3Gd/gvOT45Zwy2CTLDhjF81+oXyPzVSg/rh9zYaNlcV5aX/B9I2UGzEN7KZv2NtIXtDXUL54T+HcjfUF5+Ep79gX1i8tL9r99NgQMge6DgJHw3acvrSWGgCFgCBgCzY6AvkTU2JB16Z30Lay8fud4bRYk1oOniYz4TGrbDNK32iZ8NFD9fDdIMes1nchGqmFqBPx4dYmOKpwMWORdyEpbbLHFMi8LiU42cBaJnnYiRDia7JzLJoxZcjfI3JDRFoitmAzi32Rsh6w5sgQh4smWzCOwkNcoWpLOC3yeXERam/gOuYA40zDruOT3EBdVJAvIukWGATKVvyyDwGEjwypEBqQeGd1VjaxZMsvJEA9GP3BtNsJtxMhEXnXVVVtPnWOOOXzmJYGOKv5GAcgRgEccXIF8xo+4TlUyM2hJx6s78CskGhoha0LwJq4fbQybqOaRtmnYkuGbt9oDOZ1rr73WZ7sj5xITcRBqSEHglyeddFImscYGpo34Cv2ATFKar1TJPo/bzXlxBvPss8/uSUH6qarEDb6C5eGXxBxZE3BjQ9I8Q3KDwEaeQV6X8ccq2tZ518v6jfFLVn5yg8us4+PvGQPgSEAzno8Zc3H2eZmyOIbyyGyOs+jDWGkk8Bnqhx55MDZJxudZoVV1BQUYJfst1I85q2jVQRIH7r+Mk7l+WSHD7wRduGfiZ1WJc+6N3CuTfQGxj+Rc1WAafUv7woox2s4KkOQeHsl2pX2mPdw/qF+8Ag1fYX5qxJiXkEMKFvqCe2dVYx6hD6vec6pex443BAyB5kDANOGbox+sFoaAIWAIGAI9AYFX7hL3nWaxrnJg87T2a12u/7RK0CyxmcgU1XQ7O6QRX70j7prNRSafVmo73qasxVgZhQ65tl1kvCKAni1LuNm0LY8gZgk/5EVe9mdcUV5mkcCA4O/Xr5/07t27TTsgVHghx5CUQGMXOQyOPeuss/xf3759PeEeCHiORZqBl2XKyyMo2DwuJl7SQIRQaOSFmwxWiOKqf5CZVTIIyW4HJ7Lg83BHboSyq2Sy0jdk5UOMVDEIMvo2zuYnkAH5QYCkKjGNXjF9v9lmOvf9YgSDKG/AgAFVquaPZeUAZFMsd8IKAUhGfLGq4ZMQvfwFgwSGjEOSoqqxqSP9FJP6kMcErNK03fPKh1i7/vrrc1dWEDA477zzPBmeDJIQTGH8o42dJ62CrxBEK1pZkqwr1yTAlvQVAkpV20rZ1J95KCZoGb8QmGwoWtWCDndZaQ38ng1+CTjlyUMxBpCiYX+CIita4VJ0fnv8zjwKpo2MD0hkcGSujQle+vyWW25pnePL1hPinoBiHLgBI+4BzHNVjfmT1VixnjxzC/eyRnzm/9k7Czi7iuuPn0uIIcEluFtxKRQpUKA4BUppsUILxSn9Iy0uoVhxinspUKS4heBFi3sI7iEQQtyz8z/fCXd79+3Ttft29zefz2vZ9+6dOfOdufPyfufMGXZCIHCz3qYlnT8jRoyo1byY+oT6sof8br/99nGNbUkKIvrLWpd1LjMWzMla7eO7gfWe5z9bOBA6TftSS4dTG3AqZVP3YB9O81rtY33BvuxcYVxIodMSdtjHGRPVPLe19FvXioAI1CcBifD1OS6ySgREQAREoKsRmDbF7DE/8HS5zesr2vyFqz1XQh9L1j+4/oh//dZ0AX6eZabngJ+xd/3ZKItaTIBDFxG199xzz7J1ILCS2qKawo/ZAw88MEZCnnrqqbbbbrs1Ecz5fN99920UaBBisYMc7ukLcWKvvfZqcngewgT5r/kBXy6fL4Im92cj5IrZjSBeLvq/2D0d+R6CLUJINkq8sH1Y4rioJR88deyyyy4xghUhvpbC9URuksM3LYzHHnvsEQ9TJHK/2kK0IpHaOICy44AouP/++0eRrJb6YHHBBRfEXPLUmRZEWv7GMVOL04FcxTgCsn2lTkSa1VZbLfaZOVltwdnELgqizrO5wEkDhTB95ZVXVltVvI5ofIQr0j2VK9iPzaRIQTRNC88dInalZ5+5BTci6mspt9xyS2yPQ4XTglB70EEH2eOPPx4dJtUWHAAHHHBAdBZstNFGTW7DfuYlO3WqLfTnoosuiodBsgunmsKBl6wt2IADr1RByGPOlbsmvffggyt/5zPGOH1qfSFEVjvfTz755LgenHGGp8SroVx++eXRiXbkkUc2uYs5iQOVFGa1FJ55RPKsKI3TCqcsdRG9Xm1hzvDdQ2R54aGu2IdDFyG32gJL5hlOgWx+es7CID880dzZNCuV6oUP5wuw1mXnCs8kTg2cDrU4vnBqs1OEw64R4tPCjgwYZnOnV7KNz2FDnaxz2cKazZqPcF7t/OJ+nCHsIDv66KOb1Mf6wHOF06aWwgGx7DzI7mbgu4OD4eGQ5uqvpk7GjQNZcazXekB2NfXrGhEQgfojUPpbvP5slUUiIAIiIAIi0HkJfOspVb772JKlN62fPnwz2MLzLr5sMSBGmtdTiTsGbj/AE2/OYslOl5nNOn89mSdb2oAAaRz4gV4Y7VZYNdGOpLOoVBBoDzvssChekrLhz3/+c7NbEAMQWtKt40TGZVNJ8IMY0YUf+9kIcKJqEcKISi6X/xzxYMsttywbPY5RRLT+4Q9/aGZfpTcQhhFcan0hEtYi2hLNiKiAoFeqUCfRf5Xy+RfejxODCM7TTjstRv9VUxBOEbkRUQojeI855pgYfckOhWpS9SDekNoDYZhDewsLc4eUBSeddFKTfM6F16V/M++OOuqoKMRef/31TaJyEX7POuusKPoyp6oRtrjm9NNPj33ZZx9Pw1VQiB7HyUSUeTUFkQlBkN0m3JstRKvvt99+8ZlJHS+V6uRZoB6eAyJTyxUibY8//vg4zghhsEek4sVuk3I7YKgXgREnCc6DNIVLufb4DLEUBxzPV9Yhwmc44BAxiWCttj4Euscee6yowwCHEuvECSecEHdBVCo4axhbnEY333xz2bRW2bpYJ3key6WwSuveYostKpkRP0f0q1R4PjgUuNYXazqOn2oKawjpwODy4osvVnNLvO7www+Pz2/hQbsIwaxbzFEcq9UU5sy1114bnb2F6wtCNdHr2FjteoVIyyGi2FDoENl7773jWOJ8yDqmStnJ+sL8wsYLL7ywye4snLm33357XNuffPLJqoR4vuPYDUL6qWLrH2sOzwbO5GqEbub9XXfdFdeDU045pUk3EPUZV7530+e/VD95n/aoDycdDqfC7/055pgjCv3826FaRw99QeTeeeedmzhYaA8RHqcm/1Zgd041he9gHEA4GAsP8GaXCk4c2kt325Wrk/7CGacrzqRa0rqVq1efiYAI1DcBifD1PT6yTgREQAREoKsQ+Ni3M4cGP/h0o/roEbY87rng513ekiV+Wh82pVZMGGnJTbtZ8Mj35DfX1p2DoL5gdV5r+NGOSMkP61KFA1URi6pJpUI0L+IHwhiCSrGUMUQTZg94RRDO5sLmxzOicmFOd8REIojZbl6qIIJdddVVMRd9exUiMklTUusLkRXxtNqC+ElEY6l83IioiCuFUajV1E8kI5GgRKPjACEtSblCn0lZwVgde+yxRS8lAhHBjcjpcv1EgDrzzDPtkEMOicJ0MZEbBwH1IW6RqqZcqgIEc2wispnIYs4LKCyIPDgKcCIgyiGqlSrkO0Y8Zv4i9HBvYUH8QSwcMGBAFOfK1YfjCCY4CHAGFCvUQXTuJptsElO/lCukKSK6lUhadoZko+pL3UckMDtLiK5F6CKKHkdVJQGf+lgfiOCnIJxXSiXz4IMPxshjhLCzzz67qEmMA5wRzMoJb8wVRE+cFFtttVWcM4UFAZgo/UGDBhmpPMrVxzjxzOBQQPzMRlwX1lv4N05DxOFyjgOecdayWvPTF7aV/RsHBGNe64uUONWm2qE9HHLkx2dOwLJcIXUNazzfCzh4CgsOC+YY6z87eSrtaOE5x2mAE4/xKVbOPffcOLaMcbl0I+kY80yxdmTTF6X14vi97bbboiOQnRTl1ivqY31hziAU4wwpLHyPsg4jdJOyhu+hUgWxHr44i5nbRNIXFqLP2TFCtDnOjnIR9gjmsMY5wXpV7Hua54bnne/WSsI+LBD0EaP5f9KvFRaco9hNfaTlKuUo4H3WP9YEnFc45ooV5ji54Zkrlb6LmCvsFGAHC//WKFZw4sPl/vvvj47UUvbBlfbgzNyrdNZDsbb0ngiIQCcl4AuDigiIQDcg4NFjJF+NL5XuQ8Cj8oL/EAm+Jbb7dLpee3rFFqHh3iPrx7rRX4WG05cO4fXb6scmLGloCA3/3i80nLlCCMMG15dt3dWahmkhTJvqrykhTJ3sr0khTJnorwkhTB43/bMWsPEcx8Hz7Qb+v1jxSOXgP06D/8Av9nHje/5jNnh+6uACVHAxJbhA2Ox6jzgMLnoEzwHb7LP0Dd9CHjyNTPAfzkWvcQEmeIRl8Ai3Zp9Tv//ID/4DvNlnnfENF3+Cp/UJHjUcPB+2P5b+XPqLvrtoEHbdddfg0dit6pqLabF+F3IjNxd8ggvpwSO3g4v8wQ+YDC5MBBd2gm/7Dy6olG3vnnvuCX7YZPDI5HDJJZcE3y0QXNSJ88EjDYOLT8GjWeM8oV53ApStz1PtBHcYRBtdnA6+IyPORepzESu4gyi4SB48aj64aFW2LhfGgqc0ibZ5hGdwJ0RwcTDWRZ0uTgVPoRJcWAye5iB4RGngnnLFHQjBBcfg0ZzBUyoFF6Qa63PRPbijJnikeXCBKXjUdbmqgufCDi5Cxfo80jR45HfwFCTBxeo4Jh6ZGlyIjOzcQRXbq6XQP+xwZ1bwyODgOxtquT0wV+DmonxwwTZ4lHG0mbniomjwyPLgUe5xrnj6m2h7ucKaA2vG7vzzzw8eZRzc2RL7y7187iJq5LHjjjvG98uVa665JrjTKs4/1iKP1I1zj/s8Aji4IynaxVx3kbPi2BZri+fOherg4mOT+5k//FvviCOOKHZbp3nPRe7gB2jHMXYRO7jTJvAezwhrM3OAPjIHee5KrdNphz0yPLiTJM4J5oynNQuet7xxjJnjLvrHMWZ9oY1yBe48T4yBO3zjnHGnSLTDnRTBxejgjp1Yn4vr5aqKn7mTKLgDOriIHtw5HOcMc5D6WBtchI72swZ59HxgTS5X3MEXr3WHTfDdEMGdjMEdeoF1gvWa91hbmPM8y+UK6zz3MRa+UyG44y/O27Q+jyqPzBgLmLgjqlx1cQz5Lud6dyZFTjDimXWndVxz3MkWP/fo+bj2lytw4nrG1p3m8Rl1R19jfe78CGuuuWb83HfDxDWiXHHnXvydxNp03HHHBf7tkc4VvouYS/Sd+tZZZ5241pYrXE8/3JkQ/00CL8aQOtyBGtzpGXx3RawPW1VEQAS6FwGpcd1rvNXbbkxAInz3HHyJ8HUy7kPfCGHAwiGM/rpODHIz/rVnaLh6Wxe9yws9HW7wI6eGhr8uJgG+vcFPcSF9govNY3xOfvdRCJ+9EBrevCuEZy4JDQ8e6/NjrxCu2Dw0nLdmaDhntRDOXc3/f9UQ/NVw9ir+Wnn666yVQnjv4RZZi6jrUenxx2r2R7JHF0dRlh+rxQT1wsYQaxAX+BGN4IUoxQuBBEHNow6juMMPfH7wlyoeKRwOPfTQUh/HuhAgPQ1CE0EEocijg6NQS5+6SvGoyYC46Ad5Bo9Cj32EIwJONeNSDQeESpgj9iBYeMRiFH08T3kUKBCUPJ96wMlRTUGYRfBgrBE8EYgQRhG7qI+6EUg8UrFidYwlDgjEK8QZBPS0Po/QjA5unDqIZ5UE87Qxj3wMHsUZ62PO+s6K+KJu7PMdCMEjWivaxgX0AbEdMYf66CN9xUbEbsRAWCAmVVMQ+WAN85Q99TEmOMsYH54fRPlaCyw9ojcGglBHtbyy7fBM829ZbGG+pHMFURR7GRPmK/O2msL6gNBIv6gTMZT+pv1nruC4qXbuIdbh5MEWhM50riDOMz44ERD7Komp5Wxn7uI88Gj/+BziKEDkQ6CvZk6Xq7sePsNp4buJopjMM8zYMib8P/OZZ+bqq6+u6BRJ+8Kc8R0qcS1gzuAIyo4xY+07CALfOdUU1hfmL7ZQJ3OG5zcdY5y0iPPVjoXvGAi+AyXWl84Z6qOfzBm+03AmVlN4phDvWaO5F37UyVrAf/MeQjgCcjXfU8xTT1EV13/WOp6TtD7spU7E72rXF5g88MAD8bnN1gdHnhnGx6PmKzpbUxY44JgLPPf0jWcY+/h//mYO8e+ISg60tD6+01hfUl7pXOG7iP7Sju9Qqno9wGnMdxucuJ96sQ+O9J9/S8C32vWqmjmga0RABDoHgQQzO2kQv8wWARGogQBbodNtlmwzVOkeBNj66RFdcVsweZVVciJw7+EWvnrTkr3v9UNQ6+Bw0S9esXDVVpbscr3Zsj/PCUqRZocMsnCL52je6nRL1qzuIM4itXS/t/in3DQ/9HDKRAtjv7Vk5Gdmo74wmzjaPGLdbOpES8Z9Y2HEp5aM8byno7+24O9Zj57TDwmeYcb434nPzdB7Vkv69POk5bP+8JrFgufltxl6mCU9LOFQwMRf/G0zWPD/Tn7khx/64bktKePGjTOPRI1pJjjEjhQCbOHmYFNSNviP14rVkirAxdKK13EB6QGKbennMw5d5PuRnLOlCnl5ycVNmgDy3ZKOhJdHGppH3pW6rVO/T//4LiHNAWPUHnlrGXNSoZDqgfZog5QDpF5pSXscJEmaAVLUuOAU8yh7BGNMudKSQj5jUuik6QVIqUMKCw4dLZb2qFIbHDZMnnHmP/eT7ohUF/BtSfHI0ZjTnRQ/1Ef6BdKtcIZBrQX+HFZM3nlyVrtAFtM1kFOZ/29pIUUDebVJL9OSMU3bJcc96TzIo5zOFRcKY0odONZaSDOCTS4mxrmCbS5kxhQaLSkeFR1TabgAHOvDJuYKaWJcHGxJlU3ugSNjTUoRnhFsJW1PVyqMK6k/yCvPWsv3AM8GY8yzXGshzQlzhgMzqY8x5rwA8ue7SFprdXGusB4wdxhj0jKxFhQe3Fttxen64kJwTF/iYm1Mv0Xak5asLzy7pJ0h7RL3c4go60thvvtq7SMFEOcYkM6G+lgHWrO+YBvnmlAfY+uOkbi+FEs/U8lGvpd43sgTz7xhPOkn/YVjrYUxYO7xHUJ9PFs8Z+SPb8lzRjqzdO6l30X8W4FDWFsytrX2R9eLgAjUHwGJ8PU3JrJIBNqFQFaEb5cGVGldE+DHi0T4nIZo8jgLl2zsB7L+zGzrM3Iyommz4YFjzF6/1ZLDXnOh1QXWeigIyOeuarbQmpbsdkM9WFS/Nkx1wd3Fdhv+noXXbjMb8qDZ5PHN7UVk7/WDmD7zXJYs5PmlF1jFbP4fmc3tonk9OISaW53LOwh7CAHkZ/Xo5lxsUKMiIAIiIAIiIAIiIAIiIAJdl0Dl8KKu23f1TAS6FQEi/4j+UOmeBIiKU8mJwOihLph6FPIK21qSkwlNmkWsfeses838QLN6EeBxVNy6jyX9/NDLX11RD5Tyt4GDcyf6oV5D37Lkk2dihLuNG27JsHcsfO+R7r36+vh5xDoR6Gs7u1n7+0G2fSzp7ZFfsy1kNsciZjN71KpHralUJsChdkTltSZCt3IrukIEREAEREAEREAEREAERKC7EpAI311HXv3udgTYcslLRQREoGMJhA8eM+sziyWLr9exDZdq7anzXbyd2dO97Fnqig5/P3gamuTjp812+YeLy7WnE+hwg9u6QdLJkB5m/AhPFeNOmyEDzZ6/wlPGTPY0MZ5moO9sPodmN5t1frN1D7Rk5R39b3+voEhuLyRS/d+kQSFVREtSE1Tfiq4UAREQAREQAREQAREQARHorgQkwnfXkVe/RUAEREAEOobAy55aZY06EbzJBf7CtZas84eO6Xs1rQz/wOz+v1jY6EhLlvKUPd2pjP/ewtt3mb1xh9mk0ZaM+MRzrCeWzOt5ocmLP8/S7pQgsn3h6XnauxObDu7rhhtuaH6oY8zzriICIiACIiACIiACIiACIiACbU1AInxbE1V9IiACIiACIpAS+HaI2XcfWrLC1vXBxNOa2KSxZitsUx/2NEyz8NCJLjIv2D0OYp3iqYC+ftts2LsWXnHnzFdvmM3iKWP6r2TJ/J6HfNuzPG/7Wkohk8Ps5EA4DldVEQEREAEREAEREAEREAEREIH2ICARvj2oqk4REAEREAERcAJhyMNmM83laUTmqw8eb9xqttTGZvMuXx/24KT44AlLfnuzp1zxdCtdtXgu9/DUhWbveC5+j363GfyfXz/azpKdLp+el3+mOV14n6Gr9l79EgEREAEREAEREAEREAEREIFuT0AifLefAgIgAiIgAiLQLgQ8yts+fc5s7iVdYJ6jXZqoqdJv33N7nrdknwfrI9LaDx21W/a2ZNWdzRbfoKaudIqLye8++AELHz1p9q7neO+3oO9A8MN5F/uJ2dKbea73np2iGzJSBERABESg6xGYMmWKzsDoesOqHomACIiACNQ5AYnwdT5AMk8EREAERKCTEpg2yeybIZZscHB9RDk/dYGFeZazZC53CtRDefVfFkZ9acl6B9WDNW1jAwesTnDx/ZlLzZ69xIIL7cl8K5gd6EL8XEu0TRuqpUsQCD5XJkyYYDPN1A0PIu4SI6hOiEDnJfDFF1/Ytttua6+++mrn7YQsFwEREAEREIFOSEAifCccNJksAiIgAiLQCQh8/6nZmK89+nm7/I3lANBPnrVklV+Zzdg7f3tcgAwvXe/27OTidJ04BVpLhVzvODo+esqsZ19LtjrVbNF1PfXPsq2tWfd3QQKIYNtss429/vrrXbB36pIIiEA9E5g8ebKNGTOmnk2UbSIgAiIgAiLQJQlIhO+Sw6pOiYAIiIAI5E7gNc9z7gduGvm+8y7ff2I29luzlXbM25Lp7T/9d48Y99zofhCpJUl92NQSK4h8H/W5R7571PtL/4jR7snPjjRb6/extk7cs5bQ0D01EJhxxhmNdBAqIiACItDRBBZffHFbcEFPkaYiAiIgAiIgAiLQoQQkwncobjUmAiIgAiLQLQh4Pvjw6s2W/CDG5t3n8MqNliy8pkdlL5e3KWajh1p45iJL1tzTVeoe+dvTUgumTjR7+BQLb99rSWiw5NfXmC3xU7NeM7e0Rt3XjQjMOuustvrqq3ejHqurIiACeRMgDVZDQ4P16NHD1lprrWjOtGnT4t8qIiACIiACIiAC7U9AInz7M1YLIiACIiAC3Y3AcD8EdeJoCwuuln80tNthb9xuYYcL87fF50F4b5DZ5HFmHMjaGQvR7x89YeFej3ifNtWdCbubbfAnPz9+zLcAACAASURBVGi1V2fsjWzuYAKjRo2yzz77zBZaaCFbddVVbeTIkfbRRx/ZCiusYH369Olga0o3R5T+/fffb5MmTfLNKkl8IeBRsHuZZZZpvPn222+PUf0IeVzDa/3116860hYR8K233rJ33nnHvv/+e4PR3HPPbXPMMYf9+Mc/tkUWWaS0oUU+wZaXXnopcv3uu+9s4sSJNs8889icc85p6667bvzvWgq5+//73//a559/HuujfuqYa6657Kc//anNNttstVRn48aNs6eeesq+/vprGz58uM0wwwyxvwsvvLCts8461rdv35rq+/bbb+3ZZ5+N7Pjv3r17x74uuuiikR9/11K++uqr2F/6Sn39+vWLY7H88svbyiuvXJNgy1z44IMPYu5x5jo2zj777JHZiiuuGOc9/a+2ICC/++679sYbb9iIESNinelcWWONNYwIb+ZqtjCHDzjggNintijUf/bZZ9sWW2zRrDraev755+Mzjn2kfcE+Xuutt14cl5YW7GfOsIuGFyymTp0az5XYeOONGzm++eabce736tUrvpfa8JOf/MQuuOACO/PMM23PPfeM9vH/gwYNskceecR+9KMftdS0Nr0vO8aML88IzxrsmH/LLedn29Swg471hfkyePDgOKfpd//+/WOdPB+sxbXUxxi/+OKL9umnn8bnY/z48Tb//PPHZ4Tnl7prKaxP6Zz55ptv4voy33zzxdcGG2wQn79aCuvnM888Y9TFfGFdnnfeeeN6zByYeebaAgVgRn2MA/WxnmDbYostFvkxz2opPBsvvPBCHAfqgxtjseyyy9oqq6wS53a1hbnC+vLaa6/FtYU+p3OF+cyr1vXl7bffjt9H6Vyhr8y9NddcM/a5lrnCWL788svRRupj7Wcs6DNjscACC1TbVV0nAiLQhQgk/o+j6f+i7kKdUldEQAREQAREIFcCHDp6/1GWHPBY/jnPX73JwqAB023pVwf/4L9ofbOlf2a2+YBch6hFjU8cY+HqrcyGf2i25EaW7HSZWZ/afiC3qN0uehOi5tFHH90o8iEWILqMHj3aTj755CgiUhAF//KXv8QfrrzGjh0b8xlfeumlRQXBJ554wi6//PKK1Phxfuyxx0YhsJpy9dVXR/GUH+SIiPygxlYE2VNOOaWxihtvvNEeffTR+GO7Z8+eURzgx/sRRxwR+3vxxRdHoQABjcLn1P3rX/+6GjM65Bp+HiAwvffee/EAR4QRRHkEcfqfFV6GDh1qV111VWRw8MEH2yGHHBIF5WrEFASojTbaKIooiIWzzDJLZIbwzWcI0ptvvrndfPPNVYk9CCjUhxCF+EZ9zCuEMgQRBKgTTjjBDj/88KrEFARNxFbEHQr3M28Ye+qj/r/97W+23377VVUfc+PAAw+Mcxi7uB8hib8Rd5gX9JU+VCqM0ZVXXhnnFfYwJvAqrG/gwIHRcVJN2X///e2GG26IvBDbEHjpJ/ZRP/P4wQcfjGJ3pcIY/vKXvzSex3QsqZP6sJf/ZjfIww8/XNUBxTzznKOAgIcQylhgE3XTFn3/+c9/bv/617+aObR4bjfccMN4Ta2iZtpP5hPPBDbcc889zcYb4XvTTTeNzhrGBvsK5x7rGGtALcJg2j5tMx+Zu/w/Y3r66afb0ksvHccle91NN91kJ510UuRz2GGH2c477xzHDG68sIvPTzzxxCbPSaUxbe/PGccdd9wxzpnUTmyFPS/mzGqrrWYPPfSQsZuoUuG5/dnPfhZFUNYX1haeM9ZenhPmwy9+8QuDVzXl/fffjw6PYcOGxTHOri/Yy/PC+FY7xk8//XQcG8aW+ugTc4PnDRup/69//WtcUysV7ufZPeigg+LzxfrLHOR9/qa/rC933313dBZUKtzHdyx9wR7YUR/jkK5X2MtYpLsqytXJc8/3AzYyzjid4U8/qQ97EeIfe+yx6LSqVOC96667xvWINYB5wit1TjH3eTZ49nH8VSrMFb5rcNYwV7CHsUjnHrZut912ca5UI8Rz7gvrOE4HbErnSvrdxlz5wx/+YGeddVZV35WV7NfnIiACnYiAL7AqIiACIiACIiACbUig4f6jQ8M5q4UwdVIb1tqCqhqmhYZb9g4Nl2/mtkxuQQVtfMvb94ZwxrIhjP2mjStu5+qco6edCeHCn4Rw3hohvDuwnRvsHtX7D+/w5JNPBo8qDf5jN7jAHv75z38GFyaCi4CNEFxACA888EDwH9zBhe3gYm/w6M2SkH71q18F/zEe9thjj+CRn+Hee+8N//nPfxpfRx11VPAf6MGj+IJH4pWsp/ADF3KC/+APLsIQwBJoxwWI4FFzTS7lun/84x/BI+iC/6gPV1xxRfDo3XiNCxHBBZfYPxfAgv/ADy5iB/+RXthcXfztonZw4Su48BhcLClpkwukwQWWkp8X++C+++4LLuoEj7AO559/fnDxsvEyeHi0aXDRMrhYETyyPrjwWKya+B7XX3bZZcHFlrDSSiuFiy66KHLOFo/2Df/3f/8XXPwJLqwHj8QsWR8fuFgfXGyJY+hOksA8TIsLQOGOO+4IO+20U5xLe+21V3Dhv2R97lwKLtQHF7KCi4zxXupIC/OCue8iT5y7LnwFF5ZK1udCTnDxMLhQFOvl+aCOtHjUamTg4lhwoSy40FN2jg0ZMiT4LoHgQlHg+XjuueeatO0CVfj73/8ePAo5uAMq3HLLLSVt4wOPPA7u3IrjccwxxwSPhG/SPu25uBjcqRNcQI7PfLniDqC4PiyxxBLhnHPOCS54N7ncDzgOxx9/fOyrC/tx7hQWd35E/rvvvntwobLml0euxmfBRb3CqoM7YuIa5qJbnCs8D2lxQS+4aB/bpX13tjWbm80qLPMGXJmX7owoeRXrCuNZzFZuYu11Ibbk/Xl8QH8YX5531mbW+3ScGDv+Zj7z/PpOnLL9x37foRPcYRjnq0eUh9/97ndNxtzF7+DRzXFMXdhvto5nGaTriztwgu+4iM9Cdn1hbWR9wV7GmPUlOwcKeXI985Vnfeuttw7XX399k+edz1kf6TP1+Y6FwDNdqjCe++yzT1yLdthhh3Drrbc2qY+1hO8kd6jGeXrkkUeWqiq+z3rFtbD2XSTBHWVNrudzvtdgwTN3xhlnxO+yUsWF7eBOsFifOw3j2GW/8/gevvDCC4NHwsfx+Pe//12qqvg+30usRelc+c1vftNkrvCsrb322vFzF+KDC/tl62P99N0MsS++YyXyzq4Ru+yyS6wP25h7r7zyStn6WANYr/guOvfcc4M7bRqvhxP/HqF+6mPNKPyuKlu5PhQBEej0BBQJ34kcJjJVBERABESgkxC4elsL/Ve0ZKvT8zV4ygQLl25syRp7mK13UL62TPNDKK/bwUNJPcKJ/OlJ9SkIcjW8waOVX7zOwsDjLVlhG7NfXZmrOV2xcRcf7be//a3ttttuMUquVCHtCSkZiDwuVYiII20GdZISpbCQRsB/TMeIbtKfEI1WayGlCXb4D+mYYqJY8V8I8TMi8v2HeLNL2Jq+/fbbxyi9ei5EuBOtR8QskbOlClHyRCq7GFLqkibvEzXMOLFbgOj1ctHJn3zySYy0JLqeyNFiY3bnnXfGiFIiI11sKmsDUcwuqsRxgT8RntnC2J133nlx9wXpOmBQrhC5znVEfTN/i0U5u/hvLjLFdCBEg5YqtM21LqDHCFgXxJtdSpQmkaykZXExv2halOxNLs7Ztddeay6a2d57792sPiJRSatDyhh3isUUE6UKEbVEgjP/icZecsklm11Kmg7SQBB1S1RpsfFKbyLinnH4+OOPY33FUqIQJUykN2khaLdcOiEilYk+ZacK12ajpZlzPLtE2XJNLQVGzCsXTM0Fwia3Mj/YCUGULONRLkrWxb44T4jYJyK51kIENqlPSKHy4Ycfltwdkqaaueuuu4ruFiI9CztcGKt6KESqk+KKaGHWEKKYSxWiitntwHPAnM2mxkrvIfqYuUT0sovSzZ7xbN2kWeG7hfRIzJlibfNc84yzbpT7jqJeUkMxvqQagXOxNGPsfNp3333jvGFnVLk5w7Vcx7NbaoeXOwFjhDY7Y7CzXGEnBWsR6wypiQrbJmId+0mR484Bc2dzuepiqifsov1i6z+R3zxvjDFR7qScKVW4lmeUtYCxLfbdSQobvr9Zt2mPMS5XWJ9ZZxiXYjuCqI+xJ4qeZ6LYeKX1M1d4xtmlx9gWa5vnmt0c7KDie7FccWdkXG9ZI9l1Vs3ujnL16TMREIHOQaCT/ALuHDBlpQiIgAiIgAiYH9Jpw96xZJXyP1w6hNTwD8xGfVUf+ddHfWHh2/cswKWzCPDk07/9AAuPnOoOldPMdrykQ4atuzWCoIIQ4NFrJbuOOMmP6EqCAKk3+GFeTIBH6EPsJ6UNom05cbCUIYhgpE5B5CMtQqmCyE4aHfIXFyukoEEwrPeSCoXFeGZtv+aaa6KQUU1BVEXMRIxBpC0nwFMfAqzvZogiDgJSYSGF0Z/+9KeYPxmRu1JBLL3uuuuiiEIqgMLC+6RDQiSrJMBzL3PytNNOMwRP5l9hId2KR+mbR4vGVDTlCs+B7wqwP//5z3bcccdFp0NhgTU2ItQXy0teeD31IS7RJ4TLwoJTgHEgBUg5AZ77SEfBs4NTBGGN56Gw4KxByEOAqvSM8Tl8cMaQVqewMLb0kZRR5PkvJ8BzL+knSE+BWIYwmS2kYyHdDvOINFLVFtYebKRtRM5s8Qh8O/TQQ+PaBZdCQbOwjS233DKOGyk8mC+1FhxWFJwwxcTitD6ERZyNCIvFCk4F+lUvhZQ5pJrh2SzXL+zFyYUjiLnMM1JYWHtJPcRcpb5CJ1vh9ThlcIwgiP7+979vxoV0JKSwYg0kPUulgojMPMHpw3NfWBD6mYesWZUEeO7FJq5jzbrtttsKq4uOA97HUYoju1LxnSRxzrJW8kwVFgR6BHjWvkrft9yLUxyHMmPIvCssHvEfc6wz38sJ8NyHqE3b5EunTlKdFRbaYQ6wphUTwQuv55nDcVPMoYlTcZNNNonP7VZbbVVWgKde5gpMsAunL89RtvBMkeKO57OaFEek38Gpw3cijl8VERCB7kFAInz3GGf1UgREQAREoKMIfPyUhRn8YKkFV++oFku387znxV5kbVdOajuIsHSFLf8kvHmn2Yx9LFluy5ZX0pF3jvjI7KqtLXz1uiW73Wi21u/88NWmEbMdaU5XbQuRDRGBPOPk7i1VyP+KqM3hi6UKP7QRKsiJW1gQ4Mnli/iN2FhOQC+8N/v3448/HvPZ8sO+nMCIWEaO91ICED/WEXfquZCnl0MbEbMQlkoVBE1E4WIRqcXuIRoSBwSiMJGv1RREDXITE3GJEyRbEH2JdCRCsZrcv9zraWSiiMx8KRQjEc4QeRC1qikInTgHmF+e8iLmJ04L/42gDj9PAVE0Sr5YG0SpEu1cGPmK6MOhoDwriHPVFBizMwRGCFjZQjS9p5aJdSHaVlNgfOqpp8Y8+TjQsoXdJbSFCFmtU8ZTkMQofYRuRO1swQlBVCwiaLWHmnJ4J3MC0S+70wShjfcR6nEQ4CioprDuEFnNjhAceNnCDgPKgAEDqqkqin1ENBMpy64Ndo/UUuBDHYjM5QpRteWuQeiu5syGcm201WesBewQYDdGtc8vTlDy77MrAdE2WzwVSxwv1oxyUc3ZexBXcfTg7EMwzhZEZL43iJavNlKZiHnGmGc1ux5QL88G9bAeVHLacD3XEAlPf1lnEI7TgiOCtugr4m+1Y8q1sPa0Ok36yh84+VivikW1N7vY36AvrL0U6s2up6wHno4lroE4SaspOGM4X4RdGjirsgWnH84unIXV5I3nXuYK39ccPuwpfprUh904IOHH91w1hTWAtY1/CxCtny042Ni5xdkftFtNwZmAcxZnaXZsq7lX14iACHROAhLhO+e4yWoREAEREIF6JfD2fZbMt3z+1k0aa+Gtuy1ZZpP8bZnm0ZfPegTZugd0jij4SaMtXOcR+9MmWbKnpx5YrLQAmT/czm0Bhxjyw5Nt5+UiIBGriIguluojJcCPf8RExMtsQTRHqOCgNKL8im1xr4Yi9ZOCJo3ELHcPwmG5qETEkmoFonLttOdn7DxA5CFSsJzDARFts802Kzt+WTsRfdkhwD21FKJaYYaYkhYOYCXyGcGxUkR9ti2ELSJBSemRFfFwjBDB+Mc//jFGZ9dSEOCJws0KMwgyCIKI/rUUoq4Ra7N95X5EZcQpROtaCkIZohrRrTi+0uK5jWNUuJ+fUEt1UbQiJUOhfQhJPKe19pexJUq2MFoVwY20NtVE/Gc7wPVEyRbaxzW0QboWIpUrFZ55DoJF8MMxUliIQEacTw+RLvy81N/wZl3CAVlLwRYce8XS9mTrIe0WKTtKFZ6jUlHype5pr/cRuREsl1pqqZqagDlCcuHuF8ac9Yp0MLUU1iS+Z7JjguOKOY2gXq3om7bJfawHhSlJsI+dE6QVqqUQgU19OJTTwvcMfxdLM1WuboRkHFI4MZiHacF5zI4AhPNa5weOQRzcPFtp4YDydIdDOXsKP8Mh4/n6m0WTs5uI+V+tgy+tF9Y48QqdDowF9dU6V0ilBjfSd6WFIAActwj+rIG1FJ4B1hq+y1REQAS6PgGJ8F1/jNVDERABERCBjiLQ4JGt7z9qoR5E+KEeUUhqnP4rd1TvS7czZFC0JVlyo9LX1MsnwwZbOP/HlszpAsYBj5vNXlrIqBeTO7MdCLhEpJaLcKd/iJlEKpYriAaIedmS5ilHXCBKjS3kLS1E4xOJSmRxJXtxLhCRW6rww7+csF3qvo58nyhkxGoEqHKFqNtauCLuU2e1UZtp24h0MEtTcvA+2/iJUiUyspyDppj9RESTooQI17QgoOMUqlVE5n5EPBxJ2TRDpGfAUYBoXWvBccT9OArSguiD+Firg4D7EbWYw1nxGVEXAbTcXC1mN2MHIyJd00KUPg4NdkQgvNVaYEQ0fDZlDnPFD6AtuaOkVBuIYIj3WfvSa5l75IZmrMvtRkEUY64xv8iNXbhrA/GTtBSFaW9K2ZR9nzQUFJ6dagsiH+I6c6zcrhOuY2cK/S9VGPNqnIBECTMGtb4QssuxTe3CVqLPyfdfTVR4tj+s94jw9DUbbc6Y81zXuh5QF+tLVoRnjBFbq90lkrUPoRs7mNNpYfcITjTSotVaSNGCLTiT05KuNYjCtRaeX55Z1oC0sCOBsaiUNqZYWzy/OPhYk9PCWLAWlJuvxepi7LCP9SQbWY/TgLWv1rHlesaD8cymosI+zhoptWOtmG28R9Q8or4fYN14Cc5W1oqWrPU4kNkRVKtTrpR9el8ERKC+Cfh+eRUREAEREAEREIE2ITD2WwvjR3gkfHmxsE3aqlBJ+OxFT5/ih5vNM/3HfoXL2+9j8s4O9sOpZutvNudi7ddOW9Q8aYyF639lSU8/6IsUND1rP7SzLczoTnXwI5Yf2cUOTMtyIKKuXLqaYsyol23wbEFnGz85vltTEPT5oU1UXTmBizZI5VKuIExUm14jWw+iHaJurQURgujZaoQ36kZAQ6TkevJ/lyvYRD7dagqiG0JUKkJWc096DcxgTzRoWhClEJYLdz9UWy/1ZUVzUo/Q55aMDSIPwiBCTFrITQ7L/v19/aux4HRg3BDh0wNQv/zyyyg81hqlStPpnM1GwiMiU3etohb14RQrNhZwaEl9MIIV8zvN/Y4TolYBD9toHydL1r4UPxHyROwy9ojLpdJkIOzyDHDAMqmLCgtjwTggtNZa0rQr2ajhSnXgiMSBQhRwuchdhHPGoFx6DeZ3Nfm0SS+SFWkr2Zh+jpOGXRsInOUKkea8WuqQZE3g+WcdSNc2mLZkfcFOuGXzkKfPSkvWg9RJgEM2LWkUe6mzQsqxYr7ynZa1L/0uqDaNT7Z+xp85wjxOC/OrJWsV97MGp2OR1sdYIDCXm4ul+swY8p3LizpYG7C11ih46sfBQ39Zm5lv6a4p7GvJ2FIn9xWbK5XOrSjWX+ZK4dwrdp3eEwER6BoEJMJ3jXFUL0RABERABOqBwJihZg2eZzZv4dtZJF+8ZGFRj76cuXQ0XIcgmzrRwhevmK3hB4YhbtdrGekHx/5zZ0vmXsIF+JskwHfQOLEdnB/IROmWKkTrcR3pPmopbLcn/QZpJMhhXUoYRMggSh4xkihcouJI3VEYmYlAgYBMGpVyokcqgpWzFcGoJT/WEbZaIsLzIx+RpFoRHg6I6wgNlaKuicysRtCDB2OADVmhuhynws/oe7YPiH30rZLTo7Ce9G8EmVTg5j3EIvpeTRRvYZ0IUIhk2ShwxEXmEe3UWojYpL5sbmHsS9uptT7uoxTalxXla6kTAavYWKT2FT4/lepO8yG3pX2lUn7AFKccB23iTCh0qsGdCGv6Ql7vYpGyRMYzT5h71eZ/ThmkY1Ht88h95JnGLqKoy7ElVzVOsXLX8MxUI7amub4rjV1LPyeqnzWh8IDLauuDP33J7qqBacq32nrS63C8ZAXjdC4W5nWvpl7GCjuyeeTTecL6V7izolKdPB+Mafa+NIVbS/qLQ5S1Lttf7GtpXnKeg8KxgB8OknScKvUx+zmMqC/9bkn/uyVzhbFgxx11ZJ/l1swV+pUdi3SuZNP7VNtfxoI5VuucqLZ+XScCIlBfBCTC19d4yBoREAEREIHOTGA0IvxUF+GXzr8XQ9+wZMtT87fj+08tGeXbp1ffPX9bSlkw1XOi3r6/mefRt9/fa9arusMiS1Wn96sjwLZ8DoYkWpKt2KUKIi8/4qsVrflBi3iE8M5hdn/961+b/PBGsEjFW34wk7udg+84II17yStP9DFRoFkhi636iBbkH+fHfKnClvnVVy9/MDP3l4tmLVV3rbl/S9VT6X0iuBkfoueJ0CtViByHWbl8/oX3EgVKJPLBBx9c+FHZvzmUD8E4m+s6jbIsPEyxbEU/fMhYEgW///7+7P9QEGTpz0svvVQ2p3ax+pmnCD3ZccWBgdCDY6bcHC9WH4yYp9lUMUSBcvApc7gWAZf6mdPM56x9jMU//vGPmMe51ohQHGPZSGfEMlJZwAGhrJY5gX0wQhjO5vbHvmze5WKcir2HA4P+kqaoVDniiCPiIZREu3PuQfZZRwAkXz5rQKnUHEToMz4cNFxrTv00+njBBRcsZV6T9+HJjh7WDdIUlSqIjUSuF+a+LnZ91vlU7POOeI85QsQz8w/byzkOCu3heoRf0jNlxUvmJBHnOHZrqY9nl50T2Sh1nhXqyKaEKrSj1N+sL4wzudzTQt08Jxx4XetazvPB+GefufRZ5pmrNbqeVCwIv9nIctLukA++JbsTyE+PoJ91SLFW8x3L90SlXRGFHHEmMUezojmpXkgR1ZK5QkQ9zrasUwT7SAFTa318R/B9tP322zeazdrF+NSSYiq9mbnHXKmU+q2Qkf4WARHonASUE75zjpusFgEREAERqEcCX71myTzLmPUtLVp1hNlhmP9ImTjGbOlNO6K58m08fZFH5P/EbKY5y1+X16fk8R94ooXvP7Pkt7fkv3MgLw45tMuPbESAHXbYoaxghxhGXuhSkeyFpnNYIkIVwhqHgBaKlYjzRLRTzjrrLCPNw89//vP4N20gwl9yySXxR3Za+JFO7nB+ZJc7JBKxjBzA5SL703ZqPYiw0ZgO+A/ywSP0rrvuumUdDldffXUju2rNYixxaJDap5ZCPmzmC7mR04LoC8dnnnmm5ujXyy67LFbDroe0IKQgRHEAIGNeSyFlEuOfdcAgPCHE099aCk6nc845J6YCyu4yQPRBeCQqutZyzz33xEOJs04MWBLByWe1FFJsII5nx4L7EaMR47IpLqqpF/GT9QBhPFs444Gx/eCDD6qppvEanCiIf4X2ZSthbJgD1J3Ns801rDkI5DjnShV2OeCQGzBgQM07J2CHuFvpbIm0bURqnGKIruWEe55ZnBjVROYfeOCBpbrWoe8z5qT1qDUCm/HFWchanxXbSR/E+p7N/V1NhxDucQpk0xOxHiD83n333dVU0eSau+66K4r6hQd0Myd5thFeayk4YRjXrJjNWsN3EqJ+rYXDQHHwZZ0xfLfh0MC+WguHlrO2ZHdY8P3Bml1rrnPmA87srMiNPcwVxrxYmqly9rIuk6seR3vWOYh9iPO17sxi/UOIx8mfFnbHUT9raa3fHawHrEHbbLNNuW7oMxEQgS5CQCJ8FxlIdUMEREAERCB/AsFTwNjSm+VuSPLWnWbkpc87/cvkcRbevMNsmfyZlByUDx6x8Nqtlmz1V7N5az/crGS9XeEDDvZlZ8c0FwumeiqLiaPNxnxtxs6GER+bDXdh7JvB/vdXLeot4hqid+EP7cLKEF933XXXwreL/k0U6AEHHBBTr5BqolCMQswiwhjxFhEE4ZTIuGxkOxGuCPDZAyz50U80JAJDuUPwiPgjBUZW6CxmKMJnOYGv2D28h82IVbW+iGysRRhIBaxykcSIIQinCA+1lPSgzQsuuKDq2xByEIYYt80337zxPiKRiVZG+EW0qbYgEuOMIbVQNvKa+xEniY6uRZjGoXDxxRfHlEnZ/PTYCx9sKxR6y9mKoPXyyy83OyB27rnnjk4DUizV4sT417/+FaP7sTE71zmLARHuiiuuqEkUxAnAHMxG+dIf+k+fcWRVm5YB4Zhnliha+pUtOMcYH5xi1RaekfPPPz8++5XOKmDtwWHGupGmuWC3BcI850iUE7zT/iLe3nzzzdWaFwVn5j5tV5vvnvmPY6bSukK6qmoP2a3GCUg6L4TPWl88k9WK4MwVnhnW5WpTjcCCHQg4uLI7WRiEX/7yl3GtY5dVtWsegioR1ov5gb5ZxwjiPnOPKPQLL7yw6vr4HsAuIpsLI8A5xJr5xXdPtYU5c+utt8ZzUbJzkt1hnHvCd132bItK9Q4cODDyO+SQQ5pcisMPIZ6+SEpeNwAAIABJREFUpvnrK9XF5zieWV+OPvroJpHriNTMWVI61eJkSXdyFK4vW265ZYz4Z32s1onB2CJy41woXF8YH/4Nwq6AaucK15GqinEoPLCXdYdzLM4888wo0ldT+B5lVwRjW+16UE29ukYERKB+CSgdTf2OjSwTAREQARHobAS+fN1sw6aRfB3eBRdOwzsPWrLkhh3edLMGv/Rc8P4jNllg5WYf1cUbX7xs4db9LFnvAD9lcLu6MCkXI6Z4Op4pnrOadEqfuyPJudg3LmAgvptHAxMRjCCfivEI8z8I9InvJAir/tqdGKfVbDqCC1Hq5dIiEPXLq1JechofMmRIjJhnyzk/0ovlPH7wwQejyMoP7zTvNz+Wsz/AiZTjb0RQIuUo6TUIV9n8w4WdJkXHYYcdVvh2s78Rd7Lb4ptdUOINROM0ir/EJUXfxmaEUyKhqylEg8KonJCKOHXyySfXfKgiNuy1114xCpmo0J122qmsSYwTQt3zzz9vHORbmDcXoYcI7D/84Q8xUnjjjTeuWB+iLw4ZRKPCwhxCDPnjH/9oP/3pT8um4+FexgNBlbQ9f/vb3wqrs9NPPz2KVETU0odKh8jiANpzzz3jPKZPhYX5haiPyEd0bKUdIghGhx56aHQGrL/++k2qQ+AmvQ220QccD1mRvrBt/r7zzjtjiieeo8L6mNc4NxiP8847z4455phiVTR5j3Q41ElEeWH6EFKVYDtcmTeVzoXgOUVYRGSEeaUUVgj/2IgYh1MDwRRb2IFw0EEHVbQdZoiCjMlGfnhrJdGeiFvaYn2h39WW9CDVQj7Z+3ESMp9Zg9qq8CwxN1pSsrn9K93PGMOQtFKVDummLuY0jjR24hSmPWLs4MBuFtZYnKbluDEWRJLzHLOLqjD9FvYg7ONY4Pug0i4n6mN94f+PPPLIZl3n2eAMEuYyBwNXOtiX9YB1ku/KK6+8sll9nH1CpD47yuhHpTRnfJ8yt3GWFVt7eR5YX/bZZ5/4HBU7DyFrBLumaPvXv/61sXMlWxgbvnNxbLAjgJ1pleYFfcAJwA6HYnOBeYJt7FbBSVxubNO5gtODOgvHlnRrrC043FgLWWPK1ceY4ixi7rFOwDBbSI1EP1kDmSt8f1QqzH3WhWrWykp16XMREIFOQsAXExUREAEREAEREIHWEvj2vdBwysIhTBjV2ppad//IL0LDGcuF8PKNraunLe5+4uwQTlsyhPHft0VtbVtHw7QQrvlFaLj85/VpX9v2NoTJE0LwORpe8Xnx1AUhDBoQGq7eLjScvGBoOGn+0DBg4dDgY9Vw4bqh4fqdQ8Ndfwph4ImhYdDJITxyamh49IwQnjgnhOev8jr+FcJbd4fw3sMhfPx0CCM+aZG1Hn0b/Ed68Ci0ovf79vHgwmHwH9tFP8++6VGPwX9AB48UDh4NWvR6TzsT/Edx8KjSxs9dqAkuogUXmxvfcxEg+A/xcOKJJza+51F3wX+wh9VWW61o3bzpkY3BI9qCR/aWvKazfAAjT+sQPKVPE17Y7xGN4YQTTgge3RjckdLiLrlYQb6X4IJZ8J0GReth7P0gyuBCUHBRN7jIWvQ6jzwNLoIGFyuDiy3BRY1m17mYHzwtQnBRMbjAHTy9ULNr0jeoz3OBB4+mDtdee20zBlxH3z3lRJwTLvYGF31L1udiW3ABKHiUcnAhKni+6GbXwvy6664LLtIHdwIEj0Rtdk36hovlwQWg2LaLYIG+FRZPsxDc0RH74CJecJG58JLGv3kWXXwPLjYGj2gtypnn0QW/4GJVvK5YH6gQLi5YxjFzR0HwHMlF2/Xo3uDiV+N1PGOlijttgjuSgkeyBo80LXqZRzIHd17E+k455ZSiTIre6G96dHJwcTB4eo/47MO32sJcczEweHqa4I6pJmtJWgdMPCVRfKYYDxdNq62+8TrWKuYZ41BYYOw7a4KLjYUfdYq/mb+MLd8Hfi5DHEd38gQXixtf/L377rvHdZ654NH5odScYW5yLde5AByYP8Xqc+E4uGM1zn3fJVKSFXPVHaDBnTZxffEDoptdSx94zpkLfA+5kN3smvQNdwDG7xN3FIfLL788+E6lZtfSB+pgTvLMuWO52TXpG3zmDqDIzh0JRb+D+F66/vrr4zrkeeCD7/QqWZ8L58Ed33F94Xut2DrPvHdnQpyT2OgpWorWx5rNOsTYulgf1+Bi6zhMjjvuuPj88jwWuyZtgO9md0rE7253ahQdW97HfsbWnSJFn0vqYw6xTjFXuL7U3PPdeHGuuNMz8CyWKvTDI/bjeuIR8SW/i9yhHL9fWQ/8bIpS1el9ERCBLkgAL62KCIiACIiACIhAKwk0IEye6wLd5OY/plpZdU23N3zqP3BcUA1fvlrTfe1xccMNu4aGG3dvj6pbX+fDA0L462KuGHV+wbQkjMljQ8O7A0PDOauGhhPm+d9rgAvvZ60Ywp1/DGHo6yVvb+8PEBk8ciz+QC4s/DBGICkl0GevR2xEBEAEe/314v3hhz8CraenKGwqeLRnQHSg0C4CHoJB4Q9tjzqOAoFHyDerw9OhRIdBMbGi2cWd5A3PQR3FasbHU3RE8f3ee++N7/n2/jbphUd6R1GDl0egRwEYMYd2PI1BFOkRW8oJUFlDEHm4hxfive+OiOIzwjfiNu97yoUoBFUqCG3MT0RZBBXPoRxFTuxDiOM96uMaTzVTqbooCi+99NKNNnh6nYBjiDo9cjLaRVtcU0yUK2zAU6jEe7ABIcwjq6NtHhEdPFK0kQOOJ8auUmEOp/V5dG7ww41jfThCEN3TcaLuagpOE+7BPoRTT38R6+P58Vzq8X0+R7CvpnjajSiowcjT1AT6T30PPfRQ8Ij5WB/PLc9prcXTDwWPmo51IKLWWnDiIaqmcwXnAnMP+zx6Oa5N1O2pqso6Vyq1i+PKo/WDR+LGtYZ5wrj7ob/BI6Yr3V73n5922mlxjGGFk8l3DURRlPnHusP7MPbo5ar64tHFjXOQ9YR6WBcQSRG2qY/1hXWnUuH7innHPbw8Ujt4mpq4vuA84xlM6/NUa5Wqi981OPrSOeMR3gFnMs43HJzpnOFZrOZ7BUcBIjE2wNB34ETbPE1NFLfT9QqxHqG4UvFdCcF3HTWOBUIx6xU2wjDlwPdeNcXTyjWpjzWZ54PnmLU/XV/43q+m4PBK5wpzw6Pw41xhzjB30rmCEF5N4Xs/rQ/nSDpXPE97/LcD9bG++O6AitUxV3yXTBxb7sOpAE/Gw1ODBd+t0FgfTn8VERCB7kUgobu+OKiIgAiIgAiIgAi0hsD9f7HwxauW7HO/WY+erampVfeGV28yu+8vlhw1xHPCz9Squlp989me+mKrMzzVy9atrqpNK/jqdQtXb2PJz44yW69yyoE2bbs9K5vkh/G+5YeCffXqDyllfA70nd3PKdjEbIFVLek7m9lCa5rNuVh7WlFT3eTe9ojFuN2eNCAuNsRD3NgyTx74NB1MuUpJy0FKDVJPcBir//CNl5OagnQq5HslVQN/k/Ki8PBHtoKz/Z5UEuReJj0OB965CBltSgs5aMn56tGE0TbSHpCHl1zC3LvvvvvGFCJdqXBoHQcMkiebQk5y8mwX5tpvTZ/JK08KDbiSe5/0M6RAID+ziz015c7mZw2pGUhpwJhiP+9RH6kNmGuklqAf1RRsof+kfSFVS5pbnzQLpOkgvzM52gtT5JSqG3tIyUAqA/J3u1gTLyVFA+liYEtqh+xhrKXq4n3yLJNm6KabborpGaiP+U9qBVKlbL311s1SRJSrj/nsDpBYJ+mdmPMuTMW0HqTR4PkiJ3+lFDhpG+Tlpq+MLele4Mm9pMxgbLGv2sNJqZNzJEgz46JnTB+SzhWePxfgYp89GrhcF4t+xtpAig7GmjWJcx1qLdQBO17Uw9gw95grpM1g3jFXClNi1NIO6xPzmnFKD2ElZQ/rVLk0WbW0kfe1rNc8a4yxi7RxjJmD5BZnDtJX0ohUU+BP7nVezEHWMeqDFSmnSB3CYZgwrLaQXoUX48B3RzrGfGcwvtRZbaoxxpC5wnrFc5Km/2K9IiUY85k1ptr1lvnB+QTwI+c7f7MecIgw6wvPG+mQ4FlNoX98D3KmBOcmpOsL/WM+kx4NG6tdDxhPctuzXvnujbi+cC/fm4wtqcVIgZR+h1eykfXl/vvvj3OFHPb8+4G+sb4wDqTHyR6UXak+0tjxXUSqKHK1p3OFlEGsVzAk/VS1hTEgpQ/9Jf0ZawRj6zsRYn+ZL6SaUhEBEeheBCTCd6/xVm9FQAREQATagwB5sa91sa7P7Jbs+s+YBz2vEu45zJLvPzXb8/a8TJje7jA/6OqKzS05zm1J6ugceGIPbt17ukh96AtmM/bOl1NrWyeXO+P9n/MtvHXXdMfLrPNbsvh6ZpseN12Eb20bHXA/B6fxQ3r22WePh6dVOoCwLU1KRZ60TsRRhBnEOI8wbdYUQiq2kp8c0YDctdWKps0q0xsiIAJ1Q4A89oWHN9aNcTJEBERABERABESg0xOQCN/ph1AdEAEREAERyJ3AxNEWrvJo72U3s2SzE/I15+INzFbf1ewnfthojiU8drolHz9ttrfvDKin8u4DZnccYrbfILO5lqwny2qzhaj3J86y8METZt99aMm8y1nY2HdAEOVOv2aoLtKttka73tWvvfZajIxPD+QjqpG/idIjMrGrRJd2vZFTj0RABERABERABERABESgcxGYsXOZK2tFQAREQAREoA4JTB5nNnGUC6HL52vcBE8Z4YJsWHwDyy8W3xGEBkvef9TCAqvla0fhaPg4hcfPdmeJR+jPsVjhp53ibz9c1dk+Zvb4mZ7c2lPNLL6+77643sz7k+uYdwp6zY0kHYDnV47bxPlvouD9wDrz/LcS4Jvj0jsiIAIiIAIiIAIiIAIiIAItJCARvoXgdJsIiIAIiIAINBKIIvxoM49GzrV8+ryfMjaHJbPOl6sZNvZbC6OHWrL6bvnaUdj6555+5pt3LfnlJZ0vUnya545+6CSz128z47+3OdOSZTYzm6lr5SAvHLL2/ptczX5wovlhk7Ep8siSO7janL7tbZ/qFwEREAEREAEREAEREAER6BoEJMJ3jXFUL0RABERABPIkMOZrSxqm+qmFS+VphYXPXzKbdV7Pc943VztszDCzyZ6rfJ6cnRJZClMnmj14vDsGPFVP3s6SWkaHefX2vZ7z/TwLE763ZANPpbPewfWVZ7+W/tTZtRwAt/7668eXigiIgAiIgAiIgAiIgAiIgAi0FwGJ8O1FVvWKgAiIgAh0GwLhq9dcgF/Skp45it+eyzr58hWzWVyEz9MOH/Uw+iuzKRNchF+mfubAG7dbwFmy9vSI5/oxrIwlnDVwwy5mPr+S5beyZIe/u4OlT5kb9JEIiIAIiIAIiIAIiIAIiIAIiEA9EpAIX4+jIptEQAREQAQ6FYFk2DseXb1svjZPHmth3HeWLOkHs+Z9KCdOiTkWNZu5TlKlTJtigTQuC6/VeQ5jJaf+QI/cd9tt1xvMlto43/ml1kVABERABERABERABERABERABFpMYIYW36kbRUAEREAEREAEIoHw9dv5p16ZNNbM05WE+VfOf1S+esOdAT/N347UglFfmn35qiUbHm7Wo2f92FXMkoZpZi9ea+GmPSyZe2mzP70oAb4YJ70nAiIgAiIgAiIgAiIgAiIgAp2IgCLhO9FgyVQREAEREIE6JECk8vAP6iIS3iaOsqT/irlDSoa+brbKzrnbkRoQBp5gySIeBb/wmnVjU1FDOHD1vr+YvXWnJdv8zWylHYpepjdFQAREQAREQAREQAREQAREQAQ6FwFFwneu8ZK1IiACIiAC9UZg5BfTLZp1/lwtC0R7E0U915K52mGeDz6M94j8BVfJ14609REfm733kNnKO9WHPaWsmDrJ7JFTLbgAb5ufbLbG7ma9Zi51td4XAREQAREQAREQAREQAREQARHoRAQUCd+JBkumioAIiIAI1CGBkZ+6WDqTv2bJ1bjki1cskJd+xt652mEcDuu54JPes+ZrR9r6uw86Ez8wd/H168OeYlY0NJjde4SFwfdZ8ru7zRaoEwdGMVv1ngiIgAiIgAiIgAiIgAiIgAiIQM0EFAlfMzLdIAIiIAIiIAIZAiM/d5G3j1nvfEX4QM7z/ivlPjRh6FtmM/mBrDCpgxL8gFNbwgX42RaqA2uKmRAsPOGpZwY/YMmOl0iAL4ZI74mACIiACIiACIiACIiACIhAJycgEb6TD6DMFwEREAERyJnAyM/MenokfM4ifPL1WxbmWyFnGN6822EzzZl/RD4kJo83++Q5SzY5Nn8upSx4+Qaz/5xvtvUZZsttWeoqvS8CIiACIiACIiACIiACIiACItCJCUiE78SDJ9NFQAREQATqgMCooS7Ce9R3nvm7J42xMGaoJfMsky+QqRPNxn5jSb/+Zj165msLrT9/uRlM5ls+f1uKWfD12xYePd2S9Q4yW3H7YlfoPREQAREQAREQAREQAREQAREQgS5AQCJ8FxhEdUEEREAERCBHAuNHmM2+sNkMOR6zMvxDF709FzwR6HkWIs8njp4ufOdpB21z0OkrN1my5IZ5W1K8fXdWhOt2MFt0HbPNjq8Pp0VxS/WuCIiACIiACIiACIiACIiACIhAKwlIhG8lQN0uAiIgAiLQvQmEiSPN5lwiXwjffzw9Er9Pv3ztmDLekkljzeZeKl87aH3ERxbGf2e22Lr521LEgvDk2ZZMHmfJFqcU+VRviYAIiIAIiIAIiIAIiIAIiIAIdCUCEuG70miqLyIgAiIgAh1PYMJIS+ZavOPbzbY44hNPidPXhficD4f1SPjgqXHqQoQfNnh6NPzCa+Y7NkVaDx8/a/bqrWa7XO8Hxi5Y5Aq9JQIiIAIiIAIiIAIiIAIiIAIi0JUISITvSqOpvoiACIiACHQ8gQmjzObKORJ+5BfTRfi8D4clNc+UCb4zIGenBLPgvYfNFl/fU/TM1fFzolyL7BQYeJwlS29stpS/VERABERABERABERABERABERABLo8AYnwXX6I1UEREAEREIF2JTDRRfg5FmvXJipVHsYNN5vZxeYZ/YDYHEsY/v70yO4evXK0wptumGrhwycsWfU3+dpRrPUhD1kywtMH/ewos0T/DCuGSO+JgAiIgAiIgAiIgAiIgAiIQFcjoF9/XW1E1R8REAEREIGOIzD66yj42uyLdFybxVoiAn2eZYt90qHvJd++VxepaMKnz3sqmsn1lw+eKPh7jzBb94C6GK8OnRxqTAREQAREQAREQAREQAREQAS6MQGJ8N148NV1ERABERCB1hEIwz8wm2Uej2hOWldRa++e8L0ldXAYauQx52Kt7U2r70/ef8QdIwt7jvyZWl1Xm1bw7MUWes1sVo8R+m3aUVUmAiIgAiIgAiIgAiIgAiIgAiKQJSARXvNBBERABERABFpIIPnORedZ52vh3W13WzJxtOelX7LtKmxpTX5AbJJzah6bNsXCZy9MdwYgeNdL8Vz54e17LFluC09flPPOiXphIjtEQAREQAREQAREQAREQAREoJsQkAjfTQZa3RQBERABEWgHAsM/9Ej4eduh4tqqDBNHugif82GoDQ2WjPw0f4HZdwXYmG8sWXTt+sq57rngbdRXZpudUNvg6moREAEREAEREAEREAEREAEREIFOT0AifKcfQnVABERABEQgLwLhOz+INO9I+LHDzKZ5XvrZPP1KnmXMMAshWMjbKTHBD8od+63ng18vTxpN2548zsKgky1Zcw+zPv3qxy5ZIgIiIAIiIAIiIAIiIAIiIAIi0CEEJMJ3CGY1IgIiIAIi0CUJjPjUkpnnzrdr3/hhqOSl79EzXzvGfWM2Y2+znn3ztWPY25bM4Dn6+6+crx3Z1j95xh0Dzme5LevHJlkiAiIgAiIgAiIgAiIgAiIgAiLQYQQkwncYajUkAiIgAiLQpQh41Hcy6guzmXIW4ePhsPmnxIkic4/elvTM+TDUj/7jUfDr1tdUG/Kw75iY32yBVerLLlkjAiIgAiIgAiIgAiIgAiIgAiLQIQQkwncIZjUiAiIgAiLQ5QhM8RQjUye5CD9Hrl0Lw9+3JO+UOBBAhJ+xV+6R8OHjZyws4vng66WQoueDxyxZ7yBnk7ODol6YyA4REAEREAEREAEREAEREAER6GYEJMJ3swFXd0VABERABNqIwMQx0yvqNUsbVdjCalyEzz0vvZseyMMe09H0aWFH2uA28uOP/MyShdZog8raqAqPzE88J7ytvmsbVahqREAEREAEREAEREAEREAEREAEOhsBifCdbcRkrwiIgAiIQH0QmJSK8DPna8/wjyzM7Dnhcy7J+O+m56WfMUcRfti7lvTy8cg7T392LF66zmyRH7uDIkcuOc8NNS8CIiACIiACIiACIiACIiAC3Z2ARPjuPgPUfxEQAREQgZYRmDx2+n29ckwx4qlObPQX+R8O6yTChJGW9PB0NETD51WGDbbAzoS++aYIauy+OybC5y+6CF9H6XHyGhu1KwIiIAIiIAIiIAIiIAIiIALdmIBE+G48+Oq6CIiACIhAKwhM+kGEzzPPN9H4CPH1IDp7ypVAFPoMM7YCaitvHf6eWW9E+NlaWVHb3B6Gf2g2YbTZohLh24aoahEBERABERABERABERABERCBzkkgx1/KnROYrBYBERABERCBSCAV4XOMhA8TXeCl9M45JQ42kPd8lvmm25PT/4bRQ81mX7huUr8kX7/lJBrMFqyjHPU5jY2aFQEREAEREAEREAEREAEREIHuTECR8N159NV3ERABERCBlhP4QYQPPfMTwJNJP4jweR8OC8VJLsLP1r/lPNvizjFfm9XRoazh/Uct/Gh7syRpi96pDhEQAREQAREQAREQAREQAREQgU5KQCJ8Jx04mS0CIiACIpAzgSnjowFJzxwP3GzMS5+fI6BxFOogEt7GfmvJgqvmPDF+aH7aFEs+fc6SFV2EVxEBERABERABERABERABERABEejWBCTCd+vhV+dFQAREQARaTADRmZJnOprGvPR9W9yNtroxmTreklnmbavqaq+nocGSCSPM5v9R7fe2xx2fPW8h6WHWf6X2qF11ioAIiIAIiIAIiIAIiIAIiIAIdCICEuE70WDJVBEQAREQgToiwKGoPV38zvEg0uSHaPw8HQGNIzJlotlMc+Y3QMPesjCjj8esOafE+YFA+PhpT8+zgM+RmfJjopZFQAREQAREQAREQAREQAREQATqgoBE+LoYBhkhAiIgAiLQ6Qggwuct+KaR8IjPOZcwZYKL8HPlZ8UXL5vNuVh+7WdbDsGSz16wpJ87BHLcKVEfMGSFCIiACIiACIiACIiACIiACIiARHjNAREQAREQARFoAYHgInzSL8f0K25z4DBUSq/8Rfhk6iQX4edoAcm2uSV8/bYlsy/cNpW1thY/MDd4fnqbz1PjzOApaVREQAREQAREQAREQAREQAREQAS6NQGJ8N16+NV5ERABERCBFhPwVDChT47pVzB8CiJ8YlYXkfCko8lPhE++9nQ0pH+phzJxtNl4z0+/4Gr1YI1sEAEREAEREAEREAEREAEREAERyJmARPicB0DNi4AIiIAIdE4CyWQOIs1XhE+IhO8zS/7R1uOGuy/AnQG9Z8tnMD39iw0bXEeR8GMtmTjKD2VdOR8ealUEREAEREAEREAEREAEREAERKCuCEiEr6vhkDEiIAIiIAKdhUBwEd765hf5HTmRE36mefJH5qlXkl4z5+cMmDjSYk76WebPnwUWfDtk+qG9cyxSH/bIChEQAREQAREQAREQAREQAREQgVwJSITPFb8aFwEREAER6KwEkqku+vbNNxKevPTWb77cEYYxX3tqnn752UH+dS+h7+z52ZBt+fOXLCywan3YIitEQAREQAREQAREQAREQAREQARyJzBj7hbIABEQgQ4lMGnSJLvzzjtt4MCB9uSTT1r//v2tX79+tu2229ruu+9us802m11zzTW25JJL2oYbbtihttVrYzD74IMPbIUVVvCMG55yo47KN998Y//85z/t7rvvjmOHrVtuuWUcy6eeesoGDx5sxx57bB1ZXN4UbL7rrrtsxIgR9vnnn9sZZ5xha665ZvmbcvqUQ1GTnCPhE88JH2aaOycC/2s28fznobenxcmrTPD8616SHHPSN+n6l69assjaedFQuyIgAiIgAiIgAiIgAiIgAiIgAnVGQCJ8nQ2IzBGB9iTw/PPP2xZbbGEzzjij8d8XXXSR9erVy6ZOnRrF2kUWWcQuu+wy23///e2BBx5oT1M6Vd0HH3yw3XjjjfaXv/zFTjzxxLqxHaF68803t0033dQGDRpkPXv2tMmTJ9t///tfW2WVVWz8+PF2+OGH1429lQzB0YED4aGHHrJp06bZz372M9thhx2iGF+XJaY/mStf00iJM9tC+dpA654OJuk5U352TPD865Tes+ZnQ6blMOxts7X25MhcFREQAREQAREQAREQAREQAREQAREwpaPRJBCBbkIAUX3rrbeOUcWvv/66LbXUUjbLLLNEEX6mmWayNdZYwz755JMYNT1lypRuQmV6N7/44gs7+uijS/aZaPMJEybYyJEjS16Txwdnn3123MXwt7/9zfr06WM9evSwvn372kYbbWRXXnlldK60tlx88cWtraLq+3/961/b+uuvb+utt56tvPLKhvNjwIABVd/f4RcigPfJN/1JzIPeN6fDULPAEcF75SfChwk/PJu9c0yJk/IY5/nxp06qn0NiO/zBUIMiIAIiIAIiIAIiIAIiIAIiIAKFBCTCFxLR3yLQBQkMGTLE9tprL5t33nntkUcesQUXXLBoL+eYY46yYnTRm7rAm++++659++30nNLFunPbbbfZyy+/bOedd16xj3N5j7QzZ555pu20005FU+SSurYYAAAgAElEQVSw42HFFVdslW1wwQHREWXMmDH2yiuv2GqrrRabm3322e3888+33/3udx3RfMvamOIi/Mx5R8J7SpyZcrbB6UURPEcRPpk4avpzkGdKnHQWjfzcQs++7qCpA+dIy2a27hIBERABERABERABERABERABEWhjAhLh2xioqhOBeiRAXm1E5t/+9rcVzSOX+EIL1UF6i4qWtt0F5CAvV9gtsPrqq5e7pMM/++qrr6yhoSHmqi9WiIqvZryL3Zu+R4R9RxXSz1BIldQpSoPb69HOeR/MmkyZmLsNjFfi6WjCjC4851TC2OGek95T0SB+511Gfel2+K6AenAI5M1C7YuACIiACIiACIiACIiACIiACEQCEuE1EUSgixP47LPP7Lrrrou9JHd4pUI6k1/96ldlL/vuu+/s/ffft++//77kdSGEKBKnZeLEicZ7lQqR19Q9atQPOZ6L3IBgm9ZVql6uoe8ffvhhzJNeqnz00Ud2//33l/q4yful0rtk66ddotSrKaS4yTL58ssv7dlnn42pbyqVueeeO6agueSSS+yNN94oejmpXRZbbLGin8ENNqTiKTYur776ql177bVF7631TXLTv/fee4bjoMuUyWM9/Nvnc86pYMJUf6765HggajqgMR3NzLkNbzJ+uNlcS+TWfpOGRw91b1IfF+Lz41EfIGSFCIiACIiACIiACIiACIiACIhASkAivOaCCHRxAvfdd19jD5dffvmqevub3/wmHtJaWBCbt9122xhh/eijj8ZDQffee+/Gyz799FPbeOONY0oRXs8995yR0oT3fv/739taa61lJ510UmG18W8EbnLWc93DDz9sm2yyif3pT39qvJY0Omm9m222mQ0dOjSm2OG1wQYbNMljT5851JMI9zvuuCPmuy+WSmbnnXeO15ELn2vT+rmeQm58+pq+f9pppzXac8MNNzS+j62Ugw46KB4k+otf/CJ+9sILLzRen/0P7KMNdh2ss846dsABB9iRRx4ZRW8OxT3rrLOK3pd9c9ZZZ42pWuAGX9osjIonr/oee+zRrK4LLrjAfvKTnxh2HHbYYZEfjhXK8OHD47hus8028e8rrriisZ/77LNPTecFYNu+++4bD1tlvsCPdjmTIFu22mor++lPfxrfuuqqqxrbe/HFF5tcV1d/TB7nbuweHgLurzyLi/BJPRxG6ulokl45RqGP9/k715J5jsT/2h4zzEX43rmm56kPELJCBERABERABERABERABERABESgkYBHQKqIgAh0YQIuDBN+HmabbbZW9XL06NHBheXgAn3wKOrGujy6Pmy44YbBc3oHF12DR5YHF5JDkiSBtk899dT4PsXF1zDDDDOEm2++uYktHiUdPF99OOqooxrfd1E4uNMguAgeXPyPbb799tvBxdrgUeBhl112Ca+99lpsg/5ddNFF8d633noreG77cOGFFwaPSo/vuXMgeB784AJ/E9s9kj8MHjw41rfbbrsFF6Dji7bT4pH5wQ8nDb179479SsvYsWPDU089FRZeeOEwzzzzhFNOOSXQD4qL98GF5+CH3waPAm+8h/+4/PLLgx+EG22neMR/vG777bePf7tQHTwHffzvSsVTDAV3bMT+py/4umMhuKDfrG0YutMicqWfaYE7DBg7mI0YMSI89NBDsc4jjjiikQu2Vltg6w6bcMghhzSOA/fCe9FFFw3uxGisims9Kj+2x3in4wDHui3fvBcaTlk0f/POWCaEz1/O3Y6GizYIDYMG5GZHw9XbhvDoabm136Thuw4NDVdsUR+2yAoREAEREAEREAEREAEREAEREIG6IKBIeDlkRKCLE+DASwqR060pRLwTwUy0tgvSjVURjU0KFV7kIV988cVjtDz/TXqVY445Jv43hcjs+eef31yYb2IK0dikoXExuPH9OeecM0ah33333TE6mzZXWGEFW2+99eLfHDq6yiqrmIvvMSULUeiUkSNHGn2+6aabYpQ4hah+otWJdsemtHD4J4fRunAdU7vMNddc8UXbaXGB3X7+85/bzDM3TS3B36R7IaKdfPukfVl66aXjbeQ15x4i09kdkBbswU7s5kXp16+f7bffftE2dg4cffTR8bDVagopaYi2//Of/9x4OCspgB577LEYJb/j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BNOG2LSR4n1uHCQrltg6Y+13MVI0Bq8sWaz1duKZsWAdIocakqWZidIvjIRfmyR29gQRIw/kzf1HYq2MjE85sZdeeklGjRolr732mkyZMkWqVasmJ5xwgjRo0KCwh55xBk2cOFHeffddgSC8+eab5bLLLivTCNx7770yduxYefXVV2XhwoWyww47yM47r3VImZ7R58GDB8u8efPkmGOOkfPPP7/w3Zatjk+fPl1OP/10i/0999wj9eqZVTt5Yrfffru9/uDGez5f7bvvvpP33ntPNtpoI+nevbvUqlVLJkyYICNHjrR4gm8+27///iv333+/PProo7Jo0SLZd999pU6d9GS4Bg4cKIMGDZIbb7wxssvz58+Xp59+WmbNmiX169e3/91mm23k4IMPjjxnfdvBeGLsP//889K6dWs57bTT1jcItL+KgCKgCCgCioAiEIFAzEwa3GL2iEN0syKgCCgCmUFg5syZdqL233//yT777GOJ+D///FPuu+8+S2AwaXnuuecyU1kJStlzzz1l2LBhsnjxYjniiCPkhRdeKEFpemq5QOCB7WTN7L/Ep8BevFstukjs9C+Kb8/QFu/Fw0XGf7WuNDTp1xgSvJB+N/+sUElil48r0EPPUL3Filk4XTyDR7Fktf4DTTR+7BQTqV61drHTS7LB++cHkaf3XVcEmvghnzGxQ4zTpHMWSaGF/4l39xYFdddvLbETTMJYJIoe7CGxw58xpPxm4r1wqIgh4NHtj11opGuQFSpHNn78eGnfvr00b95cfvvttyIkvOvmnDlzpE+fPtKtWzd58skny0XvDzroIHnnnXfk/fffl759+xbr05VXXim33XabHHrooZawz6ZB9h14YIGz66effrI454s1adJEeOdfccUV1gnjt2nTpslNN90kDz/8cKk3l+8Oh6FrTAWzcoVxjVOlbdu2pd7GZBrQr18/+y01efJkadmyZTKn2GP4BiNiGxL/119/lR49esjQoUNDz1+yZIkl3HFWPPPMM+bRFhOcGL1795bHH39cjj/eOKzVChHo3LmzdYz8/fffiooioAgoAoqAIqAIKAIWgYJ17AqGIqAIKAJZRoBorZ122kmOPvpoIeKd6LjPPvtMfvnlFzuJO+6447LcguSLJ8qLaM+VK03SxxCCL/mS9MjygoDnpFDidCiW6cjvYF3osfvNyLIUIeDZ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WBbdeJOECgqiNo42fG2ja97wP2dLRvXqUffVL6MjQGT85pkzZfWrr0nhwkVG9qeXNDi1v2QYZ4eaIqAIKAKKgCKgCCgCioAioAgoAoqAIpBIBJSETySa2pYioAgoAoqAIhAPAiYCfumQofJ/7J0FuF3F9bcnThJCcG3KH3d3KJoiheIpVtzdnRIkEKS0SFvcihQvlEIJbsHdigV3CZIAISHJ/tY7Ze63z75773POPnLPzf2t57lPcraMvDN7ZM2aNT++mu2SJh4sbmmm320X13vQoCKx6Z04gcmT3ZgRI9zYEXc51727m96s4vsuuaT/v0QEREAEREAEREAEREAEREAEREAE6kFASvh6UFQYIiACIiACIlAjgZ/ee999fMSRpaF07+b6Lbe8G//qq27SmDGl98wSfkZTxPdfbbUaY9brEJj8/ffu679f4b4b+YibasEF3MyHHeq69e0rOCIgAiIgAiIgAiIgAiIgAiIgAiJQMwEp4WtGqABEQAREQAREoD4EPjn8SDfh/ffbAsND/HS/G+IGbr6ZmzxunJs8dqyb9OVo99Onn7pJo0e7ST/84H3ET7XQgrLcrk8RuHFPP+2+vuY6H9rALYa4/sstJ7Z1YqtgREAEREAEREAEREAEREAERKCrEpASvquWvPItAiIgAiLQcgS+ueoq9+1t/7F0oX7v5qZafDE34a233Rx//Yvr3le+yptZYF+cebYb98wzbsBvf+umG7KZHYbbs5nRKy4REAEREAEREAEREAEREAEREIEpiIAcnk5BhamsiIAIiIAIdG4CfZdf4ecMdHOuRw83/U47ut5zzuk+P+lkN/nH8Z07c50s9TPus5ebfped3ff33+8+O/kUN9F2H0hEQAREQAREQAREQAREQAREQAREoAgBKeGLUNM7IiACIiACItAAAn3mn8/1nnsuH3J380fevV8/N625RBn/9tvuh0ceaUCMCjKLQLfevd3Ua67hZj1+qIsmTHCfHHOsG/f8C1mP67oIiIAIiIAIiIAIiIAIiIAIiIAIZBKQEj4TjW6IgAiIgAiIQPMJTLfllj5SlPDd7PDVPvPP7was/Wv37S3/ctHEic1PUBePsedss7mZjz7S9V9hefflWWe7r//xDzvFdXIXp6Lsi4AIiIAIiIAIiIAIiIAIiIAIVENASvhqaOlZERABERABEWgwgd7zzO16zjyz64YSHj/k3bu76bffzrun+frSy1wkBXCDS6B98N3793fT776bGzhkc/fdHXe6ry6+xE22Q3ElIiACIiACIiACIiACIiACIiACIlAJASnhK6GkZ0RABERABESgSQRQ+PaZdx7XvX8/bwnvxZTx06y/nvv+0cfcxI8/blJKFE2SwDQbrO9mHX6S+/7Jp9xnx5/gJn/7bfIR/RYBERABERABERABERABERABERCBdgSkhG+HRBdEQAREQAREoAMJdOvmpl5rLdd71lmds/8HmXr11V3PX8zhvrnuBueiqAMT2IWjtvLoNWiQm/mIw6xsurvPTznNTTB//RIREAEREAEREAEREAEREAEREAERyCMgJXweHd0TAREQAREQgQ4gMNWii7h+K61UEnO3Pn3cjPvs7ca98IL7/oknOyBVijIQ6DPffG6WE45z3WzXwmen/dFNePc9wREBERABERABERABERABERABERCBTAJSwmei0Q0REAEREAER6DgCUy22aLvI8RXf1xT0Y2+73UU/jm93XxeaR6D7VFO5mQ4+0PVbckn32bCT3A+PPtq8yFswps8++8x9+OGHLZgyJUkEREAEREAEREAEREAEREAEOp6AlPAdXwZKgQiIgAiIgAi0JxBzRRNudrPDWQdutaWbYMpOLOIlHUvAH9i6846uryniR19ymfvpgw/aEvTNN9+4hx56yJ166qnu7S7gsmbEiBE+r51dJkyY4M4880x31113udGjR3f27Cj9IiACIiACIiACIiACIiACLUJASvgWKQglQwREQAREQAQqIdD7l790A9ZZ242++BI3acyYSl7RMw0kgJugGfbaw82w5+6u54wz+pg+MGX8euut5x544AG30047ubnmmquBKWiNoGeaaSY3n7np6ezSu3dvt/3227uP7QDkwYMHu0ceeaSzZ0npFwEREAEREAEREAEREAERaAEC3SKTFkiHkiACIiACIiACIlAhgYnm+uOTY451A9Zb1007ZPMK39JjzSKw8cYbuwEDBrirrrqqWVF2WDyTJ092WP2PGjXK/fTTT27RRRd1U5mrnj62ONGZhXztvvvu7rXXXnP33XefQzkvEQEREAEREAEREAEREAEREIGiBHoWfVHviYAIiIAIiIAIdAyBnrPM4qZe7Vfu+4dHSgnfMUWQG+vjjz/uTjjhhNRnvv76a3fggQe6MbaLYeqpp/aK6x9++MFtueWW7ve//71/57bbbnMXXXSR69evn0MZPH78eHf11Ve7/ub+Ji7PP/+8O+qoo/wzWbL44ou74cOHu169emU94j766CO36667ur59+/o4Q5qw4t9ss838e+eff777z3/+46aZZhp/n/RfeeWV7tVXX3W//vWv3aBBg9z000/vXnnlFbfDDju4c889NzO+rBvk89BDD3Vjx47NeqTt+jLLLOP222+/ss8VfaB79+5ulVVW8bsZJk6c2BJK+EmTJnk2lJEWBYqWrN4TAREQAREQAREQAREQgY4hICV8x3BXrCIgAiIgAiJQE4GBQ4a4H554yo35161umo03qiksvVxfAihLe/ZMH2INHDjQK8VvuOEGd8ghh7g//OEPbscdd3S4cwmyxhpreKX2Pvvs45XSS5rP+aQCnmdPO+0077d83333dUsttZS3vkd5jF/zgw46yD322GP+/TwFPOHMOuus7oILLnAXX3yxO+WUU/z/11xzTX89CIsE888/v9trr73cySef7JZddlmvdF9xxRW9Iv6dd95xbK7kGfJYRFAsH3DAAV65f+KJJ3rf7Lj16fbz+Qgowz/99FN//eGHH26oEp70w7IVZNy4cZ45XClnXOU89dRTbujQoSX1phXSqjSIgAiIgAiIgAiIgAiIgAikE0ifIaY/q6siIAIiIAIiIAItQqC7WcNOPXgt982117n+q6/mekw7bYukTMnII4Bid4455vCW5CitN9xww3Y+47GQX2KJJdwGG2zgNtlkk9TgsKh/5pln3L333usV9nEZNmyYt+C+7rrr3Nprr536fvxiDzvw95d21sAXX3zhZjS/9li28zsu0003nZt33nm9v/QhtgAUhPzMPffcPi1YwfNuUUHZThyfmbslFjG22WYbN/PMM5cEt8gii3jf82eccUbRaDrde9dee60bOXKkd4sTFgZgxYIFLo9aZbGg04FVgkVABERABERABERABESgiQRaw8SniRlWVCIgAiIgAiIwpRDov9qqjoNdfnjiySklS10mH/fff7+3JEepnCbvvvuuv58lKNlPPfXUdgr4s846yyuocQez7rrrZr3e7jrW8y+99JJfIEARnyYffviht5BPk2+//dZbaNcq7CLA7Q2W9kkFfAib67PPPnutUXWK91moOfvss/2OhriyfYUVVvALMOwIkIiACIiACIiACIiACIiACLQ+ASnhW7+MlEIREAEREAERSCXQ05SlA80VzZi77naR+emWdA4C+IDHncj666/v/bCnCdbPiy22WNqttmubbrppyX0s33Fxgyua7bbbzmHhXqng8uStt97y7k6y0vT666977zEG5AAAIABJREFUJX2aEFc5tzdp7yWvEQfK/OQOAFzk4DMewS866ewK8uabb/rFEVwSxYXdEhx+iyJeIgIiIAIiIAIiIAIiIAIi0PoEpIRv/TJSCkVABERABEQgk8DAIZu7yaaU/P7BhzKf0Y3WIvDQQw+577//3ivKs+SWW25xiy66aNZtr6QOvtJ56IknnnB77rmn4zBVDmutVv773/+6zz//3FvPx8ONh/Pss89mWufjz32qqaaqNtp2z2PZjSuatdZaq+0efuAffPBBr3RG8J9fiZuddoEXuIAlekcKbn4oD/z9xwXecMIXv0QEREAEREAEREAEREAERKD1CcgnfOuXkVIoAiIgAiIgApkEupkirp9ZyY65Y4Trt9KKrnv//pnP6kbjCeBXHdcus802W2Zkd955p8PH+vLLL5/6zEcffeR9o08zzTSp97kYV5SjqEUpj2L6wgsvLOQjHMt7lNxZ7mY4ABZreSyw04SDY/Pc56S9k7yGwvvxxx/36bj77ru9n3l85994443+8Nm4xF2zYCnOogbC4a3LLbecDwOOuPXBSr+fnaHAokY1/tMpA6zuv/vuO/9+JcIhtf/85z8redQ/Q9rwfZ/0wR8C+OSTT1LTTPnzR/okIiACIiACIiACIiACIiACrU9ASvjWLyOlUAREQAREQARyCQxY+9fuu0cecRPef99NtdBCuc/qZmMJnHbaaW6eeeZxv/rVr1IjwqXKk08+6Q8XzbIcxwXJFltskfp+8iK+2HFLg1L/8ssvT1XYTp482XFYK8++9957bocddvAHwgZFPvdRwi+++OJuhhlmSEbhf2OhTp6yrORRwmf5cE8NMOXiT+ZSCSX2QlaH999/f88HH/Gvvfaad92TJTw3fPhwd+utt/pFiBVXXNE/ilJ/q622cr/5zW/cHnvskZn2rHBXWWUVN3jwYLftttu622+/vSJ3O5Q9h9dWakGPEn6WWWbJSoJf+EiTUA7wkYiACIiACIiACIiACIiACLQ+ASnhW7+MlEIREAEREAERyCXQe955XF/zHz7m1n9LCZ9LqnE3cR9z/fXXe4Xvcccd1859SIgZi/IPPvjA/frXv3a4FEkTfLMn/b2nPff11197Zfqss87qFdBxa+177rnHrbbaag4F+zrrrON222037/6G+LEIR4nLuwiK7y+//NLtvPPOadH4axwke/TRR2feJ+4sa+7MlxI3fvzxR/fGG2/4dAaLe1yuYNkeDoslP/jT52DSICxocCAtLmuwdOcdBKv6Sy65xLOuxgI+nqyLL77YW+UfcMABntvee++dmx3KdNCgQbnPVHOTxQ3ynBSuoeivhx/+ZNj6LQIiIAIiIAIiIAIiIAIiUH8C8glff6YKUQREQAREQASaS8AUqgM328SNe/Fl99M77zY3bsXmCaAUnnbaad0dd9zhcCGSZQmNEhyXNSiWs6zKUdKjfM0T3LRsvfXW7n3b/XDNNdd4RXwQrKdx4YIyGuUz94LFNC5uuIbSPcgrr7zi07L00kunRslBsih78yy2sYLHgr0Wwa891vobbLBBSTCbbbZZ228s+eGTFNK23377uUMPPdS7sEFxPnDgQL8AUVQBTxyUF2WKi6F4OpLxx3+jIId3JX9pCvZ4WHPOOaevS0mLd37zbp7Lorw06p4IiIAIiIAIiIAIiIAIiEBzCcgSvrm8FZsIiIAIiIAINIRAr1/8wvWafVY3ZsQIN8Oee+A0vCHxKNB0AviA/9vf/ub+8Y9/eGv4u+66y7ulSQrKXNyuLLjggslb/jdW3n379m07hDT1Ibt44IEHerc2WMAn4/n3v//t3begfMYymzTh9gR54IEH/DXcrATBnzr3Z5999tTosJQPLl5SH7CLWKPXKldffbXfQbDSSiuVBBVX/t97773+8Ng0wYUP7oA4oHafffZpF07aO3nX8Le+0UYb+fDYJZC1cyEexn333edOOOGEzEWYZHwsbvzpT39yS9q5Dmmy8sor+3Jk4SHuc59dA9SlrHqUFpauiYAIiIAIiIAIiIAIiIAIdBwBKeE7jr1iFgEREAEREIG6Eehu7kD6L7e8+YYf6Sab5bIOaK0b2ooDwpp888039y5LOFQ0qRwnIHy38xcOEo0HjgX9eeed584888zMOFG+nnLKKQ5FO65Skr7nsbK/6qqrvCV8ECziP/zwQ4cCm3ssFsRdpoR04q8+Kbz317/+1f35z39O3qr4N4sFWG2zWyDL+h/rfSzOscZHEZ8UrMHxS8/fTjvtlLztf+MOB6U0h7Hizz1NHnvsMW89HizJl1hiicw0oVBnxwDucSpRwBMf5YFboqydEMk0oWDPO9CWBQjyQr5Ja5CvvvrKK+GTuwaS4eu3CIiACIiACIiACIiACIhAaxCQO5rWKAelQgREQAREQARqJjBgww3cxK++duPtIEtJxxDgkFCsm3GJkia4F8FS/oorrihxMTJq1Ch/GCkKdtyoZMk555zjD1lFUR93j4ISG6U8LmFwi5NUGmPljvsaDi7da6+9HMroICiOsZzHrU1csL4eOnSoV9qzcFBEJk6c6NZee223+uqr+wNWs4QdACwgrLrqqu0eYcHijDPOcBtvvLHfARCs+pMPkifS+8ILL7iHHnooedv/3nHHHb2FPM9xCG3WogDPfvPNN/5w2LxnkpHAHcU5LoAq+cONT/Bhnwwr/MYXP/WC9ARhMYX6spidBSERAREQAREQAREQAREQARFofQLdzFInav1kKoUiIAIiIAIiIAKVEBh90cVuwpuj3GynDnfmx6KSV/RMnQlwiOipp57qdt1119SQUZijTMffOMptlMocRLrlllt6xXCeHHnkkd5vOs8FX+couvHbjmU0wzrcsqy55po+GFzfvPPOO95dTFAm77HHHg4/8FhXh2ukCcU+il7SRNi4xdlmm23aDkXNS1fevQsuuMC9+eabXhmfdCWDoh83NFico2zHSj1uGU6eSBP5+4W5XEIhnVSKk+c777zTfffdd35hAvcxuN159tln2w54Den7+9//7vOE4jsZTjIPPMuCx4svvlhy6G3yuUb/ZhfBv/71L/f666+7eeed13322WeOXQvkM34Yb6PTofBFQAREQAREQAREQAREQASKE5A7muLs9KYIiIAIiIAItByB/iuv5L578EE34d33XO+552q59ClBziu3jzjiiEIoUO5XI48++qhbb731vJJ6tdVW86+ySIDyG+V1UESTJhTcjRCU/ijF0xTGuMVhYaGokIeXX37ZsRAxZMgQH8y2227rdwXgfgfr+bjAg8NsUWTvsMMO/oDcVhcWRDbddNNWT6bSJwIiIAIiIAIiIAIiIAIikENAJnI5cHRLBERABERABDobgd7mF7vHgGncuOef72xJV3obQAB3J1jFL7744j50fMqjkMclTbCkb0C0JUHif/22226ru+sUrOTPOussf/Bs3MIe3/P4h7/kkku8L/q4HHrooe7YY491w4cP9wzefvvtRmdf4YuACIiACIiACIiACIiACIiAkxJelUAEREAEREAEpiAC3e1Qy/7LLmtK+BemoFwpK0UJ4CP+sMMO8z7Vb775Zv9/FNb4Vm+WPP74495FDtb29ZK33nrLYWH/vC02cUgpLnqC/POf/3RrrbWWd9mD0h2rdwQ/6h9//LH/P25vcEkT7rW9rP+IgAiIgAiIgAiIgAiIgAiIQAMIyB1NA6AqSBEQAREQARHoSALTbL6p+2i/A9xEUz72tEMiJc0lwOGc+OxuFcESfpVVVvF+1VHAp7mFaWRaF1544dzDZovEPc8887jLLrss9VUOoOUvKbihwTc+gjJ+7NixjoNyswQf9fjrL+c7Put9XRcBERABERABERABERABERCBQECW8KoLIiACIiACIjCFEegx7bSu91z/58bc8q8pLGedIztYaF977bXu008/bZkEszAwrdWLZivgARAOeu1oGIcffrh74403/CGnuLDhb/bZZ09NFgr666+/3q200koOdhIREAEREAEREAEREAEREAERqIVANzvQKqolAL0rAiIgAiIgAiLQegS+ueFGN/Y/d7g5/nK26z711K2XwCk4RcFX+RVXXOEuvPBCt/LKK0/Bue18WeMQ1zwL96efftrtt99+bvXVV3dDhw7tkIWLzkdVKRYBERABERABERABERABEcgjIEv4PDq6JwIiIAIiIAKdlEDfRRd1k+3gygnvvttJc9B5k43lNFbXd999t/vggw/kd7zFihJf8FkuZlDQf/TRR+7KK690p5xyihTwLVZ2So4IiIAIiIAIiIAIiIAIdFYCsoTvrCWndIuACIiACIhAHoHJk92He+zlph68lpt2qy3zntQ9ERABERABERABERABERABERABERCBBhKQJXwD4SpoERABERABEegwAt27u2k2WN99/+STHZYERSwCIiACIiACIiACIiACIiACIiACIuCclPCqBSIgAiIgAiIwhRKYes013KQvR7sJb78zheZQ2RIBERABERABERABERABERABERCB1icgJXzrl5FSKAIiIAIiIAKFCHTr18/1HjTIjb3n3kLv6yUREAEREAEREAEREAEREAEREAEREIHaCUgJXztDhSACIiACIiACLUmgW69ervf887kfX3nFRT/+2JJpVKJEQAREQAREQAREQAREQAREQAREYEonICX8lF7Cyp8IiIAIiECXJtBv6aXcpG+/dRO/+aZLc1DmRUAEREAEREAEREAEREAEREAERKCjCEgJ31HkFa8IiIAIiIAINIFAnwUXdN2n6uOt4SUiIAIiIAIiIAIiIAIiIAIiIAIiIALNJyAlfPOZK0YREAEREAERaBoBXNL0X311N/bue5yLoqbFq4hEQAREQAREQAREQAREQAREQAREQAT+R0BKeNUEERABERABEZjCCfRfcUX300cfuwnvvT+F51TZEwEREAEREAEREAEREAEREAEREIHWIyAlfOuViVIkAiIgAiIgAnUl0HPmmVzPaQe6Hx57rK7hKjAREAEREAEREAEREAEREAEREAEREIHyBKSEL89IT4iACIiACIhApybQvX9/12fhhd2PL7/iop9+6tR5UeJFQAREQAREQAREQAREQAREQAREoLMRkBK+s5WY0isCIiACIiACBQhMs8H65pLmIzfx448LvK1XREAEREAEREAEREAEREAEREAEREAEihKQEr4oOb0nAiIgAiIgAp2IQO9f/tJNtdBC7qurru5EqVZSRUAEREAEREAEREAEREAEREAERKDzE5ASvvOXoXIgAiIgAiIgAhUR6L/mGm78f1914199raLn9ZAIiIAIiIAIiIAIiIAIiIAIiIAIiEDtBHrWHoRCEAEREAEREAER6AwEplpsUddjumnd2HvvdX0WWrClkzx+/Hg3cuRI99PPPuznmWceN99887V0mosmbujQoW7FFVd066+/ftEgWvK9H374wT1mhwGHMpxrrrncAgss0JJpVaJEQAREQAREQAREQAREQAREoJEEZAnfSLoKWwREQAREQARaiED3vn3djPvs7cY9/YxZw7/aQilrn5TRo0e7Sy+91KGM52/ixIntH5pCrowZM8ahsJ7SJIqitvJ788033YUXXjilZVH5EQEREAEREAEREAEREAEREIGKCMgSviJMekgEREAEREAEpgwCfcwvfN9ll3VfnPNXN9upw12PgQNbNmNzzz2323jjjVs2ffVK2PLLL+9mnHHGegXXMuH079+/zbr/lVde8YsqEhEQAREQAREQAREQAREQARHoigSkhO+Kpa48i4AIiIAIdGkC022zlfv4wIPdN3ZI6wxmGd+Z5KuvvnIff/yx6927t+vVq5ebMGGCw+J6wQX/515n0qRJ7q233vJZ4v6PP/7oZppppnZKbt5BMTx58uTM7BPH/PPP77p3z944yPuvv/66D6NPnz4+PNKEUn3mmWf217Hq/+yzz/x94uX+QrYYcv3117sHH3zQLbroom7UqFHuyiuvdH/4wx8cbluqlbFjxzrYlJNu3bq5X9ohvRIREAEREAEREAEREAEREAEREIHmEZASvnmsFZMIiIAIiIAItASBHtNP72Y+9hj3xR//5L667HI33e+3cd1M4dwZBGU2fsbPOussr9w+7LDD3JxzztmmhMf/+HPPPeeuueYa9/7777vtttvOrbfeeu2U8DfeeKPbfvvt3TrrrONWXnllrzDv0aOHR/DAAw94hfjBBx/sTj755FwlPPGhzMd//V//+le37rrrut/97nduWdttEJTwLBqMGDHCnX322W7TTTd1yy23nFfuk258waNAR2n/i1/8wg0YMKBQMTz//PPumWeecUcddZSbZZZZ3OGHH+569vzfMA/F/3fffeeeeuopd9ttt7l33323HY9CkXaylyjXZ5991s0+++x+waJfv35u66239osjEhEQAREQAREQAREQAREQARFoJAEp4RtJV2GLgAiIgAiIQIsS6GOHnE63/XZu9PkXuOiHcW6G3XZxZl7eoqn9/8nCgnzQoEHu/PPPd4sssojbb7/9vFV8kKmmmsptueWWXrHKIaA8nyZ/+ctf3Omnn+7fj8sLL7zg9tlnH6+8P+2009JeLblGPEOGDPE+3bHC33XXXb2iPS6LLbaYP1SWZ4477ri2Wyjg+Rs2bJhbeuml3QYbbFA2vqwHVl11VYf7nkMOOcQNHjzY7b13+x0OLBhsscUWhRX9WXF3hussUFA2TzzxhJthhhl8kvfcc0//74477tgZsqA0ioAIiIAIiIAIiIAIiIAIdGIC2furO3GmlHQREAEREAEREIHyBPr/ahU306EHu3Evv+w+OWGY+9EsujuDYDmOlTuK67gCPp72d955x80222yp2fnggw+81fnuu+9ecp93sI7Hih0FfTWChTXCwkCajBs3zivJ0wRL+q+//jrtVlXXgnsd0p8mWMYvvvjiXdLy+4wzznD77rtvmwIePiy2nHjiie7TTz9Nw6VrIiACIiACIiACIiACIiACIlA3AlLC1w2lAhIBERABERCBzkeg75JLutlOHua6mwX5Zyef4r6+4ko38YsvnTk3b9nM/Pe///WuaNZaa63UNGKR/uabb7qpp5469T7K9pNOOqlEGY0idpNNNvF+5P/9739X7a7l8ccf90r/LH/u+H7H/Uya5PmlT3s+69qLL77ob+FjPsi3337rvvnmG/8TtzRd0R88+b/lllscuwXigkX8xIkTfXlLREAEREAEREAEREAEREAERKCRBKSEbyRdhS0CIiACIiACnYCA9xF/5OFu1j8c48aZb/FPjjzKfXbqae7Hl15uSWX8P/7xD69AX2ONNVLpYhGOpXvwiZ58CBcwcWU5Vuq4sBkzZow/LDVLeZ8MJ/xGyYtP9t///vdeiZ8mpBk/8GmCb/Lgjz7tfqXXWAiAy8ILL9z2Cu5XUMQjHDC71VZbVRrcFPPck08+6XDFg9/9uFBW8IKRRAREQAREQAREQAREQAREQAQaSUA+4RtJV2GLgAiIgAiIQCch0A2F5MILuVmHn+y+f+RRN+7xJ9znZ57lek47reu3wvKuj/lX72WW3j1nMkWmKXM7Sn788Ud3xx13uFVWWcX17ds3NRkcgpplJc8LcRc2EyZM8G5JOKwUi+gslzGpEf188fbbb/cW1biySRNczXzxxRf+wNQ0md4WQbLc6qQ9n3YNa3qUyRw6+vTTT3urd+JkUeGKK65oe6V///5t/yfN+Knv1q2bbXyY7HmGdKC4R2nP9YEDB6ZF2bBrHCJLXkhfpYLfffKeJrgfIi/kMy5c4+/LL23nh0QEREAEREAEREAEREAEREAEGkhASvgGwlXQIiACIiACItDZCOCWZsDgtdyANVZ3k0wZ+t39D7jv7rzLffuvW113U9R3HzDA9TcFeL9llna95p3HdWuyQv7111/3PrwPOOCAVLQojbFKz7qffOnoo49211xzjbvnnnu8v/QswUoe5Xaacv+GG25ws846q0MRnCYvm899XN0klcDh2ZlmmslxoGwtgiuajz/+2A0fPtxNawsnuOR5+OGHvQV4lmX/qFGj3FlnneVuvvlm7yv90ksv9QfFhp0BcFx//fXdRRddVBdL/Urzx8IIuxlYcKlE4Iqrnywl/Pfff+/ZJ/mHazBi0SJ5v5K49YwIiIAIiIAIiIAIiIAIiIAIVEJASvhKKOkZERABERABEehqBHr0cD3MAnrgJhu7aTZY3/1k1sQT3nnXTTCL8R9fedmNNaW1mSq7nqZ87mkW3ljI9zRlco8ZZ3A9p5ve9TBFcPeB07hudhhoPQULaay1OZQ1Tb766is333zzVXT46J/+9Cf3l7/8xV144YXesj4IymmUurgrQfH+2muvuUsuucStsMIK7ZTwwRVN1oGshPnSSy+5TTfdNC25/tqgQYNc3EI988GcGywEYMm+9957uwG2UILgcue8885rc5GDshnr8rCDYMEFF3Tnn3++X9TA+nyZZZbx7/Hc4MGD/btZPu5zklLzLXYG7L///jWHEwLALRGLMyja48Jv/rCGl4iACIiACIiACIiACIiACIhAIwnUd2bcyJQqbBEQAREQAREQgQ4hgKua3nPP7f/axJSaP5nl9Y8vv+LGm3X6uGefc5PNt3pkClyU85PtXyyLe8w80//c2Mw8s+s1y8xeYd9r5llct75m+Y2LEFP2m5m1/z9W+PZSbh5RimPZPc8886Q+98knn7hll1029V64iEIWNy1Dhw51p556qtthhx3anseC/IgjjnDXXXedv0ZY/GEpnya4OsHdzJJ2wG2WcD/vQNQFzNVPLe5oUJrjogef80EBT1qwKMfXfZDLL7/crbnmmm7eeectSerOO+/sn3vqqacciwkwYYdAPKysvHWG6+xSCAr3eHqpB5Q39UlW8J2hJJVGERABERABERABERABEei8BKSE77xlp5SLgAiIgAiIQMcRMKV5Lzv8lL8B663rD3CdbP7FJ40Z6yL7l/9PtANLJ5m/7Yn8ffa5G//a626SWapPMtcuWMh3M4t2/2eHY3br09vNeuwfvLubPBk9erTjINOZTamfJrfeeqvbeuut0261XcP3+6677uoOOuggd+CBB5Y8++qrr3qr+KxDXZMBjx071luOo0hPE9JbTsGeZdWfFl7aNRYePvzwQ7feeuuV3MaaPwjP4F5ml112aRfEOuus49OPVfwSSyzhDjnkkA5VwGOZf+6553q3OJUICnQWEYIlf/KdwJeyiDOh3MaPH+8XHiQiIAIiIAIiIAIiIAIiIAIi0EgCUsI3kq7CFgEREAEREIGuQgBLdrMo5q+cRKb4nGQHf04yJf3kb8d4Zf1k+92tAr/oHG4aDtRMxnP//ff7g0bzXKigiN5zzz3dxhtv7I499tgSC2iUshxiut9++yWDzvyN//U+toiQprQnLcccc4xXaudJD3YCpAiuY9544w33C1vomGaaaVKe+N+l9957z7EYkKXMxwr8qquucoceemiq6xX80Z9++unut7/9rV+YmHFGO3w3RVBY4+5nNjugNwhhozRHYY5LnazDZ1OCy7yEZToLIVjyVyIo4eeYY47MR1G846//hRdeKGEEM/zOb7DBBpnv6oYIiIAIiIAIiIAIiIAIiIAI1IOAlPD1oKgwREAEREAEREAEKiaA5XtPs2Tnr1rB4pmDVDmgdamllmp7/dlnn/UHkR533HGZrkVwHbPFFlu45Zdf3l188cUlfuOxFEdZ/q75vB82bFjFycK1C77iH3zwQbf99tu3vYdC/+STT3Y77bST91FfRAhzyJAhbrvttnPnnHNOZhC4kUFBTr6Sgq938oNf+8MOOyx52/9GEc3uANzZ/O1vf/MHscbds5AXDm3l8Ff+jw/9ILgH4jrW9BdccIFbddVVvcubWgQl/Lrr2u6KOgl5Ofzww/0htNtuu22bj3xc+Gy44Ybe+l8iAiIgAiIgAiIgAiIgAiIgAo0kICV8I+kqbBEQAREQAREQgboSWH311b0S+IwzznCrrbaaw4r788/N1Y0poVEy57l+QbmMlTc+wk888USfLnyCY9395ptvegUz1uB5YSQzw7P4l0eBzwLA3OY3n3Deeustt8kmm3gFfVHBAh4XKxwUmyYozlGCP/74427FFVd0t912m1+ICPni0Fjc6+CGZd99900Lwh/UipU8Fvu4ZWHh4KOPPvLW90E4oHaPPfbwPuM5yDYI+cS6/rLLLvOHy+Lah4Nha1XCpya0xoubbbaZX7ih3qy00krefQ+LB6eddlrq7oAao9PrIiACIiACIiACIiACIiACIlBCQEp4VQgREAEREAEREIFOReB3v/ud469aQfEelO/Vvpv3PK5iUPDXW/DTfvfdd5covuNxYMXNX1FBiY5rnuHDh3s3MvjJRwn/97//3SvlywnKetzlhANc4YBrnFYUXAYdf/zxJUnDKl4iAiIgAiIgAiIgAiIgAiIgAs0g0L0ZkSgOERABERABERABEejMBPBPjtK62YI7mbgP9nrFjwKdBQms94Mfd/zaH3300d5tC657yglubJKCZb1EBERABERABERABERABERABESglICU8KoRIiACIiACIiACIpBBAJcv+GR/++233RNPPOF23HFH99BDD2U8Xd/LHHp63333uUUXXbSuAZ9wwglu8803d7fffrt3yxLklVdecTfccIM/5HSXXXZx9957b268WL7jb33y5Mn+OdKLxblEBERABERABERABERABERABESglIDc0ahGiIAIiIAIiIAIiEAGgVpdvmQEW9Fl/NXPPvvsbsEFF6zo+Uofwvqdv6TgEx6lf6WCb/2VV17ZffHFF96anoUKDneViIAIiIAIiIAIiIAIiIAIiIAIlBKQJbxqhAiIgAiIgAiIgAi0IAHcwyy33HLe2rwjBUv3O+64w40YMcJbvV8QKwtCAAAgAElEQVRyySU+Od27d/f+6u+55x6/O+DSSy+tyJd8R+ZFcYuACIiACIiACIiACIiACIhARxCQJXxHUFecIiACIiACIiACZQmMHj3avfzyy/65mWaaqc13edkX9UBdCaBsX2eddfwfgtuZIPir32effdz48eO9VTwLB0Hwo//WW285LPpHjRpV1zQpMBEQAREQAREQAREQAREQARHoTASkhO9MpaW0ioAIiIAIiEAXITBgwAB/IOk111zjc7zGGmu4tddeu4vkvvWy2aNHj8xE9erVy/GXFA6Vvemmm9y4ceP8rcGDBycf0W8REAEREAEREAEREAEREAER6BIEupk10/83Z+oSWVYmRUAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKA5BOQTvjmcFYsIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAXJCAlfBcsdGVZBERABERABERABERABERABERABERABERABERABESgOQSkhG8OZ8UiAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiLQBQlICd8FC11ZFgEREAEREAEREAEREAEREAEREAEREAEREAEREAERaA4BKeGbw1mxiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdEECUsJ3wUJXlkVABERABERABERABERABERABERABERABERABERABJpDQEr45nBWLCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAl2QgJTwXbDQlWUREAEREAEREAEREAEREAEREAEREAEREAEREAEREIHmEJASvjmcFYsIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAXJCAlfBcsdGVZBERABERABERABERABERABERABERABERABERABESgOQSkhG8OZ8UiAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiLQBQlICd8FC11ZFgEREAEREAEREAEREAEREAEREAEREAEREAEREAERaA4BKeGbw1mxiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdEECUsJ3wUJXlkVABERABERABERABERABERABERABERABERABERABJpDQEr45nBWLCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAl2QgJTwXbDQlWUREAEREAEREAEREAEREAEREAEREAEREAEREAEREIHmEJASvjmcFYsIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAXJCAlfBcsdGVZBERABERABERABERABERABERABERABERABERABESgOQSkhG8OZ8UiAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiLQBQlICd8FC11ZFgEREAEREAEREAEREAEREAEREAEREAEREAEREAERaA4BKeGbw1mxiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdEECUsJ3wUJXlkVABERABERABERABERABERABERABERABERABERABJpDQEr45nBWLCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAl2QgJTwXbDQlWUREAEREAEREAEREAEREAEREAEREAEREAEREAEREIHmEJASvjmcFYsIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAXJCAlfBcsdGVZBERABERABERABERABERABERABERABERABERABESgOQSkhG8OZ8UiAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiLQBQlICd8FC11ZFgEREAEREAEREAEREAEREAEREAEREAEREAEREAERaA4BKeGbw1mxiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdEECUsJ3wUJXlkVABERABERABERABERABERABERABERABERABERABJpDQEr45nBWLCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAl2QgJTwXbDQlWUREAEREAEREAEREAEREAEREAEREAEREAEREAEREIHmEJASvjmcFYsIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAXJCAlfBcsdGVZBERABERABERABERABERABERABERABERABERABESgOQSkhG8OZ8UiAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiLQBQlICd8FC11ZFgEREAEREAEREAEREAEREAEREAEREAEREAEREAERaA4BKeGbw1mxiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdEECUsJ3wUJXlkVABERABERABERABERABERABERABERABERABERABJpDQEr45nBWLCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAl2QgJTwXbDQlWUREAEREAEREAEREAEREAEREAEREAEREAEREAEREIHmEJASvjmcFYsIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAXJCAlfBcsdGVZBERABERABERABERABERABERABERABERABERABESgOQSkhG8OZ8UiAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiLQBQlICd8FC11ZFgEREAEREAEREAEREAEREAEREAEREAEREAEREAERaA6Bns2JpnPG8s0337iXXnrJffTRR65fv35uvvnmcwsttFBJZrjXp08fN+OMM3bOTDYo1ePGjXN9+/bNDL3c/cwXdUMEjMAbb7zhXnjhBTfddNO5Nddc0/Xo0aMqLqp/VeHSwyIgAjUSmDhxops8ebLr3bt3jSFNea/X2p63MpFyfU25+62ct45K2/jx412vXr1c9+7F7IjEvFjJRVHkfvzxx9yxfbGQ9ZYIiMCUToDxz08//eR1JpJSAnDp1q2b69lTarlWrRs//PCD1wVKRKBeBLrZoCqqV2C1hrPZZpv5BrqIbLnllm7bbbf1r55xxhnujjvu8A09g3QaNrLJH4P3+eef35177rmZ0dx9993uj3/8o3vsscfccsst5xZZZBE/6Hz++efdd9995w4//HC3ySab+LRy/8QTT3QbbbRRZnj1vEH6X3nlFbf00kvXM9jMsO655x530kknuammmsp3DnGW5J8B+f333+/fX2aZZdzo0aP9H5McWPXv39/fe+qpp9yOO+7o73311VduiSWW8NckxQjA8eGHH3brrrtul5oQffLJJ27PPff0C2P77ruv/9bpFB988MFc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FnNH4Q+yl4iACIiACLQmAXZ7aA7QmmUzpadKda9zl3D3zp18pV4EREAEREAEOoYAVvDmm9KZv1PvpiFL2BqHywjzYefMp37WY7ouAiIgAhUTwF0JgqskSeclwHZ8dkrRj4QyxQrefDl7F2YSERABERCB1iRgfrKdnd3jbrvttswE4rKFHU24ZLLzLzKf0w0RqIaA6l41tFrv2R52iOnxrZcspUgEREAEREAEWp+AHXjsz6qwQ968f2Q7WNQn2g6H8r4f7YBox0BpnXXWcXaIVUUWM62fa6VQBESgowjYwaj+DAraExTwbHPnvAKsoqYkX7MdxbfZ8WIB/5///MfZYafODiL05Tpy5Eg3bNiwZidF8YmACIiACFRBAJcgc889t7MDpt1jjz3WNgewAyu9H/mbbrrJ+4rHWt4OePXn10lEoB4EVPfqQbHjwpBP+I5jr5hFQAREQASmEAIcvmSnuPtBN8p43NRwuBlKsY033rguB49NIaiUDREQgRoIPProo2706NH+QF8OhuOgRSztmNynHfpdQ1R6tUkEWLRlwRar+FVWWcVts802dTtktklZUDQiIAIi0GUJMObHfdgzzzzj5wBjxozxh3b+8pe/dBtuuKE/PFwiAo0goLrXCKqND1NK+MYzVgwiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAJdlIB8wnfRgle2RUAEREAEREAEREAEREAEREAEREAEREAEREAEREAEGk9ASvjGM1YMIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACXZSAlPBdtOCVbREQAREQAREQAREQAREQAREQAREQAREQAREQAREQgcYTkBK+8YwVgwiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQBclICV8Fy14ZVsEREAEREAEREAEREAEREAEREAEREAEREAEREAERKDxBKSEbzxjxSACIiACIiACIiACIiACIiACIiACIiACIiACIiACItBFCUgJ30ULXtkWAREQAREQAREQAREQAREQAREQAREQAREQAREQARFoPIGejY9iyo1h3Lhxrm/fvlNuBjtBzj799FP3zDPPuIkTJ7o11ljDDRw4sKVSPX78eNerVy/XvbvWu5IF0+pll0xvJb/VJlRCSc+IgAiIgAiIgAh0dQI//PCD69evX5fFMHnyZPfTTz+5Pn36TPEMOnteNb5vbBWdMGGCnyv37CnVVGNJK3QREIFWINAtMmmFhHSGNDz11FNuxx13dKNHj3ZfffWVW2KJJRzXOlIefPBBN/3007vFFlusI5PR9LgZtB5zzDHu6quvdkcccYR75JFH3H333edGjhzpFlhggaanJx7hqquu6t577z1fR77//ns3atQoN88883RomrIi74j608pll8Up6zr1bffdd/dlTbuw7LLLusceeyzrcV0XgS5BgG/h4Ycfduuuu26nW6hmIjhixAi3wgoruFlmmaVLlFelmezM5RrP40033eQuv/zySrNd8lyPHj3cBRdc0JC6ceWVV7qLLrrIL9zzhzICAwP+6DfXWWcdP+5BrrnmGnfeeeeVPDtp0iT/XPLZQhnVSyJQhsAbb7zh3n//fTd48GDXrVu3Mk//7zZjJQxmaEv4C3W2openkIf4bs8880yf/2+++cYdfPDB7o9//OMUkrvSbAwfPtxddtllbXkdNmxYWxvW6hnW+L7xJbTpppu65557zs+hxo4d6+fwq6yySruIO2Ku2i4RTbrQ2cegzS6rIv1Qo4sSA8xXXnnFLb300qlR3Xzzze70009PvZe8OMMMM7i5557bbbTRRm7NNdd0jEElUwgBlPCSygjYxCb66KOPoqFDh7Jw8f/YOxO43abqj+8mZSxFUYhK6RqSSoaoRJKI0pWrwawuiVBEqGQohCgRZQ4ZMySiQUUDKUWjZqVZKo3nv76r9vPfz372mc95nud971qfz/u59zlnnz389t5rrb322mtnYnCr9mFPqcQArfXg7zvf+U5PpUxntvvuu28mO+bZ7bffrhUURqc4HH744ROv8G9+85vss5/9bCanJLROYoSfeJ1SFZjU+JnmvkvhVPRMlKXs5z//eXbggQdqX6+zzjpFye2dIbBAICAboToftt122xnX3l133VXr/oQnPCFD5hv9PwIzuV/DfrzvvvtUZ7rwwgsHOhT9/s1vfjO76667Bn933nlndsstt2RXXnllNn/+/OwRj3iEpofn90EPPPBAhv7wjW98I1t55ZW1rMUXXzwTw0QmJ8cy8RoeFJtKu9hii2Wy+TWSto+6Wp4LNgJifM/EGKBjVIzKlcEQb2gdn+edd55+KxtNlb+dLQnFOSf74Q9/mG2++eaKwX777TdbmjbSjvvvvz/77ne/mz3/+c/X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AoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAITDdCJgRfrr7x2pnCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAITCDETAj/AzuPKu6IWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChsB0I2BG+Ib9k2WZe+CBBxp+bZ9NAwL//Oc/3b/+9a9pqIr7z3/+4/7+979PRV3GVQnm0N/+9rdxFWflLEAI2LhagDr7f021Ph/t82mScaO1syezEYEFUZeZjf1obTIEDAFDwBAwBAwBQ8AQ6AcBM8LXwPX88893q6yyilt66aXdwx72MLfrrrvW+LpZUgwLN998s7vlllvcfffd1ywT+2qAwGte8xq30koruSWWWMIttNBC7jOf+UxtdH73u9+5yy67rLUB+fjjj3dPfepT3WMe8xgdT4cddljtulT94Hvf+567/vrrHYbvSdJ1113nnv70p7vHPe5xiv+WW245yepY2SUI/OMf/3BXXHGF+/Wvf12ScrKv4ZPPeMYz3HLLLecWXnhht8giizTa1Opqbk8WjQWj9H//+99uzTXXdMsvv7z2N39/+ctfZnTjP/e5z7lvfetbrdrQhYxrVQH7WBH4wQ9+UKiz3XHHHbMGqSOOOMKtvPLK7tGPfrR76EMf6o455phO2gY/vvHGG3VOIIuM+kXg6KOPdvfcc0+/hVjuhoAhYAgYAoaAIWAILOAImBG+xgDYeuut3bXXXus222wzhwGgT8Lotc0226iR8pxzznEHHnigW2aZZdzaa6/tbrrppj6LntV5n3TSSe7SSy9VI3xTWn/99R1jYccdd2yahX632267uWuuucY95znPUU/4vuhnP/uZmzNnjttkk03chz/84b6KqZTv85//fIchft68eVNzCqFSxRfQRHvuuad7+ctf7p71rGdNdX9heP/0pz/tTj755FYnlLqa2wvocBlrsx/ykIdon59yyimt+nyslS4o7LzzznMveMEL3BprrOHuvPPOgpTFr7qQccUl2NsqCLzrXe9ySy21lNt4443dvvvu6zBwHnrooW6HHXbQjaNddtmldz2ySj27SPPmN7/ZXXXVVTp2u9jov/XWWx28GB3poosucq9//evd4osv7ubOnet+8pOfdFFlyyNC4OMf/7g74IADHA4bRoaAIWAIGAKGgCFgCBgC/SFgRvga2D7iEY9wT3ziE3v33sVoisH0bW97mxosWVTfcMMN7vbbb1eP1A022MC9//3vr1FzS+oReNSjHqXek89+9rMbgcLmi/e2/POf/9woD/8RnptPfvKT3Ute8pJW+ZR9/Ne//nWw2C+qM4uw0047rSy7Vu/xfsdb+ZWvfGWrfOzjfAS67Mf7779fC8LTfNKhmzbaaKP8RssbTlewYfDIRz6yMF3eyy7ndl4Z9rxbBB772Me6zTffXE8TzXTyc412hP+P27XXXnu5b3/72/Hjwe+2Mi43Y3tRCwGM0YQD4rTdcccdpwZODPNnnnmmW3fddVW3YyNpNtCiiy6qp/rYcGhLV155pXvLW97iLrnkEnfxxRe7D37wgw6jPMZ4TmVxGvXLX/5y22Ls+wAB1hVsuBsZAoaAIWAIGAKGgCFgCPSPwEP7L2L2lUDokD5p5513Vo9lPKRD4rjvueeeq0b4t771rbqQW2eddfqsyqzNu2kfeu9LTkRsu+22neDTtC5VC3/a056mHqM//vGPHaEK8ui73/2uw4AzDuq7zeNow7SW0WU/nnjiie65z32u4wQDm5CTIgzkVcN0NB1bfcztSeG1oJVLCIyZTnhIs0nJhkIs+8O2MQ+qbIg1nQczHcdpqj99yib4D3/4Qw1juOqqq7pXv/rVjZ0Apqltqbq0HXO///3v9dTnF7/4xZHTipwKPfjgg9073vEO1b1wSllyySVT1bBnNRF405veNGs2hGo23ZIbAoaAIWAIGAKGgCEwdgRm/sp17JD1W+DPf/5zjQGP9xQxjvGWDul5z3ueW2211RzxRDHUmxG+3/5I5U5Mc/5mEnGyooy63FgoK8ve94dAl/1IOAVCDUya4IdVDI9t6zkT53bbNtv304EABniMtkX0pz/9SfUDo5mBAN7FhPIyqobA1VdfrXd5cOfO6173upGP3vCGN7hDDjnEcVoUr3jC1Bi1QwDHHuQemN57773tMrOvDQFDwBAwBAwBQ8AQMARKEbBwNKUQjTfBN77xDUfIELx9OH6botVXX10ff+UrX0m9tmeGQG0EvvrVr9oR79qoTd8Hs7UfP/CBD0wf2FYjQ2DMCJx66qmzIv79mGGz4mYIAui/3//+99W4noqry7cPAAAgAElEQVT9zqYwdyNBpv+279Rf/epX7vTTT9cTBkaGgCFgCBgChoAhYAgYAuNBYCqN8Pfdd5/GPvfEcV6UxTz64x//6G655RaNm/6LX/wiL9nQ83/84x/unnvuUa8bT8TvxBO9z0syyyrHceXFFlvMcax3rbXWSib3l8KCS0x4ynGkN0XgRJu7uDgrlf9Mf0asd7yBqvQ/MXvBsox+9KMfaexXLtOtkt7nx1j86U9/OjQ+y8oqek+f/+EPf0iODcIbEEu7T2Ke/fKXv6xdBH3BwvxTn/qU+9rXvqYxdqsS337nO99xX/jCF3Rjq4ioH2nxIueYO3j5+VL0XdE75mLsWcZv+FtVqtP+vvrxgQceUL6Yxze6aGceHpS93377OeIEtyF4YihTivIqm9v0IWPqc5/7nPvtb3+rWTF22hLj7bOf/awaofKwblsG35M3l+/Bl5hbxPuvQql+Ri7/7ne/S37O2GXcpORU/IHnD+H8ph/ApEuiPugJRfpEl+XVzYvTHoyvGDP67MILL3Rvf/vb62Y5lL6OjKtSkOkbVVDqL00T3ZexxTwIiblWlT+G39H/efO/SavXXntt/WyFFVZwyy67bDKLIv2XeZ3Hz9C/8nTjZEELwENOahx77LG63jAyBAwBQ8AQMAQMAUPAEBgPAlMTjuauu+5yL3rRi9SogYGcyyovv/xyDYXAovT666/XuMSXXnrpIHYhBhouKUPxJizLwgsv7A477DBduB9//PEudZEfcSUxnnhDGEYIQr7w3YMe9CCNyXrNNdfoxagnnHBCrZiTXJZ69tlnu4c//OFaRxYLxK7ce++9K/fmSiutpBsJLMYf/ehHJ7/zsZEJSxPSRz7yETVWscDiAtnzzz9flWvC1oAlixqwBGsu4HzhC1+YzH9aHu6xxx7qnQ2eD37wg9UAS+zfL33pS27rrbdWgznvIIw422+/vdtnn30Udy5epV/pU37T78QaTRF4HHrooWqcYgMkr//vvvtujcf/m9/8RscoZeB5nKLbbrvN7bLLLtqPjGXGJpeyUQbejPRzihiXXMiLwfrxj3+8hiXi8kG+mTNnTuqTwmeMAcYfC2VwwKD5vve9b/ANpyoIbeTpiCOOcKeccsrgN5iljoUXFvq/l5THPOSCNcYjF2ZirCSk0otf/OLSLM466yx39NFH690HXKaLgZJwDeAKX6BvU0TfHHTQQcor5s2bp+XSDtKfc845WhdPLNjpezZLmPN42vHdO9/5TnfnnXe6XXfdVS+Jq0rUcbvttlM+Rt9vtdVWg8vl4GHMQYz88Cz4yxZbbJGbdZ3299GPxKVmbvhLIvmXC/igLtuZBwDtnz9//uAiZOZGGAZq8cUXL/WGhB8ynplDGIyo9/77769/4aWIVeY2cYqRE+uvv77Wg/ownujLz3/+85p/E4KH7Lbbbnph8aabbqq8mst1ucgxDAXEWGTsIKPgI4wvxrQPT8JlncxVH7sfngjPAEdP3A1x+OGH6wYvd4yw6XTGGWc47iHh9NUSSywx1IRUPzOfkXUYszGWwT/wWj3qqKN07DPvmX/MH9oEbtDJJ5+s2IW0xhprOLD3Y4wNCPIlHAX9y/0GyHnmEdg3vZcAucw8h++w0Q0/ZeMeL9CUnjBUyehHH3IJPYaxhO5C3zJuuXAWol+58DLcOACPEAt4FhdW5lFVGZf3fer5bNM3Um3s4hl84sYbb9R5wuXR6623XiNZHtalru6L4Z3xge7Ct9z9wqY8G3FcfMo9BPzO449h2YxRPKfRnbmMFT6EwwCyue3m4dy5c1XHQveFz8WE/uo3tmP9Fx6KjgjWu++++/+1d/YstxZXAz5v/sEpLIIoYpQUCmJjEVCSJqBYSKKlBE+naJqopY2IJIhFMESwMEIUlKRRIlqHNIIpkpQW+QUh/2CyrnlZm3vPnvtjfz3nfva5Fjycs++PuWeu+V6zZk3t82mT33rrrVqHaKuo84zxGBfdfffdbfB31G/aRBg++uijd1S6TawEJCABCUhAAhK47QRi0LwaiYlC+fDDD0tAKaG4LDGoLqE0KDHortf4i4nMJr7PP/98CeVcvZ8S1nclFBH1WcJqJQbpJSb9JRRx9ZlPP/20PPvssyWsZDaPxgS43iP8noSCoN6PQy63boe1bYlJVglFcQmlRgnlSokJTy+Ig6+FErOEQrp+/y9/+csmHNIUiun6OyZW9X4oMEts6y2h/ChwSXniiSdKKCZLKCAPjsdVvBjKnBJKmBIKtJqeUE6XsOSrnw5FawllfAlFRAlFVPn73/9eyNuUUAqVUPCUUCqVsCDcvJf3yXPCDEVo5bY0/2EWiuX6bijhuxhC6VdiAlnCymgrTqFoKqGALqGA38qP9957r4YXyvISFuklLL434cakuabxvvvuKzHZ7X5v6iL5HpPrEofB1W+EEr77ePharfdJ2ykE/qHELT/4wQ9KKLi3ggzlTU0P3wvl0s7nyMfnnnuuhNKghHXe1v1Qbtd8DcVZgWcrYelWwgdvCSVpiYWHzW3YEWZM7rfiE0re2s60wrsPPPBAeeedd9pbs7+JVyxm1PSFsqzEwlAJBdvmPcp1HHZay20oHXfCOyb9p8xH6lgoLUooq2taWt7HpnMn4SMXQvlYvx+Ko5Enti/HQkp9/g9/+ENlH8rozQOUf+6F8nUnrKm6Tfvalp0MgDYkFDs74S25QF2IhdISirCtx7/99tvaj9AmpFBu6OtCCVzTwF8o/7fuv/DCC/X6z372s0I/Rn1Ioe+IxcBC+zQU+lTamFDIFPqwVtp8joWBEgqczWO0MdRj+iXKSyjoSijSN/fhSpsXCzgllHVbwVPWaePJW+L94x//uPZXpDWF/iwWVEsoz8t3333XRq/+DhcV3TLKvVu3btX3h+0q18k3yvaf//znbphjF8/RLxFmLJ6XWBip6SDvekKbyP1QgPZub107tI+bDTgeuC7jDcpW7KI6+i8OVl2CZesZxoexmFueeuqp8u6775ZYLKv5SjkOg4Gd9nSfDxwy9mUsGkr22u9Q38Ld4V7tI/ELo4ASC8klFogK4/UU+lfGvLHoVstnLPTtk5zFz9J2ET7jujBU2Lz3ySef1PEuEguA9RnGx8wjhm0R40fawFjsXPzNczxIXsDy2LJJ2obj3qVxhR1tLX18ShgyVW6UEUUCEpCABCQgAQlI4HwEsFxZlaBkYyB4//33l1deeWUTt1/96lclLAG3lJepbAlLl600oFAljLDuGR2gohzjGSZEKHmGEpZLdaKCIpX/tzKmhA9L16rcD9cj7Ssn+x2WvTXeTLCHElaCdUCPhBVlfSasxEtYwe98G6Uj95kUTgnvooRc8jemNJgKf+m92IJf44vyp5VUOvWUErwXFpvtK/V3KijCOmrv/A+rqhqfnhI+dilUpRoK3OEEh2+G1Wl9j7/hBDKV8CjyWHRqBaUy72T+tveX/EaxRRhXoYRnQh7WflXB9e9//7sbvVRS95Twb7/9do1rWLR130URx/1h+5AP0kZwr8eRuKDYZGEKQfHFhLxVgGZYTOoPUcLzPuWReKAcRCnQCu0Z98Paub1Vjkn/KZXwGbG77rqrxrVVwh+bzp2Ej1w4VAmPAma4+EjwX3zxRU0LCoeejNVtyisLrG14hEE9D6vKXnCT11DsUf6oKz2hLFNew3XMzm0WlEhHW7ZYnIodNzvPcyHbGRTu7YJeWI7W8MbayyzPpLP9JmGHz/76Pv32UEGfEclySRx6wsIa74/Vt7Dmr/dhNVTQZ1hjSvg4dLC+R1/QCuH88Ic/rAuFhyiyztEvZb6O9aeHKOEP6eNaVu3vc4w3+AYLESyc0T+zkBQ7CWtbzkIOxhX7CovalI1j/8YMMqbiQ3z5fttushhGvaYN6pXlqTDz3jFjXxTwtAGxC2unPZtqH2OHZl2IZIG7HdtkvGKnSa1v51DCs5iai/dtO4JSPazeazSyrbl582Y1zmglrPfrguAUexYvWThZMvblmdih1H5m8jdjG9rSY8slYbBgu69Qt2K35tZrKuH3pejzEpCABCQgAQlI4DACq/MJj7sRBPcQuBdJiYFu3UI+dEGBP0O2Uj799NOb5/gPBzex7RcXHOmzd+uB+JHfwdUFzw6FbfBso8etxVI/mWF1eePNN9+s7knaLffttw/9HROkG2HxcyMs2W989NFHW8HgViAsW+o1XBYg+Plmi24r6Q90zJ1HPh/KieoaBxcmuGhhOzPbV/nDzcE999xTXTLg3oAtzeeSmADXoHHRwNbnoeTW5KHLhbyPKxvcLEwJ7gn2zf+hG4s2bFwVhEKnurto/WySby+++GItJz1/p5RbXKK0km5ocL9zqEzF+dAwx97DVQUug5588skt1y/D54duRYbXQ1FeXcGE4reW855QLnFjERPxLXdAlHtcJOBSBtdWreCGBhcc1CHKUUzC6/Z5wuG7rRDGWDzbZ9vf2b7gQoI8b2UsT49Jf/uNU/2eKjuHpvNUcZsKJyxRd1wWjXHPcMbSSlmhL6AfoswMhXrea2en4sY92lXcIcUule6juCChnFJeW4ldXrUdxn0U7muQUBrdwC0RbmV6glusWNCrLn7adOLuCcFtSU8yn+kPQsm18wj1FaE9Hvbb+WDeHzsXAndjCK6qeoJbKVx40a7gQmaJ0A6nK6keY76JK5pYDNm4zFkSbj5zjn6pzZd94jP27CF93FhYef0c4w36d5hSfjiUPnYoVFdJYdFcx3nZ18/FbXgft0b4Aj/2rze+mIsH7udwE5QuvPJ5+pRYZKhupJaW5fZbx459cUmDq8R2DDjVPtLG4VOdMVU7thmmrY3rqX7jXob+kXaTcVYK43zOn0hXWjn+xQ1Nz9UKbRjPZ5vTix/pY5yBux6+h7sd3Fjl+JexMGM4ztZgrEd92EcYqzMOP7ZcEsbY2VFj8WHuwPgp2/yx57wuAQlIQAISkIAEJHAeAqtTwmcyGQSjMJgSfLyGpUsdUCIoLJjk46syfYXPHRqV77bfyfeZyE8JChl89+Ijk8MjU9kw9c4h9/CVi89NFPxMSvF3PhQUnxnn9BHc80VPfDngksn+lA9ZwkYJiV9yBB+b+KjFZzF/KFjx34nCFF/A5/SvSTzxT40SDJ/GKUzK8XVKHMPisSpVU5gcMUliQWVKjs3/YdjEhQNYkd5CDD58WaygrPTklHHphX9V11KxgBJxTNrJfz6HP2gUBEwspybJTCApy8PJL2c9cA1Fwti7TKyp00zmaWNQROCnHuU88cWXNUpNfMnS/oQrgbEkLLqOb9te3RhrX45J/6IInemhfdN5pmhsBdurT2Pc5+Lz85//vPrgfv311+vCUuzAqT7OU+HzxhtvzAWxcx//y0jr2zgfpKwitP2toNhDwYhvZ/zA//73v6/npnDI3pgQHm3/8BnKOeHjKxqZ6y/JZxaoW0klPcx7dTuVy+0iahvO2G/ep99B6GeXCD7p6TOm+ropxnPfOGe/NPftfe736gHvH1oXePfU4w3KJT7/UVoPx32Mc1hcok/gTKDrJLQTvbpAGhjPIKTtEDnX2HesTKAs/vLLL2tUD+nXD0nj8J0//elPtcxxRsbwTBueoS1kcRThHAzO4+EaZ8e0Ql/P4cQo1KcEv/GcI5TtGuMCFjFz/MtYmIVBzltiDNHr46fCv133WIDAYOjYA55vV/z9rgQkIAEJSEACErgEAv9vdr7ClDDZzwHwVPSwdOegOA4yQ7HGxJg/BuPI3KSf70wJFjNjEtuMq0UTCwEMblE+Di10xt7b9zrWtAz+sRLEWoxDPlsJH9P1EpNVLMCZvHJwaCssUKC8ZgdAewhf+yy/Y9tsvTxmlcw9LLuGh8b1wjn2GoomdhlwmFQqRjlcC8s5rDd/85vfVIVs3sNyLS0Vp759TP634f7jH/+oFlYIVu37yinjsu+3T/U8Cm4OU0TaHQZLvkFdQpgET0nez+d5lrKNhL/iekBkT2hT2CGShxpiBY+SDstiDsHlD+EwVywZw+XNqCKlF357bd88PSb97bev8ve+6byKuE3Faapd78WNNg4FIbsa6GdQZPCHoJRCIc8hhUsFy0oOQkRQKrHLqxXiyC6vMUtHFMhYyaMQot9h99gSS2oOkf3888+r0h5G9Jd5qOyx/eUUc9K3L/chk1SYD+t8y2z4O9sD6vzY4dK0VzDm0MZD5Fz90iFxGXvnHHly6vEGFu8s+tPutsKCKhbNudOvvX8df+fB7CyAsRumN6abS9c5x75tPeVg09wBdEi/PpeWqfu0V4zl2EGIMrwV+vJcaGLsyxiYHYU9a/1ctO/tOGzDxajjr3/9a13U52DvMaFvuC5KePqJOPeny2YsfV6XgAQkIAEJSEACEjgtgdUq4XsD6DbpKN/Db261BkSREQdsbhRmbGde6kqmDXfpb6yyUQozqMUyN/w8V0X5I488sjSI2ef++9//VgU8yuU4SG5WycJ2/alJCFu8EVjNCZMQLLuZZAwnXoSP9T/pRrA6OmWae/HCnQCuBbBSxgUOCwjkMdZZKLRQwqN4hxOTRRRMWOlfpQx3TWAVH2cSXOXnV/Mt6i6unOJMhb3jxMIWMtzV0AsklQRxkOTmdn6PCTkLNEsEZT6LZ3Hob11wYhIfh0vWhR2s7ojPVVqNHZP+Jen1mcMJYAmJdTW7FWhnv/nmm1peaGt+8pOf1EWgpTuhhnWDxZ7egumSmLKYigI53TRgMTomtJsos1DA41KGtjN3OsUB5V23N2Nh3Y7ruShPn7hEkjHvLW0PloQ7fOY69Ev7pmmf50813oiDvKtboDGFNDtRDq0j+6TnVM+yYyZ8ddedb3HuwE6wWTbp5xi/9J7ZeWlw4arHvsPx+CH9+lRapu7RpmLowiLlEqMK2mZkbMFmn/Evi320me0ODCztafvZHYowNs4Fwqm03O579A3seGLXCX+tpLsndtrGuTv1NsyvMr/bOPlbAhKQgAQkIAEJXCKB1Srh52D/7W9/q9tAUcbitzEOhJt75eT32e4aBxzVcLGKZPsqcWLy1foBPeTjTEjj8KzqMxh/mK3wLZQnQ8FqCGknDvkMz7NFGlcyCN9AYdqzQCMdTEJaH79soR4q5dk+Puc6aBjHQ/6Pn29c4KBAYjIRh0hVn/TkP+4csBZFQY+Chokb7mCWWIUeEpexd7DWw2oPBTEWbsTvugvlCDcvS4XJOn6pKTtp6bv0XZ5D0YLPUsrdlOT9oWImy+CcS40Ml3KPBSYKSayY+cuJNZN56giLe9S9MbcCU3E85N4x6Z/63r75OBXWWu798Y9/rAuOPbcDp44jrl9oY1B4s9CXO26wII+DJOtOCuLD/5cIO2VQgOM+bWl5bcOlncHvfRyKWheSUDCxGIkCsCf0I5ztgZsyXDtcN8kdNkt3HGR7gPsJdsalq41TpnsN/RJKXFycHeK3/FgWpxpvPPPMM/VchTjQ/MatW7dq/85fLmS3Y5Cl8cbFDVbcxwruY8bqVRs2bUK6TMFQoOd+LhePKZNpFd+GM/b7dox9GdvQB2LgQL8+t7tiLO77XEcRzOILu31aFzicj/Pb3/52xzXNVHmknrBoxFwh3QGheKYO99zX5S7QoUKfdoQzN4YW+Tlm2Cdt7JrkPI85Y4O5MFlgZIcA9WZO6LuYo4ydk5VnRVF+85n2/JO5b3hfAhKQgAQkIAEJSGCewLVVwuPXlq3zv/jFL7oK+HagyUA6ffDOY1n2xHDgjrIc5QbW4Wz5TFcFy0LafYq0oQREcdJzcYPipqe8yUkIlpmtMAFhYgML/JUiH3zwQZ3o9ia5yQslLNt3UVryPoojwrpqYes/Snh2H+DzfehigP/Dn0kv1qm//OUvrzp61YUKih/c5jDJ4tC/nhB3dmk8/vjjvdu35VpambaTrnTrtE+kKF8o4dlFMXYwbrvdPcPH7RGTfd6fUpyl7/1hOUfRTDpgP/Uull4oeBCs3NlN0y7YkHdYx6N4YfKe9WUfDoc8e0z6+d4p8/GQ+J/jnak0teX1HN8nTNwU4eaoVbKzeIlfYFzVUO72Edxv0JbRXqS/8/Z9dtRgsY41aCuUTco87lQoNyzgUJ75t217iBsKeOoW/qRbSZ/weR1LW5QyV92OjuUn13ENgfQOWW3Tw28UU9RbrKxhPHboK8p9FIvZJvTCmrp2lf1Sry6wA+tYZd5U+qbunWq8QRtMGjhfhoPeEcoqecZh20sXXtq4sovvFGz2sVSnTWCRjW/jN7wn7KhB2EG4r6Xx7Rj7YuzAImT262OW32P9eo/B1DXGmM8991xtH3/0ox/tPEp9bg1H6PPZxYYrxscee2znHRZJaUeG40bci7HDtHfORY5/uc84mcU8fMozNqe9P0ZQ/FM+5tx/zX0Do4elCyIw6XHJb1DvGONTZseMeObi430JSEACEpCABCQggXkCq1PC5yR8bDKeSUor255yjG3NqYQfO1h17jtT3x9799e//nV1VYAlLwqWJdtne1lE+BzCihKBSWge/sezTHJQzHz22Wc7B6sygOZQVqzw09JnGD4KbASLcoTvoGzJA7eGz/L/tARiMpJuFuCOD+GlW8NR+GAlivUQE+1jBGUTrodYFEBplJN1wsQH+KuvvloVYliX4R5oSsbyMN85JP95lwMSUeawWwALqZ6vVw5xxHVR+62xb45dn0pfe28uvUwIkeHCDmVtiVuo9lvkNTsusB6GR/pfHz7Hdm6knbTjSgY3MCxmcc4DlnCtsJUaxTiT9J/+9Keb2yhqcJNEucAy+KWXXmpfvfGf//ynsme3BJNqyjM7K9hV0gqWY5SldNnR3p/6Pcd7LE+PST/xOWU+Zvqm0jJ1j/fH0jnFrr3HIiHtD3k3XFxBUdNrh6biNBefqXdRBlI2W6tJ6ghKt313Y2EtS9uLqwXarl49wbK9d7g0ZxmwIJoHEqIkQzGEr26U1CjLhjtxsr9EcUUb2grKKyT7SxSXqfDl+hSXfe63321/s0DZU4Zj5Y9FM+njnIZWevFDiUuesYCM1eyYEp6dMHA+VK6yX6J+/+tf/9pqp6kHPSVij8kwjXN1YY7Hqccb5AN/LHax4IKbJ6ygWaxmTDd3TkgvvrTrvba99+wprzH+o/8ZaxPSLcohBzqfc+w7VSZwrYNCnHOJMH5phXfTzUnbr7fPTv0mfdQpFgAZyw7Hv7RLWGrT/rX9O4p5dkYxJuiNW9rxL4fNUoZ7dQflOAv97LJk50EKLihZBOmFP5Wm9h5jit5iaPvcVf6eay/Y3YmCnr6Y8tsb215lfP2WBCQgAQlIQAISuK4Evre2iLPNFMGtSE42enFM5RzK6KE1Cf/HgpU/hIk7ritaxUNuvcx/h9/ARUsq8ZngtpJxbN/FognlOcLW6hz0t+/P/UbR8/HHH298zaNQzj+skVAmoFRIhVuGxwSIuHO/N0nIa6mMIAw4YjnUSk5COJRq6OcYjkzEhuEzGepN3lDoYNkGr9dee61OeI4RFKJMqPkWE62hkoiDs7AmRfnE1vY5OSb/813KSGtlhyU8kzTKDWWA/BgKSiGUisNFkrHylO/l/V5ZnEtn3s84j52TgOUs5RfFd06gKb9LDjBr44CiL10j4K6ptaZHQU/5RlCuMHEeyttvv119bMOvPYSRA5CpY9QDFPytsADAIhPnB7T1j8k7rg5YLBsqPCmbKP+GQvknDYTTq0vtd9vfmWcsarTp49m8z4HGbd05Jv2nzEfiiY/69MHdKzvHpLNlNvUbf+zUNXYxIJRRFjxbxSptfboqattn3sv4kq7heQL57am6jRVk72BAdt6Qj/suMuLSizJGuWQnFYtCQ/niiy+qMpL+IAX3CfxGEd3udnrooYfqYiQLlITHuQYptNksFJCXWMQPhcVWlF0saPMObP/5z39uDjvk2aX5TP3sSXKdO8AbpSQLyUNBuUYfg9sO2o1hu89zwzLa5jluLDgbBKVRe7YD6cRdCW12b9G6l47etXP0S726xrepBwiu11JIG4fztnJMH9eG1ft9qvFGW+7JZ6yVqRv0FZR56th1EhbHWFjr9dn0W4xLWXDo5dtcOo8Z+x7TPmJFTd+J+0dcoAyFtpldQiygILSVhwhlAVdf+F2nrx6Offk/dZU+jjarHf9O7cogLvTjKI4ZO9Dnshg/tgjCOJL+gR1GQ2Gxc7jLiLaH8cN1F8opxj0IY7KesPhCnaf/2MdFYS8sr0lAAhKQgAQkIIE7mkAMRlchsT23hMK3hDK1xPbK+hfK3xJW1yWsirtx5HooMkpYQ9Zn3nrrrRID+BKKixLKzxJbfUsoFksM3kso82oYYT1bYpJXQplcv3Hz5s36jZgY1fvhz7rcfffd9Tr3Q2Fa4xXW4CUs3OuzeY8wwlq9hFKkvhsD0xIK7RID9fpuWDDWNMSgtt5fIl9//XWJArnoLyzFtoJ8//3363thJdT9VFgP17TFFtz6F4qc7nNcjElvDSsmijvPxIRrcw3WL7/88s4zeSEmKCW23pb77ruvhOXm6HNLb4QbnBqvmKTtvBILMiXcipRQPuzcywvH5D/fpiyQniw7YUXVZRSW3iUmjOXBBx8sYdFVQjlcQqFdwkp7E7ewvixhvb0pi5Sn2OZdYvJZn+FffmdZ5d/YFl94b6nEVur6zjAMwgxf6DtBhIKrlu3YilzC1UWJRY0SSrud55ZeCMVdCSVDCevuEhbqNe38jslvCeXKpoyHhWNlM5RQkNVyTF0lHqH8LLG4Un/HQZYlFngmoxE7Igp5E8rH+i5lNCbUtR6nhIK81tc4tLF+/4UXXqjfDF+tJaxxS0zQSywgTH6nvUn4lBHajSwj1DnaFYR2pm1DqBuUy6Eck/5T5GMsQtR0hMXepr2jbQ4FRo3mqdK5leiJH6E8KqFQrUypT7Tz4apg80Yob2p8v//972/iS9vLtVCo1D/+z7XMF57lGu/O1W3ayk9rdRIAAAmvSURBVHAPVssG8aBs0N7GQlGJw1Fr+IdKuEup9YLyGrunavkO370ldtKUUIxsgqX8Uleoo6E0r31bWHNu7sfujxKLSyUWwWoaaaeo66QNCQVZjTtlnvRQ1mlj+H8skJZQetb2k/IaSu/6zlw+046EMmyrT6Q8x+JbfZ92L9s46kT2mbQBQ6GPpl0PBU8JS/7Kmj49fN6XWDwooeCr+TSUsTJKnsai2tazoaCr7RBxpfyEQr62c2N95dbLC34c2y+RzrCarnzgRB7TbofV+87XYUE+8w7lj758KMf0cTsfm7hwivFGLPbUvBgTymUsupRYiBl7ZLXXY7dViYWy2maENXUt24ynqMO/+93vCm38obLv2PfY9nEYT9JCXQq3cyUWjAtjvLD8L7Q/4RJw06/T/lD/95E4f2XR2Jd2Kha3t4Km3YhdSiVcb3U/GQu4td1k/ET7Gu5pus9xkXTRHoXieeeZ4fiXtjp20u08c10u0HYwHskx7bCNph0dSiys1P6SfigWH65LEo2nBCQgAQlIQAISWB2B/yNG13kVAgsctmdjYccWT6xj0lIOSzfcVoRS4SBr1uvGBYtjLHhCKTR6kCSWRrgegBVuZcYEC3YOpGQ7ONaVPcFyBt+RocScPRgKi2J8GGONeaxgHY01UyvkN76P51zRtO+d8zeWZ1h14XMc/6891xLn/P6+YWPZBd+0GGt9pe8bHs9TLnH/ws4IDm3FUp76itUtuwLyb+zgRKxreTZ9PO8TByy8eJd2IZSuW6/S9OHSIxZK6nX89GLxS93g2lh89vn+KZ49JP3nyMdTpOXYMPDfTZtOXWL3y1UJFp64LcCaEst1+hzKM23oKdo00sFOIdovyiVt2CE7MJbwwLKYOkHfifX8kCO7z4jH8ODtJWEe+wwHP9JGYAWPyxl44/4A63zcTJ3qYGTyju+QZ6cMl/RfZb9E+0kZhE+2X8fmwb7vn2K8waHCpAM3cj3BJQguMCgPp+iLet845zV2QbFjh90c1Cssudm9c4q263aPfdlVw9gG63D6dXbSYQFPG5J9eiwGXlm+sQOIekFcxiTrDe1eOx4YvsOOkzCIuUHfO+aOjr6InZmMua9j2Rxj5HUJSEACEpCABCQggfMSuPZK+PPiuXNDR7nO9l6Ukj2fmSiLOAg1LPeqX/k54ZBZXAcpEpCABCQggSGBVgkvnTuDAAcOM85g8aX1n86BurgWi90W3XMC7gxCpvKqCeCGBgU9fywEtsIi6VdffVXdCeHS5qoPr27j428JSEACEpCABCQggetFYHUHs14vfJcXWyYWHITFpJgDCMNFx2ZnAZMPJigcaIVlGtaJw0Orxmhgjdz68R171usSkIAEJCABCVw2AcYTWBFzhgo+4LFO5qBlrmNhjVU1O/HWtLPtsnPkzk4dB39TDtkdx45RznPhnKE8iJudljzDTix2E2Htj996RQISkIAEJCABCUhAAvsQ0BJ+H1o+exABFPkcJNhzIXNQgL4kAQlIQAIXQwC3Prh3CB/01cWZcvkEUGqiaH/44YdrYjmslEMhORSbnREc0KpIQAISkIAEJCABCUhAAhK4JAIq4S8pN1eYFny9xkGpN958880Vxs4oSUACEpDA7SIQByBWxSsuR7CAxmc21qecQ5LK2dsVN78rAQlIQAISkIAEJCABCUhAAhI4JQGV8KekaVg7BNi6e++99+5c94IEJCABCdzZBD7//PN6qCGH0OLeDCtoDrPELck999xzZ8Mx9RKQgAQkIAEJSEACEpCABCRwUQRUwl9UdpoYCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISWBOB760pMsZFAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQGV8KvKDiMjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACl0RAJfwl5aZpkYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggVURUAm/quwwMhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJHBJBFTCX1JumhYJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFYH/AWgiEQnX0XuiAAAAAElFTkSuQmCC" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "syndrome_mat = zeros(Bool, 2*N, N÷2) # 2N possible errors for rows vs N÷2 possible code stabilizers for columns\n", + "for i in 1:N\n", + " for j in 1:N÷2\n", + " syndrome_mat[i,j] = comm(code[j],single_z(N,i))\n", + " end\n", + "end\n", + "for i in 1:N\n", + " for j in 1:N÷2\n", + " syndrome_mat[i+N,j] = comm(code[j],single_x(N,i))\n", + " end\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider an error rate of 0.25. We randomly select 1/4 of the qubits to be erased and extract the corresponding submatrix." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "32×32 Matrix{Bool}:\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 1 0 1 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ \n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "using Random # part of the standard library, it contains the `randperm` function\n", + "indices_of_erased_qubits = randperm(N)[1:N÷4]\n", + "S = syndrome_mat[[indices_of_erased_qubits...,indices_of_erased_qubits.+N...],:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `AbstractAlgebra` package contains convenient functions for dealing with vector spaces over arbitrary fields. We will use that package to find the rank of the above binary matrix. We could have used `AbstractAlgebra` to do the entirety of this project given that the tableaux we work with are simply matrices over $\\mathrm{GF}(2,2)$, but we would have sacrificed multiple low-level optimizations available in `QuantumClifford`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "using AbstractAlgebra # Consider Nemo.jl instead of AbstractAlgebra.jl as it is much faster (same interface)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "binary_field = GF(2)\n", + "Sbinary = matrix(binary_field, S) # TODO probably not the fastest way to convert the type of this matrix\n", + "r = rank(Sbinary)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0001220703125" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "recovery_probability = 2.0^(r-N÷2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Observing the threshold depth at which error correction becomes possible\n", + "\n", + "We will perform the derivation described in the previous section for various depths and sampling over multiple different random circuits and multiple different random patterns." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "Ns = [2^4, 2^5, 2^6, 2^7] # number of qubits for which we will perform the analysis\n", + "max_depth = 25 # depth to which we will test each circuit\n", + "nb_circuits = 100 # number of circuits we will average over\n", + "nb_error_samples = 10; # number of random error pattenrs over which we will average" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "using ProgressMeter # A library that provides the convenient @showprogress macro\n", + "using Base.Threads # A library that can turn ordinary loops into parallel multi-threaded \"loops\"" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "get_all_samples (generic function with 1 method)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function get_all_samples(Ns,max_depth,nb_circuits,nb_error_samples)\n", + " # an array that will contain the computed recovery probability for each circuit\n", + " samples = zeros(length(Ns), max_depth, nb_circuits, nb_error_samples)\n", + "\n", + " for (index_N,N) in enumerate(Ns)\n", + " println(\"Sampling from circuits of size $(N)\")\n", + " brick_layer1 = tensor_pow(tCNOT, N÷2)\n", + " brick_layer2 = permute(brick_layer1, [(2:N)...,1])\n", + " @showprogress for index_circuit in 1:nb_circuits\n", + " state = one(Stabilizer, N)\n", + " for index_depth in 1:max_depth\n", + " apply_random_singlequbitops!(state)\n", + " apply!(state, brick_layer1, phases=false)\n", + " apply_random_singlequbitops!(state)\n", + " apply!(state, brick_layer2, phases=false)\n", + " code = state[1:2:end]\n", + " syndrome_mat = zeros(Bool, 2*N, N÷2)\n", + " for i in 1:N\n", + " for j in 1:N÷2\n", + " syndrome_mat[i,j] = comm(code[j],single_z(N,i))\n", + " end\n", + " end\n", + " for i in 1:N\n", + " for j in 1:N÷2\n", + " syndrome_mat[i+N,j] = comm(code[j],single_x(N,i))\n", + " end\n", + " end\n", + " @threads for index_sample in 1:nb_error_samples\n", + " indices_of_erased_qubits = randperm(N)[1:N÷4] # error rate of 0.25\n", + " S = syndrome_mat[[indices_of_erased_qubits...,indices_of_erased_qubits.+N...],:]\n", + " Sbinary = matrix(binary_field, S)\n", + " r = rank(Sbinary)\n", + " recovery_probability = 2.0^(r-N÷2) # N_erased = N÷4\n", + " samples[index_N,index_depth,index_circuit,index_sample] = recovery_probability\n", + " end\n", + " end\n", + " end\n", + " end\n", + " return samples\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sampling from circuits of size 16\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:01\u001b[39m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sampling from circuits of size 32\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:02\u001b[39m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sampling from circuits of size 64\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:00:14\u001b[39m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sampling from circuits of size 128\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32mProgress: 100%|█████████████████████████████████████████| Time: 0:01:32\u001b[39m\n" + ] + } + ], + "source": [ + "samples = get_all_samples(Ns,max_depth,nb_circuits,nb_error_samples);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Based on these samples we can calculate means and standard errors." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "using Statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample_means = mean(samples, dims=(3,4))\n", + "sample_errs = std(samples, dims=(3,4)) / sqrt(nb_circuits*nb_error_samples)\n", + "sample_means = dropdims(sample_means, dims=(3,4))\n", + "sample_errs = dropdims(sample_errs, dims=(3,4))\n", + "plot(1:max_depth,sample_means', yerror=sample_errs',\n", + " label=[\"$(N)\" for N in Ns'],legend=:bottomright,legendtitle=\"# of qubits\",\n", + " xlabel=\"circuit depth\",ylabel=\"recovery probability\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot((1:max_depth) ./ sqrt.(Ns)', 0.610322 .- sample_means', yerror=sample_errs',\n", + " label=[\"$(N)\" for N in Ns'],legend=:topright,legendtitle=\"# of qubits\",\n", + " xlabel=\"circuit depth / √N\",ylabel=\"0.610322 - recovery probability\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reproducibility information" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Julia Version 1.9.0-DEV.573\n", + "Commit 35aaf68470 (2022-05-13 09:54 UTC)\n", + "Platform Info:\n", + " OS: Linux (x86_64-pc-linux-gnu)\n", + " CPU: 8 × Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz\n", + " WORD_SIZE: 64\n", + " LIBM: libopenlibm\n", + " LLVM: libLLVM-13.0.1 (ORCJIT, skylake)\n", + " Threads: 4 on 8 virtual cores\n", + "Environment:\n", + " JULIA_NUM_THREADS = 4\n" + ] + } + ], + "source": [ + "versioninfo()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + " \u001b[90m[0525e862] \u001b[39mQuantumClifford v0.5.0-dev `QuantumClifford`\n" + ] + } + ], + "source": [ + "using Pkg\n", + "Pkg.status(\"QuantumClifford\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia (4 Threads)", + "language": "julia", + "name": "julia" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/v0.8.21/notebooks/Symbolic_Perturbative_Expansions.ipynb b/v0.8.21/notebooks/Symbolic_Perturbative_Expansions.ipynb new file mode 100644 index 000000000..e65857fbf --- /dev/null +++ b/v0.8.21/notebooks/Symbolic_Perturbative_Expansions.ipynb @@ -0,0 +1,660 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "using Revise\n", + "using QuantumClifford\n", + "using QuantumClifford.Experimental.NoisyCircuits\n", + "using QuantumCliffordPlots\n", + "using Plots\n", + "using ProgressMeter\n", + "using BenchmarkTools" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The perturbative expansion code supports symbolic calculation. Simply use one of the many symbolic packages in Julia and set the various parameters of interest to symbolic values instead of numeric ones. Here we show an example of a typical purification circuit that uses various computer algebra system available in Julia." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The circuit we will study is:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "5-element Vector{AbstractOperation}:\n", + " NoiseOpAll(UnbiasedUncorrelatedNoise{Float64}(0.1))\n", + " Symbolic two-qubit gate on qubit 1 and 3\n", + "X_ ⟼ + XX\n", + "_X ⟼ + _X\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + ZZ\n", + "\n", + " Symbolic two-qubit gate on qubit 2 and 4\n", + "X_ ⟼ + XX\n", + "_X ⟼ + _X\n", + "Z_ ⟼ + Z_\n", + "_Z ⟼ + ZZ\n", + "\n", + " BellMeasurement(QuantumClifford.AbstractMeasurement[sMX{Nothing}(3, nothing), sMX{Nothing}(4, nothing)])\n", + " VerifyOp(+ ZZ\n", + "+ XX, [1, 2])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_bell_state = S\"XX\n", + " ZZ\"\n", + "initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n", + "\n", + "g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\n", + "g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\n", + "m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\n", + "v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\n", + "epsilon = 0.1 # The error rate\n", + "n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n", + "\n", + "# This circuit performs a depolarization at rate `epsilon` to all qubits,\n", + "# then bilater CNOT operations\n", + "# then a Bell measurement\n", + "# followed by checking whether the final result indeed corresponds to the correct Bell pair.\n", + "circuit = [n,g1,g2,m,v] # Drawing the circuit out can be a bit slow as it uses LaTeX" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you want to use `Symbolics`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "using Symbolics\n", + "@variables e\n", + "unity = one(e);" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Num} with 3 entries:\n", + " failure:CircuitStatus(3) => 4e*((1 - 3e)^3)\n", + " false_success:CircuitStatus(2) => 6e*((1 - 3e)^3)\n", + " true_success:CircuitStatus(1) => (1 - 3e)^4 + 2e*((1 - 3e)^3)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_bell_state = S\"XX\n", + " ZZ\"\n", + "initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n", + "\n", + "g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\n", + "g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\n", + "m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\n", + "v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\n", + "epsilon = e # The error rate\n", + "n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n", + "\n", + "# This circuit performs a depolarization at rate `epsilon` to all qubits,\n", + "# then bilater CNOT operations\n", + "# then a Bell measurement\n", + "# followed by checking whether the final result indeed corresponds to the correct Bell pair.\n", + "circuit = [n,g1,g2,m,v]\n", + "\n", + "pe_symbolic = petrajectories(initial_state, circuit, branch_weight=unity) # perturbative expansion" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BenchmarkTools.Trial: 3621 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m1.059 ms\u001b[22m\u001b[39m … \u001b[35m 24.199 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 92.42%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m1.251 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m1.373 ms\u001b[22m\u001b[39m ± \u001b[32m904.878 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m2.71% ± 4.04%\n", + "\n", + " \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m▄\u001b[39m█\u001b[39m▄\u001b[39m█\u001b[34m▃\u001b[39m\u001b[39m▃\u001b[39m▁\u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▂\u001b[39m▅\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▆\u001b[32m▅\u001b[39m\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m▃\n", + " 1.06 ms\u001b[90m Histogram: frequency by time\u001b[39m 2.51 ms \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m352.16 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m8202\u001b[39m." + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@benchmark petrajectories(initial_state, circuit, branch_weight=unity)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\\begin{equation}\n", + "0.3086999999999999\n", + "\\end{equation}\n" + ], + "text/plain": [ + "0.3086999999999999" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# How to evaluate numerically\n", + "substitute(pe_symbolic[true_success_stat], Dict(e=>0.1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you want to use `AbstractAlgebra`" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "using AbstractAlgebra # Consider using Nemo.jl which can be much faster while having the same interfaces\n", + "R, (e,) = PolynomialRing(RealField, [\"e\"])\n", + "unity = R(1);" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, AbstractAlgebra.Generic.MPoly{BigFloat}} with 3 entries:\n", + " failure:CircuitStatus(3) => -108.0*e^4 + 108.0*e^3 - 36.0*e^2 + 4.0*e\n", + " false_success:CircuitStatus(2) => -162.0*e^4 + 162.0*e^3 - 54.0*e^2 + 6.0*e\n", + " true_success:CircuitStatus(1) => 27.0*e^4 - 54.0*e^3 + 36.0*e^2 - 10.0*e + 1" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_bell_state = S\"XX\n", + " ZZ\"\n", + "initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n", + "\n", + "g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\n", + "g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\n", + "m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\n", + "v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\n", + "epsilon = e # The error rate\n", + "n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n", + "\n", + "# This circuit performs a depolarization at rate `epsilon` to all qubits,\n", + "# then bilater CNOT operations\n", + "# then a Bell measurement\n", + "# followed by checking whether the final result indeed corresponds to the correct Bell pair.\n", + "circuit = [n,g1,g2,m,v]\n", + "\n", + "pe_symbolic = petrajectories(initial_state, circuit, branch_weight=unity) # perturbative expansion" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BenchmarkTools.Trial: 7012 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m580.274 μs\u001b[22m\u001b[39m … \u001b[35m 24.745 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 96.18%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m638.222 μs \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m707.947 μs\u001b[22m\u001b[39m ± \u001b[32m980.471 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m6.32% ± 4.44%\n", + "\n", + " \u001b[39m \u001b[39m \u001b[39m█\u001b[39m▂\u001b[39m▅\u001b[39m▂\u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▂\u001b[39m▅\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m▇\u001b[39m▆\u001b[39m▇\u001b[39m▆\u001b[39m▅\u001b[39m▅\u001b[32m▄\u001b[39m\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m \u001b[39m▃\n", + " 580 μs\u001b[90m Histogram: frequency by time\u001b[39m 1.19 ms \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m360.54 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m7200\u001b[39m." + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@benchmark petrajectories(initial_state, circuit, branch_weight=unity)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.30870000000000000209472196532889398667975910939276218414306640625" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# How to evaluate numerically\n", + "pe_symbolic[true_success_stat](0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you want to use `SymPy`" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "using SymPy\n", + "e = Sym(\"e\")\n", + "unity = Sym(1);" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{QuantumClifford.Experimental.NoisyCircuits.CircuitStatus, Sym} with 3 entries:\n", + " failure:CircuitStatus(3) => 4.0*e*(1 - 3*e)^3\n", + " false_success:CircuitStatus(2) => 6.0*e*(1 - 3*e)^3\n", + " true_success:CircuitStatus(1) => 2.0*e*(1 - 3*e)^3 + 1.0*(1 - 3*e)^4" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "good_bell_state = S\"XX\n", + " ZZ\"\n", + "canonicalize_rref!(good_bell_state)\n", + "initial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n", + "\n", + "g1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\n", + "g2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\n", + "m = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\n", + "v = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\n", + "epsilon = e # The error rate\n", + "n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n", + "\n", + "# This circuit performs a depolarization at rate `epsilon` to all qubits,\n", + "# then bilater CNOT operations\n", + "# then a Bell measurement\n", + "# followed by checking whether the final result indeed corresponds to the correct Bell pair.\n", + "circuit = [n,g1,g2,m,v]\n", + "\n", + "pe_symbolic = petrajectories(initial_state, circuit, branch_weight=unity) # perturbative expansion" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BenchmarkTools.Trial: 901 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m4.720 ms\u001b[22m\u001b[39m … \u001b[35m150.118 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 51.46%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m5.201 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m5.540 ms\u001b[22m\u001b[39m ± \u001b[32m 5.012 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m1.55% ± 1.71%\n", + "\n", + " \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m▆\u001b[39m \u001b[39m \u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▂\u001b[39m▂\u001b[39m▅\u001b[39m▅\u001b[39m▇\u001b[39m▆\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m▇\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m█\u001b[39m▆\u001b[39m▆\u001b[39m▅\u001b[39m▄\u001b[32m▄\u001b[39m\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m \u001b[39m▃\n", + " 4.72 ms\u001b[90m Histogram: frequency by time\u001b[39m 6.92 ms \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m226.44 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m5574\u001b[39m." + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@benchmark petrajectories(initial_state, circuit, branch_weight=unity)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$0.3087$" + ], + "text/plain": [ + "0.308700000000000" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# How to evaluate numerically\n", + "pe_symbolic[true_success_stat].subs(e,0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparison to numeric result" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$2.0 e \\left(1 - 3 e\\right)^{3} + 1.0 \\left(1 - 3 e\\right)^{4}$" + ], + "text/plain": [ + " 3 4\n", + "2.0⋅e⋅(1 - 3⋅e) + 1.0⋅(1 - 3⋅e) " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "true_success_symbolic = pe_symbolic[true_success_stat]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "es_num = 0:0.01:0.1\n", + "symbolic_evaluations = [Float64(true_success_symbolic.subs(e,e_num)) for e_num in es_num]\n", + "\n", + "numeric_evaluations = []\n", + "for epsilon in es_num\n", + " n = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n", + " circuit = [n,g1,g2,m,v]\n", + " pe_symbolic = petrajectories(initial_state, circuit)\n", + " push!(numeric_evaluations, pe_symbolic[true_success_stat])\n", + "end\n", + "\n", + "plot(es_num, symbolic_evaluations, label=\"symbolic\")\n", + "plot!(es_num, numeric_evaluations, line=false, marker=true, label=\"numeric\")\n", + "plot!(xlabel=\"ε\", ylabel=\"True Success Rate\", title=\"Numeric vs Symbolic Perturbative Expansion\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reproducibility information" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Julia Version 1.9.0-DEV.573\n", + "Commit 35aaf68470 (2022-05-13 09:54 UTC)\n", + "Platform Info:\n", + " OS: Linux (x86_64-pc-linux-gnu)\n", + " CPU: 8 × Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz\n", + " WORD_SIZE: 64\n", + " LIBM: libopenlibm\n", + " LLVM: libLLVM-13.0.1 (ORCJIT, skylake)\n", + " Threads: 4 on 8 virtual cores\n", + "Environment:\n", + " JULIA_NUM_THREADS = 4\n", + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + " \u001b[90m[0525e862] \u001b[39mQuantumClifford v0.5.0-dev `QuantumClifford`\n", + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + " \u001b[90m[0c5d862f] \u001b[39mSymbolics v4.5.1\n", + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + "\u001b[33m⌅\u001b[39m \u001b[90m[c3fe647b] \u001b[39mAbstractAlgebra v0.25.3\n", + "\u001b[36m\u001b[1mInfo\u001b[22m\u001b[39m Packages marked with \u001b[33m⌅\u001b[39m have new versions available but cannot be upgraded. To see why use `status --outdated`\n", + "\u001b[32m\u001b[1mStatus\u001b[22m\u001b[39m `~/Documents/ScratchSpace/clifford/Project.toml`\n", + " \u001b[90m[24249f21] \u001b[39mSymPy v1.1.6\n" + ] + } + ], + "source": [ + "versioninfo()\n", + "using Pkg\n", + "Pkg.status(\"QuantumClifford\")\n", + "Pkg.status(\"Symbolics\")\n", + "Pkg.status(\"AbstractAlgebra\")\n", + "Pkg.status(\"SymPy\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia (4 Threads)", + "language": "julia", + "name": "julia" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/v0.8.21/objects.inv b/v0.8.21/objects.inv new file mode 100644 index 000000000..caa1ecca4 Binary files /dev/null and b/v0.8.21/objects.inv differ diff --git a/v0.8.21/plotting/7641bb18.svg b/v0.8.21/plotting/7641bb18.svg new file mode 100644 index 000000000..343524898 --- /dev/null +++ b/v0.8.21/plotting/7641bb18.svg @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.8.21/plotting/8c07ab47.svg b/v0.8.21/plotting/8c07ab47.svg new file mode 100644 index 000000000..4cf3a10c9 --- /dev/null +++ b/v0.8.21/plotting/8c07ab47.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.8.21/plotting/a8bf768d.svg b/v0.8.21/plotting/a8bf768d.svg new file mode 100644 index 000000000..564a9b73d --- /dev/null +++ b/v0.8.21/plotting/a8bf768d.svg @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.8.21/plotting/b3dfc677.svg b/v0.8.21/plotting/b3dfc677.svg new file mode 100644 index 000000000..183f07e3e --- /dev/null +++ b/v0.8.21/plotting/b3dfc677.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.8.21/plotting/c6e82822.svg b/v0.8.21/plotting/c6e82822.svg new file mode 100644 index 000000000..0ba07b97d --- /dev/null +++ b/v0.8.21/plotting/c6e82822.svg @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.8.21/plotting/d2a52a97.png b/v0.8.21/plotting/d2a52a97.png new file mode 100644 index 000000000..a53a78916 Binary files /dev/null and b/v0.8.21/plotting/d2a52a97.png differ diff --git a/v0.8.21/plotting/index.html b/v0.8.21/plotting/index.html new file mode 100644 index 000000000..a4c265ba0 --- /dev/null +++ b/v0.8.21/plotting/index.html @@ -0,0 +1,50 @@ + +Visualizations · QuantumClifford.jl

Visualizations

Stabilizers have a plot recipe that can be used with Plots.jl or Makie.jl. It simply displays the corresponding parity check matrix (extracted with stab_to_gf2) as a bitmap image. Circuits can be visualized with Quantikz.jl.

Importing the aforementioned packages together with QuantumClifford is necessary to enable the plotting functionality (implemented as package extensions).

Plots.jl

In Plots.jl we have a simple recipe plot(s::Stabilizer; xzcomponents=...) where xzcomponents=:split plots the tableau heatmap in a wide form, X bits on the left, Z bits on the right; or xzcomponents=:together plots them overlapping, with different colors for I, X, Z, and Y.

using QuantumClifford, Plots
+plot(random_stabilizer(20,30), xzcomponents=:split)
Example block output
using QuantumClifford, Plots
+plot(canonicalize!(random_stabilizer(20,30)))
Example block output
using QuantumClifford, Plots
+plot(canonicalize_gott!(random_stabilizer(30))[1], xzcomponents=:split)
Example block output
using QuantumClifford, Plots
+plot(canonicalize_gott!(random_stabilizer(30))[1]; xzcomponents=:together)
Example block output
using QuantumClifford, Plots
+plot(canonicalize_rref!(random_stabilizer(20,30),1:30)[1]; xzcomponents=:together)
Example block output

Makie.jl

Makie's heatmap can be directly called on Stabilizer.

using QuantumClifford, CairoMakie
+s = S"IIXZ
+      ZZIZ
+      YYIZ
+      IIIZ
+      ZZXZ"
+f, ax, p = CairoMakie.heatmap(s)
+hidedecorations!(ax); hidespines!(ax); # remove ticks and spines
+ax.aspect = DataAspect(); # set a one-to-one aspect ratio
+f

A full Makie recipe is available as well (supporting xzcomponents)

using QuantumClifford, CairoMakie
+s = S"IIXZ
+      ZZIZ
+      YYIZ
+      IIIZ
+      ZZXZ"
+f, ax, p = stabilizerplot(s, xzcomponents=:together)
+hidedecorations!(ax); hidespines!(ax)
+ax.aspect = DataAspect()
+f

You can easily add colorbars (and change the colormap) as well:

using QuantumClifford, CairoMakie
+fig = Figure()
+ax, p = stabilizerplot(fig[1, 1], s, colormap=cgrad(:heat, 4, categorical = true))
+hidedecorations!(ax)
+hidespines!(ax)
+xlims!(ax, 0.5, size(s,2)+0.5) # otherwise there is padding
+ylims!(ax, 0.5, size(s,1)+0.5) # otherwise there is padding
+# set the aspect ratio of the plot
+ax.aspect = DataAspect()
+# set the aspect ratio of the layout
+colsize!(fig.layout, 1, Aspect(1, size(s,2)/size(s,1)))
+Colorbar(fig[1, 2], p, ticks = (0:3, ["I", "X", "Z", "Y"]))
+fig
Example block output

Or set a completely custom set of colors:

fig = Figure()
+ax, p = stabilizerplot(fig[1, 1], s, colormap=cgrad([:lightgray,RGBf(1,0.4,0.4),RGBf(0.3,1,0.5),RGBf(0.4,0.4,1)], 4, categorical = true))
+hidedecorations!(ax)
+hidespines!(ax)
+xlims!(ax, 0.5, size(s,2)+0.5)
+ylims!(ax, 0.5, size(s,1)+0.5)
+ax.aspect = DataAspect()
+colsize!(fig.layout, 1, Aspect(1, size(s,2)/size(s,1)))
+Colorbar(fig[2, 1], p, ticks = (0:3, ["I", "X", "Z", "Y"]), vertical = false, flipaxis = false)
+fig
Example block output

You might have noticed, Makie recipes do not let you edit the axes or figure, rather they only permit you to set the plot content. Which is why we use hidedecorations!, hidesplines!, and DataAspect to further modify the plot. However, these defaults are also available in stabilizerplot_axis.

using QuantumClifford, CairoMakie
+f=Figure()
+stabilizerplot_axis(f[1,1],random_stabilizer(100))
+f
Example block output

Quantikz.jl

With the Quantikz library you can visualize gates or sequences of gates.

using QuantumClifford, Quantikz
+circuit = [sCNOT(1,2), SparseGate(random_clifford(4), [1,4,5,6]), sMZ(4)]
Example block output
diff --git a/v0.8.21/references.bib b/v0.8.21/references.bib new file mode 100644 index 000000000..4bdfce7f9 --- /dev/null +++ b/v0.8.21/references.bib @@ -0,0 +1,264 @@ +% The basis of the tableaux algorithm + +@inproceedings{gottesman1998heisenberg, + title={The Heisenberg representation of quantum computers}, + author={Gottesman, Daniel}, + booktitle={International Conference on Group Theoretic Methods in Physics}, + year={1998}, + organization={Citeseer}, + url={https://arxiv.org/abs/quant-ph/9807006} +} + +@article{aaronson2004improved, + title={Improved simulation of stabilizer circuits}, + author={Aaronson, Scott and Gottesman, Daniel}, + journal={Physical Review A}, + volume={70}, + number={5}, + pages={052328}, + year={2004}, + publisher={APS}, + doi={10.1103/PhysRevA.70.052328} +} + +% Random Stabilizers + +@article{koenig2014efficiently, + title={How to efficiently select an arbitrary Clifford group element}, + author={Koenig, Robert and Smolin, John A}, + journal={Journal of Mathematical Physics}, + volume={55}, + number={12}, + pages={122202}, + year={2014}, + publisher={AIP Publishing}, + doi={10.1063/1.4903507} +} + +@article{bravyi2020hadamard, + title={Hadamard-free circuits expose the structure of the Clifford group}, + author={Bravyi, Sergey and Maslov, Dmitri}, + journal={IEEE Transactions on Information Theory}, + volume={67}, + number={7}, + pages={4546--4563}, + year={2021}, + publisher={IEEE}, + doi={10.1109/TIT.2021.3081415} +} + +@inproceedings{berg2020simple, + title={A simple method for sampling random Clifford operators}, + author={Van Den Berg, Ewout}, + booktitle={2021 IEEE International Conference on Quantum Computing and Engineering (QCE)}, + pages={54--59}, + year={2021}, + organization={IEEE}, + doi={10.1109/QCE52317.2021.00021} +} + +@article{li2019measurement, + title={Measurement-driven entanglement transition in hybrid quantum circuits}, + author={Li, Yaodong and Chen, Xiao and Fisher, Matthew PA}, + journal={Physical Review B}, + volume={100}, + number={13}, + pages={134306}, + year={2019}, + publisher={APS}, + doi={10.1103/PhysRevB.100.134306} +} + +% Canonicalization Methods + +@article{garcia2012efficient, + title={Efficient inner-product algorithm for stabilizer states}, + author={Garcia, Hector J and Markov, Igor L and Cross, Andrew W}, + journal={arXiv preprint arXiv:1210.6646}, + year={2012}, + url={https://arxiv.org/abs/1210.6646} +} + +@article{audenaert2005entanglement, + title={Entanglement on mixed stabilizer states: normal forms and reduction procedures}, + author={Audenaert, Koenraad MR and Plenio, Martin B}, + journal={New Journal of Physics}, + volume={7}, + number={1}, + pages={170}, + year={2005}, + publisher={IOP Publishing}, + doi={10.1088/1367-2630/7/1/170} +} + +@phdthesis{gottesman1997stabilizer, + title={Stabilizer codes and quantum error correction}, + author={Gottesman, Daniel}, + year={1997}, + school={California Institute of Technology}, + publisher={California Institute of Technology}, + url={https://arxiv.org/abs/quant-ph/9705052} +} + +@article{gullans2020dynamical, + title={Dynamical purification phase transition induced by quantum measurements}, + author={Gullans, Michael J and Huse, David A}, + journal={Physical Review X}, + volume={10}, + number={4}, + pages={041020}, + year={2020}, + publisher={APS} +} + +@article{hein2006entanglement, + title={Entanglement in graph states and its applications}, + author={Hein, Marc and D{\"u}r, Wolfgang and Eisert, Jens and Raussendorf, Robert and Nest, M and Briegel, H-J}, + journal={arXiv preprint quant-ph/0602096}, + url={https://arxiv.org/abs/quant-ph/0602096}, + doi={10.48550/arXiv.quant-ph/0602096}, + year={2006} +} + +@article{wilde2009logical, + title={Logical operators of quantum codes}, + author={Wilde, Mark M}, + journal={Physical Review A}, + volume={79}, + number={6}, + pages={062322}, + year={2009}, + publisher={APS}, + doi={10.1103/PhysRevA.79.062322} +} + +% Encoding circuits + +@article{cleve1997efficient, + title={Efficient computations of encodings for quantum error correction}, + author={Cleve, Richard and Gottesman, Daniel}, + journal={Physical Review A}, + volume={56}, + number={1}, + pages={76}, + year={1997}, + publisher={APS} +} + +@inproceedings{grassl2011variations, + title={Variations on encoding circuits for stabilizer quantum codes}, + author={Grassl, Markus}, + booktitle={International Conference on Coding and Cryptology}, + pages={142--158}, + year={2011}, + organization={Springer} +} + +@article{grassl2002algorithmic, + title={Algorithmic aspects of quantum error-correcting codes}, + author={Grassl, Markus}, + journal={Mathematics of Quantum Computation}, + pages={223--252}, + year={2002}, + publisher={CRC Press Boca Raton, FL} +} + +% Examples of results that employ the tableaux formalism + +@article{gullans2020quantum, + title={Quantum coding with low-depth random circuits}, + author={Gullans, Michael J and Krastanov, Stefan and Huse, David A and Jiang, Liang and Flammia, Steven T}, + journal={arXiv preprint arXiv:2010.09775}, + year={2020} +} + +@article{krastanov2020heterogeneous, + title={Heterogeneous Multipartite Entanglement Purification for Size-Constrained Quantum Devices}, + author={Krastanov, Stefan and de la Cerda, Alexander Sanchez and Narang, Prineha}, + journal={arXiv preprint arXiv:2011.11640}, + year={2020} +} + +@article{nahum2017quantum, + title = {Quantum Entanglement Growth under Random Unitary Dynamics}, + volume = {7}, + url = {https://link.aps.org/doi/10.1103/PhysRevX.7.031016}, + doi = {10.1103/PhysRevX.7.031016}, + pages = {031016}, + number = {3}, + journal = {Physical Review X}, + author = {Nahum, Adam and Ruhman, Jonathan and Vijay, Sagar and Haah, Jeongwan}, + year = {2017} +} + +% codes + +@article{mackay2004sparse, + title={Sparse-graph codes for quantum error correction}, + author={MacKay, David JC and Mitchison, Graeme and McFadden, Paul L}, + journal={IEEE Transactions on Information Theory}, + volume={50}, + number={10}, + pages={2315--2330}, + year={2004}, + publisher={IEEE}, + doi={10.1109/TIT.2004.834737} +} + +@article{calderbank1998quantum, + title={Quantum error correction via codes over GF (4)}, + author={Calderbank, A Robert and Rains, Eric M and Shor, PM and Sloane, Neil JA}, + journal={IEEE Transactions on Information Theory}, + volume={44}, + number={4}, + pages={1369--1387}, + year={1998}, + publisher={IEEE}, + doi={10.1109/18.681315} +} + +@inproceedings{steane2007tutorial, + title={A tutorial on quantum error correction}, + author={Steane, Andrew M}, + booktitle={PROCEEDINGS-INTERNATIONAL SCHOOL OF PHYSICS ENRICO FERMI}, + volume={162}, + pages={1}, + year={2007}, + organization={IOS Press; Ohmsha; 1999}, + doi={10.3254/978-1-61499-018-5-1} +} + +@article{yu2013all, + author={Yu, Sixia and Bierbrauer, Jürgen and Dong, Ying and Chen, Qing and Oh, C. H.}, + journal={IEEE Transactions on Information Theory}, + title={All the Stabilizer Codes of Distance 3}, + year={2013}, + volume={59}, + number={8}, + pages={5179-5185}, + keywords= {Generators;Frequency modulation;Vectors;Educational institutions;Error correction codes;Physics;Indexes;1-error correcting stabilizer codes;optimal codes;quantum error correction;quantum Hamming bound}, + doi={10.1109/TIT.2013.2259138} +} + +@article{chao2018quantum, + title={Quantum Error Correction with Only Two Extra Qubits.}, + author={Rui Chao and Ben W Reichardt}, + journal={Physical review letters}, + year={2017}, + volume={121 5}, + pages={ + 050502 + }, + url={https://api.semanticscholar.org/CorpusID:206314271} +} + +@article{gottesman1996class, + title={Class of quantum error-correcting codes saturating the quantum Hamming bound}, + author={Gottesman, Daniel}, + journal={Physical Review A}, + volume={54}, + number={3}, + pages={1862}, + year={1996}, + publisher={APS} +} diff --git a/v0.8.21/references/index.html b/v0.8.21/references/index.html new file mode 100644 index 000000000..744e92101 --- /dev/null +++ b/v0.8.21/references/index.html @@ -0,0 +1,2 @@ + +Suggested Readings & References · QuantumClifford.jl

Suggested reading

For the basis of the tableaux methods first read (Gottesman, 1998) followed by the more efficient approach described in (Aaronson and Gottesman, 2004).

The tableaux can be canonicalized (i.e. Gaussian elimination can be performed on them) in a number of different ways, and considering the different approaches provides useful insight. The following methods are implemented in this library:

For the use of these methods in error correction and the subtle overlap between the two fields consider these resources. They are also useful in defining some of the specific constraints in commutation between rows in the tableaux:

These publications describe the uniform sampling of random stabilizer states:

For circuit construction routines (for stabilizer measurements for a given code):

For code construction routines:

References

diff --git a/v0.8.21/search_index.js b/v0.8.21/search_index.js new file mode 100644 index 000000000..a16fa6be9 --- /dev/null +++ b/v0.8.21/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"references/#Suggested-reading","page":"Suggested Readings & References","title":"Suggested reading","text":"","category":"section"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"For the basis of the tableaux methods first read (Gottesman, 1998) followed by the more efficient approach described in (Aaronson and Gottesman, 2004).","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"The tableaux can be canonicalized (i.e. Gaussian elimination can be performed on them) in a number of different ways, and considering the different approaches provides useful insight. The following methods are implemented in this library:","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"The default one: (Garcia et al., 2012)\nUseful when in need of tracing out a set of qubits: (Audenaert and Plenio, 2005)\nUseful when defining logical operators of codes: (Gottesman, 1997)","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"For the use of these methods in error correction and the subtle overlap between the two fields consider these resources. They are also useful in defining some of the specific constraints in commutation between rows in the tableaux:","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"(Steane, 2007)\n(Calderbank et al., 1998)\n(MacKay et al., 2004)\n(Wilde, 2009)","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"These publications describe the uniform sampling of random stabilizer states:","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"(Koenig and Smolin, 2014)\n(Bravyi and Maslov, 2021)\n(Van Den Berg, 2021)\n(Li et al., 2019)","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"For circuit construction routines (for stabilizer measurements for a given code):","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"(Cleve and Gottesman, 1997)\n(Gottesman, 1997) (and its erratum)\n(Grassl, 2002)\n(Grassl, 2011)","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"For code construction routines:","category":"page"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"(Cleve and Gottesman, 1997)\n(Gottesman, 1996)\n(Gottesman, 1997)\n(Yu et al., 2013)\n(Chao and Reichardt, 2017)","category":"page"},{"location":"references/#References","page":"Suggested Readings & References","title":"References","text":"","category":"section"},{"location":"references/","page":"Suggested Readings & References","title":"Suggested Readings & References","text":"Aaronson, S. and Gottesman, D. (2004). Improved simulation of stabilizer circuits. Physical Review A 70, 052328.\n\n\n\nAudenaert, K. M. and Plenio, M. B. (2005). Entanglement on mixed stabilizer states: normal forms and reduction procedures. New Journal of Physics 7, 170.\n\n\n\nBravyi, S. and Maslov, D. (2021). Hadamard-free circuits expose the structure of the Clifford group. IEEE Transactions on Information Theory 67, 4546–4563.\n\n\n\nCalderbank, A. R.; Rains, E. M.; Shor, P. and Sloane, N. J. (1998). Quantum error correction via codes over GF (4). IEEE Transactions on Information Theory 44, 1369–1387.\n\n\n\nChao, R. and Reichardt, B. W. (2017). Quantum Error Correction with Only Two Extra Qubits. Physical review letters 121 5, 050502.\n\n\n\nCleve, R. and Gottesman, D. (1997). Efficient computations of encodings for quantum error correction. Physical Review A 56, 76.\n\n\n\nGarcia, H. J.; Markov, I. L. and Cross, A. W. (2012). Efficient inner-product algorithm for stabilizer states, arXiv preprint arXiv:1210.6646.\n\n\n\nGottesman, D. (1996). Class of quantum error-correcting codes saturating the quantum Hamming bound. Physical Review A 54, 1862.\n\n\n\nGottesman, D. (1997). Stabilizer codes and quantum error correction. Ph.D. Thesis, California Institute of Technology.\n\n\n\nGottesman, D. (1998). The Heisenberg representation of quantum computers. In: International Conference on Group Theoretic Methods in Physics (Citeseer).\n\n\n\nGrassl, M. (2002). Algorithmic aspects of quantum error-correcting codes. Mathematics of Quantum Computation, 223–252.\n\n\n\nGrassl, M. (2011). Variations on encoding circuits for stabilizer quantum codes. In: International Conference on Coding and Cryptology (Springer); pp. 142–158.\n\n\n\nGullans, M. J.; Krastanov, S.; Huse, D. A.; Jiang, L. and Flammia, S. T. (2020). Quantum coding with low-depth random circuits, arXiv preprint arXiv:2010.09775.\n\n\n\nKoenig, R. and Smolin, J. A. (2014). How to efficiently select an arbitrary Clifford group element. Journal of Mathematical Physics 55, 122202.\n\n\n\nKrastanov, S.; de la Cerda, A. S. and Narang, P. (2020). Heterogeneous Multipartite Entanglement Purification for Size-Constrained Quantum Devices, arXiv preprint arXiv:2011.11640.\n\n\n\nLi, Y.; Chen, X. and Fisher, M. P. (2019). Measurement-driven entanglement transition in hybrid quantum circuits. Physical Review B 100, 134306.\n\n\n\nMacKay, D. J.; Mitchison, G. and McFadden, P. L. (2004). Sparse-graph codes for quantum error correction. IEEE Transactions on Information Theory 50, 2315–2330.\n\n\n\nNahum, A.; Ruhman, J.; Vijay, S. and Haah, J. (2017). Quantum Entanglement Growth under Random Unitary Dynamics. Physical Review X 7, 031016.\n\n\n\nSteane, A. M. (2007). A tutorial on quantum error correction. In: PROCEEDINGS-INTERNATIONAL SCHOOL OF PHYSICS ENRICO FERMI, Vol. 162 (IOS Press; Ohmsha; 1999); p. 1.\n\n\n\nVan Den Berg, E. (2021). A simple method for sampling random Clifford operators. In: 2021 IEEE International Conference on Quantum Computing and Engineering (QCE) (IEEE); pp. 54–59.\n\n\n\nWilde, M. M. (2009). Logical operators of quantum codes. Physical Review A 79, 062322.\n\n\n\nYu, S.; Bierbrauer, J.; Dong, Y.; Chen, Q. and Oh, C. H. (2013). All the Stabilizer Codes of Distance 3. IEEE Transactions on Information Theory 59, 5179–5185.\n\n\n\n","category":"page"},{"location":"noise/#noise","page":"Noise Processes","title":"Noise Processes","text":"","category":"section"},{"location":"noise/","page":"Noise Processes","title":"Noise Processes","text":"DocTestSetup = quote\n using QuantumClifford\n using StableRNGs\n rng = StableRNG(42)\nend","category":"page"},{"location":"noise/","page":"Noise Processes","title":"Noise Processes","text":"As seen in the list of possible gates, the simulator is capable of modeling different types of noise. If that is your goal, please consider using the available Monte Carlo simulator or the Symbolic Perturbative Expansion system.","category":"page"},{"location":"noise/","page":"Noise Processes","title":"Noise Processes","text":"The implemented types of noise include:","category":"page"},{"location":"noise/","page":"Noise Processes","title":"Noise Processes","text":"UnbiasedUncorrelatedNoise\nPauliNoise","category":"page"},{"location":"noise/","page":"Noise Processes","title":"Noise Processes","text":"The low-level functionality to work with noise is applynoise!, but most of the time you would probably just want to use PauliError, NoisyGate, NoiseOp and NoiseOpAll.","category":"page"},{"location":"ecc_example_sim/#noisycircuits_pf_ecc_example","page":"ECC example","title":"ECC example with Pauli Frames","text":"","category":"section"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"DocTestSetup = quote\n using QuantumClifford\n using Quantikz\nend\nCurrentModule = QuantumClifford.Experimental.NoisyCircuits","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"warning: The documentation is incomplete\nWaiting for a better documentation than the small example below. Check out also the page on ECC performance evaluators","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"Consider Steane 7-qubit code:","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"using QuantumClifford\nusing QuantumClifford.ECC: Steane7, naive_syndrome_circuit, naive_encoding_circuit, parity_checks, code_s, code_n\nusing Quantikz\n\ncode = Steane7()\nH = parity_checks(code)","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"... and the corresponding encoding circuit","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"ecirc = naive_encoding_circuit(code)","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"... and the corresponding syndrome measurement circuit (the non-fault tolerant one)","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"scirc, _ = naive_syndrome_circuit(code)","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"The most straightforward way to start sampling syndromes is to set up a table of Pauli frames.","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"circuit = [ecirc..., scirc...]\nnframes = 4\nframes = pftrajectories(circuit; trajectories=nframes) # run the sims\npfmeasurements(frames) # extract the measurements","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"The pftrajectories function is multithreaded. If you want more low-level control over these Pauli frame simulations, check out the PauliFrame structure, the other methods of pftrajectories, and the circuit compactifaction function compactify_circuit.","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"If you want to model Pauli errors, use:","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"The helper PauliError for unbiased Pauli noise operation acting on a given qubit\nThe lower level NoiseOp (for a single qubit) or NoiseOpAll (for all qubits) parameterized with a particular noise type, e.g. UnbiasedUncorrelatedNoise","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"errprob = 0.1\nerrors = [PauliError(i,errprob) for i in 1:code_n(code)]\nfullcircuit = [ecirc..., errors..., scirc...]","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"And running this noisy simulation:","category":"page"},{"location":"ecc_example_sim/","page":"ECC example","title":"ECC example","text":"frames = pftrajectories(fullcircuit; trajectories=nframes)\npfmeasurements(frames)","category":"page"},{"location":"stab-algebra-manual/#Stabilizer-Tableau-Algebra-Manual","page":"Manual","title":"Stabilizer Tableau Algebra Manual","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"DocTestSetup = quote\n using QuantumClifford\nend","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The library consists of two main parts: Tools for working with the algebra of Stabilizer tableaux and tools specifically for efficient Circuit Simulation. This chapter discusses the former \"lower level\" Stabilizer tableau algebra tools.","category":"page"},{"location":"stab-algebra-manual/#Pauli-Operators","page":"Manual","title":"Pauli Operators","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The PauliOperator object represents multi-qubit Pauli operator (1iIZXY^otimes n). It is stored in memory as a phase (a single byte where 0x0,0x1,0x2,0x3 corresponds to 1i-1-i) and two bit-arrays, for X and for Z components.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"You can create them with a P string.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> P\"-iXZ\"\n-iXZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Or by specifying phase and X/Z components:","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> PauliOperator(0x0,Bool[0,1,0],Bool[0,0,1])\n+ _XZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Both underscore and I can be used for identity.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> P\"I_XYZ\"\n+ __XYZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Multiplication with scalars or other Pauli operators works as expected, as well as tensor products of Pauli operators.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> -1im*P\"X\"\n-iX\n\njulia> P\"X\" * P\"Z\"\n-iY\n\njulia> P\"X\" ⊗ P\"Z\"\n+ XZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"One can check for commutativity with comm.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> comm(P\"X\",P\"Z\")\n0x01\n\njulia> comm(P\"XX\",P\"ZZ\")\n0x00","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"And check the phase of a product with prodphase.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> prodphase(P\"X\", P\"Z\")\n0x03\n\njulia> prodphase(P\"X\", P\"iZ\")\n0x00\n\njulia> prodphase(P\"X\",P\"Y\")\n0x01","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Indexing operations are available.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> p = P\"IXYZ\";\n\njulia> p[1], p[2], p[3], p[4]\n((false, false), (true, false), (true, true), (false, true))\n\njulia> p = P\"III\";\n\njulia> p[2] = (true, true);\n\njulia> p\n+ _Y_","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Including fancy indexing:","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> P\"IXYZ\"[[2,3]]\n+ XY\n\njulia> P\"IXYZ\"[[false,true,true,false]]\n+ XY","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The operator is represented in memory by bit arrays (much denser than using byte arrays).","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> p = P\"-IXYZ\";\n\njulia> p.nqubits, p.xz\n(4, UInt64[0x0000000000000006, 0x000000000000000c])","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Views that give just the X or Z components of the xz bitarray are available through xview and zview.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> xview(P\"XYZI\")\n1-element view(::Vector{UInt64}, 1:1) with eltype UInt64:\n 0x0000000000000003","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The convenience methods xbit and zbit give you Bool (GF2) vectors.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> xbit(P\"XYZI\")\n4-element Vector{Bool}:\n 1\n 1\n 0\n 0","category":"page"},{"location":"stab-algebra-manual/#Stabilizers","page":"Manual","title":"Stabilizers","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"A Stabilizer object is a tableau of Pauli operators. When the tableau is meant to represent a (pure or mixed) stabilizer state, all of these operators should commute (but that is not enforced, rather Stabilizer is a generic tableau data structure). It is stored in memory as a phase list and a bit-matrix for X and Z components. It can be instantiated by an S string, or with a number of different constructors.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"tip: Stabilizers and Destabilizers\nIn many cases you probably would prefer to use the MixedDestabilizer data structure, as it caries a lot of useful additional information, like tracking rank and destabilizer operators. Stabilizer has mostly a pedagogical value, and it is also used for slightly faster simulation of a particular subset of Clifford operations. See also the data structures discussion page.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> S\"-XX\n +ZZ\"\n- XX\n+ ZZ\n\njulia> Stabilizer([P\"-XX\",P\"+ZZ\"])\n- XX\n+ ZZ\n\njulia> Stabilizer([0x2, 0x0],\n Bool[1 1;\n 0 0],\n Bool[0 0;\n 1 1])\n- XX\n+ ZZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Direct sums can be performed,","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> S\"-XX\" ⊗ S\"ZZ\"\n- XX__\n+ __ZZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Indexing operations are available, including fancy indexing. Be careful about how phase information gets transferred during sub-indexing.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XYZ\n -ZIX\n +XIZ\";\n\njulia> s[1]\n- XYZ\n\njulia> s[1,2]\n(true, true)\n\njulia> s[[3,1]]\n+ X_Z\n- XYZ\n\njulia> s[[3,1],[2]]\n+ _\n- Y","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Consistency at creation is not verified so nonsensical stabilizers can be created, both in terms of content and shape.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> S\"iX\n +Z\"\n+iX\n+ Z","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Similarly to the Pauli operators, a bit array representation is used.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XXX\n +ZZI\n -IZZ\"\n- XXX\n+ ZZ_\n- _ZZ\n\njulia> phases(s), tab(s).xzs\n(UInt8[0x02, 0x00, 0x02], UInt64[0x0000000000000007 0x0000000000000000 0x0000000000000000; 0x0000000000000000 0x0000000000000003 0x0000000000000006])","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"And there are convenience functions that can extract the corresponding binary check matrix.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> stab_to_gf2(s)\n3×6 Matrix{Bool}:\n 1 1 1 0 0 0\n 0 0 0 1 1 0\n 0 0 0 0 1 1","category":"page"},{"location":"stab-algebra-manual/#Canonicalization-of-Stabilizers","page":"Manual","title":"Canonicalization of Stabilizers","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Canonicalization (akin to Gaussian elimination over F(2,2)) is implemented in the canonicalize! function. Besides the default canonicalization prescription, alternative ones are available as described in the canonicalization page.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XXX\n +ZZX\n +III\";\n\njulia> canonicalize!(s)\n+ YY_\n+ ZZX\n+ ___","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"If phases are inconsequential, the operations can be faster by not tracking and updating them.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XXX\n +ZZX\n +III\";\n\njulia> canonicalize!(s; phases=false)\n- YY_\n+ ZZX\n+ ___","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"These operations are in place (as customarily signified by \"!\").","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XXX\n +ZZX\n +III\";\n\njulia> canonicalize!(s; phases=false);\n\njulia> s\n- YY_\n+ ZZX\n+ ___","category":"page"},{"location":"stab-algebra-manual/#Projective-Measurements","page":"Manual","title":"Projective Measurements","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The project! function is used to perform generic projective measurements.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"tip: Single qubit projections\nIf you know your Pauli measurement operator acts on a single qubit, there are much faster projection functions available, discussed in the next section. Namely projectX!, projectY!, and projectZ!.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"To observe the effect of different projections, we will start with a GHZ state.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XXX\n +ZZI\n -IZZ\";","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The project! function returns the new stabilizer, the index where the anticommutation was detected, and the result of the projection (nothing being an undetermined result). For instance here we project on an operator that does not commute with all stabilizer generators.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> project!(copy(s), P\"ZII\")[1]\n+ Z__\n+ ZZ_\n- _ZZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Importantly, when there is an undetermined result, we return nothing and leave the phase of the new stabilizer the same as the phase of the projection operator. If you want to perform a Monte Carlo simulation, you need to randomize the phase of the stabilizer at the anticommuting index yourself. For instance, one can do:","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> newstate, anticomindex, result = project!(copy(s), P\"XII\")\n if isnothing(result)\n phases(newstate)[anticomindex] = rand([0x0,0x2])\n end\n result, anticomindex\n(nothing, 2)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Of course, this is a rather cumbersome way to run a simulation, so we also provide projectrand! which does the necessary randomization automatically, for cases where you do not need the fine grained control of project!.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"We can project on a commuting operator, hence no anticommuting terms (the index is zero), and the result is perfectly determined (-1, or in our convention to represent the phase, 0x2).","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> project!(copy(s), P\"-ZZI\")\n(Stabilizer 3×3, 0, 0x02)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"When the projection is consistent with the stabilizer (i.e. the measurement result is not nothing), this would trigger an expensive canonicalization procedure in order to calculate the measurement result (unless we are using more advanced data structures to represent the state, which are discussed later). If all you want to know is whether the projection is consistent with the stabilizer, but you do not care about the measurement result, you can skip the canonicalization and calculation of the result.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> project!(copy(s), P\"-ZZI\", keep_result=false)\n(Stabilizer 3×3, 0, nothing)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Lastly, in either case, you can skip the calculation of the phases as well, if they are unimportant.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> project!(copy(s), P\"ZZI\", phases=false)\n(Stabilizer 3×3, 0, 0x00)","category":"page"},{"location":"stab-algebra-manual/#Sparse-single-qubit-measurements","page":"Manual","title":"Sparse single-qubit measurements","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"In many circumstances only a single-qubit operator is being measured. In that case one should use the projectX!, projectY!, and projectZ! functions as they are much faster thanks to tracking only a single qubit. They have versions that randomize the phase as necessary as well: projectXrand!, projectYrand!, and projectZrand!.","category":"page"},{"location":"stab-algebra-manual/#Gate-like-interface","page":"Manual","title":"Gate-like interface","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"If you do not need all this boilerplate, and especially if you want to perform the randomization automatically, you can use the gate-like \"symbolic\" objects sMX, sMY, and sMZ, that perform the measurement and the necessary randomization of phase. If the measurement result is to be stored, you can use the Register structure that stores both stabilizer tableaux and bit values.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> state = Register(ghz(3), [false,false])\nRegister{Vector{UInt8}, Matrix{UInt64}}(Rank 3 stabilizer\n+ Z__\n+ _X_\n+ __X\n═════\n+ XXX\n+ ZZ_\n+ Z_Z\n═════\n, Bool[0, 0])\n\njulia> apply!(state, sMX(3,2)) # which qubit is measured and in which bit it is stored\nRegister{Vector{UInt8}, Matrix{UInt64}}(Rank 3 stabilizer\n+ Z__\n+ _X_\n+ Z_Z\n═════\n+ XXX\n+ ZZ_\n- __X\n═════\n, Bool[0, 1])\n\njulia> bitview(state)\n2-element Vector{Bool}:\n 0\n 1","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Or you can use the projectXrand!, projectYrand!, and projectZrand! if you prefer a function-call interface.","category":"page"},{"location":"stab-algebra-manual/#Partial-Traces","page":"Manual","title":"Partial Traces","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Partial trace (using traceout!) over even a single qubit might cause many of them to decohere due to entanglement.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> ghz = S\"XXX\n ZZ_\n _ZZ\";\n\njulia> traceout!(ghz, [1])\n+ _ZZ\n+ ___\n+ ___","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"This is somewhat more elegant when the datastructure being used explicitly supports mixed states.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> ghz = MixedStabilizer(S\"XXX\n ZZ_\n _ZZ\");\n\njulia> traceout!(ghz, [1])\n+ _ZZ","category":"page"},{"location":"stab-algebra-manual/#Generating-a-Pauli-Operator-with-Stabilizer-Generators","page":"Manual","title":"Generating a Pauli Operator with Stabilizer Generators","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The generate! function attempts to generate a Pauli operator by multiplying together the operators belonging to a given stabilizer (or reports their independence). This particular function requires the stabilizer to be already canonicalized.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"-XXX\n +ZZI\n -IZZ\";\n\njulia> s = canonicalize!(s)\n- XXX\n- Z_Z\n- _ZZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"It modifies the Pauli operator in place, reducing it to identity if possible. The leftover phase is present to indicate if the phase itself could not have been canceled. The list of indices specifies which rows of the stabilizer were used to generated the desired Pauli operator.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> generate!(P\"XYY\", s)\n(- ___, [1, 3])","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Phases can be neglected, for higher performance.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> generate!(P\"XYY\", s, phases=false)\n(+ ___, [1, 3])","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"If the Pauli operator can not be generated by the stabilizer, nothing value is returned.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> generate!(P\"ZZZ\", s)\n\njulia> generate!(P\"XZX\", s)\n\njulia> generate!(P\"YYY\", s)","category":"page"},{"location":"stab-algebra-manual/#Clifford-Operators","page":"Manual","title":"Clifford Operators","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The CliffordOperator structure represents a linear mapping between stabilizers (which should also preserve commutation relationships, but that is not checked at instantiation). These are n-qubit dense tableaux, representing an operation on n-qubit states. For single- or two-qubit gates, it is much more efficient to use small sparse symbolic clifford operators. A number of predefined Clifford operators are available, their name prefixed with t to mark them as dense tableaux.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> tHadamard\nX₁ ⟼ + Z\nZ₁ ⟼ + X\n\njulia> tPhase\nX₁ ⟼ + Y\nZ₁ ⟼ + Z\n\njulia> tCNOT\nX₁ ⟼ + XX\nX₂ ⟼ + _X\nZ₁ ⟼ + Z_\nZ₂ ⟼ + ZZ\n\njulia> tId1\nX₁ ⟼ + X\nZ₁ ⟼ + Z","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Chaining and tensor products are possible. Same for qubit permutations.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> tHadamard ⊗ tPhase\nX₁ ⟼ + Z_\nX₂ ⟼ + _Y\nZ₁ ⟼ + X_\nZ₂ ⟼ + _Z\n\njulia> tHadamard * tPhase\nX₁ ⟼ - Y\nZ₁ ⟼ + X\n\njulia> permute(tCNOT, [2,1])\nX₁ ⟼ + X_\nX₂ ⟼ + XX\nZ₁ ⟼ + ZZ\nZ₂ ⟼ + _Z","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"You can create custom Clifford operators with C-strings or with a list of Pauli operators.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> C\"-ZZ\n +_Z\n -X_\n +XX\"\nX₁ ⟼ - ZZ\nX₂ ⟼ + _Z\nZ₁ ⟼ - X_\nZ₂ ⟼ + XX\n\njulia> CliffordOperator([P\"-ZZ\", P\"_Z\", P\"-X_\", P\"XX\"])\nX₁ ⟼ - ZZ\nX₂ ⟼ + _Z\nZ₁ ⟼ - X_\nZ₂ ⟼ + XX","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Naturally, the operators can be applied to stabilizer states. This includes high performance in-place operations (and the phase can be neglected with phases=false for faster computation).","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> tCNOT * S\"X_\"\n+ XX\n\njulia> s = S\"X_\";\n\njulia> apply!(s,tCNOT)\n+ XX","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Sparse applications where a small Clifford operator is applied only on a particular subset of a larger stabilizer is also possible, but in such circumstances it is useful to consider using symbolic operators too.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s = S\"Z_YX\";\n\njulia> apply!(s, tCNOT, [4,2]) # Apply the CNOT on qubits 4 and 2\n+ ZXYX","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Pauli operators act as Clifford operators too (but they are rather boring, as they only change signs).","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> P\"XII\" * S\"ZXX\"\n- ZXX","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Internally, the CliffordOperator structure simply stores the tableau representation of the operation.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The apply! function is efficiently multithreaded for CliffordOperators. To start multithreaded Julia, use julia -t where specifies the number of threads.","category":"page"},{"location":"stab-algebra-manual/#Symbolic-Clifford-Operators","page":"Manual","title":"Symbolic Clifford Operators","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Much faster implementations for a number of common Clifford operators are available. They are stored as special named structs, instead of as a full tableau. These are the subtypes of AbstractSingleQubitOperator and AbstractTwoQubitOperator. Currently these are:","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"using QuantumClifford # hide\nusing InteractiveUtils # hide\nsubtypes(QuantumClifford.AbstractSingleQubitOperator)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"subtypes(QuantumClifford.AbstractTwoQubitOperator)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Generally, they have the prefix s for symbolic/small/sparse. They are used slightly differently, as one needs to specify the qubits on which they act while instantiating them:","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> sHadamard(2)\nsHadamard on qubit 2\nX₁ ⟼ + Z\nZ₁ ⟼ + X\n\njulia> sHadamard(2)*S\"XXX\"\n+ XZX\n\njulia> sCNOT(2,3)*S\"XYY\"\n- XXZ","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"The apply! function is efficiently multithreaded for these symbolic operators as well. To start multithreaded Julia, use julia -t where specifies the number of threads.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Symbolic projectors on single qubits also exist: sMX, sMY, sMZ. When used with the Register state representation, they can store the measurement results in the corresponding classical register.","category":"page"},{"location":"stab-algebra-manual/#Destabilizers","page":"Manual","title":"Destabilizers","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Slightly abusing the name: What we call \"destabilizers\" here is a stabilizer and its destabilizing operators saved together. They are implemented with the Destabilizer object and are initialized from a stabilizer.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> s=S\"-XXX\n -ZZI\n +IZZ\";\n\njulia> d = Destabilizer(s)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z__\n+ _X_\n+ __X\n𝒮𝓉𝒶𝒷━\n- XXX\n- ZZ_\n- Z_Z","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"They have convenience methods to extract only the stabilizer and destabilizer pieces:","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> stabilizerview(d)\n- XXX\n- ZZ_\n- Z_Z\n\njulia> destabilizerview(d)\n+ Z__\n+ _X_\n+ __X","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Importantly commuting projections are much faster when tracking the destabilizer as canonicalization is not necessary (an mathcalO(n^2) complexity because it avoids the expensive mathcalO(n^3) canonicalization operation).","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> project!(d,P\"ZZI\")\n(Destablizer 3×3, 0, 0x02)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Non-commuting projections are just as fast as when using only stabilizers.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> project!(d,P\"ZZZ\")\n(Destablizer 3×3, 1, nothing)","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Clifford operations can be applied the same way they are applied to stabilizers.","category":"page"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"julia> apply!(d,tCNOT⊗tHadamard)\n𝒟ℯ𝓈𝓉𝒶𝒷\n- X_Z\n+ XXZ\n+ X__\n𝒮𝓉𝒶𝒷━\n+ _ZX\n- _Z_\n- Z_X","category":"page"},{"location":"stab-algebra-manual/#Mixed-States","page":"Manual","title":"Mixed States","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"Both the Stabilizer and Destabilizer structures have more general forms that enable work with mixed stabilizer states. They are the MixedStabilizer and MixedDestabilizer structures, described in Mixed States. More information that can be seen in the data structures page, which expands upon the algorithms available for each structure.","category":"page"},{"location":"stab-algebra-manual/#Random-States-and-Circuits","page":"Manual","title":"Random States and Circuits","text":"","category":"section"},{"location":"stab-algebra-manual/","page":"Manual","title":"Manual","text":"random_clifford, random_stabilizer, and enumerate_cliffords can be used for the generation of random states.","category":"page"},{"location":"tutandpub/#tutandpub","page":"Tutorials and Publications","title":"Tutorials and Publications","text":"","category":"section"},{"location":"tutandpub/","page":"Tutorials and Publications","title":"Tutorials and Publications","text":"This list has a number of notebooks with tutorials, examples, and reproduction of published results (some of these results originally obtained with this very library).","category":"page"},{"location":"tutandpub/#On-the-topic-of-explicit-use-of-the-Tableaux-formalism-for-Stabilizer-states","page":"Tutorials and Publications","title":"On the topic of explicit use of the Tableaux formalism for Stabilizer states","text":"","category":"section"},{"location":"tutandpub/","page":"Tutorials and Publications","title":"Tutorials and Publications","text":"Quantum coding with low-depth random circuits reproducing results from (Gullans et al., 2020). view on nbviewer.jupyter.org","category":"page"},{"location":"tutandpub/#On-the-Monte-Carlo-and-Perturbative-Expansions-for-**Noisy**-Clifford-circuits","page":"Tutorials and Publications","title":"On the Monte Carlo and Perturbative Expansions for Noisy Clifford circuits","text":"","category":"section"},{"location":"tutandpub/","page":"Tutorials and Publications","title":"Tutorials and Publications","text":"In-depth study of multi-partite entanglement purification circuits reproducing results from (Krastanov et al., 2020). view on nbviewer.jupyter.org\nComparing the Monte Carlo and Perturbative method for noisy circuit simulations. view on nbviewer.jupyter.org\nShowcasing symbolic perturbative expansions of noisy circuits. view on nbviewer.jupyter.org","category":"page"},{"location":"noisycircuits_API/#Full-API-(autogenerated)","page":"API","title":"Full API (autogenerated)","text":"","category":"section"},{"location":"noisycircuits_API/","page":"API","title":"API","text":"warning: Unstable\nThis is experimental functionality with an unstable API.","category":"page"},{"location":"noisycircuits_API/","page":"API","title":"API","text":"Modules = [QuantumClifford.Experimental.NoisyCircuits]\nPrivate = false","category":"page"},{"location":"noisycircuits_API/#QuantumClifford.Experimental.NoisyCircuits.ConditionalGate","page":"API","title":"QuantumClifford.Experimental.NoisyCircuits.ConditionalGate","text":"A conditional gate that either performs truegate or falsegate, depending on the value of controlbit.\n\n\n\n\n\n","category":"type"},{"location":"noisycircuits_API/#QuantumClifford.Experimental.NoisyCircuits.DecisionGate","page":"API","title":"QuantumClifford.Experimental.NoisyCircuits.DecisionGate","text":"A conditional gate that performs one of the gates, depending on the output of decisionfunction applied to the entire classical bit register.\n\n\n\n\n\n","category":"type"},{"location":"noisycircuits_API/#QuantumClifford.Experimental.NoisyCircuits.NoisyBellMeasurement","page":"API","title":"QuantumClifford.Experimental.NoisyCircuits.NoisyBellMeasurement","text":"A Bell measurement in which each of the measured qubits has a chance to have flipped.\n\n\n\n\n\n","category":"type"},{"location":"noisycircuits_perturb/#noisycircuits_perturb","page":"Perturbative Expansions","title":"Perturbative expansions for simulating noisy Clifford circuits","text":"","category":"section"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"DocTestSetup = quote\n using QuantumClifford\n using QuantumClifford.Experimental.NoisyCircuits\n using Quantikz\nend\nCurrentModule = QuantumClifford.Experimental.NoisyCircuits","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"warning: Unstable\nThis is experimental functionality with an unstable API.","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"Import with using QuantumClifford.Experimental.NoisyCircuits.","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"This module enables the simulation of noisy Clifford circuits through a perturbative expansion in the noise parameter (assuming the noise is small). Instead of simulating many Monte Carlo trajectories, only the leading order trajectories are exhaustively enumerated and simulated.","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"Here is an example of a purification circuit (the same circuit seen in the Monte Carlo example)","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"using QuantumClifford # hide\nusing QuantumClifford.Experimental.NoisyCircuits # hide\nusing Quantikz # hide\ngood_bell_state = S\"XX\n ZZ\"\ncanonicalize_rref!(good_bell_state)\ninitial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n\ng1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\ng2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\nm = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\nv = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\nepsilon = 0.01 # The error rate\nn = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n\n# This circuit performs a depolarization at rate `epsilon` to all qubits,\n# then bilater CNOT operations\n# then a Bell measurement\n# followed by checking whether the final result indeed corresponds to the correct Bell pair.\ncircuit = [n,g1,g2,m,v]\n\npetrajectories(initial_state, circuit)","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification.","category":"page"},{"location":"noisycircuits_perturb/#Symbolic-expansions","page":"Perturbative Expansions","title":"Symbolic expansions","text":"","category":"section"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"The perturbative expansion method works with symbolic variables as well. One can use any of the symbolic libraries available in Julia and simply plug symbolic parameters in lieu of numeric parameters. A detailed example is available as a Jupyter notebook.","category":"page"},{"location":"noisycircuits_perturb/#Interface-for-custom-operations","page":"Perturbative Expansions","title":"Interface for custom operations","text":"","category":"section"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"applyop_branches!(s::T, g::Operation; max_order=1)::Vector{Tuple{T,Symbol,Real,Int}} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation, the Real is the probability for that branch, and the Int is the order of that branch.","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"There is also applynoise_branches! which is convenient for use in NoisyGate, but you can also just make up your own noise operator simply by implementing applyop_branches! for it.","category":"page"},{"location":"noisycircuits_perturb/","page":"Perturbative Expansions","title":"Perturbative Expansions","text":"You can also consult the list of implemented operators.","category":"page"},{"location":"graphs/#Graph-States","page":"Graph States","title":"Graph States","text":"","category":"section"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"warning: The `graphstate` API is not considered stable\ngraphstate returns a lot of information about encoding a given stabilizer state in a graph. A different API is being designed that streamlines the work with graph states.","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"Conversion to and from graph states is possible.","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"Consider a GHZ state:","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"using QuantumClifford # hide\nghz(4)","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"It can be converted to a graph state with graphstate","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"graphstate(ghz(4))[1]","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"using Random; Random.seed!(1); using QuantumClifford, GraphMakie, CairoMakie;\nf = Figure(resolution=(200,200))\na = Axis(f[1,1])\ngraphplot!(a,graphstate(ghz(4))[1])\nhidedecorations!(a); hidespines!(a)\na.aspect = DataAspect()\nsave(\"ghz4graph.png\", f); nothing","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"(Image: )","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"Notice that the initial GHZ state was not in the typical graph state form. We can see that explicitly by converting back and forth between the two forms:","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"julia> using Graphs, QuantumClifford\n\njulia> ghz(4)\n+ XXXX\n+ ZZ__\n+ _ZZ_\n+ __ZZ\n\njulia> Stabilizer(Graph(ghz(4)))\n+ XZZZ\n+ ZX__\n+ Z_X_\n+ Z__X","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"There is a set of single-qubit operations that can convert any stabilizer tableau into a state representable as a graph. These transformations are performed implicitly by the Graph constructor when converting from a Stabilizer. If you need the explicit transformation you can use the graphstate function that specifies which qubits require a Hadamard, Inverse Phase, or Phase Flip gate. The graph_gatesequence or graph_gate helper functions can be used to generate the exact operations:","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"julia> s = ghz(4)\n+ XXXX\n+ ZZ__\n+ _ZZ_\n+ __ZZ\n\njulia> g, h_idx, ip_idx, z_idx = graphstate(s);\n\njulia> gate = graph_gate(h_idx, ip_idx, z_idx, nqubits(s))\nX₁ ⟼ + X___\nX₂ ⟼ + _Z__\nX₃ ⟼ + __Z_\nX₄ ⟼ + ___Z\nZ₁ ⟼ + Z___\nZ₂ ⟼ + _X__\nZ₃ ⟼ + __X_\nZ₄ ⟼ + ___X\n\njulia> canonicalize!(apply!(s,gate)) == canonicalize!(Stabilizer(g))\ntrue","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"These converters also provides for a convenient way to create graph and cluster states, by using the helper constructors provided in Graphs.jl.","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"julia> Stabilizer(grid([4,1])) # Linear cluster state\n+ XZ__\n+ ZXZ_\n+ _ZXZ\n+ __ZX\n\njulia> Stabilizer(grid([2,2])) # Small 2D cluster state\n+ XZZ_\n+ ZX_Z\n+ Z_XZ\n+ _ZZX","category":"page"},{"location":"graphs/","page":"Graph States","title":"Graph States","text":"Graphs are represented with the Graphs.jl package and plotting can be done both in Plots.jl and Makie.jl (with GraphMakie).","category":"page"},{"location":"ECC_API/#Full-ECC-API-(autogenerated)","page":"API","title":"Full ECC API (autogenerated)","text":"","category":"section"},{"location":"ECC_API/","page":"API","title":"API","text":"Modules = [QuantumClifford.ECC]\nPrivate = false","category":"page"},{"location":"ECC_API/#QuantumClifford.ECC.CSS","page":"API","title":"QuantumClifford.ECC.CSS","text":"An arbitrary CSS error correcting code defined by its X and Z checks.\n\njulia> CSS([0 1 1 0; 1 1 0 0], [1 1 1 1]) |> parity_checks\n+ _XX_\n+ XX__\n+ ZZZZ\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.Cleve8","page":"API","title":"QuantumClifford.ECC.Cleve8","text":"A pedagogical example of a quantum error correcting [8,3] code used in (Cleve and Gottesman, 1997).\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.CommutationCheckECCSetup","page":"API","title":"QuantumClifford.ECC.CommutationCheckECCSetup","text":"Configuration for ECC evaluator that does not simulate any ECC circuits, rather it simply checks the commutation of the parity check and the Pauli error.\n\nThis is much faster than any other simulation method, but it is incapable of noisy-circuit simulations and thus useless for fault-tolerance studies.\n\nSee also: NaiveSyndromeECCSetup, ShorSyndromeECCSetup\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.Gottesman","page":"API","title":"QuantumClifford.ECC.Gottesman","text":"The family of [[2ʲ, 2ʲ - j - 2, 3]] Gottesman codes, also known as quantum Hamming codes, as described in Gottesman's 1997 PhD thesis and in (Gottesman, 1996).\n\nYou might be interested in consulting (Yu et al., 2013) and (Chao and Reichardt, 2017) as well.\n\nThe ECC Zoo has an entry for this family\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.NaiveSyndromeECCSetup","page":"API","title":"QuantumClifford.ECC.NaiveSyndromeECCSetup","text":"Configuration for ECC evaluator that runs the simplest syndrome measurement circuit.\n\nThe circuit is being simulated (as opposed to doing only a quick commutation check). This circuit would give poor performance if there is non-zero gate noise.\n\nSee also: CommutationCheckECCSetup, ShorSyndromeECCSetup\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.ShorSyndromeECCSetup","page":"API","title":"QuantumClifford.ECC.ShorSyndromeECCSetup","text":"Configuration for ECC evaluators that simulate the Shor-style syndrome measurement (without a flag qubit).\n\nThe simulated circuit includes:\n\nperfect noiseless encoding (encoding and its fault tolerance are not being studied here)\none round of \"memory noise\" after the encoding but before the syndrome measurement\nperfect preparation of entangled ancillary qubits\nnoisy Shor-style syndrome measurement (only two-qubit gate noise)\nnoiseless \"logical state measurement\" (providing the comparison data when evaluating the decoder)\n\nSee also: CommutationCheckECCSetup, NaiveSyndromeECCSetup\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.TableDecoder","page":"API","title":"QuantumClifford.ECC.TableDecoder","text":"A simple look-up table decoder for error correcting codes.\n\nThe lookup table contains only weight=1 errors, thus it is small, but at best it provides only for distance=3 decoding.\n\nThe size of the lookup table would grow exponentially quickly for higher distances.\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.Toric","page":"API","title":"QuantumClifford.ECC.Toric","text":"The Toric code.\n\n\n\n\n\n","category":"type"},{"location":"ECC_API/#QuantumClifford.ECC.BeliefPropDecoder-Tuple","page":"API","title":"QuantumClifford.ECC.BeliefPropDecoder","text":"A simple Belief Propagation decoder built around tools from LDPCDecoders.jl.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.PyBeliefPropDecoder-Tuple","page":"API","title":"QuantumClifford.ECC.PyBeliefPropDecoder","text":"A Belief Propagation decoder built around tools from the python package ldpc available from the julia package PyQDecoders.jl.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.PyBeliefPropOSDecoder-Tuple","page":"API","title":"QuantumClifford.ECC.PyBeliefPropOSDecoder","text":"A Belief Propagation decoder with ordered statistics decoding, built around tools from the python package ldpc available from the julia package PyQDecoders.jl.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.PyMatchingDecoder-Tuple","page":"API","title":"QuantumClifford.ECC.PyMatchingDecoder","text":"A perfect matching decoder built around tools from the python package pymatching available from the julia package PyQDecoders.jl.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.code_k-Tuple{Any}","page":"API","title":"QuantumClifford.ECC.code_k","text":"The number of logical qubits in a code.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.code_n","page":"API","title":"QuantumClifford.ECC.code_n","text":"The number of physical qubits in a code.\n\n\n\n\n\n","category":"function"},{"location":"ECC_API/#QuantumClifford.ECC.code_s","page":"API","title":"QuantumClifford.ECC.code_s","text":"The number of stabilizer checks in a code.\n\n\n\n\n\n","category":"function"},{"location":"ECC_API/#QuantumClifford.ECC.distance","page":"API","title":"QuantumClifford.ECC.distance","text":"The distance of a code.\n\n\n\n\n\n","category":"function"},{"location":"ECC_API/#QuantumClifford.ECC.evaluate_decoder-Tuple{QuantumClifford.ECC.AbstractSyndromeDecoder, QuantumClifford.ECC.AbstractECCSetup, Int64}","page":"API","title":"QuantumClifford.ECC.evaluate_decoder","text":"Evaluate the performance of a given decoder (e.g. TableDecoder) and a given style of running an ECC code (e.g. ShorSyndromeECCSetup)\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.evaluate_decoder-Tuple{QuantumClifford.ECC.AbstractSyndromeDecoder, Vararg{Any, 5}}","page":"API","title":"QuantumClifford.ECC.evaluate_decoder","text":"Evaluate the performance of an error-correcting circuit.\n\nThis method requires you give the circuit that performs both syndrome measurements and (probably noiseless) logical state measurements. The faults matrix that translates an error vector into corresponding logical errors is necessary as well.\n\nThis is a relatively barebones method that assumes the user prepares necessary circuits, etc. It is a method that is used internally by more user-frienly methods providing automatic conversion of codes and noise models to the necessary noisy circuits.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.faults_matrix-Tuple{Stabilizer}","page":"API","title":"QuantumClifford.ECC.faults_matrix","text":"Error-to-logical-observable map (a.k.a. fault matrix) of a code.\n\nFor a code with n physical qubits and k logical qubits this function returns a 2k × 2n binary matrix O such that O[i,j] is true if the logical observable of index i is flipped by the single physical qubit error of index j. Indexing is such that:\n\nO[1:k,:] is the error-to-logical-X-observable map (logical X observable, i.e. triggered by logical Z errors)\nO[k+1:2k,:] is the error-to-logical-Z-observable map\nO[:,1:n] is the X-physical-error-to-logical-observable map\nO[n+1:2n,:] is the Z-physical-error-to-logical-observable map\n\nE.g. for k=1, n=10, then if O[2,5] is true, then the logical Z observable is flipped by a X₅ error; and if O[1,12] is true, then the logical X observable is flipped by a Z₂ error.\n\nOf note is that there is a lot of freedom in choosing the logical operations! A logical operator multiplied by a stabilizer operator is still a logical operator. Similarly there is a different fault matrix for each choice of logical operators. But once the logical operators are picked, the fault matrix is fixed.\n\nBelow we show an example that uses the Shor code. While it is not the smallest code, it is a convenient choice to showcase the importance of the fault matrix when dealing with degenerate codes where a correction operation and an error do not need to be the same.\n\nFirst, consider a single-qubit error, potential correction operations, and their effect on the Shor code:\n\njulia> using QuantumClifford.ECC: faults_matrix, Shor9\n\njulia> state = MixedDestabilizer(Shor9())\n𝒟ℯ𝓈𝓉𝒶𝒷━━━━━\n+ Z________\n+ ___Z_____\n+ _X_______\n+ __X______\n+ ____X____\n+ _____X___\n+ ______X__\n+ _______X_\n𝒳ₗ━━━━━━━━━\n+ ______XXX\n𝒮𝓉𝒶𝒷━━━━━━━\n+ XXX___XXX\n+ ___XXXXXX\n+ ZZ_______\n+ Z_Z______\n+ ___ZZ____\n+ ___Z_Z___\n+ ______Z_Z\n+ _______ZZ\n𝒵ₗ━━━━━━━━━\n+ Z__Z____Z\n\njulia> err_Z₁ = single_z(9,1) # the error we will simulate\n+ Z________\n\njulia> cor_Z₂ = single_z(9,2) # the correction operation we will perform\n+ _Z_______\n\njulia> err_Z₁ * state # observe that one of the syndrome bits is now flipped\n𝒟ℯ𝓈𝓉𝒶𝒷━━━━━\n+ Z________\n+ ___Z_____\n+ _X_______\n+ __X______\n+ ____X____\n+ _____X___\n+ ______X__\n+ _______X_\n𝒳ₗ━━━━━━━━━\n+ ______XXX\n𝒮𝓉𝒶𝒷━━━━━━━\n- XXX___XXX\n+ ___XXXXXX\n+ ZZ_______\n+ Z_Z______\n+ ___ZZ____\n+ ___Z_Z___\n+ ______Z_Z\n+ _______ZZ\n𝒵ₗ━━━━━━━━━\n+ Z__Z____Z\n\njulia> cor_Z₂ * err_Z₁ * state # we are back to a good code state\n𝒟ℯ𝓈𝓉𝒶𝒷━━━━━\n+ Z________\n+ ___Z_____\n- _X_______\n+ __X______\n+ ____X____\n+ _____X___\n+ ______X__\n+ _______X_\n𝒳ₗ━━━━━━━━━\n+ ______XXX\n𝒮𝓉𝒶𝒷━━━━━━━\n+ XXX___XXX\n+ ___XXXXXX\n+ ZZ_______\n+ Z_Z______\n+ ___ZZ____\n+ ___Z_Z___\n+ ______Z_Z\n+ _______ZZ\n𝒵ₗ━━━━━━━━━\n+ Z__Z____Z\n\njulia> bad_Z₆Z₉ = single_z(9,6) * single_z(9,9) # a different \"correction\" operation\n+ _____Z__Z\n\njulia> bad_Z₆Z₉ * err_Z₁ * state # the syndrome is trivial, but now we have a logical error\n𝒟ℯ𝓈𝓉𝒶𝒷━━━━━\n+ Z________\n+ ___Z_____\n+ _X_______\n+ __X______\n+ ____X____\n- _____X___\n+ ______X__\n+ _______X_\n𝒳ₗ━━━━━━━━━\n- ______XXX\n𝒮𝓉𝒶𝒷━━━━━━━\n+ XXX___XXX\n+ ___XXXXXX\n+ ZZ_______\n+ Z_Z______\n+ ___ZZ____\n+ ___Z_Z___\n+ ______Z_Z\n+ _______ZZ\n𝒵ₗ━━━━━━━━━\n+ Z__Z____Z\n\nThe success of cor_Z₂ and the failure of bad_Z₆Z₉ can be immediately seen through the fault matrix, as the wrong \"correction\" does not result in the same logical flips ad the error:\n\njulia> O = faults_matrix(Shor9())\n2×18 BitMatrix:\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1\n 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0\n\njulia> O * stab_to_gf2(err_Z₁)\n2-element Vector{Int64}:\n 0\n 0\n\njulia> O * stab_to_gf2(cor_Z₂)\n2-element Vector{Int64}:\n 0\n 0\n\njulia> O * stab_to_gf2(bad_Z₆Z₉)\n2-element Vector{Int64}:\n 1\n 0\n\nWhile its use in this situation is rather contrived, the fault matrix is incredibly useful when running large scale simulations in which we want a separate fast error sampling process, (e.g. with Pauli frames) and a syndrome decoding process, without coupling between them. We just gather all our syndrome measurement and logical observables from the Pauli frame simulations, and then use them with the fault matrix in the syndrome decoding simulation.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.isdegenerate","page":"API","title":"QuantumClifford.ECC.isdegenerate","text":"Check if the code is degenerate with respect to a given set of error or with respect to all \"up to d physical-qubit\" errors (defaulting to d=1).\n\njulia> using QuantumClifford.ECC\n\njulia> isdegenerate(Shor9(), [single_z(9,1), single_z(9,2)])\ntrue\n\njulia> isdegenerate(Shor9(), [single_z(9,1), single_x(9,1)])\nfalse\n\njulia> isdegenerate(Steane7(), 1)\nfalse\n\njulia> isdegenerate(Steane7(), 2)\ntrue\n\n\n\n\n\n","category":"function"},{"location":"ECC_API/#QuantumClifford.ECC.naive_encoding_circuit-Tuple{Any}","page":"API","title":"QuantumClifford.ECC.naive_encoding_circuit","text":"Encoding physical qubits into a larger logical code.\n\nThe initial physical qubits to be encoded have to be at indices n-k+1:n.\n\ninfo: Encoding circuits are not fault-tolerant\nEncoding circuits are not fault-tolerant, and thus should not be used in practice. Instead, you should measure the stabilizers of the code and the logical observables, thus projecting into the code space (which can be fault-tolerant).\n\nThe canonicalization operation performed on the code may permute the qubits (see canonicalize_gott!). That permutation is corrected for with SWAP gates by default (controlled by the undoperm keyword argument).\n\nBased on (Cleve and Gottesman, 1997) and (Gottesman, 1997), however it seems the published algorithm has some errors. Consult the erratum, as well as the more recent (Grassl, 2002) and (Grassl, 2011), and be aware that this implementation also uses H instead of Z gates.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.naive_syndrome_circuit","page":"API","title":"QuantumClifford.ECC.naive_syndrome_circuit","text":"Generate the non-fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.\n\nUse the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts.\n\nReturns the circuit, the number of ancillary qubits that were added, and a list of bit indices that will store the measurement results.\n\nSee also: shor_syndrome_circuit\n\n\n\n\n\n","category":"function"},{"location":"ECC_API/#QuantumClifford.ECC.parity_checks","page":"API","title":"QuantumClifford.ECC.parity_checks","text":"Parity check tableau of a code.\n\nSee also: parity_checks_x and parity_checks_z\n\n\n\n\n\n","category":"function"},{"location":"ECC_API/#QuantumClifford.ECC.parity_checks_x-Tuple{QuantumClifford.ECC.AbstractECC}","page":"API","title":"QuantumClifford.ECC.parity_checks_x","text":"Parity check boolean matrix of a code (only the X entries in the tableau, i.e. the checks for Z errors).\n\nOnly CSS codes have this method.\n\nSee also: parity_checks\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.parity_checks_z-Tuple{QuantumClifford.ECC.AbstractECC}","page":"API","title":"QuantumClifford.ECC.parity_checks_z","text":"Parity check boolean matrix of a code (only the Z entries in the tableau, i.e. the checks for X errors).\n\nOnly CSS codes have this method.\n\nSee also: parity_checks\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.rate-Tuple{Any}","page":"API","title":"QuantumClifford.ECC.rate","text":"The rate of a code.\n\n\n\n\n\n","category":"method"},{"location":"ECC_API/#QuantumClifford.ECC.shor_syndrome_circuit","page":"API","title":"QuantumClifford.ECC.shor_syndrome_circuit","text":"Generate the Shor fault-tolerant stabilizer measurement cicuit for a given code instance or parity check tableau.\n\nUse the ancillary_index and bit_index arguments to offset where the corresponding part the circuit starts. Ancillary qubits\n\nReturns:\n\nThe ancillary cat state preparation circuit.\nThe Shor syndrome measurement circuit.\nThe number of ancillary qubits that were added.\nThe list of bit indices that store the final measurement results.\n\nSee also: naive_syndrome_circuit\n\n\n\n\n\n","category":"function"},{"location":"allops/#all-operations","page":"All Gates","title":"Operations - Gates, Measurements, and More","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"DocTestSetup = quote\n using QuantumClifford\n using StableRNGs\n rng = StableRNG(42)\nend","category":"page"},{"location":"allops/#Operations","page":"All Gates","title":"Operations","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"Acting on quantum states can be performed either:","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"In a \"linear algebra\" language where unitaries, measurements, and other operations have separate interfaces. This is an explicitly deterministic lower-level interface, which provides a great deal of control over how tableaux are manipulated. See the Stabilizer Tableau Algebra Manual as a primer on these approaches.\nOr in a \"circuit\" language, where the operators (and measurements and noise) are represented as circuit gates. This is a higher-level interface in which the outcome of an operation can be stochastic. The API for it is centered around the apply! function. Particularly useful for Monte Carlo simulations and Perturbative Expansion Symbolic Results.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"In the circuit language, all operations can be applied on a state with the apply! function. Whether they are deterministic and their computational complexity is listed in the table below. A list of lower-level \"linear algebra style\" functions for more control over how an operation is performed is also given.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"Type Deterministic 𝒪(nˣ) Low-level functions\nAbstractOperation \n├─ AbstractCliffordOperator \n│ ├─ AbstractSymbolicOperator \n│ │ ├─ AbstractSingleQubitOperator \n│ │ │ ├─ SingleQubitOperator ✔️ n \n│ │ │ ├─ sHadamard ✔️ n \n│ │ │ ├─ sId1 ✔️ n \n│ │ │ ├─ sInvPhase ✔️ n \n│ │ │ ├─ sPhase ✔️ n \n│ │ │ ├─ sX ✔️ n \n│ │ │ ├─ sY ✔️ n \n│ │ │ └─ sZ ✔️ n \n│ │ └─ AbstractTwoQubitOperator \n│ │ ├─ sCNOT ✔️ n \n│ │ ├─ sCPHASE ✔️ n \n│ │ └─ sSWAP ✔️ n \n│ │ \n│ ├─ CliffordOperator ✔️ n³ \n│ ├─ PauliOperator ✔️ n² \n│ └─ SparseGate ✔️ kn² \n├─ AbstractMeasurement \n│ ├─ PauliMeasurement ❌ n² project!, projectrand!\n│ ├─ sMX ❌ n² projectX!\n│ ├─ sMY ❌ n² projectY!\n│ └─ sMZ ❌ n² projectZ!\n│ \n├─ BellMeasurement ❌ n² \n├─ NoiseOp ❌ ? applynoise!\n├─ NoiseOpAll ❌ ? applynoise!\n├─ NoisyGate ❌ ? applynoise!\n└─ Reset ✔️ kn² reset_qubits!","category":"page"},{"location":"allops/#Details-of-Operations-Supported-by-[apply!](@ref)","page":"All Gates","title":"Details of Operations Supported by apply!","text":"","category":"section"},{"location":"allops/#Unitary-Gates","page":"All Gates","title":"Unitary Gates","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"We distinguish between symbolic gates like sCNOT that have specialized (fast) apply! methods (usually just for single and two qubit gates) and general tableau representation of gates like CliffordOperator that can represent any multi-qubit gate.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"Predefined unitary gates are available, like sCNOT, sHadamard, etc.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"using QuantumClifford # hide\nusing QuantumClifford.Experimental.NoisyCircuits # hide\nusing Quantikz # hide\n[sCNOT(2,4),sHadamard(2),sCPHASE(1,3),sSWAP(2,4)]","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"Any arbitrary tableaux can be used as a gate too. ","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"They can be specified by giving a Clifford operator tableaux and the indices on which it acts (particularly useful for gates acting on a small part of a circuit):","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"using QuantumClifford # hide\nusing QuantumClifford.Experimental.NoisyCircuits # hide\nusing Quantikz # hide\nSparseGate(tCNOT, [2,4])","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"The Clifford operator tableaux can be completely arbitrary.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"SparseGate(random_clifford(3), [2,4,5])","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"If the Clifford operator acts on all qubits, we do not need to specify indices, just use the operator.","category":"page"},{"location":"allops/#Noisy-Gates","page":"All Gates","title":"Noisy Gates","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"Each gate can be followed by noise applied to the qubits on which it has acted. This is done by wrapping the given gate into a NoisyGate","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"ε = 0.03 # X/Y/Z error probability\nnoise = UnbiasedUncorrelatedNoise(ε)\nnoisy_gate = NoisyGate(SparseGate(tCNOT, [2,4]), noise)","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"In circuit diagrams the noise is not depicted, but after each application of the gate defined in noisy_gate, a noise operator will also be applied. The example above is of Pauli Depolarization implemented by UnbiasedUncorrelatedNoise.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"One can also apply only the noise operator by using NoiseOp which acts only on specified qubits. Or alternatively, one can use NoiseOpAll in order to apply noise to all qubits.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"[NoiseOp(noise, [4,5]), NoiseOpAll(noise)]","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"The machinery behind noise processes and different types of noise is detailed in the section on noise","category":"page"},{"location":"allops/#Coincidence-Measurements","page":"All Gates","title":"Coincidence Measurements","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"Global parity measurements involving single-qubit projections and classical communication are implemented with BellMeasurement. One needs to specify the axes of measurement and the qubits being measured. If the parity is trivial, the circuit continues, if the parity is non-trivial, the circuit ends and reports a detected failure. This operator is frequently used in the simulation of entanglement purification.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"BellMeasurement([sMX(1), sMY(3), sMZ(4)])","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"There is also NoisyBellMeasurement that takes the bit-flip probability of a single-qubit measurement as a third argument.","category":"page"},{"location":"allops/#Stabilizer-Measurements","page":"All Gates","title":"Stabilizer Measurements","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"A measurement over one or more qubits can also be performed, e.g., a direct stabilizer measurement on multiple qubits without the use of ancillary qubits. When applied to multiple qubits, this differs from BellMeasurement as it performs a single projection, unlike BellMeasurement which performs a separate projection for every single qubit involved. This measurement is implemented in PauliMeasurement which requires a Pauli operator on which to project and the index of the classical bit in which to store the result. Alternatively, there are sMX, sMZ, sMY if you are measuring a single qubit.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"[PauliMeasurement(P\"XYZ\", 1), sMZ(2, 2)]","category":"page"},{"location":"allops/#Reset-Operations","page":"All Gates","title":"Reset Operations","text":"","category":"section"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"The Reset operations lets you trace out the specified qubits and set their state to a specific tableau.","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"new_state = random_stabilizer(3)\nqubit_indices = [1,2,3]\nReset(new_state, qubit_indices)","category":"page"},{"location":"allops/","page":"All Gates","title":"All Gates","text":"It can be done anywhere in a circuit, not just at the beginning.","category":"page"},{"location":"noisycircuits/#Simulation-of-Noisy-Clifford-Circuits","page":"Simulation of Noisy Circuits","title":"Simulation of Noisy Clifford Circuits","text":"","category":"section"},{"location":"noisycircuits/","page":"Simulation of Noisy Circuits","title":"Simulation of Noisy Circuits","text":"DocTestSetup = quote\n using QuantumClifford\n using QuantumClifford.Experimental.NoisyCircuits\nend\nCurrentModule = QuantumClifford.Experimental.NoisyCircuits","category":"page"},{"location":"noisycircuits/","page":"Simulation of Noisy Circuits","title":"Simulation of Noisy Circuits","text":"warning: Unstable\nThis is unfinished experimental functionality that will change significantly.","category":"page"},{"location":"noisycircuits/","page":"Simulation of Noisy Circuits","title":"Simulation of Noisy Circuits","text":"We have experimental support for simulation of noisy Clifford circuits which can be imported with using QuantumClifford.Experimental.NoisyCircuits.","category":"page"},{"location":"noisycircuits/","page":"Simulation of Noisy Circuits","title":"Simulation of Noisy Circuits","text":"Both Monte Carlo and Perturbative Expansion approaches are supported. When performing a perturbative expansion in the noise parameter, the expansion can optionally be performed symbolically, to arbitrary high orders.","category":"page"},{"location":"noisycircuits/","page":"Simulation of Noisy Circuits","title":"Simulation of Noisy Circuits","text":"Multiple notebooks with examples are also available. For instance, see this tutorial on entanglement purification for many examples.","category":"page"},{"location":"ECC_evaluating/#ecc_evaluating","page":"Evaluating codes and decoders","title":"Evaluating an ECC code and decoders","text":"","category":"section"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"DocTestSetup = quote\n using QuantumClifford\n using QuantumClifford.ECC\nend\nCurrentModule = QuantumClifford.ECC","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"warning: The documentation is incomplete\nWhile waiting for a better documentation than the small example below, consider looking into evaluate_decoder, TableDecoder, BeliefPropDecoder, PyBeliefPropDecoder, PyMatchingDecoder, CommutationCheckECCSetup, NaiveSyndromeECCSetup, ShorSyndromeECCSetup","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"This is a quick and durty example on how to use some of the decoders.","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"A function to plot the results of ","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"using CairoMakie\n\nfunction make_decoder_figure(phys_errors, results, title=\"\")\n minlim = min(minimum(phys_errors),minimum(results[results.!=0]))\n maxlim = min(1, max(maximum(phys_errors),maximum(results[results.!=0])))\n\n fresults = copy(results)\n fresults[results.==0] .= NaN\n\n f = Figure()\n a = Axis(f[1,1],\n xscale=log10, yscale=log10,\n limits=(minlim,maxlim,minlim,maxlim),\n aspect=DataAspect(),\n xlabel=\"physical error rate\",\n ylabel=\"logical error rate\",\n title=title)\n lines!(a, [minlim,maxlim],[minlim,maxlim], color=:black)\n for (i,sresults) in enumerate(eachslice(fresults, dims=1))\n scatter!(a, phys_errors, sresults[:,1], marker=:+, color=Cycled(i))\n scatter!(a, phys_errors, sresults[:,2], marker=:x, color=Cycled(i))\n end\n f\nend","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"Testing out a lookup table decoder on a small code.","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"using QuantumClifford\nusing QuantumClifford.ECC\n\nmem_errors = 0.001:0.0005:0.01\ncodes = [Shor9()]\nresults = zeros(length(codes), length(mem_errors), 2)\n\nfor (ic, c) in pairs(codes)\n for (i,m) in pairs(mem_errors)\n setup = CommutationCheckECCSetup(m)\n decoder = TableDecoder(c)\n r = evaluate_decoder(decoder, setup, 10000)\n results[ic,i,:] .= r\n end\nend\n\nmake_decoder_figure(mem_errors, results, \"Shor's code with a lookup table decoder\")","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"Testing out the toric code with a decoder provided by the python package pymatching (provided in julia by the meta package PyQDecoders.jl).","category":"page"},{"location":"ECC_evaluating/","page":"Evaluating codes and decoders","title":"Evaluating codes and decoders","text":"import PyQDecoders\n\nmem_errors = 0.001:0.005:0.1\ncodes = [Toric(4,4), Toric(6,6)]\nresults = zeros(length(codes), length(mem_errors), 2)\n\nfor (ic, c) in pairs(codes)\n for (i,m) in pairs(mem_errors)\n setup = ShorSyndromeECCSetup(m, 0)\n decoder = PyMatchingDecoder(c)\n r = evaluate_decoder(decoder, setup, 1000)\n results[ic,i,:] .= r\n end\nend\n\nmake_decoder_figure(mem_errors, results, \"Toric code with a MWPM decoder\")","category":"page"},{"location":"canonicalization/#Canonicalization-operations","page":"Canonicalization","title":"Canonicalization operations","text":"","category":"section"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"Different types of canonicalization operations are implemented. All of them are types of Gaussian elimination.","category":"page"},{"location":"canonicalization/#[canonicalize!](@ref)","page":"Canonicalization","title":"canonicalize!","text":"","category":"section"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"First do elimination on all X components and only then perform elimination on the Z components. Based on (Garcia et al., 2012). It is used in logdot for inner products of stabilizer states.","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"The final tableaux, if square should look like the following (Image: )","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"If the tableaux is shorter than a square, the diagonals might not reach all the way to the right.","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"using QuantumClifford, CairoMakie\nf=Figure()\nstabilizerplot_axis(f[1,1], canonicalize!(random_stabilizer(20,30)))\nf","category":"page"},{"location":"canonicalization/#[canonicalize_rref!](@ref)","page":"Canonicalization","title":"canonicalize_rref!","text":"","category":"section"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"Cycle between elimination on X and Z for each qubit. Particularly useful for tracing out qubits. Based on (Audenaert and Plenio, 2005). For convenience reasons, the canonicalization starts from the bottom row, and you can specify as a second argument which columns to be canonicalized (useful for tracing out arbitrary qubits, e.g., in traceout!).","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"The tableau canonicalization is done in recursive steps, each one of which results in something akin to one of these three options (Image: )","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"using QuantumClifford, CairoMakie\nf=Figure()\nstabilizerplot_axis(f[1,1], canonicalize_rref!(random_stabilizer(20,30),1:30)[1])\nf","category":"page"},{"location":"canonicalization/#[canonicalize_gott!](@ref)","page":"Canonicalization","title":"canonicalize_gott!","text":"","category":"section"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"First do elimination on all X components and only then perform elimination on the Z components, but without touching the qubits that were eliminated during the X pass. Unlike other canonicalization operations, qubit columns are reordered, providing for a straight diagonal in each block. Particularly useful as certain blocks of the new created matrix are related to logical operations of the corresponding code, e.g. computing the logical X and Z operators of a MixedDestabilizer. Based on (Gottesman, 1997).","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"A canonicalized tableau would look like the following (the right-most block does not exist for square tableaux). (Image: )","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"using QuantumClifford, CairoMakie\nf=Figure()\nstabilizerplot_axis(f[1,1], canonicalize_gott!(random_stabilizer(30))[1])\nf","category":"page"},{"location":"canonicalization/#[canonicalize_clip!](@ref)","page":"Canonicalization","title":"canonicalize_clip!","text":"","category":"section"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"Convert to the \"clipped\" gauge of a stabilizer state resulting in a \"river\" of non-identity operators around the diagonal.","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"using QuantumClifford, CairoMakie\nf=Figure()\nstabilizerplot_axis(f[1,1], canonicalize_clip!(random_stabilizer(30)))\nf","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"The properties of the clipped gauge are:","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"Each qubit is the left/right \"endpoint\" of exactly two stabilizer rows.\nFor the same qubit the two endpoints are always different Pauli operators.","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"This canonicalization is used to derive the bigram a stabilizer state, which is also related to entanglement entropy in the state.","category":"page"},{"location":"canonicalization/","page":"Canonicalization","title":"Canonicalization","text":"Introduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019).","category":"page"},{"location":"noisycircuits_mc/#noisycircuits_mc","page":"Monte Carlo","title":"Monte Carlo simulations of noisy Clifford circuits","text":"","category":"section"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"DocTestSetup = quote\n using QuantumClifford\n using QuantumClifford.Experimental.NoisyCircuits\n using Quantikz\nend\nCurrentModule = QuantumClifford.Experimental.NoisyCircuits","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"warning: Unstable\nThis is experimental functionality with an unstable API.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"Import with using QuantumClifford.Experimental.NoisyCircuits.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"This module enables the simulation of noisy Clifford circuits through a Monte Carlo method where the same circuit is evaluated multiple times with random errors interspersed through it as prescribed by a given error model.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"Below is an example of a purification circuit. We first prepare the circuit we desire to use, including a noise model. Quantikz.jl was is used to visualize the circuit.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"using QuantumClifford # hide\nusing QuantumClifford.Experimental.NoisyCircuits # hide\nusing Quantikz # hide\ngood_bell_state = S\"XX\n ZZ\"\ninitial_state = MixedDestabilizer(good_bell_state⊗good_bell_state)\n\ng1 = sCNOT(1,3) # CNOT between qubit 1 and qubit 3 (both with Alice)\ng2 = sCNOT(2,4) # CNOT between qubit 2 and qubit 4 (both with Bob)\nm = BellMeasurement([sMX(3),sMX(4)]) # Bell measurement on qubit 3 and 4\nv = VerifyOp(good_bell_state,[1,2]) # Verify that qubit 1 and 2 indeed form a good Bell pair\nepsilon = 0.01 # The error rate\nn = NoiseOpAll(UnbiasedUncorrelatedNoise(epsilon))\n\n# This circuit performs a depolarization at rate `epsilon` to all qubits,\n# then bilater CNOT operations\n# then a Bell measurement\n# followed by checking whether the final result indeed corresponds to the correct Bell pair.\ncircuit = [n,g1,g2,m,v]","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"And we can run a Monte Carlo simulation of that circuit with mctrajectories.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"mctrajectories(initial_state, circuit, trajectories=500)","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"For more examples, see the notebook comparing the Monte Carlo and Perturbative method or this tutorial on entanglement purification for many examples.","category":"page"},{"location":"noisycircuits_mc/#Interface-for-custom-operations","page":"Monte Carlo","title":"Interface for custom operations","text":"","category":"section"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"If you want to create a custom gate type (e.g. calling it Operation), you need to definite the following methods.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"applywstatus!(s::T, g::Operation)::Tuple{T,Symbol} where T is a tableaux type like Stabilizer or a Register. The Symbol is the status of the operation. Predefined statuses are kept in the registered_statuses list, but you can add more. Be sure to expand this list if you want the trajectory simulators using your custom statuses to output all trajectories.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"There is also applynoise! which is convenient wait to create a noise model that can then be plugged into the NoisyGate struct, letting you reuse the predefined perfect gates and measurements. However, you can also just make up your own noise operator simply by implementing applywstatus! for it.","category":"page"},{"location":"noisycircuits_mc/","page":"Monte Carlo","title":"Monte Carlo","text":"You can also consult the list of implemented operators.","category":"page"},{"location":"commonstates/#Useful-States-and-Operators","page":"Useful States","title":"Useful States and Operators","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"DocTestSetup = quote\n using QuantumClifford\n using StableRNGs\n rng = StableRNG(42)\nend","category":"page"},{"location":"commonstates/#States","page":"Useful States","title":"States","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Below are convenience constructors for common types of states and operators, already implemented in this library.","category":"page"},{"location":"commonstates/#Pauli-Operators","page":"Useful States","title":"Pauli Operators","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Single qubit PauliOperator is implemented in [single_z] and [single_x].","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> single_z(4,2)\n+ _Z__\n\njulia> single_x(4,3)\n+ __X_","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"All identity operators use zero.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> zero(PauliOperator, 3)\n+ ___\n\njulia> zero(P\"XYZXYZ\")\n+ ______","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Random Pauli operators are implemented as well (with or without a random phase).","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> using StableRNGs; rng = StableRNG(42);\n\njulia> random_pauli(rng, 4)\n+i_ZZ_\n\njulia> random_pauli(rng, 4; nophase=true)\n+ ZXZY","category":"page"},{"location":"commonstates/#Stabilizer-States","page":"Useful States","title":"Stabilizer States","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"An all-identity stabilizer can be created with zero.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> zero(Stabilizer, 3)\n+ ___\n+ ___\n+ ___\n\njulia> zero(Stabilizer, 2, 3)\n+ ___\n+ ___\n\njulia> zero(S\"XIZ\n YZX\")\n+ ___\n+ ___","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Diagonal stabilizers in different bases are available as well, through one.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> one(Stabilizer, 3)\n+ Z__\n+ _Z_\n+ __Z\n\njulia> one(Stabilizer, 3; basis=:Y)\n+ Y__\n+ _Y_\n+ __Y\n\njulia> one(S\"XX\n ZZ\")\n+ Z_\n+ _Z","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"A random stabilizer (or destabilizers or Clifford operators) can be created as well. We use the algorithm described in (Bravyi and Maslov, 2021).","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> random_stabilizer(rng, 2,5)\n+ YZXZZ\n- XZYYY","category":"page"},{"location":"commonstates/#Mixed-States","page":"Useful States","title":"Mixed States","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Similarly, one can create a diagonal mixed state.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> one(MixedDestabilizer, 2, 3)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ X__\n+ _X_\n𝒳ₗ━━━\n+ __X\n𝒮𝓉𝒶𝒷━\n+ Z__\n+ _Z_\n𝒵ₗ━━━\n+ __Z","category":"page"},{"location":"commonstates/#Enumerating-all-Clifford-Operations","page":"Useful States","title":"Enumerating all Clifford Operations","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"The algorithm from (Koenig and Smolin, 2014) can be used to enumerate all Clifford operations on a given number of qubits through enumerate_cliffords. Or one can use random_clifford, random_stabilizer to directly sample from that set.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> length(enumerate_cliffords(1))\n6\n\njulia> length(enumerate_cliffords(2))\n720","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"To also enumerate possible phases, you can use enumerate_phases.","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> length(collect(enumerate_phases(tCNOT)))\n16\n\njulia> length(collect(enumerate_phases(enumerate_cliffords(2))))\n11520","category":"page"},{"location":"commonstates/#Common-entangled-states","page":"Useful States","title":"Common entangled states","text":"","category":"section"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"Bell states and GHZ states have convenience constructors:","category":"page"},{"location":"commonstates/","page":"Useful States","title":"Useful States","text":"julia> bell()\n+ XX\n+ ZZ\n\njulia> bell(2)\n+ XX__\n+ ZZ__\n+ __XX\n+ __ZZ\n\njulia> ghz(4)\n+ XXXX\n+ ZZ__\n+ _ZZ_\n+ __ZZ","category":"page"},{"location":"API/#Full-API","page":"API","title":"Full API","text":"","category":"section"},{"location":"API/","page":"API","title":"API","text":"","category":"page"},{"location":"API/#States","page":"API","title":"States","text":"","category":"section"},{"location":"API/","page":"API","title":"API","text":"Stabilizer states can be represented with the Stabilizer, Destabilizer, MixedStabilizer, and MixedDestabilizer tableau data structures. You probably want to use MixedDestabilizer which supports the widest set of operations.","category":"page"},{"location":"API/","page":"API","title":"API","text":"Moreover, a MixedDestabilizer can be stored inside a Register together with a set of classical bits in which measurement results can be written.","category":"page"},{"location":"API/","page":"API","title":"API","text":"Lastly, for Pauli frame simulations there is the PauliFrame type, a tableau in which each row represents a different Pauli frame.","category":"page"},{"location":"API/","page":"API","title":"API","text":"There are convenience constructors for common types of states and operators.","category":"page"},{"location":"API/#Operations","page":"API","title":"Operations","text":"","category":"section"},{"location":"API/","page":"API","title":"API","text":"Acting on quantum states can be performed either:","category":"page"},{"location":"API/","page":"API","title":"API","text":"In a \"linear algebra\" language where unitaries, measurements, and other operations have separate interfaces. This is an explicitly deterministic lower-level interface, which provides a great deal of control over how tableaux are manipulated. See the Stabilizer Tableau Algebra Manual as a primer on these approaches.\nOr in a \"circuit\" language, where the operators (and measurements and noise) are represented as circuit gates. This is a higher-level interface in which the outcome of an operation can be stochastic. The API for it is centered around the apply! function. Particularly useful for Monte Carlo simulations and Perturbative Expansion Symbolic Results.","category":"page"},{"location":"API/","page":"API","title":"API","text":"See the full list of operations for a list of implemented operations.","category":"page"},{"location":"API/#Autogenerated-API-list","page":"API","title":"Autogenerated API list","text":"","category":"section"},{"location":"API/","page":"API","title":"API","text":"Modules = [QuantumClifford]\nPrivate = false","category":"page"},{"location":"API/#QuantumClifford.QuantumClifford","page":"API","title":"QuantumClifford.QuantumClifford","text":"A module for using the Stabilizer formalism and simulating Clifford circuits.\n\n\n\n\n\n","category":"module"},{"location":"API/#QuantumClifford.continue_stat","page":"API","title":"QuantumClifford.continue_stat","text":"Returned by applywstatus! if the circuit simulation should continue.\n\n\n\n\n\n","category":"constant"},{"location":"API/#QuantumClifford.failure_stat","page":"API","title":"QuantumClifford.failure_stat","text":"Returned by applywstatus! if the circuit reports a failure.\n\nSee also: VerifyOp, BellMeasurement.\n\n\n\n\n\n","category":"constant"},{"location":"API/#QuantumClifford.false_success_stat","page":"API","title":"QuantumClifford.false_success_stat","text":"Returned by applywstatus! if the circuit reports a success, but it is a false positive (i.e., there was an undetected error).\n\nSee also: VerifyOp, BellMeasurement.\n\n\n\n\n\n","category":"constant"},{"location":"API/#QuantumClifford.true_success_stat","page":"API","title":"QuantumClifford.true_success_stat","text":"Returned by applywstatus! if the circuit reports a success and there is no undetected error.\n\nSee also: VerifyOp, BellMeasurement.\n\n\n\n\n\n","category":"constant"},{"location":"API/#QuantumClifford.AbstractSingleQubitOperator","page":"API","title":"QuantumClifford.AbstractSingleQubitOperator","text":"Supertype of all single-qubit symbolic operators.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.AbstractSymbolicOperator","page":"API","title":"QuantumClifford.AbstractSymbolicOperator","text":"Supertype of all symbolic operators. Subtype of AbstractCliffordOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.AbstractTwoQubitOperator","page":"API","title":"QuantumClifford.AbstractTwoQubitOperator","text":"Supertype of all two-qubit symbolic operators.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.BellMeasurement","page":"API","title":"QuantumClifford.BellMeasurement","text":"A Bell measurement performing the correlation measurement corresponding to the given pauli projections on the qubits at the selected indices.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.CircuitStatus","page":"API","title":"QuantumClifford.CircuitStatus","text":"A convenience struct to represent the status of a circuit simulated by mctrajectories\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.ClassicalXOR","page":"API","title":"QuantumClifford.ClassicalXOR","text":"Applies an XOR gate to classical bits. Currently only implemented for functionality with pauli frames.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.CliffordOperator","page":"API","title":"QuantumClifford.CliffordOperator","text":"Clifford Operator specified by the mapping of the basis generators.\n\njulia> tCNOT\nX₁ ⟼ + XX\nX₂ ⟼ + _X\nZ₁ ⟼ + Z_\nZ₂ ⟼ + ZZ\n\njulia> phase_gate = C\"Y\n Z\"\nX₁ ⟼ + Y\nZ₁ ⟼ + Z\n\njulia> stab = S\"XI\n IZ\";\n\n\njulia> entangled = tCNOT*stab\n+ XX\n+ ZZ\n\njulia> CliffordOperator(T\"YY\")\nERROR: DimensionMismatch: Input tableau should be of size 2n×n (top half is the X mappings and the bottom half are the Z mappings).\n[...]\n\nDestabilizer can also be converted.\n\njulia> d = Destabilizer(S\"Y\")\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z\n𝒮𝓉𝒶𝒷\n+ Y\n\njulia> CliffordOperator(d)\nX₁ ⟼ + Z\nZ₁ ⟼ + Y\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.Destabilizer","page":"API","title":"QuantumClifford.Destabilizer","text":"A tableau representation of a pure stabilizer state. The tableau tracks the destabilizers as well, for efficient projections. On initialization there are no checks that the provided state is indeed pure. This enables the use of this data structure for mixed stabilizer state, but a better choice would be to use MixedDestabilizer.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.MixedDestabilizer","page":"API","title":"QuantumClifford.MixedDestabilizer","text":"A tableau representation for mixed stabilizer states that keeps track of the destabilizers in order to provide efficient projection operations.\n\nThe rank r of the n-qubit tableau is tracked, either so that it can be used to represent a mixed stabilizer state, or so that it can be used to represent an n-r logical-qubit code over n physical qubits. The \"logical\" operators are tracked as well.\n\nWhen the constructor is called on an incomplete Stabilizer it automatically calculates the destabilizers and logical operators, following chapter 4 of (Gottesman, 1997). Under the hood the conversion uses the canonicalize_gott! canonicalization. That canonicalization permutes the columns of the tableau, but we automatically undo the column permutation in the preparation of a MixedDestabilizer so that qubits are not reindexed. The boolean keyword arguments undoperm and reportperm can be used to control this behavior and to report the permutations explicitly.\n\nSee also: stabilizerview, destabilizerview, logicalxview, logicalzview\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.MixedStabilizer","page":"API","title":"QuantumClifford.MixedStabilizer","text":"A slight improvement of the Stabilizer data structure that enables more naturally and completely the treatment of mixed states, in particular when the project! function is used.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.NoiseOp","page":"API","title":"QuantumClifford.NoiseOp","text":"An operator that applies the given noise model to the qubits at the selected indices.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.NoiseOpAll","page":"API","title":"QuantumClifford.NoiseOpAll","text":"An operator that applies the given noise model to all qubits.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.NoisyGate","page":"API","title":"QuantumClifford.NoisyGate","text":"A gate consisting of the given noise applied after the given perfect Clifford gate.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.PauliChannel","page":"API","title":"QuantumClifford.PauliChannel","text":"A Pauli channel datastructure, mainly for use with StabMixture\n\nSee also: UnitaryPauliChannel\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.PauliFrame","page":"API","title":"QuantumClifford.PauliFrame","text":"struct PauliFrame{T, S} <: QuantumClifford.AbstractQCState\n\nThis is a wrapper around a tableau. This \"frame\" tableau is not to be viewed as a normal stabilizer tableau, although it does conjugate the same under Clifford operations. Each row in the tableau refers to a single frame. The row represents the Pauli operation by which the frame and the reference differ.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.PauliFrame-Tuple{Any, Any, Any}","page":"API","title":"QuantumClifford.PauliFrame","text":"PauliFrame(\n frames,\n qubits,\n measurements\n) -> PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}}\n\n\nPrepare an empty set of Pauli frames with the given number of frames and qubits. Preallocates spaces for measurement number of measurements.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.PauliMeasurement","page":"API","title":"QuantumClifford.PauliMeasurement","text":"A Stabilizer measurement on the entirety of the quantum register.\n\nprojectrand!(state, pauli) and apply!(state, PauliMeasurement(pauli)) give the same (possibly non-deterministic) result. Particularly useful when acting on Register.\n\nSee also: apply!, projectrand!.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.PauliOperator","page":"API","title":"QuantumClifford.PauliOperator","text":"A multi-qubit Pauli operator (1iIZXY^otimes n).\n\nA Pauli can be constructed with the P custom string macro or by building up one through products and tensor products of smaller operators.\n\njulia> pauli3 = P\"-iXYZ\"\n-iXYZ\n\njulia> pauli4 = 1im * pauli3 ⊗ X\n+ XYZX\n\njulia> Z*X\n+iY\n\nWe use a typical F(2,2) encoding internally. The X and Z bits are stored in a single concatenated padded array of UInt chunks of a bit array.\n\njulia> p = P\"-IZXY\";\n\n\njulia> p.xz\n2-element Vector{UInt64}:\n 0x000000000000000c\n 0x000000000000000a\n\nYou can access the X and Z bits through getters and setters or through the xview, zview, xbit, and zbit functions.\n\njulia> p = P\"XYZ\"; p[1]\n(true, false)\n\njulia> p[1] = (true, true); p\n+ YYZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.Register","page":"API","title":"QuantumClifford.Register","text":"A register, representing the state of a computer including both a tableaux and an array of classical bits (e.g. for storing measurement results)\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.Reset","page":"API","title":"QuantumClifford.Reset","text":"Reset the specified qubits to the given state.\n\nBe careful, this operation implies first tracing out the qubits, which can lead to mixed states if these qubits were entangled with the rest of the system.\n\nSee also: sMRZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.SingleQubitOperator","page":"API","title":"QuantumClifford.SingleQubitOperator","text":"A \"symbolic\" general single-qubit operator which permits faster multiplication than an operator expressed as an explicit tableau.\n\njulia> op = SingleQubitOperator(2, true, true, true, false, true, true) # Tableau components and phases\nSingleQubitOperator on qubit 2\nX₁ ⟼ - Y\nZ₁ ⟼ - X\n\njulia> typeof(op)\nSingleQubitOperator\n\njulia> t_op = CliffordOperator(op, 3) # Transforming it back into an explicit tableau representation (specifying the size)\nX₁ ⟼ + X__\nX₂ ⟼ - _Y_\nX₃ ⟼ + __X\nZ₁ ⟼ + Z__\nZ₂ ⟼ - _X_\nZ₃ ⟼ + __Z\n\njulia> typeof(t_op)\nCliffordOperator{QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}}\n\njulia> CliffordOperator(op, 1, compact=true) # You can also extract just the non-trivial part of the tableau\nX₁ ⟼ - Y\nZ₁ ⟼ - X\n\nSee also: sHadamard, sPhase, sId1, sX, sY, sZ, CliffordOperator\n\nOr simply consult subtypes(QuantumClifford.AbstractSingleQubitOperator) and subtypes(QuantumClifford.AbstractTwoQubitOperator) for a full list. You can think of the s prefix as \"symbolic\" or \"sparse\".\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.SparseGate","page":"API","title":"QuantumClifford.SparseGate","text":"A Clifford gate, applying the given cliff operator to the qubits at the selected indices.\n\napply!(state, cliff, indices) and apply!(state, SparseGate(cliff, indices)) give the same result.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.StabMixture","page":"API","title":"QuantumClifford.StabMixture","text":"mutable struct StabMixture{T, F}\n\nRepresents mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is a pure stabilizer state.\n\njulia> StabMixture(S\"-X\")\nA mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z\n𝒮𝓉𝒶𝒷\n- X\nwith ϕᵢⱼ | Pᵢ | Pⱼ:\n 1.0+0.0im | + _ | + _\n\njulia> pcT\nA unitary Pauli channel P = ∑ ϕᵢ Pᵢ with the following branches:\nwith ϕᵢ | Pᵢ\n 0.853553+0.353553im | + _\n 0.146447-0.353553im | + Z\n\njulia> apply!(StabMixture(S\"-X\"), pcT)\nA mixture ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† where ρ is\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z\n𝒮𝓉𝒶𝒷\n- X\nwith ϕᵢⱼ | Pᵢ | Pⱼ:\n 0.0+0.353553im | + _ | + Z\n 0.0-0.353553im | + Z | + _\n 0.853553+0.0im | + _ | + _\n 0.146447+0.0im | + Z | + Z\n\nSee also: PauliChannel\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.Stabilizer","page":"API","title":"QuantumClifford.Stabilizer","text":"Stabilizer, i.e. a list of commuting multi-qubit Hermitian Pauli operators.\n\nInstances can be created with the S custom string macro or as direct sum of other stabilizers.\n\ntip: Stabilizers and Destabilizers\nIn many cases you probably would prefer to use the MixedDestabilizer data structure, as it caries a lot of useful additional information, like tracking rank and destabilizer operators. Stabilizer has mostly a pedagogical value, and it is also used for slightly faster simulation of a particular subset of Clifford operations.\n\njulia> s = S\"XXX\n ZZI\n IZZ\"\n+ XXX\n+ ZZ_\n+ _ZZ\n\njulia> s⊗s\n+ XXX___\n+ ZZ____\n+ _ZZ___\n+ ___XXX\n+ ___ZZ_\n+ ____ZZ\n\nIt has an indexing API, looking like a list of PauliOperators.\n\njulia> s[2]\n+ ZZ_\n\nPauli operators can act directly on the a stabilizer.\n\njulia> P\"YYY\" * s\n- XXX\n+ ZZ_\n+ _ZZ\n\nThere are a number of ways to create a Stabilizer, including:\n\ngenerate Stabilizers from a list of Pauli operators\n\njulia> Stabilizer([P\"XX\", P\"ZZ\"])\n+ XX\n+ ZZ\n\ngenerate Stabilizers from boolean matrices\n\njulia> a = [true true; false false]; b = [false true; true true];\n\njulia> Stabilizer(a, b)\n+ XY\n+ ZZ\n\njulia> Stabilizer([0x0, 0x2], a, b)\n+ XY\n- ZZ\n\ninitialize an empty Stabilizer and fill it through indexing\n\njulia> s = zero(Stabilizer, 2)\n+ __\n+ __\n\njulia> s[1,1] = (true, false); s\n+ X_\n+ __\n\nThere are no automatic checks for correctness (i.e. independence of all rows, commutativity of all rows, hermiticity of all rows). The rank (number of rows) is permitted to be less than the number of qubits (number of columns): canonilization, projection, etc. continue working in that case. To great extent this library uses the Stabilizer data structure simply as a tableau. This might be properly abstracted away in future versions.\n\nSee also: PauliOperator, canonicalize!\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.Stabilizer-Tuple{Graphs.SimpleGraphs.SimpleGraph}","page":"API","title":"QuantumClifford.Stabilizer","text":"Convert a graph representing a stabilizer state to an explicit Stabilizer.\n\nSee also: graphstate\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.UnbiasedUncorrelatedNoise","page":"API","title":"QuantumClifford.UnbiasedUncorrelatedNoise","text":"Depolarization noise model with total probability of error 3*errprobthird.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.UnitaryPauliChannel","page":"API","title":"QuantumClifford.UnitaryPauliChannel","text":"A Pauli channel datastructure, mainly for use with StabMixture.\n\nMore convenient to use than PauliChannel when you know your Pauli channel is unitary.\n\njulia> Tgate = UnitaryPauliChannel(\n (I, Z),\n ((1+exp(im*π/4))/2, (1-exp(im*π/4))/2)\n )\nA unitary Pauli channel P = ∑ ϕᵢ Pᵢ with the following branches:\nwith ϕᵢ | Pᵢ\n 0.853553+0.353553im | + _\n 0.146447-0.353553im | + Z\n\njulia> PauliChannel(Tgate)\nPauli channel ρ ↦ ∑ ϕᵢⱼ Pᵢ ρ Pⱼ† with the following branches:\nwith ϕᵢⱼ | Pᵢ | Pⱼ:\n 0.853553+0.0im | + _ | + _\n 0.0+0.353553im | + _ | + Z\n 0.0-0.353553im | + Z | + _\n 0.146447+0.0im | + Z | + Z\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.VerifyOp","page":"API","title":"QuantumClifford.VerifyOp","text":"A \"probe\" to verify that the state of the qubits corresponds to a desired good_state, e.g. at the end of the execution of a circuit.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sCNOT","page":"API","title":"QuantumClifford.sCNOT","text":"A \"symbolic\" CNOT. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sCPHASE","page":"API","title":"QuantumClifford.sCPHASE","text":"A \"symbolic\" CPHASE. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sHadamard","page":"API","title":"QuantumClifford.sHadamard","text":"A \"symbolic\" single-qubit Hadamard. See also: SingleQubitOperator, AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sId1","page":"API","title":"QuantumClifford.sId1","text":"A \"symbolic\" single-qubit Identity operation.\n\nSee also: SingleQubitOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sInvPhase","page":"API","title":"QuantumClifford.sInvPhase","text":"A \"symbolic\" single-qubit InvPhase. See also: SingleQubitOperator, AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sMRX","page":"API","title":"QuantumClifford.sMRX","text":"Measure a qubit in the X basis and reset to the |+⟩ state.\n\nSee also: sMRZ, Reset, sMZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sMRY","page":"API","title":"QuantumClifford.sMRY","text":"Measure a qubit in the Y basis and reset to the |i₊⟩ state.\n\nSee also: sMRZ, Reset, sMZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sMRZ","page":"API","title":"QuantumClifford.sMRZ","text":"Measure a qubit in the Z basis and reset to the |0⟩ state.\n\nwarning: It does not trace out the qubit!\nAs described below there is a difference between measuring the qubit (followed by setting it to a given known state) and \"tracing out\" the qubit. By reset here we mean \"measuring and setting to a known state\", not \"tracing out\".\n\njulia> s = MixedDestabilizer(S\"XXX ZZI IZZ\") # |000⟩+|111⟩\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z__\n+ _X_\n+ __X\n𝒮𝓉𝒶𝒷━\n+ XXX\n+ ZZ_\n+ Z_Z\n\njulia> traceout!(copy(s), 1) # = I⊗(|00⟩⟨00| + |11⟩⟨11|)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ _X_\n𝒳ₗ━━━\n+ _XX\n+ Z__\n𝒮𝓉𝒶𝒷━\n+ _ZZ\n𝒵ₗ━━━\n+ Z_Z\n+ XXX\n\njulia> projectZ!(traceout!(copy(s), 1), 1)[1] # = |000⟩⟨000|+|011⟩⟨011| or |100⟩⟨100|+|111⟩⟨111| (use projectZrand! to actually get a random result)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ _X_\n+ XXX\n𝒳ₗ━━━\n+ _XX\n𝒮𝓉𝒶𝒷━\n+ _ZZ\n+ Z__\n𝒵ₗ━━━\n+ Z_Z\n\njulia> projectZ!(copy(s), 1)[1] # = |000⟩ or |111⟩ (use projectZrand! to actually get a random result)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ XXX\n+ _X_\n+ __X\n𝒮𝓉𝒶𝒷━\n+ Z__\n+ ZZ_\n+ Z_Z\n\njulia> apply!(Register(copy(s)), sMRZ(1)) |> quantumstate # |000⟩ or |011⟩, depending on randomization\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ XXX\n+ _X_\n+ __X\n𝒮𝓉𝒶𝒷━\n+ Z__\n- ZZ_\n- Z_Z\n\nSee also: Reset, sMZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sMX","page":"API","title":"QuantumClifford.sMX","text":"Symbolic single qubit X measurement. See also Register, projectXrand!, sMY, sMZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sMY","page":"API","title":"QuantumClifford.sMY","text":"Symbolic single qubit Y measurement. See also Register, projectYrand!, sMX, sMZ\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sMZ","page":"API","title":"QuantumClifford.sMZ","text":"Symbolic single qubit Z measurement. See also Register, projectZrand!, sMX, sMY\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sPhase","page":"API","title":"QuantumClifford.sPhase","text":"A \"symbolic\" single-qubit Phase. See also: SingleQubitOperator, AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sSWAP","page":"API","title":"QuantumClifford.sSWAP","text":"A \"symbolic\" SWAP. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sX","page":"API","title":"QuantumClifford.sX","text":"A \"symbolic\" single-qubit X. See also: SingleQubitOperator, AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sXCX","page":"API","title":"QuantumClifford.sXCX","text":"A \"symbolic\" XCX. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sXCY","page":"API","title":"QuantumClifford.sXCY","text":"A \"symbolic\" XCY. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sXCZ","page":"API","title":"QuantumClifford.sXCZ","text":"A \"symbolic\" XCZ. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sY","page":"API","title":"QuantumClifford.sY","text":"A \"symbolic\" single-qubit Y. See also: SingleQubitOperator, AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sYCX","page":"API","title":"QuantumClifford.sYCX","text":"A \"symbolic\" YCX. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sYCY","page":"API","title":"QuantumClifford.sYCY","text":"A \"symbolic\" YCY. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sYCZ","page":"API","title":"QuantumClifford.sYCZ","text":"A \"symbolic\" YCZ. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sZ","page":"API","title":"QuantumClifford.sZ","text":"A \"symbolic\" single-qubit Z. See also: SingleQubitOperator, AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sZCX","page":"API","title":"QuantumClifford.sZCX","text":"A \"symbolic\" ZCX. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sZCY","page":"API","title":"QuantumClifford.sZCY","text":"A \"symbolic\" ZCY. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sZCZ","page":"API","title":"QuantumClifford.sZCZ","text":"A \"symbolic\" ZCZ. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.sZCrY","page":"API","title":"QuantumClifford.sZCrY","text":"A \"symbolic\" ZCrY. See also: AbstractSymbolicOperator\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.PauliError","page":"API","title":"QuantumClifford.PauliError","text":"A convenient constructor for various types of Pauli errors, that can be used as circuit gates in simulations. Returns more specific types when necessary.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.PauliError-Tuple{Any, Any}","page":"API","title":"QuantumClifford.PauliError","text":"\"Construct a gate operation that applies an unbiased Pauli error on all qubits, each with independent probability p.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.PauliError-Tuple{Int64, Any}","page":"API","title":"QuantumClifford.PauliError","text":"\"Construct a gate operation that applies an unbiased Pauli error on qubit q with probability p.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.PauliNoise","page":"API","title":"QuantumClifford.PauliNoise","text":"A convenient constructor for various types of Pauli noise models. Returns more specific types when necessary.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.PauliNoise-Tuple{Any}","page":"API","title":"QuantumClifford.PauliNoise","text":"Constructs an unbiased Pauli noise model with total probability of error p.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.affectedqubits","page":"API","title":"QuantumClifford.affectedqubits","text":"A method giving the qubits acted upon by a given operation. Part of the Noise interface.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.applybranches","page":"API","title":"QuantumClifford.applybranches","text":"Compute all possible new states after the application of the given operator. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Perturbative Expansion interface.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.applynoise!","page":"API","title":"QuantumClifford.applynoise!","text":"A method modifying a given state by applying the corresponding noise model. It is non-deterministic, part of the Noise interface.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.applywstatus!-Tuple{Any, Any}","page":"API","title":"QuantumClifford.applywstatus!","text":"Used for mctrajectories.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.bell","page":"API","title":"QuantumClifford.bell","text":"Prepare one or more Bell pairs (with optional phases).\n\njulia> bell()\n+ XX\n+ ZZ\n\njulia> bell(2)\n+ XX__\n+ ZZ__\n+ __XX\n+ __ZZ\n\njulia> bell((true, false))\n- XX\n+ ZZ\n\njulia> bell([true, false, true, true])\n- XX__\n+ ZZ__\n- __XX\n- __ZZ\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.bigram-Tuple{QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumClifford.bigram","text":"bigram(\n state::QuantumClifford.AbstractStabilizer;\n clip\n) -> Matrix{Int64}\n\n\nGet the bigram of a tableau.\n\nIt is the list of endpoints of a tableau in the clipped gauge.\n\nIf clip=true (the default) the tableau is converted to the clipped gauge in-place before calculating the bigram. Otherwise, the clip gauge conversion is skipped (for cases where the input is already known to be in the correct gauge).\n\nIntroduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in (Li et al., 2019) and (Gullans et al., 2020).\n\nSee also: canonicalize_clip!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.bitview","page":"API","title":"QuantumClifford.bitview","text":"A view of the classical bits stored with the state\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.canonicalize!-Tuple{QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumClifford.canonicalize!","text":"canonicalize!(\n state::QuantumClifford.AbstractStabilizer;\n phases,\n ranks\n) -> Any\n\n\nCanonicalize a stabilizer (in place).\n\nAssumes the input is a valid stabilizer (all operators commute and have real phases). It permits redundant generators and identity generators.\n\njulia> ghz = S\"XXXX\n ZZII\n IZZI\n IIZZ\";\n\n\njulia> canonicalize!(ghz)\n+ XXXX\n+ Z__Z\n+ _Z_Z\n+ __ZZ\n\njulia> canonicalize!(S\"XXXX\n IZZI\n IIZZ\")\n+ XXXX\n+ _Z_Z\n+ __ZZ\n\nNot all rows in the tableau in the next example are independent:\n\njulia> canonicalize!(S\"XXXX\n ZZII\n IZZI\n IZIZ\n IIZZ\")\n+ XXXX\n+ Z__Z\n+ _Z_Z\n+ __ZZ\n+ ____\n\nIn cases of lower rank, more advanced tableau structures might be better. For instance the MixedStabilizer or MixedDestabilizer structures (you can read more about them in the Data Structures section of the documentation).\n\nIf phases=false is set, the canonicalization does not track the phases in the tableau, leading to significant (constant factor) speedup.\n\njulia> s = S\"-ZX\n XZ\"\n- ZX\n+ XZ\n\njulia> canonicalize!(copy(s), phases=false)\n- XZ\n+ ZX\n\njulia> canonicalize!(copy(s))\n+ XZ\n- ZX\n\nIf ranks=true is set, the last pivot indices for the X and Z stage of the canonicalization are returned as well.\n\njulia> s = S\"XXXX\n ZZII\n IZIZ\n ZIIZ\";\n\n\njulia> _, ix, iz = canonicalize!(s, ranks=true); ix, iz\n(1, 3)\n\njulia> s\n+ XXXX\n+ Z__Z\n+ _Z_Z\n+ ____\n\nBased on (Garcia et al., 2012).\n\nSee also: canonicalize_rref!, canonicalize_gott!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.canonicalize_clip!-Tuple{QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumClifford.canonicalize_clip!","text":"canonicalize_clip!(\n state::QuantumClifford.AbstractStabilizer;\n phases\n) -> QuantumClifford.AbstractStabilizer\n\n\nFix the clipped gauge of a stabilizer (in place).\n\nAssumes the input is a valid full-rank stabilizer (all operators commute and have real phases).\n\njulia> s = S\"- X_ZX_X\n + XXYZ__\n - YZ_Z_X\n - XZX__Y\n + _Z_Y_Y\n - ____Z_\";\n\n\njulia> canonicalize_clip!(s)\n- X_XY__\n+ YZY___\n+ _XZX__\n- _ZYX_Z\n- __YZ_X\n- ____Z_\n\nIf phases=false is set, the canonicalization does not track the phases in the tableau, leading to a significant speedup.\n\nIntroduced in (Nahum et al., 2017), with a more detailed explanation of the algorithm in Appendix A of (Li et al., 2019)\n\nSee also: canonicalize!, canonicalize_rref!, canonicalize_gott!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.canonicalize_gott!-Tuple{Stabilizer}","page":"API","title":"QuantumClifford.canonicalize_gott!","text":"Inplace Gottesman canonicalization of a tableau.\n\nThis uses different canonical form from canonicalize!. It is used in the computation of the logical X and Z operators of a MixedDestabilizer.\n\nIt returns the (in place) modified state, the indices of the last pivot of both Gaussian elimination steps, and the permutations that have been used to put the X and Z tableaux in standard form.\n\nBased on (Gottesman, 1997).\n\nSee also: canonicalize!, canonicalize_rref!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.canonicalize_rref!-Tuple{QuantumClifford.AbstractStabilizer, Any}","page":"API","title":"QuantumClifford.canonicalize_rref!","text":"canonicalize_rref!(\n state::QuantumClifford.AbstractStabilizer,\n colindices;\n phases\n) -> Tuple{QuantumClifford.AbstractStabilizer, Any}\n\n\nCanonicalize a stabilizer (in place) along only some columns.\n\nThis uses different canonical form from canonicalize!. It also indexes in reverse in order to make its use in traceout! more efficient. Its use in traceout! is its main application.\n\nIt returns the (in place) modified state and the index of the last pivot.\n\nBased on (Audenaert and Plenio, 2005).\n\nSee also: canonicalize!, canonicalize_gott!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.canonicalize_rref!-Tuple{QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumClifford.canonicalize_rref!","text":"canonicalize_rref!(\n state::QuantumClifford.AbstractStabilizer;\n phases\n) -> Tuple{QuantumClifford.AbstractStabilizer, Any}\n\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.clifford_cardinality-Tuple{Int64}","page":"API","title":"QuantumClifford.clifford_cardinality","text":"The size of the Clifford group over a given number of qubits, possibly modulo the phases.\n\nFor n qubits, not accounting for phases is 2ⁿⁿΠⱼ₌₁ⁿ(4ʲ-1). There are 4ⁿ different phase configurations.\n\nSee also: enumerate_cliffords.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.comm-Union{Tuple{T}, Tuple{AbstractVector{T}, AbstractVector{T}}} where T<:Unsigned","page":"API","title":"QuantumClifford.comm","text":"Check whether two operators commute.\n\n0x0 if they commute, 0x1 if they anticommute.\n\njulia> P\"XX\"*P\"ZZ\", P\"ZZ\"*P\"XX\"\n(- YY, - YY)\n\njulia> comm(P\"ZZ\", P\"XX\")\n0x00\n\njulia> comm(P\"IZ\", P\"XX\")\n0x01\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.compactify_circuit-Tuple{Any}","page":"API","title":"QuantumClifford.compactify_circuit","text":"Convert a list of gates to a more optimized \"sum type\" format which permits faster dispatch.\n\nGenerally, this should be called on a circuit before it is used in a simulation.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.destabilizerview-Tuple{Destabilizer}","page":"API","title":"QuantumClifford.destabilizerview","text":"A view of the subtableau corresponding to the destabilizer. See also tab, stabilizerview, logicalxview, logicalzview\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.enumerate_cliffords-Tuple{Any, Any}","page":"API","title":"QuantumClifford.enumerate_cliffords","text":"Give the i-th n-qubit Clifford operation, where i∈{1..2ⁿⁿΠⱼ₌₁ⁿ(4ʲ-1)}\n\nThe algorithm is detailed in (Koenig and Smolin, 2014).\n\nSee also: symplecticGS, clifford_cardinality.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.enumerate_cliffords-Tuple{Any}","page":"API","title":"QuantumClifford.enumerate_cliffords","text":"Give all n-qubit Clifford operations.\n\nThe algorithm is detailed in (Koenig and Smolin, 2014).\n\nSee also: symplecticGS, clifford_cardinality.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.enumerate_phases-Tuple{CliffordOperator}","page":"API","title":"QuantumClifford.enumerate_phases","text":"Given an operator, return all operators that have the same tableau but different phases.\n\njulia> length(collect(enumerate_phases(tCNOT)))\n16\n\nSee also: enumerate_cliffords, clifford_cardinality.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.enumerate_phases-Tuple{Union{Base.Generator, AbstractVector}}","page":"API","title":"QuantumClifford.enumerate_phases","text":"Given a set of operators, return all operators that have the same tableaux but different phases.\n\njulia> length(collect(enumerate_phases(enumerate_cliffords(2))))\n11520\n\nSee also: enumerate_cliffords, clifford_cardinality.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.enumerate_single_qubit_gates-Tuple{Any}","page":"API","title":"QuantumClifford.enumerate_single_qubit_gates","text":"Generate a symbolic single-qubit gate given its index. Optionally, set non-trivial phases.\n\nSee also: enumerate_cliffords.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.fastcolumn","page":"API","title":"QuantumClifford.fastcolumn","text":"Convert a tableau to a memory layout that is fast for column operations.\n\nIn this layout a column of the tableau is stored (mostly) contiguously in memory. Due to bitpacking, e.g., packing 64 bits into a single UInt64, the memory layout is not perfectly contiguous, but it is still optimal given that some bitwrangling is required to extract a given bit.\n\nSee also: fastrow\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.fastrow","page":"API","title":"QuantumClifford.fastrow","text":"Convert a tableau to a memory layout that is fast for row operations.\n\nIn this layout a Pauli string (a row of the tableau) is stored contiguously in memory.\n\nSee also: fastrow\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.generate!-Tuple{PauliOperator, Stabilizer}","page":"API","title":"QuantumClifford.generate!","text":"Generate a Pauli operator by using operators from a given the Stabilizer.\n\nIt assumes the stabilizer is already canonicalized. It modifies the Pauli operator in place, generating it in reverse, up to a phase. That phase is left in the modified operator, which should be the identity up to a phase. Returns the new operator and the list of indices denoting the elements of stabilizer that were used for the generation.\n\njulia> ghz = S\"XXXX\n ZZII\n IZZI\n IIZZ\";\n\n\njulia> canonicalize!(ghz)\n+ XXXX\n+ Z__Z\n+ _Z_Z\n+ __ZZ\n\njulia> generate!(P\"-ZIZI\", ghz)\n(- ____, [2, 4])\n\nWhen the Pauli operator can not be generated by the given tableau, nothing is returned.\n\njulia> generate!(P\"XII\",canonicalize!(S\"ZII\")) === nothing\ntrue\n\njulia> generate!(P\"XII\",canonicalize!(S\"XII\")) === nothing\nfalse\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.gf2_H_to_G-Tuple{Any}","page":"API","title":"QuantumClifford.gf2_H_to_G","text":"For a given F(2,2) parity check matrix, return the generator matrix.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.gf2_gausselim!-Tuple{Any}","page":"API","title":"QuantumClifford.gf2_gausselim!","text":"Gaussian elimination over the binary field.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.gf2_invert-Tuple{Any}","page":"API","title":"QuantumClifford.gf2_invert","text":"Invert a binary matrix.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.gf2_isinvertible-Tuple{Any}","page":"API","title":"QuantumClifford.gf2_isinvertible","text":"Check whether a binary matrix is invertible.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.ghz","page":"API","title":"QuantumClifford.ghz","text":"Prepare a GHZ state of n qubits.\n\njulia> ghz()\n+ XXX\n+ ZZ_\n+ _ZZ\n\njulia> ghz(2)\n+ XX\n+ ZZ\n\njulia> ghz(4)\n+ XXXX\n+ ZZ__\n+ _ZZ_\n+ __ZZ\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.graph_gate-NTuple{4, Any}","page":"API","title":"QuantumClifford.graph_gate","text":"A helper function converting the gate indices from graphstate into a Clifford operator.\n\njulia> s = S\" XXX\n YZ_\n -_ZZ\";\n\n\njulia> graph, h_idx, ip_idx, z_idx = graphstate(s);\n\n\njulia> gate = graph_gate(h_idx, ip_idx, z_idx, nqubits(s));\n\n\njulia> apply!(s, gate) # This is now a graph state (notice you need to multiply row 1 by row 2)\n+ YYZ\n+ XZ_\n+ _ZX\n\njulia> canonicalize!(s) == canonicalize!(Stabilizer(graph))\ntrue\n\nSee also: graph_gatesequence\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.graph_gatesequence-Tuple{Vector{Int64}, Vector{Int64}, Vector{Int64}}","page":"API","title":"QuantumClifford.graph_gatesequence","text":"A helper function converting the gate indices from graphstate into a sequence of gates.\n\njulia> s = S\" XXX\n YZ_\n -_ZZ\";\n\n\njulia> graph, h_idx, ip_idx, z_idx = graphstate(s);\n\n\njulia> gates = graph_gatesequence(h_idx, ip_idx, z_idx);\n\n\njulia> for gate in vcat(gates...) apply!(s, gate) end\n\n\njulia> s # This is now a graph state (notice you need to multiply row 1 by row 2)\n+ YYZ\n+ XZ_\n+ _ZX\n\njulia> canonicalize!(s) == canonicalize!(Stabilizer(graph))\ntrue\n\nSee also: graph_gatesequence\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.graphstate!-Tuple{Stabilizer}","page":"API","title":"QuantumClifford.graphstate!","text":"An in-place version of graphstate.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.graphstate-Tuple{QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumClifford.graphstate","text":"Convert any stabilizer state to a graph state\n\nGraph states are a special type of entangled stabilizer states that can be represented by a graph. For a graph G=(VE) the corresponding stabilizers are S_v = X_v prod_u N(v) Z_u. Notice that such tableau rows contain only a single X operator. There is a set of single qubit gates that converts any stabilizer state to a graph state.\n\nThis function returns the graph state corresponding to a stabilizer and the gates that might be necessary to convert the stabilizer into a state representable as a graph.\n\nFor a tableau stab you can convert it with:\n\ngraph, hadamard_idx, iphase_idx, flips_idx = graphstate()\n\nwhere graph is the graph representation of stab, and the rest specifies the single-qubit gates converting stab to graph: hadamard_idx are the qubits that require a Hadamard gate (mapping X ↔ Z), iphase_idx are (different) qubits that require an inverse Phase gate (Y → X), and flips_idx are the qubits that require a phase flip (Pauli Z gate), after the previous two sets of gates.\n\njulia> using Graphs\n\njulia> s = S\" XXX\n ZZ_\n -_ZZ\";\n\n\njulia> g, h_idx, ip_idx, z_idx = graphstate(s);\n\n\njulia> collect(edges(g))\n2-element Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}:\n Edge 1 => 2\n Edge 1 => 3\n\njulia> h_idx\n2-element Vector{Int64}:\n 2\n 3\n\njulia> ip_idx\nInt64[]\n\njulia> z_idx\n1-element Vector{Int64}:\n 3\n\nThe Graphs.jl library provides many graph-theory tools and the MakieGraphs.jl library provides plotting utilities for graphs.\n\nYou can directly call the graph constructor on a stabilizer, if you just want the graph and do not care about the Clifford operation necessary to convert an arbitrary state to a state representable as a graph:\n\njulia> collect(edges( Graph(bell()) ))\n1-element Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}:\n Edge 1 => 2\n\nFor a version that does not copy the stabilizer, but rather performs transformations in-place, use graphstate!. It would perform canonicalize_gott! on its argument as it finds a way to convert it to a graph state.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.logdot-Tuple{QuantumClifford.AbstractStabilizer, QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumClifford.logdot","text":"Logarithm of the inner product between to Stabilizer states.\n\nIf the result is nothing, the dot inner product is zero. Otherwise the inner product is 2^(-logdot/2).\n\nThe actual inner product can be computed with LinearAlgebra.dot.\n\nBased on (Garcia et al., 2012).\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.logicalxview-Tuple{MixedDestabilizer}","page":"API","title":"QuantumClifford.logicalxview","text":"A view of the subtableau corresponding to the logical X operators. See also tab, stabilizerview, destabilizerview, logicalzview\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.logicalzview-Tuple{MixedDestabilizer}","page":"API","title":"QuantumClifford.logicalzview","text":"A view of the subtableau corresponding to the logical Z operators. See also tab, stabilizerview, destabilizerview, logicalxview\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.mctrajectories-Tuple{Any, Any}","page":"API","title":"QuantumClifford.mctrajectories","text":"Run multiple Monte Carlo trajectories and report the aggregate final statuses of each.\n\nSee also: pftrajectories, petrajectories\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.mctrajectory!-Tuple{Any, Any}","page":"API","title":"QuantumClifford.mctrajectory!","text":"Run a single Monte Carlo sample, starting with (and modifying) state by applying the given circuit. Uses apply! under the hood.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.petrajectories-Tuple{Any, Any}","page":"API","title":"QuantumClifford.petrajectories","text":"Run a perturbative expansion to a given order. This is the main public function for the perturbative expansion approach.\n\nSee also: pftrajectories, mctrajectories\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pfmeasurements-Tuple{PauliFrame}","page":"API","title":"QuantumClifford.pfmeasurements","text":"pfmeasurements(frame::PauliFrame) -> Any\n\n\nReturns the measurement results for each frame in the PauliFrame instance.\n\nwarning: Relative measurements\nThe return measurements are relative to the reference measurements, i.e. they only say whether the reference measurements have been flipped in the given frame.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pfmeasurements-Tuple{Register, PauliFrame}","page":"API","title":"QuantumClifford.pfmeasurements","text":"pfmeasurements(register::Register, frame::PauliFrame) -> Any\n\n\nTakes the references measurements from the given Register and applies the flips as prescribed by the PauliFrame relative measurements. The result is the actual (non-relative) measurement results for each frame.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pfmeasurements-Tuple{Register}","page":"API","title":"QuantumClifford.pfmeasurements","text":"pfmeasurements(register::Register) -> Vector{Bool}\n\n\nReturns the measurements stored in the bits of the given Register.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pftrajectories","page":"API","title":"QuantumClifford.pftrajectories","text":"Perform a \"Pauli frame\" style simulation of a quantum circuit.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.pftrajectories-Tuple{Any}","page":"API","title":"QuantumClifford.pftrajectories","text":"pftrajectories(\n circuit;\n trajectories,\n threads\n) -> PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}, Matrix{Bool}}\n\n\nThe main method for running Pauli frame simulations of circuits. See the other methods for lower level access.\n\nMultithreading is enabled by default, but can be disabled by setting threads=false. Do not forget to launch Julia with multiple threads enabled, e.g. julia -t4, if you want to use multithreading.\n\nSee also: mctrajectories, petrajectories\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pftrajectories-Tuple{PauliFrame, Any}","page":"API","title":"QuantumClifford.pftrajectories","text":"pftrajectories(state::PauliFrame, circuit) -> PauliFrame\n\n\nEvolve each frame stored in PauliFrame by the given circuit.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pftrajectories-Tuple{Register, Any}","page":"API","title":"QuantumClifford.pftrajectories","text":"pftrajectories(\n register::Register,\n circuit;\n trajectories\n) -> Tuple{Register, PauliFrame{Stabilizer{QuantumClifford.Tableau{Vector{UInt8}, LinearAlgebra.Adjoint{UInt64, Matrix{UInt64}}}}, Matrix{Bool}}}\n\n\nFor a given Register and circuit, simulates the reference circuit acting on the register and then also simulate numerous PauliFrame trajectories. Returns the register and the PauliFrame instance.\n\nUse pfmeasurements to get the measurement results.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.phases-Tuple{QuantumClifford.Tableau}","page":"API","title":"QuantumClifford.phases","text":"The phases of a given tableau. It is a view, i.e. if you modify this array, the original tableau caries these changes.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.prodphase-Union{Tuple{T}, Tuple{AbstractVector{T}, AbstractVector{T}}} where T<:Unsigned","page":"API","title":"QuantumClifford.prodphase","text":"Get the phase of the product of two Pauli operators.\n\nPhase is encoded as F(4) in the low qubits of an UInt8.\n\njulia> P\"ZZZ\"*P\"XXX\"\n-iYYY\n\njulia> prodphase(P\"ZZZ\", P\"XXX\")\n0x03\n\njulia> prodphase(P\"XXX\", P\"ZZZ\")\n0x01\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.projectXrand!-Tuple{Any, Any}","page":"API","title":"QuantumClifford.projectXrand!","text":"projectXrand!(state, qubit) -> Tuple{Register, UInt8}\n\n\nProject qubit of state along the X axis and randomize the phase if necessary.\n\nLower boilerplate version of project!.\n\nSee also: project!, projectX!, projectZrand!, projectYrand!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.projectYrand!-Tuple{Any, Any}","page":"API","title":"QuantumClifford.projectYrand!","text":"projectYrand!(state, qubit) -> Tuple{Register, UInt8}\n\n\nProject qubit of state along the Y axis and randomize the phase if necessary.\n\nLower boilerplate version of project!.\n\nSee also: project!, projectY!, projectXrand!, projectZrand!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.projectZrand!-Tuple{Any, Any}","page":"API","title":"QuantumClifford.projectZrand!","text":"projectZrand!(state, qubit) -> Tuple{Register, UInt8}\n\n\nProject qubit of state along the Z axis and randomize the phase if necessary.\n\nLower boilerplate version of project!.\n\nSee also: project!, projectZ!, projectXrand!, projectYrand!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.projectrand!-Tuple{Any, Any}","page":"API","title":"QuantumClifford.projectrand!","text":"projectrand!(state, pauli) -> Tuple{Register, Any}\n\n\nMeasure pauli operator on state and randomize the phase if necessary.\n\nLower boilerplate version of project!.\n\nSee also: project!, projectXrand!, projectZrand!, projectYrand!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.puttableau!-Union{Tuple{M2}, Tuple{M1}, Tuple{T}, Tuple{V2}, Tuple{V1}, Tuple{B}, Tuple{QuantumClifford.Tableau{V1, M1}, QuantumClifford.Tableau{V2, M2}, Int64, Int64}} where {B, V1, V2, T<:Unsigned, M1<:AbstractMatrix{T}, M2<:AbstractMatrix{T}}","page":"API","title":"QuantumClifford.puttableau!","text":"Put source tableau in target tableau at given row and column. Assumes target location is zeroed out.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.quantumstate","page":"API","title":"QuantumClifford.quantumstate","text":"Only the quantum part of the state (excluding classical bits)\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.random_clifford-Tuple{Random.AbstractRNG, Int64}","page":"API","title":"QuantumClifford.random_clifford","text":"A random Clifford operator generated by the Bravyi-Maslov Algorithm 2 from (Bravyi and Maslov, 2021).\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.random_clifford1-Tuple{Random.AbstractRNG, Any}","page":"API","title":"QuantumClifford.random_clifford1","text":"Random symbolic single-qubit Clifford applied to qubit at index qubit.\n\nSee also: SingleQubitOperator, random_clifford\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.random_destabilizer-Tuple{Random.AbstractRNG, Int64}","page":"API","title":"QuantumClifford.random_destabilizer","text":"A random Stabilizer/Destabilizer tableau generated by the Bravyi-Maslov Algorithm 2 from (Bravyi and Maslov, 2021).\n\nrandom_destabilizer(n) gives a n-qubit tableau of rank n. random_destabilizer(r,n) gives a n-qubit tableau of rank r.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.random_pauli-Tuple{Random.AbstractRNG, Int64}","page":"API","title":"QuantumClifford.random_pauli","text":"A random Pauli operator on n qubits.\n\nUse realphase=true to get operators with phase ±1 (excluding ±i). nophase=true sets the phase to +1.\n\nOptionally, a \"flip\" probability p can be provided specified, in which case each bit is set to I with probability 1-p and to X, Y, or Z, each with probability p. Useful for simulating Pauli noise.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.random_stabilizer-Tuple{Random.AbstractRNG, Int64}","page":"API","title":"QuantumClifford.random_stabilizer","text":"A random Stabilizer tableau generated by the Bravyi-Maslov Algorithm 2 from (Bravyi and Maslov, 2021).\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.single_x-Tuple{Any, Any}","page":"API","title":"QuantumClifford.single_x","text":"A multiqubit operator corresponding to all identities except for Pauli X at i. See also: sX, sMX\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.single_y-Tuple{Any, Any}","page":"API","title":"QuantumClifford.single_y","text":"A multiqubit operator corresponding to all identities except for Pauli Y at i. See also: sY, sMY\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.single_z-Tuple{Any, Any}","page":"API","title":"QuantumClifford.single_z","text":"A multiqubit operator corresponding to all identities except for Pauli Z at i. See also: sY, sMY\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.stab_to_gf2-Tuple{QuantumClifford.Tableau}","page":"API","title":"QuantumClifford.stab_to_gf2","text":"The F(2,2) matrix of a given tableau, represented as the concatenation of two binary matrices, one for X and one for Z.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.stabilizerplot","page":"API","title":"QuantumClifford.stabilizerplot","text":"A Makie.jl recipe for pictorial representation of a tableau.\n\nRequires a Makie.jl backend to be loaded, e.g. using CairoMakie.\n\nAlternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S\"XXX ZZZ\").\n\nConsult the documentation for more details on visualization options.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.stabilizerplot_axis","page":"API","title":"QuantumClifford.stabilizerplot_axis","text":"A Makie.jl recipe for pictorial representation of a tableau.\n\nRequires a Makie.jl backend to be loaded, e.g. using CairoMakie.\n\nAlternatively, you can use the Plots.jl plotting ecosystem, e.g. using Plots; plot(S\"XXX ZZZ\").\n\nConsult the documentation for more details on visualization options.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.stabilizerview-Tuple{Stabilizer}","page":"API","title":"QuantumClifford.stabilizerview","text":"A view of the subtableau corresponding to the stabilizer. See also tab, destabilizerview, logicalxview, logicalzview\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.symplecticGS-Tuple{PauliOperator}","page":"API","title":"QuantumClifford.symplecticGS","text":"Perform the Symplectic Gram-Schmidt procedure that gives a Clifford operator canonically related to a given Pauli operator.\n\nThe algorithm is detailed in (Koenig and Smolin, 2014).\n\nSee also: enumerate_cliffords, clifford_cardinality.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.tab-Union{Tuple{Stabilizer{T}}, Tuple{T}} where T","page":"API","title":"QuantumClifford.tab","text":"Extract the underlying tableau structure.\n\njulia> s = S\"X\"\n+ X\n\njulia> tab(s)\n+ X\n\njulia> tab(Destabilizer(s))\n+ Z\n+ X\n\njulia> tab(MixedDestabilizer(s))\n+ Z\n+ X\n\njulia> tab(tHadamard)\n+ Z\n+ X\n\njulia> typeof(tab(tHadamard))\nQuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}\n\nSee also: stabilizerview, destabilizerview, logicalxview, logicalzview\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.xbit-Tuple{PauliOperator}","page":"API","title":"QuantumClifford.xbit","text":"Extract as a new bit array the X part of the UInt array of packed qubits of a given Pauli operator.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.xview-Tuple{PauliOperator}","page":"API","title":"QuantumClifford.xview","text":"Get a view of the X part of the UInt array of packed qubits of a given Pauli operator.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.zbit-Tuple{PauliOperator}","page":"API","title":"QuantumClifford.zbit","text":"Extract as a new bit array the Z part of the UInt array of packed qubits of a given Pauli operator.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.zview-Tuple{PauliOperator}","page":"API","title":"QuantumClifford.zview","text":"Get a view of the Y part of the UInt array of packed qubits of a given Pauli operator.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.apply!","page":"API","title":"QuantumInterface.apply!","text":"In QuantumClifford the apply! function is used to apply any quantum operation to a stabilizer state, including unitary Clifford operations, Pauli measurements, and noise. Thus, this function may result in a random/stochastic result (e.g. with measurements or noise).\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumInterface.embed-Tuple{Int64, Int64, PauliOperator}","page":"API","title":"QuantumInterface.embed","text":"Embed a Pauli operator in a larger Pauli operator.\n\njulia> embed(5, 3, P\"-Y\")\n- __Y__\n\njulia> embed(5, (3,5), P\"-YX\")\n- __Y_X\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.entanglement_entropy","page":"API","title":"QuantumInterface.entanglement_entropy","text":"Get bipartite entanglement entropy of a subsystem\n\nDefined as entropy of the reduced density matrix.\n\nIt can be calculated with multiple different algorithms, the most performant one depending on the particular case.\n\nCurrently implemented are the :clip (clipped gauge), :graph (graph state), and :rref (Gaussian elimination) algorithms. Benchmark your particular case to choose the best one.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumInterface.entanglement_entropy-Tuple{QuantumClifford.AbstractStabilizer, AbstractVector, Val{:graph}}","page":"API","title":"QuantumInterface.entanglement_entropy","text":"Get bipartite entanglement entropy by first converting the state to a graph and computing the rank of the adjacency matrix.\n\nBased on \"Entanglement in graph states and its applications\".\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.entanglement_entropy-Tuple{QuantumClifford.AbstractStabilizer, AbstractVector, Val{:rref}}","page":"API","title":"QuantumInterface.entanglement_entropy","text":"Get bipartite entanglement entropy by converting to RREF form (i.e., partial trace form).\n\nThe state will be partially canonicalized in an RREF form.\n\nSee also: canonicalize_rref!, traceout!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.entanglement_entropy-Tuple{QuantumClifford.AbstractStabilizer, UnitRange, Val{:clip}}","page":"API","title":"QuantumInterface.entanglement_entropy","text":"Get bipartite entanglement entropy of a contiguous subsystem by passing through the clipped gauge.\n\nIf clip=false is set the canonicalization step is skipped, useful if the input state is already in the clipped gauge.\n\nSee also: bigram, canonicalize_clip!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.expect-Tuple{PauliOperator, QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumInterface.expect","text":"expect(p::PauliOperator, st::AbstractStabilizer)\n\nCompute the expectation value of a Pauli operator p on a stabilizer state st. This function will allocate a temporary copy of the stabilizer state st.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.nqubits-Tuple{QuantumClifford.AbstractStabilizer}","page":"API","title":"QuantumInterface.nqubits","text":"The number of qubits of a given state.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.project!-Tuple{Any, PauliOperator}","page":"API","title":"QuantumInterface.project!","text":"project!(\n state,\n pauli::PauliOperator;\n keep_result,\n phases\n) -> Tuple{MixedStabilizer, Any, Any}\n\n\nProject the state of a Stabilizer on the two eigenspaces of a Pauli operator.\n\nAssumes the input is a valid stabilizer. The projection is done inplace on that stabilizer and it does not modify the projection operator.\n\nIt returns\n\na stabilizer that might not be in canonical form\nthe index of the row where the non-commuting operator was (that row is now equal to pauli; its phase is not updated and for a faithful measurement simulation it needs to be randomized by the user)\nand the result of the projection if there was no non-commuting operator (nothing otherwise)\n\nIf keep_result==false that result of the projection in case of anticommutation is not computed, sparing a canonicalization operation. This canonicalization operation is the only one potentially of cubic complexity. The rest of the calculations are of quadratic complexity.\n\nIf you need to measure a single qubit instead of a multiqubit Pauli operator, the faster projectX!, projectY!, and projectZ! are available.\n\nFor less boilerplate and automatic randomization of the phase use projectrand!.\n\nHere is an example of a projection destroying entanglement:\n\njulia> ghz = S\"XXXX\n ZZII\n IZZI\n IIZZ\";\n\n\njulia> canonicalize!(ghz)\n+ XXXX\n+ Z__Z\n+ _Z_Z\n+ __ZZ\n\njulia> state, anticom_index, result = project!(ghz, P\"ZIII\");\n\n\njulia> state\n+ Z___\n+ Z__Z\n+ _Z_Z\n+ __ZZ\n\njulia> canonicalize!(state)\n+ Z___\n+ _Z__\n+ __Z_\n+ ___Z\n\njulia> anticom_index, result\n(1, nothing)\n\nAnd an example of projection consistent with the stabilizer state.\n\njulia> s = S\"ZII\n IXI\n IIY\";\n\n\njulia> canonicalize!(s)\n+ _X_\n+ __Y\n+ Z__\n\njulia> state, anticom_index, result = project!(s, P\"-ZII\");\n\n\njulia> state\n+ _X_\n+ __Y\n+ Z__\n\njulia> anticom_index, result\n(0, 0x02)\n\nWhile not the best choice, Stabilizer can be used for mixed states, simply by providing an incomplete tableau. In that case it is possible to attempt to project on an operator that can not be generated by the provided stabilizer operators. In that case we have anticom_index==rank and result===nothing, where rank is the the new rank of the tableau, one more than the number of rows in the initial tableau. However, if keep_result was set to false, then anticom_index would stay at zero.\n\njulia> s = S\"XZI\n IZI\";\n\n\njulia> project!(s, P\"IIX\")[1]\n+ X__\n+ _Z_\n\nIf we had used MixedStabilizer we would have added the projector to the list of stabilizers.\n\njulia> s = one(MixedStabilizer, 2, 3)\n+ Z__\n+ _Z_\n\njulia> project!(s, P\"IIX\")[1]\n+ Z__\n+ _Z_\n+ __X\n\nHowever, MixedDestabilizer would be an even better choice as it has mathcalO(n^2) complexity instead of the mathcalO(n^3) complexity of *Stabilizer.\n\njulia> s = one(MixedDestabilizer, 2, 3)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ X__\n+ _X_\n𝒳ₗ━━━\n+ __X\n𝒮𝓉𝒶𝒷━\n+ Z__\n+ _Z_\n𝒵ₗ━━━\n+ __Z\n\njulia> project!(s, P\"IIX\")[1]\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ X__\n+ _X_\n+ __Z\n𝒮𝓉𝒶𝒷━\n+ Z__\n+ _Z_\n+ __X\n\nSee the \"Datastructure Choice\" section in the documentation for more details.\n\nSee also: projectX!, projectY!, projectZ!, projectrand!\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.project!-Tuple{MixedStabilizer, PauliOperator}","page":"API","title":"QuantumInterface.project!","text":"project!(\n state::MixedStabilizer,\n pauli::PauliOperator;\n phases\n) -> Tuple{MixedStabilizer, Any, Any}\n\n\nWhen using project! on MixedStabilizer it automates some of the extra steps we encounter when implicitly using the Stabilizer datastructure to represent mixed states. Namely, it helps when the projector is not among the list of stabilizers:\n\njulia> s = S\"XZI\n IZI\";\n\n\njulia> ms = MixedStabilizer(s)\n+ X__\n+ _Z_\n\njulia> project!(ms, P\"IIY\")[1]\n+ X__\n+ _Z_\n+ __Y\n\nSimilarly to project! on Stabilizer, this function has cubic complexity when the Pauli operator commutes with all rows of the tableau. Most of the time it is better to simply use MixedDestabilizer representation.\n\nUnlike other project! methods, this one does not allow for keep_result=false, as the correct rank or anticommutation index can not be calculated without the expensive (cubic) canonicalization operation required by keep_result=true.\n\nSee the \"Datastructure Choice\" section in the documentation for more details.\n\nSee also: projectX!, projectY!, projectZ!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.projectX!-Tuple{MixedDestabilizer, Int64}","page":"API","title":"QuantumInterface.projectX!","text":"Measure a given qubit in the X basis. A faster special-case version of project!.\n\nSee also: project!, projectXrand!, projectY!, projectZ!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.projectY!-Tuple{MixedDestabilizer, Int64}","page":"API","title":"QuantumInterface.projectY!","text":"Measure a given qubit in the Y basis. A faster special-case version of project!.\n\nSee also: project!, projectYrand!, projectX!, projectZ!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.projectZ!-Tuple{MixedDestabilizer, Int64}","page":"API","title":"QuantumInterface.projectZ!","text":"Measure a given qubit in the Z basis. A faster special-case version of project!.\n\nSee also: project!, projectZrand!, projectY!, projectX!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.reset_qubits!-Tuple{MixedDestabilizer, QuantumClifford.AbstractStabilizer, Any}","page":"API","title":"QuantumInterface.reset_qubits!","text":"reset_qubits!(\n s::MixedDestabilizer,\n newstate::QuantumClifford.AbstractStabilizer,\n qubits;\n phases\n) -> MixedDestabilizer\n\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.reset_qubits!-Tuple{MixedStabilizer, Any, Any}","page":"API","title":"QuantumInterface.reset_qubits!","text":"reset_qubits!(\n s::MixedStabilizer,\n newstate,\n qubits;\n phases\n) -> MixedStabilizer\n\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.reset_qubits!-Tuple{Stabilizer, Any, Any}","page":"API","title":"QuantumInterface.reset_qubits!","text":"reset_qubits!(\n s::Stabilizer,\n newstate,\n qubits;\n phases\n) -> Any\n\n\nReset a given set of qubits to be in the state newstate. These qubits are traced out first, which could lead to \"nonlocal\" changes in the tableau.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.tensor","page":"API","title":"QuantumInterface.tensor","text":"Tensor product between operators or tableaux. See also tensor_pow.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumInterface.tensor_pow-Tuple{Union{QuantumClifford.AbstractCliffordOperator, QuantumClifford.AbstractStabilizer}, Any}","page":"API","title":"QuantumInterface.tensor_pow","text":"Repeated tensor product of an operators or a tableau. See also tensor.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.traceout!-Tuple{Stabilizer, Any}","page":"API","title":"QuantumInterface.traceout!","text":"traceout!(s::Stabilizer, qubits; phases, rank) -> Any\n\n\nTrace out a qubit.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumInterface.traceout!-Tuple{Union{MixedDestabilizer, MixedStabilizer}, Any}","page":"API","title":"QuantumInterface.traceout!","text":"traceout!(\n s::Union{MixedDestabilizer, MixedStabilizer},\n qubits;\n phases,\n rank\n) -> Any\n\n\n\n\n\n\n","category":"method"},{"location":"API/#Private-API","page":"API","title":"Private API","text":"","category":"section"},{"location":"API/","page":"API","title":"API","text":"danger: Private Implementation Details\nThese functions are used internally by the library and might be drastically modified or deleted without warning or deprecation.","category":"page"},{"location":"API/","page":"API","title":"API","text":"Modules = [QuantumClifford]\nPrivate = true\nPublic = false","category":"page"},{"location":"API/#QuantumClifford.AbstractMeasurement","page":"API","title":"QuantumClifford.AbstractMeasurement","text":"Supertype of all symbolic single-qubit measurements.\n\n\n\n\n\n","category":"type"},{"location":"API/#QuantumClifford.Tableau","page":"API","title":"QuantumClifford.Tableau","text":"Internal Tableau type for storing a list of Pauli operators in a compact form. No special semantic meaning is attached to this type, it is just a convenient way to store a list of Pauli operators. E.g. it is not used to represent a stabilizer state, or a stabilizer group, or a Clifford circuit.\n\n\n\n\n\n","category":"type"},{"location":"API/#Base.inv-Tuple{CliffordOperator}","page":"API","title":"Base.inv","text":"inv(\n c::CliffordOperator;\n phases\n) -> CliffordOperator{QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}}\n\n\nInverse of a CliffordOperator\n\n\n\n\n\n","category":"method"},{"location":"API/#Base.permute!-Tuple{QuantumClifford.AbstractStabilizer, AbstractVector}","page":"API","title":"Base.permute!","text":"Permute the qubits (i.e., columns) of the state in place.\n\n\n\n\n\n","category":"method"},{"location":"API/#Base.permute!-Tuple{QuantumClifford.Tableau, AbstractVector}","page":"API","title":"Base.permute!","text":"Permute the qubits (i.e., columns) of the tableau in place.\n\n\n\n\n\n","category":"method"},{"location":"API/#LinearAlgebra.dot-Tuple{QuantumClifford.AbstractStabilizer, QuantumClifford.AbstractStabilizer}","page":"API","title":"LinearAlgebra.dot","text":"The inner product of two Stabilizers.\n\nBased on (Garcia et al., 2012).\n\nSee also: logdot\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford._apply_nonthread!-Tuple{QuantumClifford.AbstractStabilizer, CliffordOperator, AbstractVector{Int64}}","page":"API","title":"QuantumClifford._apply_nonthread!","text":"Nonvectorized version of apply! used for unit tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford._apply_nonthread!-Tuple{QuantumClifford.AbstractStabilizer, CliffordOperator}","page":"API","title":"QuantumClifford._apply_nonthread!","text":"Nonvectorized version of apply! used for unit tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford._mul_left_nonvec!-Union{Tuple{T}, Tuple{AbstractVector{T}, AbstractVector{T}}} where T<:Unsigned","page":"API","title":"QuantumClifford._mul_left_nonvec!","text":"Nonvectorized version of mul_left! used for unit tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford._remove_rowcol!-Tuple{MixedDestabilizer, Any, Any}","page":"API","title":"QuantumClifford._remove_rowcol!","text":"Unexported low-level function that removes a row (by shifting all rows up as necessary)\n\nBecause MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.\n\nUsed on its own, this function will break invariants. Meant to be used with projectremove!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford._rowmove!-Union{Tuple{B}, Tuple{QuantumClifford.Tableau, Any, Any}} where B","page":"API","title":"QuantumClifford._rowmove!","text":"Unexported low-level function that moves row i to row j.\n\nUsed on its own, this function will break invariants. Meant to be used in _remove_rowcol!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford._stim_prodphase-Union{Tuple{T}, Tuple{AbstractVector{T}, AbstractVector{T}}} where T<:Unsigned","page":"API","title":"QuantumClifford._stim_prodphase","text":"The quantumlib/Stim implementation, which performs the prodphase and mul_left! together. Used for unit tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.apply_single_x!-Tuple{QuantumClifford.AbstractStabilizer, Any}","page":"API","title":"QuantumClifford.apply_single_x!","text":"Apply a Pauli X to the i-th qubit of state s. You should use apply!(stab,sX(i)) instead of this.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.apply_single_y!-Tuple{QuantumClifford.AbstractStabilizer, Any}","page":"API","title":"QuantumClifford.apply_single_y!","text":"Apply a Pauli Y to the i-th qubit of state s. You should use apply!(stab,sY(i)) instead of this.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.apply_single_z!-Tuple{QuantumClifford.AbstractStabilizer, Any}","page":"API","title":"QuantumClifford.apply_single_z!","text":"Apply a Pauli Z to the i-th qubit of state s. You should use apply!(stab,sZ(i)) instead of this.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.applynoise_branches","page":"API","title":"QuantumClifford.applynoise_branches","text":"Compute all possible new states after the application of the given noise model. Reports the probability of each one of them. Deterministic (as it reports all branches of potentially random processes), part of the Noise interface.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.colswap!-Tuple{QuantumClifford.Tableau, Any, Any}","page":"API","title":"QuantumClifford.colswap!","text":"Swap two columns of a stabilizer in place.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.destab_looks_good-Tuple{Any}","page":"API","title":"QuantumClifford.destab_looks_good","text":"Check basic consistency requirements of a destabilizer. Used in tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.enumerate_cliffords_slow-Tuple{Any, Any}","page":"API","title":"QuantumClifford.enumerate_cliffords_slow","text":"The O(n^4) implementation from (Koenig and Smolin, 2014) – their algorithm seems wrong as ⟨w'₁|wₗ⟩=bₗ which is not always zero.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.fill_tril-Tuple{Any, Any, Any}","page":"API","title":"QuantumClifford.fill_tril","text":"Assign (symmetric) random ints to off diagonals of matrix.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.gf2_H_standard_form_indices-Tuple{Any}","page":"API","title":"QuantumClifford.gf2_H_standard_form_indices","text":"The permutation of columns which turns a binary matrix into standard form. It is assumed the matrix has already undergone Gaussian elimination.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.initZ!-Tuple{PauliFrame}","page":"API","title":"QuantumClifford.initZ!","text":"initZ!(frame::PauliFrame) -> PauliFrame\n\n\nInject random Z errors over all frames and qubits for the supplied PauliFrame with probability 0.5.\n\nCalling this after initialization is essential for simulating any non-deterministic circuit. It is done automatically by most PauliFrame constructors.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.make_sumtype-Tuple{Any}","page":"API","title":"QuantumClifford.make_sumtype","text":"julia> make_sumtype([sCNOT])\nquote\n @sum_type CompactifiedGate :hidden begin\n sCNOT(::Int64, ::Int64)\n end\nend\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.make_sumtype_method","page":"API","title":"QuantumClifford.make_sumtype_method","text":"``` julia> makesumtypemethod([sCNOT], :apply!, (:s,)) quote function QuantumClifford.apply!(s, g::CompactifiedGate) @cases g begin sCNOT(q1, q2) => apply!(s, sCNOT(q1, q2)) end end end\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.make_sumtype_variant_constructor-Tuple{Any}","page":"API","title":"QuantumClifford.make_sumtype_variant_constructor","text":"julia> make_sumtype_variant_constructor(sCNOT)\n:(CompactifiedGate(g::sCNOT) = begin\n (CompactifiedGate').sCNOT(g.q1, g.q2)\nend)\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.make_variant-Tuple{DataType}","page":"API","title":"QuantumClifford.make_variant","text":"julia> make_variant(sCNOT)\n:(sCNOT(::Int64, ::Int64))\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.make_variant_deconstruct","page":"API","title":"QuantumClifford.make_variant_deconstruct","text":"julia> make_variant_deconstruct(sCNOT, :apply!, (:s,))\n:(sCNOT(q1, q2) => apply!(s, sCNOT(q1, q2)))\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.mixed_destab_looks_good-Tuple{Any}","page":"API","title":"QuantumClifford.mixed_destab_looks_good","text":"Check basic consistency requirements of a mixed destabilizer. Used in tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.mixed_stab_looks_good-Tuple{Any}","page":"API","title":"QuantumClifford.mixed_stab_looks_good","text":"Check basic consistency requirements of a mixed stabilizer. Used in tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.pfmeasurement","page":"API","title":"QuantumClifford.pfmeasurement","text":"For a given simulated state, e.g. a PauliFrame instance, returns the measurement results.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.precise_inv-Tuple{Any}","page":"API","title":"QuantumClifford.precise_inv","text":"Inverting a binary matrix: uses floating point for small matrices and Nemo for large matrices.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.project_cond!-Union{Tuple{PHASES}, Tuple{RESET}, Tuple{IS}, Tuple{MixedDestabilizer, Int64, Val{IS}, Val{RESET}}} where {IS, RESET, PHASES}","page":"API","title":"QuantumClifford.project_cond!","text":"Internal method used to implement projectX!, projectZ!, and projectY!.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.projectremoverand!-Union{Tuple{F}, Tuple{MixedDestabilizer, F, Any}} where F<:Union{typeof(projectX!), typeof(projectY!), typeof(projectZ!)}","page":"API","title":"QuantumClifford.projectremoverand!","text":"Unexported low-level function that projects a qubit and returns the result while making the tableau smaller by a qubit.\n\nBecause MixedDestabilizer is not mutable we return a new MixedDestabilizer with the same (modified) xzs array.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.quantum_mallows-Tuple{Any, Any}","page":"API","title":"QuantumClifford.quantum_mallows","text":"Sample (h, S) from the distribution P_n(h, S) from Bravyi and Maslov Algorithm 1.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.remove_column!-Union{Tuple{M}, Tuple{T}, Tuple{V}, Tuple{QuantumClifford.Tableau{V, M}, Int64}} where {V, T<:Unsigned, M<:AbstractMatrix{T}}","page":"API","title":"QuantumClifford.remove_column!","text":"Unexported low-level function that removes a column (by shifting all columns to the right of the target by one step to the left)\n\nBecause Tableau is not mutable we return a new Tableau with the same (modified) xzs array.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.rowdecompose-Tuple{Any, Union{Destabilizer, MixedDestabilizer}}","page":"API","title":"QuantumClifford.rowdecompose","text":"Decompose a Pauli P in terms of stabilizer and destabilizer rows from a given tableaux.\n\nFor given tableaux of rows destabilizer rows d_i and stabilizer rows s_i, there are boolean vectors b and c such that P = i^p prod_i d_i^b_i prod_i s_i^c_i.\n\nThis function returns p, b, c.\n\njulia> s = MixedDestabilizer(ghz(2))\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z_\n+ _X\n𝒮𝓉𝒶𝒷\n+ XX\n+ ZZ\n\njulia> phase, destab_rows, stab_rows = QuantumClifford.rowdecompose(P\"XY\", s)\n(3, Bool[1, 0], Bool[1, 1])\n\njulia> im^3 * P\"Z_\" * P\"XX\" * P\"ZZ\"\n+ XY\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.sample_geometric_2-Tuple{Any, Integer}","page":"API","title":"QuantumClifford.sample_geometric_2","text":"This function samples a number from 1 to n where n >= 1 probability of outputting i is proportional to 2^i\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.stab_looks_good-Tuple{Any}","page":"API","title":"QuantumClifford.stab_looks_good","text":"Check basic consistency requirements of a stabilizer. Used in tests.\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.to_cpu","page":"API","title":"QuantumClifford.to_cpu","text":"copies the memory content of the object to CPU\n\nYou can only use this function if CUDA.jl is imported\n\nFor more advanced users to_cpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your CPU architecture, if working with matrices of UInt32 is faster than UInt64, you can use to_cpu(data, UInt32)\n\njulia> using QuantumClifford: to_cpu, to_gpu\n\njulia> using CUDA # without this import, to_cpu, to_gpu are just function\n\njulia> stab = S\"- X_Z\\n+ _ZZ\\n+ __Z\"\n- X_Z\n+ _ZZ\n+ __Z\n\njulia> stab_gpu = to_gpu(stab);\n\njulia> apply!(stab_gpu, sHadamard(1));\n\njulia> stab_result_cpu = to_cpu(stab_gpu)\n- Z_Z\n+ _ZZ\n+ __Z\n\njulia> using QuantumClifford: to_cpu, to_gpu\n\njulia> using CUDA # without this import, to_cpu, to_gpu are just function\n\njulia> pf_gpu = to_gpu(PauliFrame(1000, 2, 2));\njulia> circuit = [sMZ(1, 1), sHadamard(2), sMZ(2, 2)];\njulia> pftrajectories(pf_gpu, circuit);\njulia> measurements = to_cpu(pf_gpu.measurements);\n\nSee also: to_gpu\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.to_gpu","page":"API","title":"QuantumClifford.to_gpu","text":"copies the memory content of the object to GPU\n\nYou can only use this function if CUDA.jl is imported\n\nFor more advanced users to_gpu(data, element_type) will reinterpret elements of data and converts them to element_type. For example based on your GPU architecture, if working with matrices of UInt64 is faster than UInt32, you can use to_gpu(data, UInt64)\n\njulia> using QuantumClifford: to_cpu, to_gpu\n\njulia> using CUDA # without this import, to_cpu, to_gpu are just function\n\njulia> stab = S\"- X_Z\\n+ _ZZ\\n+ __Z\"\n- X_Z\n+ _ZZ\n+ __Z\n\njulia> stab_gpu = to_gpu(stab);\n\njulia> apply!(stab_gpu, sHadamard(1));\n\njulia> stab_result_cpu = to_cpu(stab_gpu)\n- Z_Z\n+ _ZZ\n+ __Z\n\njulia> using QuantumClifford: to_cpu, to_gpu\n\njulia> using CUDA # without this import, to_cpu, to_gpu are just function\n\njulia> pf_gpu = to_gpu(PauliFrame(1000, 2, 2));\njulia> circuit = [sMZ(1, 1), sHadamard(2), sMZ(2, 2)];\njulia> pftrajectories(pf_gpu, circuit);\njulia> measurements = to_cpu(pf_gpu.measurements);\n\nSee also: to_cpu\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.trusted_rank","page":"API","title":"QuantumClifford.trusted_rank","text":"A \"trusted\" rank which returns rank(state) for Mixed[De]Stabilizer and length(state) for [De]Stabilizer.\n\n\n\n\n\n","category":"function"},{"location":"API/#QuantumClifford.zero!-Tuple{QuantumClifford.Tableau, Any}","page":"API","title":"QuantumClifford.zero!","text":"Zero-out a given row of a Tableau\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.zero!-Union{Tuple{PauliOperator{Tz, Tv}}, Tuple{Tv}, Tuple{Tve}, Tuple{Tz}} where {Tz, Tve<:Unsigned, Tv<:AbstractVector{Tve}}","page":"API","title":"QuantumClifford.zero!","text":"Zero-out the phases and single-qubit operators in a PauliOperator\n\n\n\n\n\n","category":"method"},{"location":"API/#QuantumClifford.@qubitop1-Tuple{Any, Any}","page":"API","title":"QuantumClifford.@qubitop1","text":"Macro used to define single qubit symbolic gates and their qubit_kernel methods.\n\n\n\n\n\n","category":"macro"},{"location":"API/#QuantumClifford.@qubitop2-Tuple{Any, Any}","page":"API","title":"QuantumClifford.@qubitop2","text":"Macro used to define 2-qubit symbolic gates and their qubit_kernel methods.\n\n\n\n\n\n","category":"macro"},{"location":"API/#QuantumClifford.@valbooldispatch-Tuple{Any, Vararg{Any}}","page":"API","title":"QuantumClifford.@valbooldispatch","text":"Turns f(Val(x)) into x ? f(Val(true)) : f(Val(false)) in order to avoid dynamic dispatch\n\nSee discourse discussion\n\n\n\n\n\n","category":"macro"},{"location":"mixed/#Mixed-Stabilizer-States","page":"Mixed States","title":"Mixed Stabilizer States","text":"","category":"section"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"DocTestSetup = quote\n using QuantumClifford\nend","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"The Stabilizer and Destabilizer have some support for mixed states (by being initialized with an incomplete list of stabilizer generators), but for most purposes one would use the Mixed* data structures.","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"Mixed stabilizer states are implemented with MixedStabilizer and MixedDestabilizer, the latter of which is the preferred data structure for most tasks as it is much faster by virtue of tracking the destabilizer generators.","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"julia> s = S\"XXX\n IZZ\";\n\njulia> Destabilizer(s)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z__\n+ _X_\n𝒮𝓉𝒶𝒷━\n+ XXX\n+ _ZZ","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"Unlike Destabilizer, MixedDestabilizer also tracks the logical operation generators.","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"julia> m = MixedDestabilizer(s)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z__\n+ _X_\n𝒳ₗ━━━\n+ _XX\n𝒮𝓉𝒶𝒷━\n+ XXX\n+ _ZZ\n𝒵ₗ━━━\n+ Z_Z\n\njulia> stabilizerview(m)\n+ XXX\n+ _ZZ\n\njulia> destabilizerview(m)\n+ Z__\n+ _X_\n\njulia> logicalxview(m)\n+ _XX\n\njulia> logicalzview(m)\n+ Z_Z","category":"page"},{"location":"mixed/#Gottesman-Canonicalization","page":"Mixed States","title":"Gottesman Canonicalization","text":"","category":"section"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"To obtain the logical operators we perform a different type of canonicalization, described in Gottesman's thesis and implemented in canonicalize_gott!. Unlike canonicalize! which uses only row operations, canonicalize_gott! performs column swaps as well. MixedDestabilizer undoes those swaps by default when instantiated, but that behavior can be turned off, if you prefer to work with the canonicalized tableau.","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"julia> s = S\"XXX\n ZIZ\";\n\njulia> MixedDestabilizer(s)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z__\n+ __X\n𝒳ₗ━━━\n+ _X_\n𝒮𝓉𝒶𝒷━\n+ XXX\n+ Z_Z\n𝒵ₗ━━━\n+ ZZ_\n\njulia> MixedDestabilizer(s; undoperm=false)\n𝒟ℯ𝓈𝓉𝒶𝒷\n+ Z__\n+ _X_\n𝒳ₗ━━━\n+ __X\n𝒮𝓉𝒶𝒷━\n+ XXX\n+ ZZ_\n𝒵ₗ━━━\n+ Z_Z","category":"page"},{"location":"mixed/","page":"Mixed States","title":"Mixed States","text":"Destabilizer and MixedStabilizer do not use any column swaps on instantiation as they do not track the logical operators.","category":"page"},{"location":"datastructures/#Data-Structures-Options","page":"Datastructure Choice","title":"Data Structures Options","text":"","category":"section"},{"location":"datastructures/#Choosing-Appropriate-Data-Structure","page":"Datastructure Choice","title":"Choosing Appropriate Tableau Data Structure","text":"","category":"section"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"There are four different data structures used to represent stabilizer states. If you will never need projective measurements you probably would want to use Stabilizer. If you require projective measurements, but only on pure states, Destabilizer should be the appropriate data structure. If mixed stabilizer states are involved, MixedStabilizer would be necessary.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"Stabilizer is simply a list of Pauli operators in a tableau form. As a data structure it does not enforce the requirements for a pure stabilizer state (the rows of the tableau do not necessarily commute, nor are they forced to be Hermitian; the tableau might be underdetermined, redundant, or contradictory). It is up to the user to ensure that the initial values in the tableau are meaningful and consistent.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"canonicalize!, project!, and generate! can accept an under determined (mixed state) Stabilizer instance and operate correctly. canonicalize! can also accept a redundant Stabilizer (i.e. not all rows are independent), leaving as many identity rows at the bottom of the canonicalized tableau as the number of redundant stabilizers in the initial tableau.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"canonicalize! takes mathcalO(n^3) steps. generate! expects a canonicalized input and then takes mathcalO(n^2) steps. project! takes mathcalO(n^3) for projecting on commuting operators due to the need to call canonicalize! and generate!. If the projections is on an anticommuting operator (or if keep_result=false) then it takes mathcalO(n^2) steps.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"MixedStabilizer provides explicit tracking of the rank of the mixed state and works properly when the projection is on a commuting operator not in the stabilizer (see table below for details). Otherwise it has the same performance as Stabilizer.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"The canonicalization can be made unnecessary if we track the destabilizer generators. There are two data structures capable of that.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"Destabilizer stores both the destabilizer and stabilizer states. project! called on it never requires a stabilizer canonicalization, hence it runs in mathcalO(n^2). However, project! will raise an exception if you try to project on a commuting state that is not in the stabilizer as that would be an expensive mathcalO(n^3) operation.","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"MixedDestabilizer tracks both the destabilizer operators and the logical operators in addition to the stabilizer generators. It does not require canonicalization for measurements and its project! operations always takes mathcalO(n^2).","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"For the operation _, anticom_index, result = project!(...) we have the following behavior:","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"projection Stabilizer MixedStabilizer Destabilizer MixedDestabilizer\non anticommuting operator anticom_index>0 result===nothing correct result in mathcalO(n^2) steps same as Stabilizer same as Stabilizer same as Stabilizer\non commuting operator in the stabilizer anticom_index==0 result!==nothing mathcalO(n^3); or mathcalO(n^2) if keep_result=false mathcalO(n^3) mathcalO(n^2) if the state is pure, throws exception otherwise mathcalO(n^2)\non commuting operator out of the stabilizer[1] anticom_index==rank result===nothing mathcalO(n^3), but the user needs to manually include the new operator to the stabilizer; or mathcalO(n^2) if keep_result=false but then result indistinguishable from cell above and anticom_index==0 mathcalO(n^3) and rank goes up by one not applicable if the state is pure, throws exception otherwise mathcalO(n^2) and rank goes up by one","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"Notice the results when the projection operator commutes with the state but is not generated by the stabilizers of the state (the last row of the table). In that case we have _, anticom_index, result = project!(...) where both anticom_index==rank and result===nothing, with rank being the new rank after projection, one more than the number of rows in the tableau before the measurement. ","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"[1]: This can occur only if the state being projected is mixed. Both Stabilizer and Destabilizer can be used for mixed states by simply providing fewer stabilizer generators than qubits at initialization. This can be useful for low-level code that tries to avoid the extra memory cost of using MixedStabilizer and MixedDestabilizer but should be avoided otherwise. project! works correctly or raises an explicit warning on all 4 data structures.","category":"page"},{"location":"datastructures/#Bit-Packing-in-Integers-and-Array-Order","page":"Datastructure Choice","title":"Bit Packing in Integers and Array Order","text":"","category":"section"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"We do not use boolean arrays to store information about the qubits as this would be wasteful (7 out of 8 bits in the boolean would be unused). Instead, we use all 8 qubits in a byte and perform bitwise logical operations as necessary. Implementation details of the object in RAM can matter for performance. The library permits any of the standard UInt types to be used for packing the bits, and larger UInt types (like UInt64) are usually faster as they permit working on 64 qubits at a time (instead of 1 if we used a boolean, or 8 if we used a byte).","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"Moreover, how a tableau is stored in memory can affect performance, as a row-major storage usually permits more efficient use of the CPU cache (for the particular algorithms we use).","category":"page"},{"location":"datastructures/","page":"Datastructure Choice","title":"Datastructure Choice","text":"Both of these parameters are benchmarked (testing the application of a Pauli operator, which is an mathcalO(n^2) operation; and testing the canonicalization of a Stabilizer, which is an mathcalO(n^3) operation). Row-major UInt64 is the best performing and it is used by default in this library.","category":"page"},{"location":"noisycircuits_ops/#noisycircuits_ops","page":"Circuit Operations","title":"Operators in Circuit Simulations","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"DocTestSetup = quote\n using QuantumClifford\n using QuantumClifford.Experimental.NoisyCircuits\n using Quantikz\nend\nCurrentModule = QuantumClifford.Experimental.NoisyCircuits","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"warning: Unstable\nThis is experimental functionality with an unstable API.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"Import with using QuantumClifford.Experimental.NoisyCircuits.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"Too see a condensed list of all operations check out the API docs.","category":"page"},{"location":"noisycircuits_ops/#Unitary-Gates","page":"Circuit Operations","title":"Unitary Gates","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"We distinguish between symbolic gates like sCNOT that have specialized (fast) apply! methods (usually just for single and two qubit gates) and general tableau representation of gates like CliffordOperator that can represent any multi-qubit gate.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"Predefined unitary gates are available, like sCNOT, sHadamard, etc.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"using QuantumClifford # hide\nusing QuantumClifford.Experimental.NoisyCircuits # hide\nusing Quantikz # hide\n[sCNOT(2,4),sHadamard(2),sCPHASE(1,3),sSWAP(2,4)]","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"Any arbitrary tableaux can be used as a gate too. ","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"They can be specified by giving a Clifford operator tableaux and the indices on which it acts (particularly useful for gates acting on a small part of a circuit):","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"using QuantumClifford # hide\nusing QuantumClifford.Experimental.NoisyCircuits # hide\nusing Quantikz # hide\nSparseGate(tCNOT, [2,4])","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"The Clifford operator tableaux can be completely arbitrary.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"SparseGate(random_clifford(3), [2,4,5])","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"If the Clifford operator acts on all qubits, we do not need to specify indices, just use the operator.","category":"page"},{"location":"noisycircuits_ops/#Noisy-Gates","page":"Circuit Operations","title":"Noisy Gates","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"Each gate can be followed by noise applied to the qubits on which it has acted. This is done by wrapping the given gate into a NoisyGate","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"ε = 0.03 # X/Y/Z error probability\nnoise = UnbiasedUncorrelatedNoise(ε)\nnoisy_gate = NoisyGate(SparseGate(tCNOT, [2,4]), noise)","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"In circuit diagrams the noise is not depicted, but after each application of the gate defined in noisy_gate, a noise operator will also be applied. The example above is of Pauli Depolarization implemented by UnbiasedUncorrelatedNoise.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"One can also apply only the noise operator by using NoiseOp which acts only on specified qubits. Or alternatively, one can use NoiseOpAll in order to apply noise to all qubits.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"[NoiseOp(noise, [4,5]), NoiseOpAll(noise)]","category":"page"},{"location":"noisycircuits_ops/#Coincidence-Measurements","page":"Circuit Operations","title":"Coincidence Measurements","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"Global parity measurements involving single-qubit projections and classical communication are implemented with BellMeasurement. One needs to specify the axes of measurement and the qubits being measured. If the parity is trivial, the circuit continues, if the parity is non-trivial, the circuit ends and reports a detected failure. This operator is frequently used in the simulation of entanglement purification.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"BellMeasurement([sMX(1), sMY(3), sMZ(4)])","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"There is also NoisyBellMeasurement that takes the bit-flip probability of a single-qubit measurement as a third argument.","category":"page"},{"location":"noisycircuits_ops/#Stabilizer-Measurements","page":"Circuit Operations","title":"Stabilizer Measurements","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"A measurement over one or more qubits can also be performed, e.g., a direct stabilizer measurement on multiple qubits without the use of ancillary qubits. When applied to multiple qubits, this differs from BellMeasurement as it performs a single projection, unlike BellMeasurement which performs a separate projection for every single qubit involved. This measurement is implemented in PauliMeasurement which requires a Pauli operator on which to project and the index of the classical bit in which to store the result. Alternatively, there are sMX, sMZ, sMY if you are measuring a single qubit.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"[PauliMeasurement(P\"XYZ\", 1), sMZ(2, 2)]","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"TODO: SparseMeasurement, NoisyMeasurement","category":"page"},{"location":"noisycircuits_ops/#Verification-Operations","page":"Circuit Operations","title":"Verification Operations","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"At the end of many circuits one might want to check whether they performed correctly. The VerifyOp operation corresponds to an unphysical perfect tomographic operation, checking whether the state of the qubits at the given indices is indeed what is expected. If it is, the operation reports a success, otherwise it reports an undetected error.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"desired_state = random_stabilizer(5)\nqubit_indices = [1,2,3,4,7]\nVerifyOp(desired_state, qubit_indices)","category":"page"},{"location":"noisycircuits_ops/#Reset-Operations","page":"Circuit Operations","title":"Reset Operations","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"The Reset operations lets you trace out the specified qubits and set their state to a specific tableau.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"new_state = random_stabilizer(3)\nqubit_indices = [1,2,3]\nReset(new_state, qubit_indices)","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"It can be done anywhere in a circuit, not just at the beginning.","category":"page"},{"location":"noisycircuits_ops/#Gates-Conditioned-on-Classical-Bits","page":"Circuit Operations","title":"Gates Conditioned on Classical Bits","text":"","category":"section"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"ConditionalGate is a conditional gate that performs one of two provided gates, depending on the value of a given classical bit.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"DecisionGate is a conditional gate that performs one of the supplied gates, depending on the output of decisionfunction applied to the entire classical bit register.","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"gate1 = SparseGate(tCNOT, [1,2])\ngate2 = sCPHASE(1,2)\ngate3 = SparseGate(tSWAP, [1,3])\ncg = ConditionalGate(gate1, gate2, 2)\ndg = DecisionGate([gate1,gate2,gate3], bit_register->1) # it will always perform gate1\n[sMX(4,1), sMZ(5,2), cg, dg]","category":"page"},{"location":"noisycircuits_ops/","page":"Circuit Operations","title":"Circuit Operations","text":"TODO: Split ConditionalGate into quantum conditional and classical conditional","category":"page"},{"location":"plotting/#Visualizations","page":"Visualizations","title":"Visualizations","text":"","category":"section"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"Stabilizers have a plot recipe that can be used with Plots.jl or Makie.jl. It simply displays the corresponding parity check matrix (extracted with stab_to_gf2) as a bitmap image. Circuits can be visualized with Quantikz.jl.","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"Importing the aforementioned packages together with QuantumClifford is necessary to enable the plotting functionality (implemented as package extensions).","category":"page"},{"location":"plotting/#Plots.jl","page":"Visualizations","title":"Plots.jl","text":"","category":"section"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"In Plots.jl we have a simple recipe plot(s::Stabilizer; xzcomponents=...) where xzcomponents=:split plots the tableau heatmap in a wide form, X bits on the left, Z bits on the right; or xzcomponents=:together plots them overlapping, with different colors for I, X, Z, and Y.","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, Plots\nplot(random_stabilizer(20,30), xzcomponents=:split)","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, Plots\nplot(canonicalize!(random_stabilizer(20,30)))","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, Plots\nplot(canonicalize_gott!(random_stabilizer(30))[1], xzcomponents=:split)","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, Plots\nplot(canonicalize_gott!(random_stabilizer(30))[1]; xzcomponents=:together)","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, Plots\nplot(canonicalize_rref!(random_stabilizer(20,30),1:30)[1]; xzcomponents=:together)","category":"page"},{"location":"plotting/#Makie.jl","page":"Visualizations","title":"Makie.jl","text":"","category":"section"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"Makie's heatmap can be directly called on Stabilizer.","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, CairoMakie\ns = S\"IIXZ\n ZZIZ\n YYIZ\n IIIZ\n ZZXZ\"\nf, ax, p = CairoMakie.heatmap(s)\nhidedecorations!(ax); hidespines!(ax); # remove ticks and spines\nax.aspect = DataAspect(); # set a one-to-one aspect ratio\nf","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"A full Makie recipe is available as well (supporting xzcomponents)","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, CairoMakie\ns = S\"IIXZ\n ZZIZ\n YYIZ\n IIIZ\n ZZXZ\"\nf, ax, p = stabilizerplot(s, xzcomponents=:together)\nhidedecorations!(ax); hidespines!(ax)\nax.aspect = DataAspect()\nf","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"You can easily add colorbars (and change the colormap) as well:","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, CairoMakie\nfig = Figure()\nax, p = stabilizerplot(fig[1, 1], s, colormap=cgrad(:heat, 4, categorical = true))\nhidedecorations!(ax)\nhidespines!(ax)\nxlims!(ax, 0.5, size(s,2)+0.5) # otherwise there is padding\nylims!(ax, 0.5, size(s,1)+0.5) # otherwise there is padding\n# set the aspect ratio of the plot\nax.aspect = DataAspect()\n# set the aspect ratio of the layout\ncolsize!(fig.layout, 1, Aspect(1, size(s,2)/size(s,1))) \nColorbar(fig[1, 2], p, ticks = (0:3, [\"I\", \"X\", \"Z\", \"Y\"]))\nfig","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"Or set a completely custom set of colors:","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"fig = Figure()\nax, p = stabilizerplot(fig[1, 1], s, colormap=cgrad([:lightgray,RGBf(1,0.4,0.4),RGBf(0.3,1,0.5),RGBf(0.4,0.4,1)], 4, categorical = true))\nhidedecorations!(ax)\nhidespines!(ax)\nxlims!(ax, 0.5, size(s,2)+0.5)\nylims!(ax, 0.5, size(s,1)+0.5)\nax.aspect = DataAspect()\ncolsize!(fig.layout, 1, Aspect(1, size(s,2)/size(s,1))) \nColorbar(fig[2, 1], p, ticks = (0:3, [\"I\", \"X\", \"Z\", \"Y\"]), vertical = false, flipaxis = false)\nfig","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"You might have noticed, Makie recipes do not let you edit the axes or figure, rather they only permit you to set the plot content. Which is why we use hidedecorations!, hidesplines!, and DataAspect to further modify the plot. However, these defaults are also available in stabilizerplot_axis.","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, CairoMakie\nf=Figure()\nstabilizerplot_axis(f[1,1],random_stabilizer(100))\nf","category":"page"},{"location":"plotting/#Quantikz.jl","page":"Visualizations","title":"Quantikz.jl","text":"","category":"section"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"With the Quantikz library you can visualize gates or sequences of gates.","category":"page"},{"location":"plotting/","page":"Visualizations","title":"Visualizations","text":"using QuantumClifford, Quantikz\ncircuit = [sCNOT(1,2), SparseGate(random_clifford(4), [1,4,5,6]), sMZ(4)]","category":"page"},{"location":"#QuantumClifford.jl","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"DocTestSetup = quote\n using QuantumClifford\nend","category":"page"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"QuantumClifford.jl is a Julia library for simulation of Clifford circuits, which are a subclass of quantum circuits that can be efficiently simulated on a classical computer.","category":"page"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"This library uses the tableaux formalism[1] with the destabilizer improvements[2]. Pauli frames are supported for faster repeated simulation of noisy circuits. Various symbolic and algebraic tools for manipulating, converting, and visualizing states and circuits are also implemented. ","category":"page"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"[1]: (Gottesman, 1998)","category":"page"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"[2]: (Aaronson and Gottesman, 2004)","category":"page"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"The library consists of two main parts: Tools for working with the algebra of Stabilizer Tableaux and tools specifically for efficient Circuit Simulation.","category":"page"},{"location":"#Stabilizer-Tableau-Algebra","page":"QuantumClifford.jl","title":"Stabilizer Tableau Algebra","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"The Stabilizer Tableau Algebra component of QuantumClifford.jl efficiently handles pure and mixed stabilizer states of thousands of qubits, along with support for sparse or dense Clifford operations acting upon them. It provides operations such as canonicalization, projection, generation , and partial traces. The code is vectorized and multithreaded, offering fast, in-place, and allocation-free implementations. Tools for conversion to graph states and for visualization of tableaux are available.","category":"page"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"See the Stabilizer Tableau Algebra manual or the curated list of useful functions.","category":"page"},{"location":"#Example-Usage","page":"QuantumClifford.jl","title":"Example Usage","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"julia> using QuantumClifford\n\njulia> P\"X\" * P\"Z\"\n-iY\n\njulia> P\"X\" ⊗ P\"Z\"\n+ XZ\n\njulia> S\"-XX\n +ZZ\"\n- XX\n+ ZZ\n\njulia> tCNOT * S\"-XX\n +ZZ\"\n- X_\n+ _Z","category":"page"},{"location":"#Circuit-Simulation","page":"QuantumClifford.jl","title":"Circuit Simulation","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"The circuit simulation component of QuantumClifford.jl enables Monte Carlo (or symbolic) simulations of noisy Clifford circuits. It provides three main simulation methods: mctrajectories, pftrajectories, and petrajectories. These methods offer varying levels of efficiency, accuracy, and insight.","category":"page"},{"location":"#Monte-Carlo-Simulations-with-Stabilizer-Tableaux-(mctrajectories)","page":"QuantumClifford.jl","title":"Monte Carlo Simulations with Stabilizer Tableaux (mctrajectories)","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"The mctrajectories method runs Monte Carlo simulations using a Stabilizer tableau representation for the quantum states.","category":"page"},{"location":"#Monte-Carlo-Simulations-with-Pauli-Frames-(pftrajectories)","page":"QuantumClifford.jl","title":"Monte Carlo Simulations with Pauli Frames (pftrajectories)","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"The pftrajectories method runs Monte Carlo simulations of Pauli frames over a single reference Stabilizer tableau simulation. This approach is much more efficient but supports a smaller class of circuits.","category":"page"},{"location":"#Symbolic-Depth-First-Traversal-of-Quantum-Trajectories-(petrajectories)","page":"QuantumClifford.jl","title":"Symbolic Depth-First Traversal of Quantum Trajectories (petrajectories)","text":"","category":"section"},{"location":"","page":"QuantumClifford.jl","title":"QuantumClifford.jl","text":"The petrajectories method performs a depth-first traversal of the most probable quantum trajectories, providing a fixed-order approximation of the circuit's behavior. This approach gives symbolic expressions for various figures of merit instead of just a numeric value.","category":"page"}] +} diff --git a/v0.8.21/siteinfo.js b/v0.8.21/siteinfo.js new file mode 100644 index 000000000..822dd0eb6 --- /dev/null +++ b/v0.8.21/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.8.21"; diff --git a/v0.8.21/stab-algebra-manual/index.html b/v0.8.21/stab-algebra-manual/index.html new file mode 100644 index 000000000..29219f0e0 --- /dev/null +++ b/v0.8.21/stab-algebra-manual/index.html @@ -0,0 +1,296 @@ + +Manual · QuantumClifford.jl

Stabilizer Tableau Algebra Manual

The library consists of two main parts: Tools for working with the algebra of Stabilizer tableaux and tools specifically for efficient Circuit Simulation. This chapter discusses the former "lower level" Stabilizer tableau algebra tools.

Pauli Operators

The PauliOperator object represents multi-qubit Pauli operator ($±\{1,i\}\{I,Z,X,Y\}^{\otimes n}$). It is stored in memory as a phase (a single byte where 0x0,0x1,0x2,0x3 corresponds to $1,i,-1,-i$) and two bit-arrays, for X and for Z components.

You can create them with a P string.

julia> P"-iXZ"
+-iXZ

Or by specifying phase and X/Z components:

julia> PauliOperator(0x0,Bool[0,1,0],Bool[0,0,1])
++ _XZ

Both underscore and I can be used for identity.

julia> P"I_XYZ"
++ __XYZ

Multiplication with scalars or other Pauli operators works as expected, as well as tensor products of Pauli operators.

julia> -1im*P"X"
+-iX
+
+julia> P"X" * P"Z"
+-iY
+
+julia> P"X" ⊗ P"Z"
++ XZ

One can check for commutativity with comm.

julia> comm(P"X",P"Z")
+0x01
+
+julia> comm(P"XX",P"ZZ")
+0x00

And check the phase of a product with prodphase.

julia> prodphase(P"X", P"Z")
+0x03
+
+julia> prodphase(P"X", P"iZ")
+0x00
+
+julia> prodphase(P"X",P"Y")
+0x01

Indexing operations are available.

julia> p = P"IXYZ";
+
+julia> p[1], p[2], p[3], p[4]
+((false, false), (true, false), (true, true), (false, true))
+
+julia> p = P"III";
+
+julia> p[2] = (true, true);
+
+julia> p
++ _Y_

Including fancy indexing:

julia> P"IXYZ"[[2,3]]
++ XY
+
+julia> P"IXYZ"[[false,true,true,false]]
++ XY

The operator is represented in memory by bit arrays (much denser than using byte arrays).

julia> p = P"-IXYZ";
+
+julia> p.nqubits, p.xz
+(4, UInt64[0x0000000000000006, 0x000000000000000c])

Views that give just the X or Z components of the xz bitarray are available through xview and zview.

julia> xview(P"XYZI")
+1-element view(::Vector{UInt64}, 1:1) with eltype UInt64:
+ 0x0000000000000003

The convenience methods xbit and zbit give you Bool (GF2) vectors.

julia> xbit(P"XYZI")
+4-element Vector{Bool}:
+ 1
+ 1
+ 0
+ 0

Stabilizers

A Stabilizer object is a tableau of Pauli operators. When the tableau is meant to represent a (pure or mixed) stabilizer state, all of these operators should commute (but that is not enforced, rather Stabilizer is a generic tableau data structure). It is stored in memory as a phase list and a bit-matrix for X and Z components. It can be instantiated by an S string, or with a number of different constructors.

Stabilizers and Destabilizers

In many cases you probably would prefer to use the MixedDestabilizer data structure, as it caries a lot of useful additional information, like tracking rank and destabilizer operators. Stabilizer has mostly a pedagogical value, and it is also used for slightly faster simulation of a particular subset of Clifford operations. See also the data structures discussion page.

julia> S"-XX
+         +ZZ"
+- XX
++ ZZ
+
+julia> Stabilizer([P"-XX",P"+ZZ"])
+- XX
++ ZZ
+
+julia> Stabilizer([0x2, 0x0],
+                  Bool[1 1;
+                       0 0],
+                  Bool[0 0;
+                       1 1])
+- XX
++ ZZ

Direct sums can be performed,

julia> S"-XX" ⊗ S"ZZ"
+- XX__
++ __ZZ

Indexing operations are available, including fancy indexing. Be careful about how phase information gets transferred during sub-indexing.

julia> s = S"-XYZ
+             -ZIX
+             +XIZ";
+
+julia> s[1]
+- XYZ
+
+julia> s[1,2]
+(true, true)
+
+julia> s[[3,1]]
++ X_Z
+- XYZ
+
+julia> s[[3,1],[2]]
++ _
+- Y

Consistency at creation is not verified so nonsensical stabilizers can be created, both in terms of content and shape.

julia> S"iX
+         +Z"
++iX
++ Z

Similarly to the Pauli operators, a bit array representation is used.

julia> s = S"-XXX
+             +ZZI
+             -IZZ"
+- XXX
++ ZZ_
+- _ZZ
+
+julia> phases(s), tab(s).xzs
+(UInt8[0x02, 0x00, 0x02], UInt64[0x0000000000000007 0x0000000000000000 0x0000000000000000; 0x0000000000000000 0x0000000000000003 0x0000000000000006])

And there are convenience functions that can extract the corresponding binary check matrix.

julia> stab_to_gf2(s)
+3×6 Matrix{Bool}:
+ 1  1  1  0  0  0
+ 0  0  0  1  1  0
+ 0  0  0  0  1  1

Canonicalization of Stabilizers

Canonicalization (akin to Gaussian elimination over F(2,2)) is implemented in the canonicalize! function. Besides the default canonicalization prescription, alternative ones are available as described in the canonicalization page.

julia> s = S"-XXX
+             +ZZX
+             +III";
+
+julia> canonicalize!(s)
++ YY_
++ ZZX
++ ___

If phases are inconsequential, the operations can be faster by not tracking and updating them.

julia> s = S"-XXX
+             +ZZX
+             +III";
+
+julia> canonicalize!(s; phases=false)
+- YY_
++ ZZX
++ ___

These operations are in place (as customarily signified by "!").

julia> s = S"-XXX
+             +ZZX
+             +III";
+
+julia> canonicalize!(s; phases=false);
+
+julia> s
+- YY_
++ ZZX
++ ___

Projective Measurements

The project! function is used to perform generic projective measurements.

Single qubit projections

If you know your Pauli measurement operator acts on a single qubit, there are much faster projection functions available, discussed in the next section. Namely projectX!, projectY!, and projectZ!.

To observe the effect of different projections, we will start with a GHZ state.

julia> s = S"-XXX
+             +ZZI
+             -IZZ";

The project! function returns the new stabilizer, the index where the anticommutation was detected, and the result of the projection (nothing being an undetermined result). For instance here we project on an operator that does not commute with all stabilizer generators.

julia> project!(copy(s), P"ZII")[1]
++ Z__
++ ZZ_
+- _ZZ

Importantly, when there is an undetermined result, we return nothing and leave the phase of the new stabilizer the same as the phase of the projection operator. If you want to perform a Monte Carlo simulation, you need to randomize the phase of the stabilizer at the anticommuting index yourself. For instance, one can do:

julia> newstate, anticomindex, result = project!(copy(s), P"XII")
+       if isnothing(result)
+           phases(newstate)[anticomindex] = rand([0x0,0x2])
+       end
+       result, anticomindex
+(nothing, 2)

Of course, this is a rather cumbersome way to run a simulation, so we also provide projectrand! which does the necessary randomization automatically, for cases where you do not need the fine grained control of project!.

We can project on a commuting operator, hence no anticommuting terms (the index is zero), and the result is perfectly determined (-1, or in our convention to represent the phase, 0x2).

julia> project!(copy(s), P"-ZZI")
+(Stabilizer 3×3, 0, 0x02)

When the projection is consistent with the stabilizer (i.e. the measurement result is not nothing), this would trigger an expensive canonicalization procedure in order to calculate the measurement result (unless we are using more advanced data structures to represent the state, which are discussed later). If all you want to know is whether the projection is consistent with the stabilizer, but you do not care about the measurement result, you can skip the canonicalization and calculation of the result.

julia> project!(copy(s), P"-ZZI", keep_result=false)
+(Stabilizer 3×3, 0, nothing)

Lastly, in either case, you can skip the calculation of the phases as well, if they are unimportant.

julia> project!(copy(s), P"ZZI", phases=false)
+(Stabilizer 3×3, 0, 0x00)

Sparse single-qubit measurements

In many circumstances only a single-qubit operator is being measured. In that case one should use the projectX!, projectY!, and projectZ! functions as they are much faster thanks to tracking only a single qubit. They have versions that randomize the phase as necessary as well: projectXrand!, projectYrand!, and projectZrand!.

Gate-like interface

If you do not need all this boilerplate, and especially if you want to perform the randomization automatically, you can use the gate-like "symbolic" objects sMX, sMY, and sMZ, that perform the measurement and the necessary randomization of phase. If the measurement result is to be stored, you can use the Register structure that stores both stabilizer tableaux and bit values.

julia> state = Register(ghz(3), [false,false])
+Register{Vector{UInt8}, Matrix{UInt64}}(Rank 3 stabilizer
++ Z__
++ _X_
++ __X
+═════
++ XXX
++ ZZ_
++ Z_Z
+═════
+, Bool[0, 0])
+
+julia> apply!(state, sMX(3,2)) # which qubit is measured and in which bit it is stored
+Register{Vector{UInt8}, Matrix{UInt64}}(Rank 3 stabilizer
++ Z__
++ _X_
++ Z_Z
+═════
++ XXX
++ ZZ_
+- __X
+═════
+, Bool[0, 1])
+
+julia> bitview(state)
+2-element Vector{Bool}:
+ 0
+ 1

Or you can use the projectXrand!, projectYrand!, and projectZrand! if you prefer a function-call interface.

Partial Traces

Partial trace (using traceout!) over even a single qubit might cause many of them to decohere due to entanglement.

julia> ghz = S"XXX
+               ZZ_
+               _ZZ";
+
+julia> traceout!(ghz, [1])
++ _ZZ
++ ___
++ ___

This is somewhat more elegant when the datastructure being used explicitly supports mixed states.

julia> ghz = MixedStabilizer(S"XXX
+                               ZZ_
+                               _ZZ");
+
+julia> traceout!(ghz, [1])
++ _ZZ

Generating a Pauli Operator with Stabilizer Generators

The generate! function attempts to generate a Pauli operator by multiplying together the operators belonging to a given stabilizer (or reports their independence). This particular function requires the stabilizer to be already canonicalized.

julia> s = S"-XXX
+             +ZZI
+             -IZZ";
+
+julia> s = canonicalize!(s)
+- XXX
+- Z_Z
+- _ZZ

It modifies the Pauli operator in place, reducing it to identity if possible. The leftover phase is present to indicate if the phase itself could not have been canceled. The list of indices specifies which rows of the stabilizer were used to generated the desired Pauli operator.

julia> generate!(P"XYY", s)
+(- ___, [1, 3])

Phases can be neglected, for higher performance.

julia> generate!(P"XYY", s, phases=false)
+(+ ___, [1, 3])

If the Pauli operator can not be generated by the stabilizer, nothing value is returned.

julia> generate!(P"ZZZ", s)
+
+julia> generate!(P"XZX", s)
+
+julia> generate!(P"YYY", s)

Clifford Operators

The CliffordOperator structure represents a linear mapping between stabilizers (which should also preserve commutation relationships, but that is not checked at instantiation). These are n-qubit dense tableaux, representing an operation on n-qubit states. For single- or two-qubit gates, it is much more efficient to use small sparse symbolic clifford operators. A number of predefined Clifford operators are available, their name prefixed with t to mark them as dense tableaux.

julia> tHadamard
+X₁ ⟼ + Z
+Z₁ ⟼ + X
+
+julia> tPhase
+X₁ ⟼ + Y
+Z₁ ⟼ + Z
+
+julia> tCNOT
+X₁ ⟼ + XX
+X₂ ⟼ + _X
+Z₁ ⟼ + Z_
+Z₂ ⟼ + ZZ
+
+julia> tId1
+X₁ ⟼ + X
+Z₁ ⟼ + Z

Chaining and tensor products are possible. Same for qubit permutations.

julia> tHadamard ⊗ tPhase
+X₁ ⟼ + Z_
+X₂ ⟼ + _Y
+Z₁ ⟼ + X_
+Z₂ ⟼ + _Z
+
+julia> tHadamard * tPhase
+X₁ ⟼ - Y
+Z₁ ⟼ + X
+
+julia> permute(tCNOT, [2,1])
+X₁ ⟼ + X_
+X₂ ⟼ + XX
+Z₁ ⟼ + ZZ
+Z₂ ⟼ + _Z

You can create custom Clifford operators with C-strings or with a list of Pauli operators.

julia> C"-ZZ
+         +_Z
+         -X_
+         +XX"
+X₁ ⟼ - ZZ
+X₂ ⟼ + _Z
+Z₁ ⟼ - X_
+Z₂ ⟼ + XX
+
+julia> CliffordOperator([P"-ZZ", P"_Z", P"-X_", P"XX"])
+X₁ ⟼ - ZZ
+X₂ ⟼ + _Z
+Z₁ ⟼ - X_
+Z₂ ⟼ + XX

Naturally, the operators can be applied to stabilizer states. This includes high performance in-place operations (and the phase can be neglected with phases=false for faster computation).

julia> tCNOT * S"X_"
++ XX
+
+julia> s = S"X_";
+
+julia> apply!(s,tCNOT)
++ XX

Sparse applications where a small Clifford operator is applied only on a particular subset of a larger stabilizer is also possible, but in such circumstances it is useful to consider using symbolic operators too.

julia> s = S"Z_YX";
+
+julia> apply!(s, tCNOT, [4,2]) # Apply the CNOT on qubits 4 and 2
++ ZXYX

Pauli operators act as Clifford operators too (but they are rather boring, as they only change signs).

julia> P"XII" * S"ZXX"
+- ZXX

Internally, the CliffordOperator structure simply stores the tableau representation of the operation.

The apply! function is efficiently multithreaded for CliffordOperators. To start multithreaded Julia, use julia -t<N> where <N> specifies the number of threads.

Symbolic Clifford Operators

Much faster implementations for a number of common Clifford operators are available. They are stored as special named structs, instead of as a full tableau. These are the subtypes of AbstractSingleQubitOperator and AbstractTwoQubitOperator. Currently these are:

subtypes(QuantumClifford.AbstractSingleQubitOperator)
8-element Vector{Any}:
+ SingleQubitOperator
+ sHadamard
+ sId1
+ sInvPhase
+ sPhase
+ sX
+ sY
+ sZ
subtypes(QuantumClifford.AbstractTwoQubitOperator)
13-element Vector{Any}:
+ sCNOT
+ sCPHASE
+ sSWAP
+ sXCX
+ sXCY
+ sXCZ
+ sYCX
+ sYCY
+ sYCZ
+ sZCX
+ sZCY
+ sZCZ
+ sZCrY

Generally, they have the prefix s for symbolic/small/sparse. They are used slightly differently, as one needs to specify the qubits on which they act while instantiating them:

julia> sHadamard(2)
+sHadamard on qubit 2
+X₁ ⟼ + Z
+Z₁ ⟼ + X
+
+julia> sHadamard(2)*S"XXX"
++ XZX
+
+julia> sCNOT(2,3)*S"XYY"
+- XXZ

The apply! function is efficiently multithreaded for these symbolic operators as well. To start multithreaded Julia, use julia -t<N> where <N> specifies the number of threads.

Symbolic projectors on single qubits also exist: sMX, sMY, sMZ. When used with the Register state representation, they can store the measurement results in the corresponding classical register.

Destabilizers

Slightly abusing the name: What we call "destabilizers" here is a stabilizer and its destabilizing operators saved together. They are implemented with the Destabilizer object and are initialized from a stabilizer.

julia> s=S"-XXX
+           -ZZI
+           +IZZ";
+
+julia> d = Destabilizer(s)
+𝒟ℯ𝓈𝓉𝒶𝒷
++ Z__
++ _X_
++ __X
+𝒮𝓉𝒶𝒷━
+- XXX
+- ZZ_
+- Z_Z

They have convenience methods to extract only the stabilizer and destabilizer pieces:

julia> stabilizerview(d)
+- XXX
+- ZZ_
+- Z_Z
+
+julia> destabilizerview(d)
++ Z__
++ _X_
++ __X

Importantly commuting projections are much faster when tracking the destabilizer as canonicalization is not necessary (an $\mathcal{O}(n^2)$ complexity because it avoids the expensive $\mathcal{O}(n^3)$ canonicalization operation).

julia> project!(d,P"ZZI")
+(Destablizer 3×3, 0, 0x02)

Non-commuting projections are just as fast as when using only stabilizers.

julia> project!(d,P"ZZZ")
+(Destablizer 3×3, 1, nothing)

Clifford operations can be applied the same way they are applied to stabilizers.

julia> apply!(d,tCNOT⊗tHadamard)
+𝒟ℯ𝓈𝓉𝒶𝒷
+- X_Z
++ XXZ
++ X__
+𝒮𝓉𝒶𝒷━
++ _ZX
+- _Z_
+- Z_X

Mixed States

Both the Stabilizer and Destabilizer structures have more general forms that enable work with mixed stabilizer states. They are the MixedStabilizer and MixedDestabilizer structures, described in Mixed States. More information that can be seen in the data structures page, which expands upon the algorithms available for each structure.

Random States and Circuits

random_clifford, random_stabilizer, and enumerate_cliffords can be used for the generation of random states.

diff --git a/v0.8.21/tutandpub/index.html b/v0.8.21/tutandpub/index.html new file mode 100644 index 000000000..2217b1dfb --- /dev/null +++ b/v0.8.21/tutandpub/index.html @@ -0,0 +1,2 @@ + +Tutorials and Publications · QuantumClifford.jl
diff --git a/versions.js b/versions.js index 93f4fd6ad..df7feb0e5 100644 --- a/versions.js +++ b/versions.js @@ -10,5 +10,5 @@ var DOC_VERSIONS = [ "v0.1", "dev", ]; -var DOCUMENTER_NEWEST = "v0.8.19"; +var DOCUMENTER_NEWEST = "v0.8.21"; var DOCUMENTER_STABLE = "stable";