text:
### A Pluto.jl notebook ###
# v0.18.0

using Markdown
using InteractiveUtils

# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error).
macro bind(def, element)
    quote
        local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end
        local el = $(esc(element))
        global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el)
        el
    end
end

# ╔═╡ 0b4c1052-9180-11ec-2cdd-1b61bde8bdc6
begin
using Plots
using Printf
using Unitful
using DataFrames
using CSV
using Images
end

# ╔═╡ 2d15cff8-622e-4f60-a16f-77a4d16ccc0d
begin
using Interpolations
using QuadGK
using UnitfulEquivalences
end

# ╔═╡ ffc498a9-3522-4309-9ced-48955cab1759
begin
using Markdown
using InteractiveUtils
using PlutoUI
end

# ╔═╡ 9d66c472-b742-49b3-9495-1c3be998108b
import Unitful:
    nm, μm, mm, cm, m, km,
    mg, g, kg,
    ps, ns, μs, ms, s, minute, hr, d, yr, Hz, kHz, MHz, GHz,
    eV,
    μJ, mJ, J,
	μW, mW, W,
    A, N, mol, mmol, V, L, M

# ╔═╡ c3b89fa7-67f8-4cc3-b3ba-fcb304f44669
import PhysicalConstants.CODATA2018: N_A

# ╔═╡ bd9eed27-fc29-41ff-bf12-ec0cd3881ea2
function ingredients(path::String)
	# this is from the Julia source code (evalfile in base/loading.jl)
	# but with the modification that it returns the module instead of the last object
	name = Symbol(basename(path))
	m = Module(name)
	Core.eval(m,
        Expr(:toplevel,
             :(eval(x) = $(Expr(:core, :eval))($name, x)),
             :(include(x) = $(Expr(:top, :include))($name, x)),
             :(include(mapexpr::Function, x) = $(Expr(:top, :include))(mapexpr, $name, x)),
             :(include($path))))
	m
end

# ╔═╡ ca6f7233-a1d1-403d-9416-835a51d360db
lfi = ingredients("../src/LaserLab.jl")

# ╔═╡ 4c6c9627-d80d-41ac-8141-f935df893b73
md"# Observed fluorescence in a ML of fluo/phospho molecules (ANN155)"

# ╔═╡ 34b3d66e-3b39-43dc-922b-9ba6c15c1bac
md"## The ANN155 molecules

ANN155 molecules are a type of fluo/phospho molecules able to capture Ba2+. The response of the free and the chelated species is different both in terms of color and decay lifetime. While the predominant mode of the free species (fANN1555) is fluorescence, the predominant moded of the chelated species (cANN155) is phosporescence."

# ╔═╡ 370bc6ae-f5ff-4827-aa6a-1a0d8ff7f37a
#md"#### The dominant mode of the free molecules (fANN155) is fluorescence"

# ╔═╡ 9199ceec-ecf3-441a-9f60-5142f138c5b6
#load("../notebooks/fann155.png")

# ╔═╡ dd026eeb-4c9b-44cb-81b0-10d75dd9fc8d
#md"#### The dominant mode of the chelated molecules (cANN155) is phosporescence"

# ╔═╡ f5ea9f13-7b71-4037-a438-365a00c7d86e
#load("../notebooks/cfann155.png")

# ╔═╡ ac493173-6cdd-4df6-912e-10561f712729
load("../notebooks/An155_fluo_phospho.png")

# ╔═╡ 617479f5-598a-4db5-a18b-dfe0a7119380
#md"### Fluorescence cross section and quantum yield"

# ╔═╡ 87e695d6-1b06-4808-91be-46e26f24d763
md"### Absorption cross section"

# ╔═╡ 16cdbadf-4deb-4a66-8ab7-84437a4fe3d4
load("../notebooks/ann155_abs.png")

# ╔═╡ ce2f9e72-557a-4cd0-915e-699b1223a5d6
md"#### Facts:
- Red line represents the absorption cross section for ANN155Ba, green for ANN155.
- Maximum separation around 330 nm with a factor 2.5 in favour for ANN155Ba.
- Cross section about the same at around 365 nm.
"

# ╔═╡ 7e150a69-0070-4371-b5c0-02b7ad70d813
md"### Fluorescence cross section and quantum yield"

# ╔═╡ e918dcc4-53e4-46d0-ab2d-43a1c101ae7c
load("../notebooks/img/ann155_fluo.png")

# ╔═╡ 2d9731bf-f6f9-4b32-a1d8-c782e5b9e357
md"#### Facts:
- Excitation at 365 nm
- Red line represents the fluorescent emission for ANN155Ba, green for ANN155.
- Fluorescent peaks near 500 nm phosphorescent near 650 nm
"

# ╔═╡ e25fbab5-4575-4c6f-ba55-df3c1454705b
md"## Formulation of the problem

The free and chelated ANN molecules differ in their absolute bright (e.g, product of cross section and quantum yield), their color spectra, and their time response. However, these properties are correlated. The fluorescence component is predominantely green light (circa 500 nm), while the phosphorescent component is shifter towards the red with a peak around 620 nm.

To ilustrate this point, the graphic shows the color spectrum of both species after a cut on the recorded emission time at 500 ns.

- Without temporal cut (0-5000 ns), both spectra overlap in a large region (450 - 650 nm).
- Cutting at t > 250 ns reduces the overlap to (450-570 nm)
- Cutting at t > 1 μs reduces further the overlap, so that one can use the range > 550 nm
"

# ╔═╡ 7ad8c68d-d720-4179-b783-e6d030f053a0
load("../notebooks/img/ann155_temp_slices.png")

# ╔═╡ 58b227ac-627f-49ba-bc58-75039c65733b
md"## The ANN experiment(s)

All the above measurements have been conducted in solution. For BOLD, the relevant problem is:

- Produce monlayers (ML) of suitable density of ANN155 molecules.
- Measure the response of the free and chelated species using a laser setup in dry atmosphere.
- The measurement must include spectral response (number of photons observed as a function of the wavelength) and time response (which requires time-stamps for the observed photons)
"

# ╔═╡ 5b04127d-2879-4ca0-9130-a4f2e07833fe
md"## Basic setup

The basic setup for the experiment includes:
- The sample (ML of free/chelated molecules)
- The excitation laser
- A dichroic mirror to direct the incident (VUV) light to the objective and focus it in the sample
- An spectrometer, which can be either a CCD/CMOS camera or a PMT (+ color filters). The spectrometer measures the emission spectra and/or the time response.
"

# ╔═╡ 4223f9f8-8ee6-4ea9-a7bc-6379c81c48c0
load("../notebooks/img/basicSetup.png")

# ╔═╡ fabba61a-f28d-4535-b0e3-e94f5098bb0a
md"## The Monolayers

A Monolayer (ML) of fluorophores is characterised by the packing of the fluorophores, the absorption cross section of the individual fluorophores and their emission spectra. These properties may also be correlated or can be modified when moving from solution to ML. For example colective effects of the interference with substrate can modify the naive assumption that the total fluorescence is the product of the number of fluorophores and the fluorescence per fluorophore. However, it is useful to start with the simplest assumption that all cross sections measured in solution hold in solid/gas interface

"

# ╔═╡ 466554b6-be48-4594-a85f-2dca0f586032
begin
	λexc    = 365.0nm
	λEMfa155 = 502.0nm
	λEMca155 = 650.0nm
	Qfa155 = 0.2
	Qca155 = 0.8
	ϵfa155 = 12705.0/(M*cm)
	ϵca155 = 12750.0/(M*cm)
end

# ╔═╡ 17ae61ff-b4e6-4a26-9dad-93ae1106f7ee
md""" ### Fluorescence emitted by ANN molecules (solution, λ=365 nm)

| ANN155 | Q | ϵ ($M^{-1} cm^{-1}$)
|:-------| ---------- |:------------:|
| free   | $Qfa155| $ϵfa155 |
| Ba2+   | $Qca155| $ϵca155 |
"""

# ╔═╡ 7a1fcff4-6948-4333-b971-8fbf31c7d3ee
md"#### Define the fluorophores at nominal excitation ($λexc)"

# ╔═╡ a917927d-d471-4465-abd1-30d959af0b45
fa155λexc = lfi.LaserLab.Fluorophore(λexc, λEMfa155, ϵfa155, Qfa155)

# ╔═╡ ff3e686f-4eec-4c81-a220-061ecff3825f
ca155λexc = lfi.LaserLab.Fluorophore(λexc, λEMca155, ϵca155, Qca155)

# ╔═╡ aa4283d7-37d4-4aaf-a5b7-b515466e545d
begin
	λepl    = 375.0nm
	Pkepl   = 140.0mW
	fepl    = 1.0MHz
	wepl    = 65.0ps
end

# ╔═╡ 93b78d1a-ee07-4d66-b5a4-c7a109a24f81
md"## Laser
- The experiment requires a VUV pulsed laser. Given the phosphorescent times, it is enough to use a repetition rate of 1 MHz (pulsed each 1 μs), but one can consider also longer times, e.g, 200 kHz (5 μs).
- The nominal laser for the experiment is the EPL375

| λepl   | Pkepl      | fepl  | wepl
|:-------| ---------- |:-----:|:-----:|
| $λepl  | $Pkepl| $fepl | $wepl |

"

# ╔═╡ 19b7d7fb-adab-4f29-82af-d059525921ee
md"#### Define laser"

# ╔═╡ 102a2054-2fd5-406e-8bb4-20ecb47c278f
epl375 = lfi.LaserLab.PulsedLaser(λepl, Pkepl, fepl, wepl)

# ╔═╡ 7d03f6a5-c646-44de-8a7a-9d9b36807aea
md"We could print the data 'classical style' "

# ╔═╡ 177762d5-b9f2-449b-abba-256f3d4318ad
md"## Objective

The objective directs the laser light into the ML. For the first round of experiments, it is convenient to focus the laser to the smaller possible spot (diffraction limit). This is done by filling the entrance pupil of the objective with the laser.

Let's assume a setup in which the back lens of the objective is filled up with a laser beam (assumed to be gaussian). The waist of the beam, assuming $z_r >> f$ (where $f$ is the focal distance of the objective and $z_r$ is the depth of focus of the gaussian beam) is then $w_0 = d/2$, where $d$ is the diameter of the back lens of the objective

The experiment must be conducted in a dry atmosphere, to avoid quenching the phosporescence. Thus the sample must be in a box at vacuum or filled with an inert gas (e.g, argon, N2). The objective may be inside the box (if working distance is small) or outside (if working distance is large)

We will use a reflection objective, the MM40XF-VUV, characterized by a large working distance and large (for an air coupled) NA.
"

# ╔═╡ 4e4ab4e5-bacc-4c58-8000-10602a1f8465
load("../notebooks/img/LMM40XVUV.png")

# ╔═╡ 13827ddc-bebd-44d5-929f-f4ac6f43b093
begin
	dd    = 5.1mm
	fl    = 5.0mm
	NA    = 0.5
	dth   = 0.3J/cm^2
	wd    = 7.8mm
	T     = 0.85
	MM     = 40.0
end

# ╔═╡ e35f8650-dc2e-46f3-9220-26754e8860e0
md"### Characteristics of the MM40xVUV

| Feature   | Value
|:-------| ---------- |
| Entrance pupil diameter  | $dd|
| Focal length  | $fl|
|NA  | $NA|
|M (magnification)  | $MM|
|working distance  | $wd|
|Tranmission (250-1000 nm)  | $T|
|Damage threshold  | $dth|
"

# ╔═╡ 2a07dd38-bac4-410c-8135-5c4e6f851df6
lmm40xf_uvv  = lfi.LaserLab.Objective("LMM40XF-UVVV", fl, dd, MM)

# ╔═╡ 417fecfd-b316-4e63-8e68-303d4c568434
md"## The laser beam as a Gaussian Laser"

# ╔═╡ 5632d2fb-f5ef-41e8-a2c3-7cec0910ec8f
w0 = lmm40xf_uvv.d /2.0

# ╔═╡ 3d012b3c-bc87-4a62-84e3-bd4eb67924ea
md"### Transporting the laser

We assume that the laser beam is gaussian, expanded in such a way that the waist of the beam equals the radius of the entrance pupil: thus, w0 = $w0
"

# ╔═╡ 8e4ee280-d71c-4554-8a5e-289cbb2566f0
gepl375 = lfi.LaserLab.GaussianLaser(epl375, w0)

# ╔═╡ c88f0cbc-e2aa-4357-8eb2-0639f2e7384a
i0mWcm2 = round(uconvert(W/cm^2, gepl375.I0)/(W*cm^-2), sigdigits=2)

# ╔═╡ 6fb18f24-4f36-4465-8923-44fe5755ed0c
md"### Damage threshold

We can now compute the pontential power damage to the objective. Since the waist of the beam is of the same size than the radius of the entrance pupil, we can compute the power density absorbed by the lens and compare with the damage threshold. or the LMM40X-VUV objective, such damage threshold is $dth, while the power density is
$i0mWcm2 W/cm2. Thus, we are far away from the damage threshold."

# ╔═╡ bbd09112-d6cd-4f0f-9a87-7b85be983e09
md"### Focusing the beam"

# ╔═╡ 8c405cc2-e8b5-4125-b21d-f7a22f94fb59
md"The beam is now focused in a narrow spot by the objective. "

# ╔═╡ ebe77978-7d7f-407d-9a73-4be3568265ef
g2epl375 = lfi.LaserLab.propagate_paralell_beam(epl375, lmm40xf_uvv)

# ╔═╡ e7e7b1ca-b27f-406c-9df0-5ffea702719f
md"### Spot size and Depth of focus

The spot size is $(round(lfi.LaserLab.spot_size(g2epl375)/nm,digits=1)) nm, while the depth of focus is $(round(lfi.LaserLab.depth_of_focus(g2epl375)/nm, digits=1)) nm. "

# ╔═╡ f48eb494-f9f5-4e4f-9fc0-ffa20312155a
i0mWcm2f = round(uconvert(W/cm^2, g2epl375.I0)/(W*cm^-2), sigdigits=2);

# ╔═╡ fc5b2f60-2c04-4835-a222-9971189ac54e
ng0 = round(g2epl375.γ0/(Hz*cm^-2), sigdigits=2);

# ╔═╡ 4eeabd93-cd82-4051-b2d0-bee3db1723e4
md"### Power density

- The power density in the spot is now much larger: $(i0mWcm2f ) W/cm2
- Or in term of photon density: $(ng0) Hz/cm2
"

# ╔═╡ e40a68c6-5885-49d1-9259-fdd3be09fee4
md"In a gaussian laser, the intensity as a function of the radial direction ($\rho$) and the direction of propagation (z) is:

$I(\rho, z) = I_0 ( W_0 / W(z))^2 \exp{-2 \rho^2/W^2(z)}$
"

# ╔═╡ f79fb47b-b4f7-442a-927f-0c186e673b80
md"Since both the spot size and the depth of focus are small, we can approximate the intensity that will illuminate the molecules of the mono layer with I(0,0)"

# ╔═╡ 8da11b18-5934-4207-941b-795969173f21
fI = lfi.LaserLab.I(g2epl375) ;

# ╔═╡ ce47be17-7773-4797-beb7-202d3c02555a
begin()
zl=-5.0:0.01:5.0
p1 = plot(zl, fI.(0.0*μm, zl*μm)/(mW * cm^-2), label="I(0,z)")
ylims!((0.0,1.10e+7))
xlabel!("z (μm)")
ylabel!("I(0,z)")

rl=-1.0:0.01:1.0
p2 = plot(rl, fI.(rl*μm, 0*μm)/(mW * cm^-2), label="I(ρ,0)")
xlabel!("ρ (μm)")
ylabel!("I(0,z)")

plot(p1,p2, layout = (1, 2), legend=false, fmt = :png)
end

# ╔═╡ 498d145b-ce5f-46a5-b77e-31f412e04eb9
md"### Packing of the monolayer

- One can define the packing of the ML in terms of the 'pitch' or distance separating two molecules. This is a crucial parameter of the experiment.

"

# ╔═╡ 0d4a0651-4ce4-497e-8764-2bcbbef83cf1
md"##### molecular pitch (in nm)"

# ╔═╡ d437cc55-8c19-4d0b-86d8-760da3956895
@bind mp NumberField(1.0:10.0^3; default=1.0)

# ╔═╡ 7dedd16b-4279-4f50-8120-d9ef394f3e13
pitch = mp*nm;

# ╔═╡ 649fa1b3-0dd2-487d-9bdf-7db97a0ec178
ml = lfi.LaserLab.Monolayer(pitch);

# ╔═╡ 92a5b436-1d8e-4436-8dda-8b1d3518bdea
md"This corresponds to $(uconvert(cm^-2, ml.σ)) molecules"

# ╔═╡ 8d4516fd-8838-4e5f-a61d-9dc1f65b31ad
aspot = π * g2epl375.w0^2;

# ╔═╡ c5b0405a-a991-45a5-aa04-d09020b0c7f0
md"### Spot area
- The area of the spot iluminated by the beam is $(round(uconvert(μm^2,aspot)/μm^2, digits=1)) μm2"

# ╔═╡ 03e15d19-ea63-413e-8ec5-4d50e28558ac
nmol = uconvert(μm^2, aspot) * ml.σ;

# ╔═╡ 4a1cf5fc-b44f-4b19-ac8e-d610da0a17cb
md"### Number of molecules in the spot
- The number of molecules in the spot illuminated by the beam is: $(round(nmol))"

# ╔═╡ 39a7f7b4-058b-4283-b35c-4409ea9e478a
md"### Fluorescence per molecule
- The fluorescence of each molecule is the product of the beam density, the fluorescence cross section and the quantum yield:

$f = I_0 \cdot \sigma \cdot Q$
"

# ╔═╡ 3ebf8b24-b56e-48ce-a823-768acc736e0e
md"##### ANN155 fluorophore"

# ╔═╡ f824769b-14c2-48ec-b125-e0ff0114fce8
ann155 = fa155λexc

# ╔═╡ 92c56c0e-8f3d-4877-92d8-0038d3784913
ann155Ba = ca155λexc

# ╔═╡ abe34c91-9824-45e4-8865-7b3f73ff8758
fann155 = lfi.LaserLab.fluorescence(ann155, g2epl375.γ0);

# ╔═╡ 9b9de403-c6ce-4537-b309-961e393f2e21
fann155Ba = lfi.LaserLab.fluorescence(ann155Ba, g2epl375.γ0);

# ╔═╡ 52aeae45-0dfc-48f2-a362-20d1add0ff7f
md"### Fluorescence per molecule for free and chelated species
- The fluorescence per molecule for Ann155 is: $(round(fann155/Hz)) Hz,
- The fluorescence per molecule for Ann155Ba is:  $(round(fann155Ba/Hz)) Hz"

# ╔═╡ 9d97d16a-8f90-4ff7-ac0b-ee610c20ee32
sfann155 = fann155 * nmol;

# ╔═╡ 94fc35b0-e3ff-472e-92af-65144bb03ed5
sfann155Ba = fann155Ba * nmol;

# ╔═╡ 960ba1ef-495d-4bb2-8aff-73cb68ae440e
md"### Total fluorescence in the spot

The total fluorescence in the spot is the product of the number of molecules and the fluorescence per molecule:

- Fluorescence in spot for Ann155 = $(round(sfann155/Hz, sigdigits=1)) Hz

- Fluorescence in spot for Ann155Ba = $(round(sfann155Ba/Hz, sigdigits=1)) Hz
"

# ╔═╡ 356b7b35-6794-40d0-8c88-b8e066f086a6
begin
ϵ_obj_vuv = 0.85
ϵ_obj_vis = 0.85
ϵd = 0.85
ϵf = 0.85
ϵPMT = 0.1
ϵNA      = lfi.LaserLab.transmission(lmm40xf_uvv)
ϵT =  ϵ_obj_vuv * ϵ_obj_vis * ϵd^2 * ϵf * ϵPMT * ϵNA
println("")
end

# ╔═╡ f38318dd-f7bb-4bf1-9bc9-d1f7ed8a8397
md"## Detected Light

The detected light is the product of the emitted fluorescence and the detection efficiency, which in turns includes:

- Transmission efficiency of the objective to the incoming VUV: ϵ_obj_vuv =$(ϵ_obj_vuv)
- Transmission efficiency of the objective to the outgoing vis libht: ϵ_obj_vis = $(ϵ_obj_vis)
- Tranmission due to the NA ϵ_NA = $(round(ϵNA, digits=2))
- Transmission due to the dichroic ϵd =$ϵd
- Tranmission due to the filters ϵf = $ϵf
- Transmission due to PMT ϵPMT = $ϵPMT

  The total tranmission is $(round(ϵT, digits=3))
"

# ╔═╡ 43e8a5f1-512c-46b7-91f6-89d3c7e81368
osfann155 = sfann155 * ϵT ;

# ╔═╡ 01ff7216-796a-4cb2-887b-b8d1fdfceed8
osfann155Ba = sfann155Ba * ϵT ;

# ╔═╡ d49e7e9b-6487-407b-aef7-2884461879a0
md" ### Detected light in the PMT

Thus the total expected light in the PMT for a ML of ~ $(uconvert(cm^-2, ml.σ)) molecules is:

- Free molecule = $(round(osfann155/Hz, sigdigits=1)) Hz
- Chelated molecule = $(round(osfann155Ba/Hz, sigdigits=1)) Hz

"

# ╔═╡ 4aa6aa5e-ab12-4850-9d56-93bb29aa049f
phot_mus_f = round((osfann155/Hz) * (uconvert(s,1.0μs)/1.0s), digits=1);

# ╔═╡ d859f529-1890-4f2b-ac33-1b87be00c986
phot_mus_ba = round((osfann155Ba/Hz) * (uconvert(s,1.0μs)/1.0s), digits=1);

# ╔═╡ 4c5bf7b9-89b1-47c8-b824-cc907fcc78b7
md"## Detected photons per microsecond

- For a dense ML and with the parameters estimated here, one has ~ $phot_mus_f photons per microsecond for the free molecule and $phot_mus_ba photons per microsecond for the chelated molecule"

# ╔═╡ 0f7ff8a4-43e4-4829-a4b4-78594664cee2
md"## TCSP experiments"

# ╔═╡ 131f4e45-85f5-43bc-8c32-d59f8803bfd6
md"### Typical setup"

# ╔═╡ a4066207-4c50-4360-b43f-218d5355ff3e
load("../notebooks/img/tcsp_setup.png")

# ╔═╡ 218fc76e-1060-40ff-a52f-d884441380e2
md"### Photon counting technique"

# ╔═╡ 58b61eac-e1de-48f3-a37b-ecc1f8d5f8ab
load("../notebooks/img/tcspc.png")

# ╔═╡ 320f9c75-5047-4a4c-890b-ffdc70767634
md" The phothon counting technique requires that one photon is recorded on average per pulse (in this case in the period 1-5 mus). This is to avoid inefficiencies which can bias the measurement as ilustrated below."

# ╔═╡ b97cd0a9-ee46-4520-a408-f60150bbea74
load("../notebooks/img/tcspc_deadtime.png")

# ╔═╡ b96961fd-6a9a-40bb-b582-2b3586f56edb
md"However, most TCSPC techniques are designed for short interval times. The dead time is typically a few nanoseconds, thus no loss for dead time is expected here. Nevertheless the system is designed to record just one photon per pulse. This implies that the average number of photons must be reduced to 1 per 1 (5) μs. This can be done by:
- attenuating the laser light
- reducing the laser power
- spacing the molecules in the ML
"

# ╔═╡ eba3554f-ae6f-4a3d-8131-43ffa2743977
md"# Appendix"

# ╔═╡ f57ca807-9b3a-4f77-9607-74ee3a411990
md"## Auxiliary functions"

# ╔═╡ 6490a13e-2c64-44bc-90a9-eb97997a953e
function pprint(l::lfi.LaserLab.Laser)
	with_terminal() do
		@printf("Laser: λ = %5.1f nm, power = %5.1f mW, rep rate = %5.1f MHz", l.λ/nm, l.P/mW, l.f/MHz)
	end
end

# ╔═╡ 9d969e50-fe20-4b2a-8971-17e763db9b0b
pprint(epl375)

# ╔═╡ 00000000-0000-0000-0000-000000000001
PLUTO_PROJECT_TOML_CONTENTS = """
[deps]
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
PhysicalConstants = "5ad8b20f-a522-5ce9-bfc9-ddf1d5bda6ab"
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
UnitfulEquivalences = "da9c4bc3-91c8-4f02-8a40-6b990d2a7e0c"

[compat]
CSV = "~0.10.2"
DataFrames = "~1.3.2"
Images = "~0.25.1"
Interpolations = "~0.13.5"
PhysicalConstants = "~0.2.1"
Plots = "~1.25.10"
PlutoUI = "~0.7.34"
QuadGK = "~2.4.2"
Unitful = "~1.11.0"
UnitfulEquivalences = "~0.2.0"
"""

# ╔═╡ 00000000-0000-0000-0000-000000000002
PLUTO_MANIFEST_TOML_CONTENTS = """
# This file is machine-generated - editing it directly is not advised

julia_version = "1.7.2"
manifest_format = "2.0"

[[deps.AbstractFFTs]]
deps = ["ChainRulesCore", "LinearAlgebra"]
git-tree-sha1 = "6f1d9bc1c08f9f4a8fa92e3ea3cb50153a1b40d4"
uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
version = "1.1.0"

[[deps.AbstractPlutoDingetjes]]
deps = ["Pkg"]
git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481"
uuid = "6e696c72-6542-2067-7265-42206c756150"
version = "1.1.4"

[[deps.Adapt]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "af92965fb30777147966f58acb05da51c5616b5f"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
version = "3.3.3"

[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"

[[deps.ArnoldiMethod]]
deps = ["LinearAlgebra", "Random", "StaticArrays"]
git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae"
uuid = "ec485272-7323-5ecc-a04f-4719b315124d"
version = "0.2.0"

[[deps.ArrayInterface]]
deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"]
git-tree-sha1 = "745233d77146ad221629590b6d82fe7f1ddb478f"
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
version = "4.0.3"

[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"

[[deps.AxisAlgorithms]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7"
uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
version = "1.0.1"

[[deps.AxisArrays]]
deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"]
git-tree-sha1 = "d127d5e4d86c7680b20c35d40b503c74b9a39b5e"
uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9"
version = "0.4.4"

[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"

[[deps.Bzip2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2"
uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
version = "1.0.8+0"

[[deps.CEnum]]
git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9"
uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
version = "0.4.1"

[[deps.CSV]]
deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"]
git-tree-sha1 = "9519274b50500b8029973d241d32cfbf0b127d97"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
version = "0.10.2"

[[deps.Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2"
uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
version = "1.16.1+1"

[[deps.Calculus]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad"
uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9"
version = "0.5.1"

[[deps.CatIndices]]
deps = ["CustomUnitRanges", "OffsetArrays"]
git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc"
uuid = "aafaddc9-749c-510e-ac4f-586e18779b91"
version = "0.2.2"

[[deps.ChainRulesCore]]
deps = ["Compat", "LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "7dd38532a1115a215de51775f9891f0f3e1bac6a"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
version = "1.12.1"

[[deps.ChangesOfVariables]]
deps = ["ChainRulesCore", "LinearAlgebra", "Test"]
git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1"
uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0"
version = "0.1.2"

[[deps.Clustering]]
deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "SparseArrays", "Statistics", "StatsBase"]
git-tree-sha1 = "75479b7df4167267d75294d14b58244695beb2ac"
uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5"
version = "0.14.2"

[[deps.CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.0"

[[deps.ColorSchemes]]
deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"]
git-tree-sha1 = "12fc73e5e0af68ad3137b886e3f7c1eacfca2640"
uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
version = "3.17.1"

[[deps.ColorTypes]]
deps = ["FixedPointNumbers", "Random"]
git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597"
uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
version = "0.11.0"

[[deps.ColorVectorSpace]]
deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"]
git-tree-sha1 = "3f1f500312161f1ae067abe07d13b40f78f32e07"
uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
version = "0.9.8"

[[deps.Colors]]
deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40"
uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
version = "0.12.8"

[[deps.CommonSolve]]
git-tree-sha1 = "68a0743f578349ada8bc911a5cbd5a2ef6ed6d1f"
uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
version = "0.2.0"

[[deps.Compat]]
deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"]
git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
version = "3.41.0"

[[deps.CompilerSupportLibraries_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"

[[deps.ComputationalResources]]
git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7"
uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3"
version = "0.3.2"

[[deps.ConstructionBase]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4"
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
version = "1.3.0"

[[deps.Contour]]
deps = ["StaticArrays"]
git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
version = "0.5.7"

[[deps.CoordinateTransformations]]
deps = ["LinearAlgebra", "StaticArrays"]
git-tree-sha1 = "681ea870b918e7cff7111da58791d7f718067a19"
uuid = "150eb455-5306-5404-9cee-2592286d6298"
version = "0.6.2"

[[deps.Crayons]]
git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15"
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
version = "4.1.1"

[[deps.CustomUnitRanges]]
git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a"
uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce"
version = "1.0.2"

[[deps.DataAPI]]
git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8"
uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
version = "1.9.0"

[[deps.DataFrames]]
deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
git-tree-sha1 = "ae02104e835f219b8930c7664b8012c93475c340"
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
version = "1.3.2"

[[deps.DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
version = "0.18.11"

[[deps.DataValueInterfaces]]
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
version = "1.0.0"

[[deps.Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"

[[deps.DelimitedFiles]]
deps = ["Mmap"]
uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"

[[deps.Distances]]
deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"]
git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04"
uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
version = "0.10.7"

[[deps.Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"

[[deps.DocStringExtensions]]
deps = ["LibGit2"]
git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
version = "0.8.6"

[[deps.Downloads]]
deps = ["ArgTools", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"

[[deps.DualNumbers]]
deps = ["Calculus", "NaNMath", "SpecialFunctions"]
git-tree-sha1 = "84f04fe68a3176a583b864e492578b9466d87f1e"
uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"
version = "0.6.6"

[[deps.EarCut_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d"
uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
version = "2.2.3+0"

[[deps.EllipsisNotation]]
deps = ["ArrayInterface"]
git-tree-sha1 = "d7ab55febfd0907b285fbf8dc0c73c0825d9d6aa"
uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949"
version = "1.3.0"

[[deps.Expat_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "ae13fcbc7ab8f16b0856729b050ef0c446aa3492"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
version = "2.4.4+0"

[[deps.FFMPEG]]
deps = ["FFMPEG_jll"]
git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8"
uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
version = "0.4.1"

[[deps.FFMPEG_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
git-tree-sha1 = "d8a578692e3077ac998b50c0217dfd67f21d1e5f"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
version = "4.4.0+0"

[[deps.FFTViews]]
deps = ["CustomUnitRanges", "FFTW"]
git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2"
uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd"
version = "0.3.2"

[[deps.FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
git-tree-sha1 = "463cb335fa22c4ebacfd1faba5fde14edb80d96c"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
version = "1.4.5"

[[deps.FFTW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea"
uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
version = "3.3.10+0"

[[deps.FileIO]]
deps = ["Pkg", "Requires", "UUIDs"]
git-tree-sha1 = "80ced645013a5dbdc52cf70329399c35ce007fae"
uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
version = "1.13.0"

[[deps.FilePathsBase]]
deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"]
git-tree-sha1 = "04d13bfa8ef11720c24e4d840c0033d145537df7"
uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
version = "0.9.17"

[[deps.FixedPointNumbers]]
deps = ["Statistics"]
git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc"
uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
version = "0.8.4"

[[deps.Fontconfig_jll]]
deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03"
uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.93+0"

[[deps.Formatting]]
deps = ["Printf"]
git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8"
uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
version = "0.4.2"

[[deps.FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
version = "2.10.4+0"

[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91"
uuid = "559328eb-81f9-559d-9380-de523a88c83c"
version = "1.0.10+0"

[[deps.Future]]
deps = ["Random"]
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"

[[deps.GLFW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"]
git-tree-sha1 = "51d2dfe8e590fbd74e7a842cf6d13d8a2f45dc01"
uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89"
version = "3.3.6+0"

[[deps.GR]]
deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"]
git-tree-sha1 = "9f836fb62492f4b0f0d3b06f55983f2704ed0883"
uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
version = "0.64.0"

[[deps.GR_jll]]
deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "a6c850d77ad5118ad3be4bd188919ce97fffac47"
uuid = "d2c73de3-f751-5644-a686-071e5b155ba9"
version = "0.64.0+0"

[[deps.GeometryBasics]]
deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"]
git-tree-sha1 = "58bcdf5ebc057b085e58d95c138725628dd7453c"
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
version = "0.4.1"

[[deps.Gettext_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"]
git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046"
uuid = "78b55507-aeef-58d4-861c-77aaff3498b1"
version = "0.21.0+0"

[[deps.Glib_jll]]
deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06"
uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
version = "2.68.3+2"

[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
git-tree-sha1 = "1c5a84319923bea76fa145d49e93aa4394c73fc2"
uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
version = "1.1.1"

[[deps.Graphite2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011"
uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
version = "1.3.14+0"

[[deps.Graphs]]
deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
git-tree-sha1 = "57c021de207e234108a6f1454003120a1bf350c4"
uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
version = "1.6.0"

[[deps.Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
version = "1.0.2"

[[deps.HTTP]]
deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"]
git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "0.9.17"

[[deps.HarfBuzz_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"]
git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3"
uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
version = "2.8.1+1"

[[deps.Hyperscript]]
deps = ["Test"]
git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9"
uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91"
version = "0.0.4"

[[deps.HypertextLiteral]]
git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238"
uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"
version = "0.9.3"

[[deps.IOCapture]]
deps = ["Logging", "Random"]
git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a"
uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89"
version = "0.2.2"

[[deps.IfElse]]
git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1"
uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
version = "0.1.1"

[[deps.ImageAxes]]
deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"]
git-tree-sha1 = "c54b581a83008dc7f292e205f4c409ab5caa0f04"
uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac"
version = "0.6.10"

[[deps.ImageBase]]
deps = ["ImageCore", "Reexport"]
git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835"
uuid = "c817782e-172a-44cc-b673-b171935fbb9e"
version = "0.1.5"

[[deps.ImageContrastAdjustment]]
deps = ["ImageCore", "ImageTransformations", "Parameters"]
git-tree-sha1 = "0d75cafa80cf22026cea21a8e6cf965295003edc"
uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a"
version = "0.3.10"

[[deps.ImageCore]]
deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"]
git-tree-sha1 = "9a5c62f231e5bba35695a20988fc7cd6de7eeb5a"
uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
version = "0.9.3"

[[deps.ImageDistances]]
deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"]
git-tree-sha1 = "7a20463713d239a19cbad3f6991e404aca876bda"
uuid = "51556ac3-7006-55f5-8cb3-34580c88182d"
version = "0.2.15"

[[deps.ImageFiltering]]
deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"]
git-tree-sha1 = "15bd05c1c0d5dbb32a9a3d7e0ad2d50dd6167189"
uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5"
version = "0.7.1"

[[deps.ImageIO]]
deps = ["FileIO", "JpegTurbo", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"]
git-tree-sha1 = "464bdef044df52e6436f8c018bea2d48c40bb27b"
uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
version = "0.6.1"

[[deps.ImageMagick]]
deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"]
git-tree-sha1 = "ca8d917903e7a1126b6583a097c5cb7a0bedeac1"
uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
version = "1.2.2"

[[deps.ImageMagick_jll]]
deps = ["JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "1c0a2295cca535fabaf2029062912591e9b61987"
uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7"
version = "6.9.10-12+3"

[[deps.ImageMetadata]]
deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"]
git-tree-sha1 = "36cbaebed194b292590cba2593da27b34763804a"
uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49"
version = "0.9.8"

[[deps.ImageMorphology]]
deps = ["ImageCore", "LinearAlgebra", "Requires", "TiledIteration"]
git-tree-sha1 = "7668b123ecfd39a6ae3fc31c532b588999bdc166"
uuid = "787d08f9-d448-5407-9aad-5290dd7ab264"
version = "0.3.1"

[[deps.ImageQualityIndexes]]
deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "OffsetArrays", "Statistics"]
git-tree-sha1 = "1d2d73b14198d10f7f12bf7f8481fd4b3ff5cd61"
uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9"
version = "0.3.0"

[[deps.ImageSegmentation]]
deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"]
git-tree-sha1 = "36832067ea220818d105d718527d6ed02385bf22"
uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1"
version = "1.7.0"

[[deps.ImageShow]]
deps = ["Base64", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"]
git-tree-sha1 = "d0ac64c9bee0aed6fdbb2bc0e5dfa9a3a78e3acc"
uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31"
version = "0.3.3"

[[deps.ImageTransformations]]
deps = ["AxisAlgorithms", "ColorVectorSpace", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"]
git-tree-sha1 = "42fe8de1fe1f80dab37a39d391b6301f7aeaa7b8"
uuid = "02fcd773-0e25-5acc-982a-7f6622650795"
version = "0.9.4"

[[deps.Images]]
deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"]
git-tree-sha1 = "11d268adba1869067620659e7cdf07f5e54b6c76"
uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
version = "0.25.1"

[[deps.Imath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e"
uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
version = "3.1.2+0"

[[deps.IndirectArrays]]
git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
version = "1.0.0"

[[deps.Inflate]]
git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c"
uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
version = "0.1.2"

[[deps.IniFile]]
deps = ["Test"]
git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8"
uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f"
version = "0.5.0"

[[deps.InlineStrings]]
deps = ["Parsers"]
git-tree-sha1 = "61feba885fac3a407465726d0c330b3055df897f"
uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
version = "1.1.2"

[[deps.IntegralArrays]]
deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"]
git-tree-sha1 = "cf737764159c66b95cdbf5c10484929b247fecfe"
uuid = "1d092043-8f09-5a30-832f-7509e371ab51"
version = "0.1.3"

[[deps.IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c"
uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
version = "2018.0.3+2"

[[deps.InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"

[[deps.Interpolations]]
deps = ["AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
git-tree-sha1 = "b15fc0a95c564ca2e0a7ae12c1f095ca848ceb31"
uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
version = "0.13.5"

[[deps.IntervalSets]]
deps = ["Dates", "EllipsisNotation", "Statistics"]
git-tree-sha1 = "3cc368af3f110a767ac786560045dceddfc16758"
uuid = "8197267c-284f-5f27-9208-e0e47529a953"
version = "0.5.3"

[[deps.InverseFunctions]]
deps = ["Test"]
git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65"
uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
version = "0.1.2"

[[deps.InvertedIndices]]
git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
version = "1.1.0"

[[deps.IrrationalConstants]]
git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151"
uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
version = "0.1.1"

[[deps.IterTools]]
git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
version = "1.4.0"

[[deps.IteratorInterfaceExtensions]]
git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
uuid = "82899510-4779-5014-852e-03e436cf321d"
version = "1.0.0"

[[deps.JLD2]]
deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"]
git-tree-sha1 = "28b114b3279cdbac9a61c57b3e6548a572142b34"
uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819"
version = "0.4.21"

[[deps.JLLWrappers]]
deps = ["Preferences"]
git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
version = "1.4.1"

[[deps.JSON]]
deps = ["Dates", "Mmap", "Parsers", "Unicode"]
git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.3"

[[deps.JpegTurbo]]
deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"]
git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5"
uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0"
version = "0.1.1"

[[deps.JpegTurbo_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba"
uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
version = "2.1.2+0"

[[deps.LAME_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c"
uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
version = "3.100.1+0"

[[deps.LZO_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6"
uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
version = "2.10.1+0"

[[deps.LaTeXStrings]]
git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996"
uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
version = "1.3.0"

[[deps.Latexify]]
deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"]
git-tree-sha1 = "2a8650452c07a9c89e6a58f296fd638fadaca021"
uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
version = "0.15.11"

[[deps.LazyArtifacts]]
deps = ["Artifacts", "Pkg"]
uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"

[[deps.LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"

[[deps.LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"

[[deps.LibGit2]]
deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"

[[deps.LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"

[[deps.Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[[deps.Libffi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290"
uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
version = "3.2.2+1"

[[deps.Libgcrypt_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"]
git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae"
uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
version = "1.8.7+0"

[[deps.Libglvnd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"]
git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf"
uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
version = "1.3.0+3"

[[deps.Libgpg_error_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9"
uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
version = "1.42.0+0"

[[deps.Libiconv_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778"
uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
version = "1.16.1+1"

[[deps.Libmount_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73"
uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
version = "2.35.0+0"

[[deps.Libtiff_jll]]
deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "340e257aada13f95f98ee352d316c3bed37c8ab9"
uuid = "89763e89-9b03-5906-acba-b20f662cd828"
version = "4.3.0+0"

[[deps.Libuuid_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066"
uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
version = "2.36.0+0"

[[deps.LinearAlgebra]]
deps = ["Libdl", "libblastrampoline_jll"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

[[deps.LogExpFunctions]]
deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"]
git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1"
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
version = "0.3.6"

[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"

[[deps.MKL_jll]]
deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"]
git-tree-sha1 = "5455aef09b40e5020e1520f551fa3135040d4ed0"
uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
version = "2021.1.1+2"

[[deps.MacroTools]]
deps = ["Markdown", "Random"]
git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf"
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
version = "0.5.9"

[[deps.MappedArrays]]
git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142"
uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
version = "0.4.1"

[[deps.Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"

[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"]
git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
version = "1.0.3"

[[deps.MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"

[[deps.Measurements]]
deps = ["Calculus", "LinearAlgebra", "Printf", "RecipesBase", "Requires"]
git-tree-sha1 = "58390f5617544fb09d27244749484fee0cae6712"
uuid = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
version = "2.7.0"

[[deps.Measures]]
git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f"
uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
version = "0.3.1"

[[deps.MetaGraphs]]
deps = ["Graphs", "JLD2", "Random"]
git-tree-sha1 = "2af69ff3c024d13bde52b34a2a7d6887d4e7b438"
uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5"
version = "0.7.1"

[[deps.Missings]]
deps = ["DataAPI"]
git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f"
uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
version = "1.0.2"

[[deps.Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"

[[deps.MosaicViews]]
deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d"
uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
version = "0.3.3"

[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"

[[deps.NaNMath]]
git-tree-sha1 = "b086b7ea07f8e38cf122f5016af580881ac914fe"
uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
version = "0.3.7"

[[deps.NearestNeighbors]]
deps = ["Distances", "StaticArrays"]
git-tree-sha1 = "16baacfdc8758bc374882566c9187e785e85c2f0"
uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
version = "0.4.9"

[[deps.Netpbm]]
deps = ["FileIO", "ImageCore"]
git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153"
uuid = "f09324ee-3d7c-5217-9330-fc30815ba969"
version = "1.0.2"

[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"

[[deps.OffsetArrays]]
deps = ["Adapt"]
git-tree-sha1 = "043017e0bdeff61cfbb7afeb558ab29536bbb5ed"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.10.8"

[[deps.Ogg_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f"
uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
version = "1.3.5+1"

[[deps.OpenBLAS_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"

[[deps.OpenEXR]]
deps = ["Colors", "FileIO", "OpenEXR_jll"]
git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633"
uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
version = "0.3.2"

[[deps.OpenEXR_jll]]
deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304"
uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
version = "3.1.1+0"

[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"

[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "648107615c15d4e09f7eca16307bc821c1f718d8"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
version = "1.1.13+0"

[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1"
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"

[[deps.Opus_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720"
uuid = "91d4177d-7536-5919-b921-800302f37372"
version = "1.3.2+0"

[[deps.OrderedCollections]]
git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
version = "1.4.1"

[[deps.PCRE_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488"
uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc"
version = "8.44.0+0"

[[deps.PNGFiles]]
deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
git-tree-sha1 = "eb4dbb8139f6125471aa3da98fb70f02dc58e49c"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
version = "0.3.14"

[[deps.PaddedViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d"
uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
version = "0.5.11"

[[deps.Parameters]]
deps = ["OrderedCollections", "UnPack"]
git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe"
uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
version = "0.12.3"

[[deps.Parsers]]
deps = ["Dates"]
git-tree-sha1 = "13468f237353112a01b2d6b32f3d0f80219944aa"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "2.2.2"

[[deps.PhysicalConstants]]
deps = ["Measurements", "Roots", "Unitful"]
git-tree-sha1 = "2bc26b693b5cbc823c54b33ea88a9209d27e2db7"
uuid = "5ad8b20f-a522-5ce9-bfc9-ddf1d5bda6ab"
version = "0.2.1"

[[deps.Pixman_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29"
uuid = "30392449-352a-5448-841d-b1acce4e97dc"
version = "0.40.1+0"

[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"

[[deps.PkgVersion]]
deps = ["Pkg"]
git-tree-sha1 = "a7a7e1a88853564e551e4eba8650f8c38df79b37"
uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688"
version = "0.1.1"

[[deps.PlotThemes]]
deps = ["PlotUtils", "Requires", "Statistics"]
git-tree-sha1 = "a3a964ce9dc7898193536002a6dd892b1b5a6f1d"
uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a"
version = "2.0.1"

[[deps.PlotUtils]]
deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"]
git-tree-sha1 = "6f1b25e8ea06279b5689263cc538f51331d7ca17"
uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
version = "1.1.3"

[[deps.Plots]]
deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"]
git-tree-sha1 = "d9c49967b9948635152edaa6a91ca4f43be8d24c"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
version = "1.25.10"

[[deps.PlutoUI]]
deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"]
git-tree-sha1 = "8979e9802b4ac3d58c503a20f2824ad67f9074dd"
uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
version = "0.7.34"

[[deps.PooledArrays]]
deps = ["DataAPI", "Future"]
git-tree-sha1 = "db3a23166af8aebf4db5ef87ac5b00d36eb771e2"
uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720"
version = "1.4.0"

[[deps.Preferences]]
deps = ["TOML"]
git-tree-sha1 = "2cf929d64681236a2e074ffafb8d568733d2e6af"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
version = "1.2.3"

[[deps.PrettyTables]]
deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"]
git-tree-sha1 = "dfb54c4e414caa595a1f2ed759b160f5a3ddcba5"
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
version = "1.3.1"

[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[[deps.ProgressMeter]]
deps = ["Distributed", "Printf"]
git-tree-sha1 = "afadeba63d90ff223a6a48d2009434ecee2ec9e8"
uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
version = "1.7.1"

[[deps.QOI]]
deps = ["ColorTypes", "FileIO", "FixedPointNumbers"]
git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce"
uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65"
version = "1.0.0"

[[deps.Qt5Base_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"]
git-tree-sha1 = "ad368663a5e20dbb8d6dc2fddeefe4dae0781ae8"
uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1"
version = "5.15.3+0"

[[deps.QuadGK]]
deps = ["DataStructures", "LinearAlgebra"]
git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39"
uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
version = "2.4.2"

[[deps.Quaternions]]
deps = ["DualNumbers", "LinearAlgebra", "Random"]
git-tree-sha1 = "2c49e23ae1470d4e6823e66231c4115866898ff3"
uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0"
version = "0.4.4"

[[deps.REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[deps.Random]]
deps = ["SHA", "Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[[deps.RangeArrays]]
git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5"
uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d"
version = "0.3.2"

[[deps.Ratios]]
deps = ["Requires"]
git-tree-sha1 = "01d341f502250e81f6fec0afe662aa861392a3aa"
uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
version = "0.4.2"

[[deps.RecipesBase]]
git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d"
uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
version = "1.2.1"

[[deps.RecipesPipeline]]
deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"]
git-tree-sha1 = "37c1631cb3cc36a535105e6d5557864c82cd8c2b"
uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c"
version = "0.5.0"

[[deps.Reexport]]
git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
uuid = "189a3867-3050-52da-a836-e630ba90ab69"
version = "1.2.2"

[[deps.RegionTrees]]
deps = ["IterTools", "LinearAlgebra", "StaticArrays"]
git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9"
uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f"
version = "0.3.2"

[[deps.RelocatableFolders]]
deps = ["SHA", "Scratch"]
git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca"
uuid = "05181044-ff0b-4ac5-8273-598c1e38db00"
version = "0.1.3"

[[deps.Requires]]
deps = ["UUIDs"]
git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7"
uuid = "ae029012-a4dd-5104-9daa-d747884805df"
version = "1.3.0"

[[deps.Roots]]
deps = ["CommonSolve", "Printf", "Setfield"]
git-tree-sha1 = "0abe7fc220977da88ad86d339335a4517944fea2"
uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
version = "1.3.14"

[[deps.Rotations]]
deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"]
git-tree-sha1 = "405148000e80f70b31e7732ea93288aecb1793fa"
uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc"
version = "1.2.0"

[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"

[[deps.Scratch]]
deps = ["Dates"]
git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda"
uuid = "6c6a2e73-6563-6170-7368-637461726353"
version = "1.1.0"

[[deps.SentinelArrays]]
deps = ["Dates", "Random"]
git-tree-sha1 = "6a2f7d70512d205ca8c7ee31bfa9f142fe74310c"
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
version = "1.3.12"

[[deps.Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"

[[deps.Setfield]]
deps = ["ConstructionBase", "Future", "MacroTools", "Requires"]
git-tree-sha1 = "0afd9e6c623e379f593da01f20590bacc26d1d14"
uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
version = "0.8.1"

[[deps.SharedArrays]]
deps = ["Distributed", "Mmap", "Random", "Serialization"]
uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"

[[deps.Showoff]]
deps = ["Dates", "Grisu"]
git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de"
uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
version = "1.0.3"

[[deps.SimpleTraits]]
deps = ["InteractiveUtils", "MacroTools"]
git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231"
uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
version = "0.9.4"

[[deps.SimpleWeightedGraphs]]
deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays", "Test"]
git-tree-sha1 = "a6f404cc44d3d3b28c793ec0eb59af709d827e4e"
uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622"
version = "1.2.1"

[[deps.Sixel]]
deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"]
git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28"
uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47"
version = "0.1.2"

[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"

[[deps.SortingAlgorithms]]
deps = ["DataStructures"]
git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
version = "1.0.1"

[[deps.SparseArrays]]
deps = ["LinearAlgebra", "Random"]
uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"

[[deps.SpecialFunctions]]
deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
git-tree-sha1 = "8d0c8e3d0ff211d9ff4a0c2307d876c99d10bdf1"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
version = "2.1.2"

[[deps.StackViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c"
uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
version = "0.1.1"

[[deps.Static]]
deps = ["IfElse"]
git-tree-sha1 = "00b725fffc9a7e9aac8850e4ed75b4c1acbe8cd2"
uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
version = "0.5.5"

[[deps.StaticArrays]]
deps = ["LinearAlgebra", "Random", "Statistics"]
git-tree-sha1 = "95c6a5d0e8c69555842fc4a927fc485040ccc31c"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "1.3.5"

[[deps.Statistics]]
deps = ["LinearAlgebra", "SparseArrays"]
uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

[[deps.StatsAPI]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "c3d8ba7f3fa0625b062b82853a7d5229cb728b6b"
uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
version = "1.2.1"

[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
git-tree-sha1 = "8977b17906b0a1cc74ab2e3a05faa16cf08a8291"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
version = "0.33.16"

[[deps.StructArrays]]
deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"]
git-tree-sha1 = "d21f2c564b21a202f4677c0fba5b5ee431058544"
uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
version = "0.6.4"

[[deps.TOML]]
deps = ["Dates"]
uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"

[[deps.TableTraits]]
deps = ["IteratorInterfaceExtensions"]
git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
version = "1.0.1"

[[deps.Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"]
git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
version = "1.6.1"

[[deps.Tar]]
deps = ["ArgTools", "SHA"]
uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"

[[deps.TensorCore]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6"
uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50"
version = "0.1.1"

[[deps.Test]]
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[[deps.TiffImages]]
deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"]
git-tree-sha1 = "991d34bbff0d9125d93ba15887d6594e8e84b305"
uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
version = "0.5.3"

[[deps.TiledIteration]]
deps = ["OffsetArrays"]
git-tree-sha1 = "5683455224ba92ef59db72d10690690f4a8dc297"
uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac"
version = "0.3.1"

[[deps.TranscodingStreams]]
deps = ["Random", "Test"]
git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.9.6"

[[deps.URIs]]
git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355"
uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
version = "1.3.0"

[[deps.UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[[deps.UnPack]]
git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
version = "1.0.2"

[[deps.Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[deps.UnicodeFun]]
deps = ["REPL"]
git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
version = "0.4.1"

[[deps.Unitful]]
deps = ["ConstructionBase", "Dates", "LinearAlgebra", "Random"]
git-tree-sha1 = "b649200e887a487468b71821e2644382699f1b0f"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
version = "1.11.0"

[[deps.UnitfulEquivalences]]
deps = ["Unitful"]
git-tree-sha1 = "76fc2f7fdc87531a1018eb7d647df7c29daf36b7"
uuid = "da9c4bc3-91c8-4f02-8a40-6b990d2a7e0c"
version = "0.2.0"

[[deps.Unzip]]
git-tree-sha1 = "34db80951901073501137bdbc3d5a8e7bbd06670"
uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d"
version = "0.1.2"

[[deps.Wayland_jll]]
deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"]
git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23"
uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89"
version = "1.19.0+0"

[[deps.Wayland_protocols_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "66d72dc6fcc86352f01676e8f0f698562e60510f"
uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91"
version = "1.23.0+0"

[[deps.WeakRefStrings]]
deps = ["DataAPI", "InlineStrings", "Parsers"]
git-tree-sha1 = "c69f9da3ff2f4f02e811c3323c22e5dfcb584cfa"
uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
version = "1.4.1"

[[deps.WoodburyMatrices]]
deps = ["LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3"
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
version = "0.5.5"

[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
version = "2.9.12+0"

[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a"
uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
version = "1.1.34+0"

[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527"
uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
version = "1.6.9+4"

[[deps.Xorg_libXau_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e"
uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
version = "1.0.9+4"

[[deps.Xorg_libXcursor_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"]
git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd"
uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724"
version = "1.2.0+4"

[[deps.Xorg_libXdmcp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4"
uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
version = "1.1.3+4"

[[deps.Xorg_libXext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3"
uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
version = "1.3.4+4"

[[deps.Xorg_libXfixes_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4"
uuid = "d091e8ba-531a-589c-9de9-94069b037ed8"
version = "5.0.3+4"

[[deps.Xorg_libXi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"]
git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246"
uuid = "a51aa0fd-4e3c-5386-b890-e753decda492"
version = "1.7.10+4"

[[deps.Xorg_libXinerama_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"]
git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123"
uuid = "d1454406-59df-5ea1-beac-c340f2130bc3"
version = "1.1.4+4"

[[deps.Xorg_libXrandr_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"]
git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631"
uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484"
version = "1.5.2+4"

[[deps.Xorg_libXrender_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96"
uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
version = "0.9.10+4"

[[deps.Xorg_libpthread_stubs_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb"
uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
version = "0.1.0+3"

[[deps.Xorg_libxcb_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6"
uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
version = "1.13.0+3"

[[deps.Xorg_libxkbfile_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2"
uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a"
version = "1.1.0+4"

[[deps.Xorg_xcb_util_image_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97"
uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b"
version = "0.4.0+1"

[[deps.Xorg_xcb_util_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"]
git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1"
uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5"
version = "0.4.0+1"

[[deps.Xorg_xcb_util_keysyms_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00"
uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7"
version = "0.4.0+1"

[[deps.Xorg_xcb_util_renderutil_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e"
uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e"
version = "0.3.9+1"

[[deps.Xorg_xcb_util_wm_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67"
uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361"
version = "0.4.1+1"

[[deps.Xorg_xkbcomp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"]
git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b"
uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4"
version = "1.4.2+4"

[[deps.Xorg_xkeyboard_config_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"]
git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d"
uuid = "33bec58e-1273-512f-9401-5d533626f822"
version = "2.27.0+4"

[[deps.Xorg_xtrans_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845"
uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
version = "1.4.0+3"

[[deps.Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"

[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.5.2+0"

[[deps.libass_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47"
uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
version = "0.15.1+0"

[[deps.libblastrampoline_jll]]
deps = ["Artifacts", "Libdl", "OpenBLAS_jll"]
uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"

[[deps.libfdk_aac_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55"
uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
version = "2.0.2+0"

[[deps.libpng_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
version = "1.6.38+0"

[[deps.libsixel_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "78736dab31ae7a53540a6b752efc61f77b304c5b"
uuid = "075b6546-f08a-558a-be8f-8157d0f608a5"
version = "1.8.6+1"

[[deps.libvorbis_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"]
git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
version = "1.3.7+1"

[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"

[[deps.p7zip_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"

[[deps.x264_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2"
uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
version = "2021.5.5+0"

[[deps.x265_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9"
uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
version = "3.5.0+0"

[[deps.xkbcommon_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"]
git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6"
uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd"
version = "0.9.1+5"
"""

# ╔═╡ Cell order:
# ╟─0b4c1052-9180-11ec-2cdd-1b61bde8bdc6
# ╟─2d15cff8-622e-4f60-a16f-77a4d16ccc0d
# ╟─ffc498a9-3522-4309-9ced-48955cab1759
# ╟─9d66c472-b742-49b3-9495-1c3be998108b
# ╟─c3b89fa7-67f8-4cc3-b3ba-fcb304f44669
# ╟─bd9eed27-fc29-41ff-bf12-ec0cd3881ea2
# ╟─ca6f7233-a1d1-403d-9416-835a51d360db
# ╟─4c6c9627-d80d-41ac-8141-f935df893b73
# ╟─34b3d66e-3b39-43dc-922b-9ba6c15c1bac
# ╟─370bc6ae-f5ff-4827-aa6a-1a0d8ff7f37a
# ╟─9199ceec-ecf3-441a-9f60-5142f138c5b6
# ╟─dd026eeb-4c9b-44cb-81b0-10d75dd9fc8d
# ╟─f5ea9f13-7b71-4037-a438-365a00c7d86e
# ╟─ac493173-6cdd-4df6-912e-10561f712729
# ╟─617479f5-598a-4db5-a18b-dfe0a7119380
# ╠═87e695d6-1b06-4808-91be-46e26f24d763
# ╠═16cdbadf-4deb-4a66-8ab7-84437a4fe3d4
# ╟─ce2f9e72-557a-4cd0-915e-699b1223a5d6
# ╠═7e150a69-0070-4371-b5c0-02b7ad70d813
# ╠═e918dcc4-53e4-46d0-ab2d-43a1c101ae7c
# ╠═2d9731bf-f6f9-4b32-a1d8-c782e5b9e357
# ╠═e25fbab5-4575-4c6f-ba55-df3c1454705b
# ╠═7ad8c68d-d720-4179-b783-e6d030f053a0
# ╠═58b227ac-627f-49ba-bc58-75039c65733b
# ╠═5b04127d-2879-4ca0-9130-a4f2e07833fe
# ╠═4223f9f8-8ee6-4ea9-a7bc-6379c81c48c0
# ╟─fabba61a-f28d-4535-b0e3-e94f5098bb0a
# ╟─17ae61ff-b4e6-4a26-9dad-93ae1106f7ee
# ╠═466554b6-be48-4594-a85f-2dca0f586032
# ╠═7a1fcff4-6948-4333-b971-8fbf31c7d3ee
# ╠═a917927d-d471-4465-abd1-30d959af0b45
# ╠═ff3e686f-4eec-4c81-a220-061ecff3825f
# ╠═93b78d1a-ee07-4d66-b5a4-c7a109a24f81
# ╠═aa4283d7-37d4-4aaf-a5b7-b515466e545d
# ╠═19b7d7fb-adab-4f29-82af-d059525921ee
# ╠═102a2054-2fd5-406e-8bb4-20ecb47c278f
# ╟─7d03f6a5-c646-44de-8a7a-9d9b36807aea
# ╟─177762d5-b9f2-449b-abba-256f3d4318ad
# ╠═4e4ab4e5-bacc-4c58-8000-10602a1f8465
# ╟─e35f8650-dc2e-46f3-9220-26754e8860e0
# ╠═13827ddc-bebd-44d5-929f-f4ac6f43b093
# ╠═2a07dd38-bac4-410c-8135-5c4e6f851df6
# ╟─417fecfd-b316-4e63-8e68-303d4c568434
# ╟─3d012b3c-bc87-4a62-84e3-bd4eb67924ea
# ╠═5632d2fb-f5ef-41e8-a2c3-7cec0910ec8f
# ╠═8e4ee280-d71c-4554-8a5e-289cbb2566f0
# ╟─6fb18f24-4f36-4465-8923-44fe5755ed0c
# ╠═c88f0cbc-e2aa-4357-8eb2-0639f2e7384a
# ╟─bbd09112-d6cd-4f0f-9a87-7b85be983e09
# ╟─8c405cc2-e8b5-4125-b21d-f7a22f94fb59
# ╟─ebe77978-7d7f-407d-9a73-4be3568265ef
# ╟─e7e7b1ca-b27f-406c-9df0-5ffea702719f
# ╟─f48eb494-f9f5-4e4f-9fc0-ffa20312155a
# ╟─4eeabd93-cd82-4051-b2d0-bee3db1723e4
# ╟─fc5b2f60-2c04-4835-a222-9971189ac54e
# ╟─e40a68c6-5885-49d1-9259-fdd3be09fee4
# ╟─f79fb47b-b4f7-442a-927f-0c186e673b80
# ╟─8da11b18-5934-4207-941b-795969173f21
# ╟─ce47be17-7773-4797-beb7-202d3c02555a
# ╠═498d145b-ce5f-46a5-b77e-31f412e04eb9
# ╟─0d4a0651-4ce4-497e-8764-2bcbbef83cf1
# ╟─d437cc55-8c19-4d0b-86d8-760da3956895
# ╟─7dedd16b-4279-4f50-8120-d9ef394f3e13
# ╟─649fa1b3-0dd2-487d-9bdf-7db97a0ec178
# ╟─92a5b436-1d8e-4436-8dda-8b1d3518bdea
# ╟─c5b0405a-a991-45a5-aa04-d09020b0c7f0
# ╠═8d4516fd-8838-4e5f-a61d-9dc1f65b31ad
# ╟─4a1cf5fc-b44f-4b19-ac8e-d610da0a17cb
# ╠═03e15d19-ea63-413e-8ec5-4d50e28558ac
# ╟─39a7f7b4-058b-4283-b35c-4409ea9e478a
# ╟─3ebf8b24-b56e-48ce-a823-768acc736e0e
# ╠═f824769b-14c2-48ec-b125-e0ff0114fce8
# ╠═92c56c0e-8f3d-4877-92d8-0038d3784913
# ╟─52aeae45-0dfc-48f2-a362-20d1add0ff7f
# ╟─abe34c91-9824-45e4-8865-7b3f73ff8758
# ╟─9b9de403-c6ce-4537-b309-961e393f2e21
# ╟─960ba1ef-495d-4bb2-8aff-73cb68ae440e
# ╟─9d97d16a-8f90-4ff7-ac0b-ee610c20ee32
# ╟─94fc35b0-e3ff-472e-92af-65144bb03ed5
# ╟─f38318dd-f7bb-4bf1-9bc9-d1f7ed8a8397
# ╟─356b7b35-6794-40d0-8c88-b8e066f086a6
# ╟─d49e7e9b-6487-407b-aef7-2884461879a0
# ╟─43e8a5f1-512c-46b7-91f6-89d3c7e81368
# ╟─01ff7216-796a-4cb2-887b-b8d1fdfceed8
# ╟─4aa6aa5e-ab12-4850-9d56-93bb29aa049f
# ╟─d859f529-1890-4f2b-ac33-1b87be00c986
# ╟─4c5bf7b9-89b1-47c8-b824-cc907fcc78b7
# ╟─0f7ff8a4-43e4-4829-a4b4-78594664cee2
# ╟─131f4e45-85f5-43bc-8c32-d59f8803bfd6
# ╠═a4066207-4c50-4360-b43f-218d5355ff3e
# ╟─218fc76e-1060-40ff-a52f-d884441380e2
# ╟─58b61eac-e1de-48f3-a37b-ecc1f8d5f8ab
# ╠═320f9c75-5047-4a4c-890b-ffdc70767634
# ╠═b97cd0a9-ee46-4520-a408-f60150bbea74
# ╠═b96961fd-6a9a-40bb-b582-2b3586f56edb
# ╠═eba3554f-ae6f-4a3d-8131-43ffa2743977
# ╠═f57ca807-9b3a-4f77-9607-74ee3a411990
# ╠═6490a13e-2c64-44bc-90a9-eb97997a953e
# ╠═9d969e50-fe20-4b2a-8971-17e763db9b0b
# ╟─00000000-0000-0000-0000-000000000001
# ╟─00000000-0000-0000-0000-000000000002

max_stars_repo_name: proscrite/LaserLab

max_issues_repo_name: proscrite/LaserLab

max_forks_repo_name: proscrite/LaserLab


text:
using GtkReactive, AxisArrays, ImageView
using ImageView: sliceinds
using Base.Test

@testset "CLim" begin
    cl = Signal(CLim(0.0, 0.8))
    push!(cl, CLim(0, 1))
    Reactive.run_till_now()
    @test value(cl) === CLim{Float64}(0, 1)

    # default contrast setting with a homogenous image
    imgdict = imshow(zeros(3, 3))
    @test value(imgdict["clim"]) == CLim(0.0,1.0)
end

@testset "sliceinds" begin
    A = rand(3,3,3)
    @test @inferred(sliceinds(A, (1:3, 1:3), Axis{3}(1))) === (1:3, 1:3, 1)
    @test @inferred(sliceinds(A, (1:3, 1:3), Axis{2}(1))) === (1:3, 1, 1:3)
    @test @inferred(sliceinds(A, (1:3, 1:3), Axis{1}(1))) === (1, 1:3, 1:3)
    @test_throws TypeError sliceinds(A, (1:3, 1:3), Axis{1}(1), Axis{2}(1))
    @test_throws BoundsError sliceinds(A, (1:3, 1:3), Axis{3}(1), Axis{2}(1))
    @test_throws BoundsError sliceinds(A, (1:3, 1:3), Axis{2}(1), Axis{2}(1))

    B = AxisArray(A, :X, :Y, :Z)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:Z}(1))) === (1:3, 1:3, 1)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:Y}(1))) === (1:3, 1, 1:3)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:X}(1))) === (1, 1:3, 1:3)
    @test_throws MethodError sliceinds(B, (1:3, 1:3), Axis{:X}(1), Axis{:Y}(1))
    @test_throws MethodError sliceinds(B, (1:3, 1:3), Axis{:Z}(1), Axis{:Y}(1))
    @test_throws MethodError sliceinds(B, (1:3, 1:3), Axis{:Y}(1), Axis{:Y}(1))

    A = rand(3,3,3,3)
    zr = ZoomRegion(indices(A)[1:2])
    @test_throws TypeError sliceinds(A, (1:3, 1:3), Axis{3}(1))
    @test @inferred(sliceinds(A, (1:3, 1:3), Axis{3}(1), Axis{4}(1))) === (1:3, 1:3, 1, 1)
    @test @inferred(sliceinds(A, (1:3, 1:3), Axis{2}(1), Axis{4}(1))) === (1:3, 1, 1:3, 1)
    @test @inferred(sliceinds(A, (1:3, 1:3), Axis{1}(1), Axis{3}(1))) === (1, 1:3, 1, 1:3)
    @test_throws BoundsError sliceinds(A, (1:3, 1:3), Axis{2}(1), Axis{2}(1))

    B = AxisArray(A, :W, :X, :Y, :Z)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:Y}(1), Axis{:Z}(1))) === (1:3, 1:3, 1, 1)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:Z}(1), Axis{:Y}(1))) === (1:3, 1:3, 1, 1)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:X}(1), Axis{:Z}(1))) === (1:3, 1, 1:3, 1)
    @test @inferred(sliceinds(B, (1:3, 1:3), Axis{:X}(1), Axis{:W}(1))) === (1, 1, 1:3, 1:3)
    @test_throws BoundsError sliceinds(B, (1:3, 1:3), Axis{:Y}(1), Axis{:Y}(1))
end

@testset "SliceData" begin
    A = reshape(1:9, 3, 3)
    zr, sd = roi(indices(A), (1,2))
    v = @inferred(slice2d(A, value(zr), sd))
    @test v == A
    zr, sd = roi(indices(A), (2,1))
    v = @inferred(slice2d(A, value(zr), sd))
    @test v == A'

    A = reshape(1:27, 3, 3, 3)
    for (slicedims, target) in (((1, 2), view(A, :, :, 1)),
                                ((1, 3), view(A, :, 1, :)),
                                ((2, 3), view(A, 1, :, :)),
                                ((2, 1), view(A, :, :, 1)'),
                                ((3, 1), view(A, :, 1, :)'),
                                ((3, 2), view(A, 1, :, :)'))
        zr, sd = roi(indices(A), slicedims)
        v = @inferred(slice2d(A, value(zr), sd))
        @test v == target
    end

    A = reshape(1:81, 3, 3, 3, 3)
    for (slicedims, target) in (((1, 2), view(A, :, :, 1, 1)),
                                ((1, 3), view(A, :, 1, :, 1)),
                                ((2, 3), view(A, 1, :, :, 1)),
                                ((2, 4), view(A, 1, :, 1, :)),
                                ((3, 4), view(A, 1, 1, :, :)),
                                ((1, 4), view(A, :, 1, 1, :)),
                                ((2, 1), view(A, :, :, 1, 1)'),
                                ((3, 1), view(A, :, 1, :, 1)'),
                                ((3, 2), view(A, 1, :, :, 1)'),
                                ((4, 2), view(A, 1, :, 1, :)'),
                                ((4, 3), view(A, 1, 1, :, :)'),
                                ((4, 1), view(A, :, 1, 1, :)'))
        zr, sd = roi(indices(A), slicedims)
        v = @inferred(slice2d(A, value(zr), sd))
        @test v == target
    end

    B = AxisArray(A, :x, :y, :z, :time)
    for (slicedims, target) in (((:x, :y), view(B, :, :, 1, 1)),
                                ((:x, :z), view(B, :, 1, :, 1)),
                                ((:y, :z), view(B, 1, :, :, 1)),
                                ((:y, :time), view(B, 1, :, 1, :)),
                                ((:z, :time), view(B, 1, 1, :, :)),
                                ((:x, :time), view(B, :, 1, 1, :)),
                                ((:y, :x), view(B, :, :, 1, 1)'),
                                ((:z, :x), view(B, :, 1, :, 1)'),
                                ((:z, :y), view(B, 1, :, :, 1)'),
                                ((:time, :y), view(B, 1, :, 1, :)'),
                                ((:time, :z), view(B, 1, 1, :, :)'),
                                ((:time, :x), view(B, :, 1, 1, :)'))
        zr, sd = roi(AxisArrays.axes(B), slicedims)
        v = @inferred(slice2d(B, value(zr), sd))
        @test v == target
    end
end

@testset "Canvas size" begin
    @test ImageView.canvas_size((1000,1000), (300, 200)) == (300, 200)
    @test ImageView.canvas_size((1000,1000), (8, 5)) == (160, 100)
    @test ImageView.canvas_size((1000,1000), (3000, 2000)) == (1000, 667)
end

nothing

ext: jl


text:
@testset "160.intersection-of-two-linked-lists.jl" begin
    @test get_intersection_node(
        ListNode{Int}([4, 2, 8, 4, 5]), ListNode{Int}([5, 0, 1, 8, 4, 5])
    ) == ListNode{Int}([8, 4, 5])
    @test get_intersection_node(ListNode{Int}([0, 9, 1, 2, 4]), ListNode{Int}([3, 2, 4])) ==
          ListNode{Int}([2, 4])
    @test get_intersection_node(ListNode{Int}([2, 6, 4]), ListNode{Int}([1, 5])) == nothing
end


text:
"""

"""
abstract type HyperParameter end


text:
# ------------------------------------------------------------------
# Licensed under the MIT License. See LICENSE in the project root.
# ------------------------------------------------------------------

"""
    DensityRatioWeighting(tdata, [vars]; [options])

Density ratio weights based on empirical distribution of
variables in target data `tdata`. Default to all variables.

## Optional parameters

* `estimator` - Density ratio estimator (default to `LSIF()`)
* `optlib`    - Optimization library (default to `default_optlib(estimator)`)

### Notes

Estimators from [DensityRatioEstimation.jl]
(https://github.com/JuliaEarth/DensityRatioEstimation.jl)
are supported.
"""
struct DensityRatioWeighting <: WeightingMethod
  tdata
  vars
  dre
  optlib
end

function DensityRatioWeighting(tdata, vars=nothing; estimator=LSIF(),
                               optlib=default_optlib(estimator))
  tvars = Tables.schema(values(tdata)).names
  wvars = isnothing(vars) ? tvars : vars
  @assert wvars ⊆ tvars "variables ($wvars) not found in geospatial data"
  DensityRatioWeighting(tdata, wvars, estimator, optlib)
end

function weight(sdata, method::DensityRatioWeighting)
  # retrieve method parameters
  tdata  = method.tdata
  vars   = method.vars
  dre    = method.dre
  optlib = method.optlib

  ttable = Tables.columns(values(tdata))
  stable = Tables.columns(values(sdata))

  svars  = Tables.schema(stable).names
  @assert vars ⊆ svars "variables ($vars) not found in geospatial data"

  # numerator and denominator samples
  tcols  = [var => Tables.getcolumn(ttable, var) for var in vars]
  scols  = [var => Tables.getcolumn(stable, var) for var in vars]
  xnu    = [collect(r) for r in Tables.rowtable((; tcols...))]
  xde    = [collect(r) for r in Tables.rowtable((; scols...))]

  # perform denstiy ratio estimation
  ratios = densratio(xnu, xde, dre, optlib=optlib)

  GeoWeights(domain(sdata), ratios)
end


text:
export joMultigrid, multigrid_multiply, multigrid_vcycle

function joMultigrid(Hs,S,R,P,C,coarse_solver;
                     recursive_vcycle::Bool=false)
    n = size(Hs[1],1)
    nlevels = length(Hs)
    if recursive_vcycle
        coarse_solves = Array{Function,1}()
        prepend!(coarse_solves,[solvesystem(Hs[nlevels],coarse_solver)])
        for i=nlevels-1:-1:1
            old_cs = coarse_solves[1]
            Hc = Hs[i+1]
            Hf = Hs[i]
            Rf = R[i]
            Pf = P[i]
            Sf = S[i]
            coarse_solver = deepcopy(coarse_solver)
            coarse_solver.precond = old_cs
            CS = solvesystem(Hc,coarse_solver)
            prepend!(coarse_solves,[(b,x,mode::Bool)->multigrid_vcycle(Hf,Sf,Rf,Pf,CS,b,x,forw_mode=mode)])
        end
        solver = coarse_solves[1]
        return joLinearFunctionFwdCT(n,n,
                                     x->solver(x,zeros(x),true),
                                     x->solver(x,zeros(x),false),
                                     eltype(Hs[1]),name="Recursive Multigrid Preconditioner")
    else
        return joLinearFunctionFwdCT(n,n,
                             x->multigrid_multiply(Hs,S,R,P,C,x,forw_mode=true),
                             x->multigrid_multiply(Hs,S,R,P,C,x,forw_mode=false),
                             eltype(Hs[1]),name="V cycle Multigrid preconditioner")
    end

end

function multigrid_vcycle(H,S,R,P,C,b,x;forw_mode::Bool=true)
    xf = S(b,x,forw_mode)
    if forw_mode
        r = b-H*xf
    else
        r = b-H'*xf
    end
    xc = R*r
    xc = C(xc,zeros(xc),forw_mode)
    xf .+= P*xc
    xf = S(b,xf,forw_mode)
end

function multigrid_multiply(Hs,S,R,P,C,b;forw_mode::Bool=true)
    x = zeros(b)
    x_lvl = Array{typeof(b),1}()
    b_lvl = Array{typeof(b),1}()
    push!(x_lvl,x)
    push!(b_lvl,b)
    nlevels = length(Hs)
    for i=1:nlevels-1
        xf = x_lvl[i]
        bf = b_lvl[i]
        xf = S[i](bf,xf,forw_mode)
        if forw_mode
            rf = bf-Hs[i]*xf
        else
            rf = bf-Hs[i]'*xf
        end
        push!(x_lvl,R[i]*rf)
        push!(b_lvl,R[i]*bf)
    end
    x = x_lvl[end]
    x = C(x,zeros(x),forw_mode)
    for i=nlevels-1:-1:1
        xf = x_lvl[i] + P[i]*x
        x = S[i](b_lvl[i],xf,forw_mode)
    end
    return x

end


text:
module Data
export List, Cons, Nil, Optional
using MLStyle.Err
using MLStyle

include("List.jl")
Optional{T} = Union{Some{T}, Nothing}

end


text:
using Revise
using ReversibleSeismic

nx = ny = 100
nstep = 2000
param = AcousticPropagatorParams(nx=nx, ny=ny,
     Rcoef=0.2, dx=20.0, dy=20.0, dt=0.05, nstep=nstep)

c = 1000*ones(param.NX+2, param.NY+2)
src = (param.NX÷2, param.NY÷2)
srcv = Ricker(param, 100.0, 500.0)

tu = zeros(size(c)..., nstep+1)
tφ = zeros(size(c)..., nstep+1)
tψ = zeros(size(c)..., nstep+1)
i_solve!(param, src, srcv, c, tu, tφ, tψ)
loss = sum(tu .^ 2)
@assert loss ≈ 10.931466822080788

using PyPlot

function viz(param, tu)
     close("all")
     plot(srcv)
     savefig("_srcv.png")

     for i = 1:200:param.NSTEP+1
          close("all")
          pcolormesh(tu[:,:,i])
          colorbar()
          savefig("_f$i.png")
     end
end

viz(param, tu)


text:
## PART 3

println("Part 3");
println("\n\tEstimating mean and standard deviation using");
println("\tjacknife resampling with bin size of 40.");

include("jacknife.jl");

b = 40;
jest = jacknife(v, N2, b);

println("\n\tEstimated means, using N = $N2 and b = $b:\n");
for i in [1:5]
    println("\t\tdataset $i: $(jest.μ[i])");
end

println("\n\tEstimated standard deviations:\n");
for i in [1:5]
    println("\t\tdataset $i: $(jest.σ[i])");
end

println("\n\tCalculating dependence of jacknife σ estimator on b.");
bvals = [1:100];
σb = zeros(length(bvals),5);
for i in [1:length(bvals)]
    jestb = jacknife(v, N2, bvals[i]);
    σb[i,:] = jestb.σ;
end

println("\n\tGenerating plots in σvsbplots to show that dependence.");
using Gadfly
σvsbplots = Plot[];
ttl = "Estimated Variance vs. Bin Size for Dataset";
for i in [1:5]
    push!(σvsbplots, Gadfly.plot(
        x = bvals,
        y = σb[:,i],
        Geom.line,
        Geom.point,
        Guide.xlabel("Bin size b"),
        Guide.ylabel("Estimated Variance"),
        Guide.title(join([ttl,string(i)]," "))
    ));
end


text:
using Test
using MLJBase
include(joinpath("..", "..", "test", "_models", "models.jl"))
using .Models

@testset "basics" begin
    y = categorical(['m', 'f', 'n', 'f', 'm', 'n', 'n', 'm', 'f'])
    ŷ = categorical(['f', 'f', 'm', 'f', 'n', 'm', 'n', 'm', 'f'])
    l = levels(y) # f, m, n
    cm = confmat(ŷ, y; warn=false)
    e(l,i,j) = sum((ŷ .== l[i]) .& (y .== l[j]))
    for i in 1:3, j in 1:3
        @test cm[i,j] == e(l,i,j)
    end
    perm = [3, 1, 2]
    l2 = l[perm]
    cm2 = confmat(ŷ, y; perm=perm) # no warning because permutation is given
    for i in 1:3, j in 1:3
        @test cm2[i,j] == e(l2,i,j)
    end
    @test_logs (:warn, "The classes are un-ordered,\nusing order: ['f', 'm', 'n'].\nTo suppress this warning, consider coercing to OrderedFactor.") confmat(ŷ, y)
    ŷc = coerce(ŷ, OrderedFactor)
    yc = coerce(y, OrderedFactor)
    @test confmat(ŷc, yc).mat == cm.mat

    y = categorical(['a','b','a','b'])
    ŷ = categorical(['b','b','a','a'])
    @test_logs (:warn, "The classes are un-ordered,\nusing: negative='a' and positive='b'.\nTo suppress this warning, consider coercing to OrderedFactor.") confmat(ŷ, y)

    # more tests for coverage
    y = categorical([1,2,3,1,2,3,1,2,3])
    ŷ = categorical([1,2,3,1,2,3,1,2,3])
    @test_throws ArgumentError confmat(ŷ, y, rev=true)

    # silly test for display
    ŷ = coerce(y, OrderedFactor)
    y = coerce(y, OrderedFactor)
    iob = IOBuffer()
    Base.show(iob, MIME("text/plain"), confmat(ŷ, y))
    siob = String(take!(iob))
    @test strip(siob) == strip("""
                         ┌─────────────────────────────────────────┐
                         │              Ground Truth               │
           ┌─────────────┼─────────────┬─────────────┬─────────────┤
           │  Predicted  │      1      │      2      │      3      │
           ├─────────────┼─────────────┼─────────────┼─────────────┤
           │      1      │      3      │      0      │      0      │
           ├─────────────┼─────────────┼─────────────┼─────────────┤
           │      2      │      0      │      3      │      0      │
           ├─────────────┼─────────────┼─────────────┼─────────────┤
           │      3      │      0      │      0      │      3      │
           └─────────────┴─────────────┴─────────────┴─────────────┘""")

end

@testset "confmat as measure" begin

    @test info(confmat).orientation == :other
    model = DeterministicConstantClassifier()

    X = (x=rand(10),)
    long = categorical(collect("abbaacaabbbbababcbac"), ordered=true)
    y = long[1:10]
    yhat =long[11:20]

    confmat(yhat, y).mat == [1 2 0; 3 1 1; 1 1 0]

    MLJBase.value(confmat, yhat, X, y, nothing)

    e = evaluate(model, X, y,
                 measures=[misclassification_rate, confmat],
                 resampling=Holdout(fraction_train=0.5))
    cm = e.measurement[2]
    @test cm.labels == ["a", "b", "c"]
    @test cm.mat == [2 2 1; 0 0 0; 0 0 0]
end


text:
begin
	using Plots
	using CUDA
	CUDA.versioninfo()
end

struct Spins
	N::Int32
	M::Int32
	A::Array{Float32}
end

function Init(N = 100::Int,M = 100::Int)
	S = Spins(N, M, rand(Float32, N+2 ,M+2)*2π .- π)

	S.A[1,:] .= 0.0
	S.A[N + 2, :] .= 0.0
	S.A[:,1] .= 0.0
	S.A[:,M + 2] .= 0.0

	return S
end

function EnergyGPU(S::Spins)
	E = CUDA.zeros(S.N,S.M)
	CuAr = CuArray(S.A)

	S.A[2:S.N+1,2:S.M+1]

	p = [(-1,0),(1,0),(0,-1),(0,1)]

	@sync begin
	@async begin
			Epart = *(CuAr[2:S.N+1,2:S.M+1],
					CuAr[2+p[1][1]:S.N+1+p[1][1],
						2+p[1][2]:S.M+1+p[1][2]])
			E += Epart
	end
	@async begin
			Epart = *(CuAr[2:S.N+1,2:S.M+1],
					CuAr[2+p[2][1]:S.N+1+p[2][1],
						2+p[2][2]:S.M+1+p[2][2]])
			E += Epart
	end
	@async begin
			Epart = *(CuAr[2:S.N+1,2:S.M+1],
					CuAr[2+p[3][1]:S.N+1+p[3][1],
						2+p[3][2]:S.M+1+p[3][2]])
			E += Epart
	end
	@async begin
			Epart = *(CuAr[2:S.N+1,2:S.M+1],
					CuAr[2+p[4][1]:S.N+1+p[4][1],
						2+p[4][2]:S.M+1+p[4][2]])
			E += Epart
	end
	end

	return CUDA.sum(E)
end

function EnergyGPUAlt(S::Spins)
	E = CUDA.zeros(S.N,S.M)
	CuAr = CuArray(S.A)

	S.A[2:S.N+1,2:S.M+1]

	p = [(-1,0),(1,0),(0,-1),(0,1)]
	@sync for i in p
			begin
			Epart = *(CuAr[2:S.N+1,2:S.M+1],
					CuAr[2+i[1]:S.N+1+i[1],
						2+i[2]:S.M+1+i[2]])
			E += Epart
			end
	end
	return CUDA.sum(E)
end

function MagnetisationGPU(S::Spins)
	CuAr = CuArray(S.A)
	mx = (CUDA.sum(cos.(CuAr)))/ *(S.N,S.M)
	my = (CUDA.sum(sin.(CuAr)))/ *(S.N,S.M)
	return √(mx^2 + my^2)
end

function Advance(S::Spins,max_steps=10000::Int,T=5.0::Float32)
	eps = 0.001

	E = zeros(Float32,max_steps + 1)
	m = zeros(Float32,max_steps + 1)

	Enow = EnergyGPU(S)
	E[1] = Enow
	m[1] = MagnetisationGPU(S)

	step = 1

	for _ in 1:max_steps

		step += 1
		i = rand(2:S.N+1)
		j = rand(2:S.M+1)

		InitVal = S.A[i,j]
		S.A[i,j]= (S.A[i,j] + 2π*(rand()-0.5))%π
		Enext = EnergyGPU(S)
		dE = Enext - Enow

        	if rand() < exp(-dE/T)
			Enow = Enext
	        else
			S.A[i,j] = InitVal
		end

		E[step] = Enow
		m[step] = MagnetisationGPU(S)
	end
	return E,m,S.A
end

function Run(N=100::Int,M=100::Int,max_steps=10000::Int,T=5.0::Float64)
	S = Init(N,M)
	h1 = heatmap(S.A)
	E,m,S=Advance(S,max_steps,convert(Float32,T))

	h2 = heatmap(S)

	l = @layout [a{0.5h};b{0.5h}]
	p1 = plot(m, linecolor = :blue, label="m")
	p2 = plot(E, lc = :red, label="E")

	a1 = plot(h1,h2,layout = l)
	a2 = plot(p1,p2,layout = l)

	plot(a2,a1,size=(600,300))
end

max_stars_repo_name: anirbrhm/curious-eavesdropper

max_issues_repo_name: anirbrhm/curious-eavesdropper

max_forks_repo_name: anirbrhm/curious-eavesdropper


text:
import Pkg.Types: VersionRange

# Currently we specify a 512 byte header
const FILE_HEADER_LENGTH = 512

const FORMAT_VERSION = v"0.1.0"
# Range of file format versions that can be read
# Publish patch release relaxing upper version bound
# if the imminent major release is not breaking
const COMPATIBLE_VERSIONS = VersionRange("0.1")
const REQUIRED_FILE_HEADER = "HDF5-based Julia Data Format, version "
const FILE_HEADER = "$(REQUIRED_FILE_HEADER)$(FORMAT_VERSION)\x00 (Julia $(VERSION) $(sizeof(Int)*8)-bit $(htol(1) == 1 ? "LE" : "BE"))\x00"
@assert length(FILE_HEADER) <= FILE_HEADER_LENGTH

# Legacy File Header
const LEGACY_REQUIRED_FILE_HEADER = "Julia data file (HDF5), version 0.2.0"

function verify_file_header(f)
    io = f.io
    fname = f.path
    seek(io, 0)
    headermsg = String(read!(io, Vector{UInt8}(undef, length(REQUIRED_FILE_HEADER))))
    if headermsg != REQUIRED_FILE_HEADER
        if !startswith(headermsg, LEGACY_REQUIRED_FILE_HEADER)
            throw(ArgumentError(string('"', fname, "\" is not a JLD2 file")))
        else
            #@warn("This file was written with an older version of JLD2. Attempting to load data.", maxlog=1)
            return
        end
    end

    ver = VersionNumber(read_bytestring(io))
    if ver > FORMAT_VERSION
        @warn("""This file was written in a newer version of the JLD2 file format.
        Please consider updating JLD2.""", maxlog=1)
    end
    if ver ∉ COMPATIBLE_VERSIONS
        @warn("""This file was written with a different version of JLD2 that may not be compatible.
         Attempting to load data.""", maxlog=1)
    end
end


text:
import Base.convert

function convert(::Type{INARCHModel}, x::INGARCHModel)
    INARCHModel(x.distr, x.link, x.pastObs, x.X, x.external, x.zi)
end

function convert(::Type{INGARCHModel}, x::INARCHModel)
    INGARCHModel(x.distr, x.link, x.pastObs, Array{Int64, 1}([]), x.X, x.external, x.zi)
end

function convert(::Type{INGARCHModel}, x::IIDModel)
    INGARCHModel(x.distr, x.link, Array{Int64, 1}([]), Array{Int64, 1}([]), x.X, x.external, x.zi)
end

function convert(::Type{IIDModel}, x::INGARCHModel)
    if length(x.pastObs) + length(pastMean) > 0
        error("Can not convert model to IIDModel.")
    end
    IIDModel(x.distr, x.link, x.X, x.external, x.zi)
end

function convert(::Type{INARCHModel}, x::IIDModel)
    INARCHModel(x.distr, x.link, Array{Int64, 1}([]), x.X, x.external, x.zi)
end

function convert(::Type{IIDModel}, x::INARCHModel)
    if length(x.pastObs) > 0
        error("Can not convert model to IIDModel.")
    end
    IIDModel(x.distr, x.link, x.X, x.external, x.zi)
end

function convert(::Type{INARMAModel}, x::INARModel)
    INARMAModel(x.distr, x.link, x.pastObs, Array{Int64, 1}([]), x.X, x.external, x.zi)
end

function convert(::Type{INARModel}, x::INARMAModel)
    if length(x.pastMean) > 0
        error("Can not convert model to INARModel")
    end
    INARModel(x.distr, x.link, x.pastObs, x.X, x.external, x.zi)
end

function convert(::Type{INARMAModel}, x::INMAModel)
    INARMAModel(x.distr, x.link, Array{Int64, 1}([]), x.pastMean, x.X, x.external, x.zi)
end

function convert(::Type{INMAModel}, x::INARMAModel)
    if length(x.pastObs) > 0
        error("Can not convert model to INMAModel.")
    end
    INMAModel(x.distr, x.link, x.pastMean, x.X, x.external, x.zi)
end


text:
# # Publish.jl Literate Source Code
#
# This package can use Julia source files as a content source, similar to
# normal markdown files. It uses the same syntax to mark source lines as either
# markdown content or codeblocks. You can read about the details of literate
# Julia files [here](# "Literate Julia").
#
# !!! info "Literate Programming"
#
#     These source file only make use of literate features as a test case for
#     the package. They should not be thought of as a showcase for literate
#     programming itself.
module Publish

# ## Exports

export html, html_doc, pdf, serve, deploy, setup

# ## Imports

import Base64
import CommonMark
import DataStructures
import IOCapture
import IterTools
import JSON
import LiveServer
import Mustache
import Pkg
import Pkg.TOML
import PrettyTables
import Requires
import Tectonic

using FilePathsBase
using FileTrees
using Logging

# ## Configuration

const DAGGER = Ref(false)
const LAZY = Ref(true)

# ## Includes

include("projects.jl")
include("themes.jl")
include("load.jl")
include("cells.jl")
include("save.jl")
include("serve.jl")
include("deploy.jl")
include("tools.jl")
include("utilities.jl")
include("Experimental.jl")

# ## Package Initialisation
#
# Revise.jl is an optional dependency, we use Requires.jl to define a
# [`revise`](#) method when it is available that triggers `Revise.revise`.

function __init__()
    Requires.@require Revise="295af30f-e4ad-537b-8983-00126c2a3abe" begin
        revise(::Project) = Revise.revise()
    end
end

end # module