Artifact c64ad9ef9ea50d25e81f04eceee5d592712dba92b79348565a85b71da2e17813:

  • File rotor_param.jl — part of check-in [a7f53ca801] at 2026-01-02 23:26:17 on branch trunk — EDITED README.md rotor_energy_param.jl demons and images (user: hisacro size: 34383)

### A Pluto.jl notebook ###
# v0.19.35

#> [frontmatter]
#> title = "Adding parameters and seeing eigenValues"
#> date = "2023-12-12"
#> 
#>     [[frontmatter.author]]
#>     name = "monish"

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

# ╔═╡ ca771507-832d-4e2a-8c03-d13504632475
begin
	import Pkg
	Pkg.activate("/home/hisacro/.julia/environments/v1.9/Project.toml")
	using ForwardDiff, LinearAlgebra,PlutoUI, DelimitedFiles, DynamicalSystems, GLMakie, Plots, OrdinaryDiffEq, ProgressMeter; plotly(size=(400,450));
end

# ╔═╡ 1226574e-4bac-46d0-ac38-792ca403e6d7
TableOfContents()

# ╔═╡ e863f615-11e7-4c8e-a90a-85bfcf8be042
md"""
## Abstract

Modelled potential between rotors via yukawa-like $\frac{e^{Kr}}{r}$ interaction and Taking 4 first order differential equations, Stability of fixed points are analyzed for different $K,L$ values. Bifurcation plot is made for $L$ as well as $K$.

Update 1- introduced new rotor arm length parameter $\alpha$ and analysis was extended
Update 2-  new additive  parameter $\xi$ 

## Goal

To get a purely imaginary eigenvalue around collision point to account for experimental behaviour. This corresponds to small oscillations at the collision points. 

## Methodology

1. Find the fixed points of the system.
2. Linearize the governing equations at these points
3. Find the eigen vector and values of Jacobian.
4. Resolve issues and use approximation for fixed points that don't give proper Jacobian. 
"""

# ╔═╡ b24d7013-ac8c-41df-bc11-38385e690449
md"""
### Loading packages
"""

# ╔═╡ cb195a84-99a4-4939-9111-b139c1830ae3
TableOfContents();

# ╔═╡ 4f9577de-6a29-40e9-8f3c-30ee6cb19c80
md"""
# Problem Definition
"""

# ╔═╡ 21bd002f-6eaa-4016-be2d-c3ca2befa565
md"""
Lagrangian of the System,

$\mathcal{L} =\frac{1}{2}(\dot{\theta_{1}}^{2}+\dot{\theta_{2}}^{2})-\frac{e^{-Kr}}{r}$

"""

# ╔═╡ 1f9528ed-f6ab-4ffd-9aaa-3c1808706b9d
md"""
where
r is defined as 

$r^2={\alpha^{2}+1+L^{2}-2L(\alpha cos\theta_{1}-cos\theta_{2})-2\alpha cos(\theta_{1}-\theta_{2})}.$

"""

# ╔═╡ 4e6899c4-21d4-4b2a-aad1-b9330030b97a
md"""
Parameters of the system are,

1. Exponential force factor - $K$ 
2. Length between rotor pivots  -     $L$ 
3. Normalized rotor arm length -  $α$ 
4. Additive parameter - $ξ$

"""

# ╔═╡ f8f6c083-06f0-46c5-98b5-ba2a7a379bae
md"""
###  Parameter list
"""

# ╔═╡ 14900acf-7f22-4ba7-9fb6-2c5bea6052ae
# ╠═╡ disabled = true
#=╠═╡
u0s = [
        [0.,0.,0.,0.],
	  	[pi,0.,0.,0.],  [-pi,0.,0.,0.],
        [0.,0.,pi,0.],  [0.,0.,-pi,0.],
        [pi,0.,pi,0.],  [pi,0.,-pi,0.], [-pi,0.,pi,0.],  [-pi,0.,-pi,0.],
]

  ╠═╡ =#

# ╔═╡ ec7df2bf-69fb-4244-b1ca-0c134a887496
md"""
## Fixed points of the system
"""

# ╔═╡ c9686e75-5f96-49e5-98cd-7fb2980c436d
md"""
Trivial Solutions
"""

# ╔═╡ 3f86d469-d127-4530-9300-a8bc556c7c1a
u0s = [
        [0.,0.,0.,0.],
	  	[pi,0.,0.,0.], 
        [0.,0.,pi,0.],  
        [pi,0.,pi,0.]
]


# ╔═╡ c6ee834e-501e-4837-bb74-f7239ce67481
md"""
Non-Trivial Solutions
"""

# ╔═╡ c963b761-aa45-43de-acee-1803582e0b48
md"""
## Validity of Non- Trivial Fixed points
"""

# ╔═╡ 0700966c-5993-4df6-bd43-09ac4904cf91
md"""
Non-trivial fixed points are solutions of r,

$\begin{equation}
cos^{-1}\left(\frac{L^{2}+(\alpha^{2}-1)}{2L\alpha}\right),cos^{-1}\left(-\frac{L^{2}-(\alpha^{2}-1)}{2L}\right)
\end{equation}$
"""

# ╔═╡ 2ea8844a-91c4-11ee-218b-79f3922f9694
md"""
# Linearizing System Around Fixed Points
"""

# ╔═╡ 91c2b868-76a2-4a14-ace3-d7526fe928da
md"""
ODEs governing equation of motion are 

$\begin{align}
\dot{\theta}_{1} & =p_{1}\\
\dot{p_{1}} & =\frac{e^{-Kr}}{r^{3}}(1+Kr)(Lsin\theta_{1}+sin(\theta_{1}-\theta_{2}))\\
\dot{\theta}_{2} & =p_{2}\\
\dot{p_{2}} & =\frac{e^{-Kr}}{r^{3}}(1+Kr)(-Lsin\theta_{2}+sin(\theta_{2}-\theta_{1}))
\end{align}$
"""

# ╔═╡ 722eba29-ce5c-43b1-ad92-3ef99d9420b8
md"""
Jacobian of the system is given by

$\mathcal{J}= 
 \begin{bmatrix}0 & 1 & 0 & 0\\
\frac{\partial\dot{p_{1}}}{\partial\theta_{1}} & 0 & \frac{\partial\dot{p_{1}}}{\partial\theta_{2}} & 0\\
0 & 0 & 0 & 1\\
\frac{\partial\dot{p_{2}}}{\partial\theta_{1}} & 0 & \frac{\partial\dot{p_{2}}}{\partial\theta_{2}} & 0
\end{bmatrix}$

"""


# ╔═╡ 9a261a75-bd2a-43b1-be8e-371ec5908449
md"""
The factors of $\mathcal{J}$ if we consider only around fixed points that make sinsouidal factors to vanish that includes

1. $(0,0,0,0)$
2. $(\pm\pi,0,0,0)$
3. $(0,0,\pm\pi,0)$
4. $(\pm\pi,0,\pi,0), (\pm\pi,0,-\pi,0)$
5. $(c_{1},c_{2}),(-c_{1},-c_{2}) \
         \space for  \space |1-α|<L<1+α$

"""

# ╔═╡ 35a43101-b01a-4ef5-91e6-78a65f145cfb
md"""
## Brute force differentiation
"""

# ╔═╡ cc04b4c3-18b1-4bc5-8e1d-66dc85045a25
md"""
Both of the functions are sensitive to all the parameters 
"""

# ╔═╡ 155f232f-a2a4-437b-a40a-cdd6a8ee1a33
md"""
### Jacobian function
"""

# ╔═╡ a3fe4298-5690-4b89-b278-973c1a0db888
md"""
##### Testing case - when $e^{-Kr}$ is linear approximated. Giving rise to condition $Kr=1$ 
"""

# ╔═╡ e10f28cf-1968-488e-be56-1b962f0da0bc
md"""
# EigenValues of (θ1, θ2) that make $\dot{r}$ = 0
"""

# ╔═╡ aef13861-a689-4cff-9d95-bdedc68d817e
md"""
(A digression to show that $\mathcal{J}$ doesn't depend on radial velocities)

For $\dot{\theta_1} = 2.05$ , $\dot{\theta_2} = 2.00$, but linearized $\mathcal{J}$ doesn't depend on these
"""

# ╔═╡ c43d2dba-f3f2-42d2-ad93-c601a1f0840e
md"""
### Inference

For the points further from (c1,c2) real part becomes smaller but $r$ is higher 

(So this computation of brute force linearization fails)
"""

# ╔═╡ 5ed7f6ed-cbc8-4174-bfbb-bb1df72f4e65
md"""
# Simplified computation of  $\mathcal{J}$'s  around fixed point
"""

# ╔═╡ 72b776bf-d2f8-44f2-bfa8-01f70df7f146
md"""
Used the fact, that functions $f_1(\theta_1,\theta_2)$ $f_s(\theta_1,\theta_2)$ go to zero (refer supplementary section of article for calculation).

This gives the same result as brute force differential with lesser computing power,
"""

# ╔═╡ 49e7f646-826e-456b-a868-96589ea8d4c3
md"""

$\begin{align}
\frac{\partial\dot{p_{1}}}{\partial\theta_{1}} & =\frac{e^{-Kr}}{r^{3}}(1+kr)(Lcos(\theta_{1})+cos(\theta_{1}-\theta_{2}))\\
\frac{\partial\dot{p_{1}}}{\partial\theta_{2}} & =f(r)\frac{\partial f_{1}}{\partial\theta_{1}}=\frac{e^{-Kr}}{r^{3}}(1+kr)(-cos(\theta_{1}-\theta_{2}))\\
\frac{\partial\dot{p_{2}}}{\partial\theta_{1}} & =f(r)\frac{\partial f_{2}}{\partial\theta_{1}}=\frac{e^{-Kr}}{r^{3}}(1+kr)(-cos(\theta_{1}-\theta_{2}))\\
\frac{\partial\dot{p_{2}}}{\partial\theta_{2}} & =f(r)\frac{\partial f_{2}}{\partial\theta_{2}}=\frac{e^{-Kr}}{r^{3}}(1+kr)(-Lcos(\theta_{2})+cos(\theta_{1}-\theta_{2})).
\end{align}$

"""

# ╔═╡ d9e20040-31e5-4125-a037-7c90ddee908e
md"""
 Above equations are simplified using the fact both $\frac{\partial r}{\partial\theta_{1}}$ , $\frac{\partial r}{\partial\theta_{2}}$ are zero around fixed points.
"""

# ╔═╡ 70c103df-03b5-457a-8745-640ba2756321
md"""
Note - These are functions are also locally sensitive to parameter defined in next section ie global "Parameters" values can be overriden by specific argument - don't panic if above eigen value didn't match (made this way for plotting eigen value graph)
"""

# ╔═╡ 68a97aa0-4e69-4914-a27b-ddb42b54d552
md"""
f1 function doesnt have α defined
"""

# ╔═╡ 3a23d6fe-3086-442e-98ad-743c0ad83f95
md"""
Check if it matches with the above brute force table
"""

# ╔═╡ 04119e03-660a-4048-9050-637d664ab764
md"""
# Parameters

### Potential order, n = ($(@bind n Scrubbable(1:1:5,default=3)))

 ### Exponential factor, k = $(@bind k  PlutoUI.NumberField(1.5:0.1:20.0,default=2.0)) 

 ### Length between 2 rotors l = $(@bind l PlutoUI.NumberField(0.5:0.001:10., default=1.5; ))

 ### Additive parameter ξ = $(@bind ξ PlutoUI.NumberField(0.0:0.01:10., default=0.0; ))

#### Velocity parameters 

Parameter A = $(@bind A1 PlutoUI.Slider(-1.0:0.1:20., default=1; show_value=true))

Parameter B = $(@bind B1 PlutoUI.Slider(0.0:0.1:20., default=0.0; show_value=true))

#### Velocities

 $\dot\theta_1$ = $(@bind ω1 PlutoUI.NumberField(-10:0.05:10., default=2.05;  ))

 $\dot\theta_2$ = $(@bind ω2 PlutoUI.NumberField(-10.0:0.05:10., default=2.00; ))

### α - rotor arm parameter = $(@bind α PlutoUI.Slider(0.2:0.01:1.0,default=1.0,show_value=true))



"""

# ╔═╡ 4ac3eabd-cb4e-49d2-9603-7a9d1b585922
params = [k,l,α,ξ,A1,B1]

# ╔═╡ 6501775e-59ae-48a6-8792-56cc2d7347d1
# function to be passed for jacobian
function f1_brute(u;k1=params[1],l1=params[2],α1=params[3],ξ1=params[4])

       f=zero.(u)
       θ1,pθ1,θ2,pθ2  = u
	   l,k,α,ξ=l1,k1,α1,ξ1

       r  = (sqrt(abs(1+α^2 + l^2 - 2*l*(α*cos(θ1)- cos(θ2)) - 2*α*cos(θ2-θ1))))+ξ
       h  = exp(-k*r) * (1+k*r) / r^3;

       f[1] = pθ1;
       f[2]  = (h*(sin(θ1-θ2)+l*sin(θ1)))
       f[3]  = pθ2;
       f[4]  = (h*(α*sin(θ2-θ1)-l*sin(θ2)))

       return f

 end


# ╔═╡ 45029925-7e4f-44ae-b52f-0d72b8f7bf10
eigvals(ForwardDiff.jacobian(f1_brute, [0.7304784,0.,2.606183,0.]))

# ╔═╡ 10b499e6-3329-48b2-bad8-6382d8a5e328
c1 = acos( (l^2+α^2-1)/(2*l*α) )

# ╔═╡ 3d4474bf-cc5f-419c-b498-22fde0599b2c
c2 = acos((-l^2+α^2-1)/(2*l))

# ╔═╡ d23ce50e-c492-499e-89ac-96a150c5449a
u0c = [
		[c1,0.,c2,0.],  [-c1,0.,-c2,0.]
]

# ╔═╡ 53c2b817-b5e9-4af7-a430-1dd864d7783e
md""" we have relations from geometry of the problem

$αcos(θ_1-θ_2) = \frac{-L^2+α^2+1}{2}$ 

Subsituting Analytically found solutions into above,  LHS = $(α*cos(c1-c2)), RHS = $((-l^2+α^2+1)/2) and

$αcosθ_1-cosθ_2 = L$

LHS = $(α*cos(c1)-cos(c2)) ; matches with length parameter = $(l)

so solution c1,c2 are valid
"""

# ╔═╡ aa9608bc-3236-43ff-8f74-bdf37ab31b1c
# 2nd sample function with floating error correction
function f2_brute(u)

f=zero.(u)
θ1,pθ1,θ2,pθ2  = u

(s1,c1)  = α.*sincos(θ1)
(s2, c2) = sincos(θ2)

r = let
  a = fma(s1, s2, 1)
  b = fma(c1, c2, a)
  c = fma(l, c1 - c2, b)
  d = fma(l, l, -2*c)
  (sqrt ∘ abs)(d+3.0+α^2)+ξ
end
x = k * (r)
h = exp(-x) * (1 + x) / (r)^3

 s = s1*c2 - c1*s2

          f[1] = pθ1
          f[2] =  h * fma(s1, l, s)/α
          f[3] = pθ2
          f[4] = -h * fma(s2, l, s)

       return f
end

# ╔═╡ cb5d7133-ae1f-42cb-90f7-9abd223f0a6f
function brute_eign_cal()
	J0_eig = []
	for u0 in u0s
        J0 = ForwardDiff.jacobian(f2_brute, u0)
        push!(J0_eig,round.(eigvals(J0),digits=6))
    end
	return J0_eig
end


# ╔═╡ 3cae7b81-9d4b-48b7-ba26-c5592b73c58c
J0_eig = brute_eign_cal();

# ╔═╡ d45fa4fc-9be2-44ab-9a0e-8883c63f3b09
md"""
| $(0,0,0,0)$     | $(\pm\pi,0,0,0)$ |$(0,0,\pm\pi,0)$  |$(\pm\pi,0,\pm\pi,0)$|
|-----------------|------------------|------------------|---------------------|
| $(J0_eig[1][1]) |  $(J0_eig[2][1]) |  $(J0_eig[3][1]) |  $(J0_eig[4][1])    |
| $(J0_eig[1][2]) |  $(J0_eig[2][2]) |  $(J0_eig[3][2]) |  $(J0_eig[4][2])    |
| $(J0_eig[1][3]) |  $(J0_eig[2][3]) |  $(J0_eig[3][3]) |  $(J0_eig[4][3])    |
| $(J0_eig[1][4]) |  $(J0_eig[2][4]) |  $(J0_eig[3][4]) |  $(J0_eig[4][4])    |
"""

# ╔═╡ e42026de-4352-46ac-9882-6c018049b4ae
begin

# u00=[]
# u00=[0.638136,0,1.840777,0]
# u00= [0.7853982,2.05,2.380738,2.0]
# u00=[0.7117671,0,2.429826,0]
u00=[0.6626797,5.05,2.454369,24.0]
# u00=[c1,0,c2,0]
	

J00 = ForwardDiff.jacobian(f2_brute, u00)
end

# ╔═╡ 37bf12eb-01b5-42c3-9f40-e01c78deb3df
  eigvals(J00)

# ╔═╡ 8eb14802-d2eb-4db5-8f02-24cde5177717
begin
	r00(θ1,θ2)  = (sqrt(abs(1+α^2 + l^2 - 2*l*(α*cos(θ1)- cos(θ2)) - 2*α*cos(θ2-θ1))))
end

# ╔═╡ 099e8493-8131-455b-8ab5-3f3e59ca3e55
md"""
distance between 2 rotor ends at these points, r = $(r00(u00[1],u00[3]))
"""

# ╔═╡ bf8e9b8d-e415-473c-9979-0ec5d8146ac2
function f1(u;k1=params[1],l1=params[2])
	θ1,pθ1,θ2,pθ2  = u
	k,l = k1,l1
	function f(θ1,θ2)
       r  = (sqrt(abs(2 + l^2 - 2*l*(cos(θ1)- cos(θ2)) - 2*cos(θ2-θ1))))+ξ
       h  = exp(-k*r) * (1+k*r) / r^3;
       return h
end
j21(θ1,θ2) = f(θ1,θ2)*(l*cos(θ1)+cos(θ1-θ2))
j23(θ1,θ2) = f(θ1,θ2)*(-cos(θ1-θ2))
j41(θ1,θ2) = f(θ1,θ2)*(-cos(θ1-θ2))
j43(θ1,θ2) = f(θ1,θ2)*(-l*cos(θ2)+cos(θ1-θ2))

j_mat(θ1,θ2) = [[0,j21(θ1,θ2),0,j41(θ1,θ2)]  [1,0,0,0]  [0,j23(θ1,θ2),0,j43(θ1,θ2)]  [0,0,1,0]]
	return j_mat(θ1,θ2) 
end

# ╔═╡ bc49f7ea-856f-401c-9fda-a311714f323a
function f2(u;k1=params[1],l1=params[2])
	θ1,pθ1,θ2,pθ2  = u
	K,L = k1,l1
	# α = α1
	# ξ = ξ1
	A = A1

	r=sqrt(abs(α^2+1+L^2-2*L*(α*cos(θ1)-cos(θ2))-2*α*cos(θ1-θ2)));
	r=r+ξ

	v0     = (1-exp(-K*r^n))/r
	pv0_r  = -exp(-K*r^n)*(-1-n*K*r^n+exp(K*r^n))/(r^2)
	# pr_θ1  = (α*(sin(θ1-θ2)+L*sin(θ1)))/r
	# pr_θ2  = (α*sin(θ2-θ1) -L*sin(θ2)) /r
	pr_θ1=pr_θ2=0

	ppr_θ1 = ( α*(l*cos(θ1)+cos(θ1-θ2))- (pr_θ1)^2 )/r
	ppr_θ2 = ( (-l*cos(θ2)+α*cos(θ1-θ2))- (pr_θ2)^2 )/r
	ppr_θ12 = ( α*(-cos(θ1-θ2)) - pr_θ1*pr_θ2)/r
	
	j21(θ1,θ2) = -A * pv0_r * ppr_θ1
	j23(θ1,θ2) = -A * pv0_r * ppr_θ12
	j41(θ1,θ2) = j23(θ1,θ2)
	j43(θ1,θ2) = -A * pv0_r * ppr_θ2

	j_mat(θ1,θ2) = [[0,j21(θ1,θ2),0,j41(θ1,θ2)]  [1/α^2,0,0,0]  [0,j23(θ1,θ2),0,j43(θ1,θ2)]  [0,0,1,0]]
	return j_mat(θ1,θ2) 
end


# ╔═╡ 9ece77d0-b198-4948-a594-6952bab4117b
function f2_c(θ1,θ2)
       # fma(a,b,c) = a*b + c   

        (s1, c1) = sincos(θ1)
        (s2, c2) = sincos(θ2)

       r = let
          a = fma(s1, s2, 1)
          b = fma(c1, c2, a)
          c = fma(l, c1 - c2, b)
          d = fma(l, l, -2*c)
          (sqrt ∘ abs)(d+4.0)+ξ
        end

        x = k * r
        h = exp(-x) * (1 + x) / r^3

        d = fma(s1,s2,0)
        e = fma(c1,c2,d)

        j21 = h*(fma(l,c1,e))
        j23 = h*(-e)
        j41 = h*(-e)
        j43 = h*(fma(-l,c2,e))

        j_mat = [[0,j21 ,0,j41 ]  [1,0,0,0]  [0,j23 ,0,j43 ]  [0,0,1,0]]
end

# ╔═╡ 4daef6fc-8739-458a-aadc-98ef04af70a6
md"""
# Fixed points behaviours
"""

# ╔═╡ ca2a7e83-4d07-4a18-a902-d6e41304d43a
md"""
Note: sensitive to only  α and ξ global parameters
"""

# ╔═╡ 254cae6f-a68d-4b4c-a653-e1300bce1dfa
md"""
### At Jacobian at point S$(@bind fixed_points_no Scrubbable(1:1:4))

"""

# ╔═╡ 99821d72-9ed7-47cb-8473-576137bc1037
md"""
Jacobian 
 At $(round(u0s[fixed_points_no][1],digits=2),u0s[fixed_points_no][2],round(u0s[fixed_points_no][3],digits=2),u0s[fixed_points_no][4])

"""

# ╔═╡ 53917c67-0ca9-4560-b807-96208d1d40f1
f1(u0s[fixed_points_no])

# ╔═╡ a2bb65bd-4a54-4de6-835f-827f242bdb8c
J0_eig_simp = (f2(u0s[fixed_points_no]));

# ╔═╡ 38e47a6c-1668-454f-8902-c83b9e945f7e
eigvals(J0_eig_simp)

# ╔═╡ 3e046e80-f724-43ef-914c-17d28e184f68
md"""
#### $(round(u0s[fixed_points_no][1],digits=2),u0s[fixed_points_no][2],round(u0s[fixed_points_no][3],digits=2),u0s[fixed_points_no][4])


"""

# ╔═╡ 3847d0b2-cd87-4b38-8456-8fad52648fcc
md"""

#### Plot of  `L` vs real eigenvalues 
for fixed value of k = $(@bind fixed_k PlutoUI.Slider(0.5:0.1:10,default=k,show_value=true)),

"""

# ╔═╡ 8f66444a-81b7-4e40-be82-058827753201
begin
eigs_list = Vector{Float64}(undef,0)
l_range = 0.1:0.015:4

for lr in l_range
	push!(eigs_list,real(eigvals(f2(u0s[fixed_points_no];k1=fixed_k,l1=lr))[4]))
end
	Plots.plot(l_range, round.(eigs_list,digits=8),
	legend = false, 
	# title = "K=$(fixed_k) α=$(params[3]) ξ=$(params[4]) ",
	title = "K=$(fixed_k) α=$(params[3])",
	xaxis = "L",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	ylims = (0, 5),
	widen = true,
		lw=2
)
end

# ╔═╡ f206ca9b-68eb-4f84-bea0-fa7354e20f88
md"""

#### Plot of  `K` vs real eigenvalues
for fixed value of l = $(@bind fixed_l PlutoUI.Slider(0.1:0.1:10,default=l,show_value=true))

"""

# ╔═╡ 9ffea646-fdd4-4d72-8255-90626440237b
begin
eigsk_list = Vector{Float64}(undef,0)
k_range = 0.5:0.1:10

for kr in k_range
	push!(eigsk_list,real(eigvals(f2(u0s[fixed_points_no];k1=kr,l1=fixed_l))[4]))
end
	Plots.plot(k_range, round.(eigsk_list,digits=8),
		legend = false,
	# title = "L=$(fixed_l) α=$(params[3]) ξ=$(params[4])",
	title = "L=$(fixed_k) α=$(params[3])",

	xaxis = "K",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	ylims = (0, 5),
	# yticks = 0:0.1:1,
	widen = true,
		lw = 2
	)
end

# ╔═╡ 889aa967-c5fb-4e10-8be1-1682c381dd86
md"""
### All in one, L vs Re(Eigen Values)
"""

# ╔═╡ d8cc4ad7-1fe1-4ebe-9d49-8f30d60cf4fc
begin
eigs_list1 = Vector{Float64}(undef,0)
eigs_list2 = Vector{Float64}(undef,0)
eigs_list3 = Vector{Float64}(undef,0)

l1_range = 0.1:0.015:4

for lr in l1_range
	push!(eigs_list1,real(eigvals(f2(u0s[1];k1=fixed_k,l1=lr))[4]))
	push!(eigs_list2,real(eigvals(f2(u0s[2];k1=fixed_k,l1=lr))[4]))
	push!(eigs_list3,real(eigvals(f2(u0s[3];k1=fixed_k,l1=lr))[4]))

end
	Plots.plot(l_range, round.(eigs_list1,digits=8), lw=4, label="S1 [0,0,0,0]")
	Plots.plot!(l_range, round.(eigs_list2,digits=8),ls=:dashdot, lw= 4, label="S2 [π,0,0,0]")
	Plots.plot!(l_range, round.(eigs_list3,digits=8),ls=:dot, lw=4, label="S3 [0,0,π,0]")
	Plots.plot!(
	legend = false, 
	# title = "K=$(fixed_k) α=$(params[3]) ξ=$(params[4]) ",
	# title = "K=$(fixed_k) α=$(params[3])",
	xaxis = "L",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	widen = true,
	xrange = [0,3]
)
	Plots.annotate!([(2.,0.13,("S2",20,"Computer Modern"),:chocolate3,)])
	Plots.annotate!([(2.,0.75,("S1",20,"Computer Modern"),:deepskyblue3)])
	Plots.annotate!([(2.,1.55,("S3",20,"Computer Modern"),:green)])
	Plots.plot!(xguidefontsize=24,yguidefontsize=14,  tickfontsize=16, fontfamily="Computer Modern",framestyle=:box,yrotation=90, margin=5*Plots.mm)
	
end

# ╔═╡ 89f4c60c-0307-40b4-83fa-17ce9b336c3b


# ╔═╡ eaba2ce6-c5cd-48b4-91f1-de10f3f88f8b
# ╠═╡ disabled = true
#=╠═╡
begin
	epsi_range = 0.01:10e-4:1.5
	eigs_c = Vector{Float64}(undef,0)
for epsi in epsi_range
	epsi_points = [c1-epsi,c2+epsi]
	J0_c = ForwardDiff.jacobian(f2_brute, [epsi_points[1],0.,epsi_points[2],0.])
	push!(eigs_c,real(eigvals(J0_c)[4]))
end
	Plots.plot(epsi_range, round.(eigs_c,digits=10),
	
	legend = false,
	title = "at (c1-ϵ,c2+ϵ) L=$(l)  K=$(k) α=$(α)",
	xaxis = "parameter ϵ",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	ylims = (0, 10),
	widen = true

	
	)
end
  ╠═╡ =#

# ╔═╡ 57640abf-90fb-4c74-a8e4-73bab525216d
md"""
# Bifurcation Plot of Collision points (θ1,θ2) vs parameter L


"""

# ╔═╡ 19b434bb-7a16-425a-a729-bee8daf589e3
begin
x1 = range(abs(1-α), 1+α, length=100)
x2 = range(0, 5, length=100)
c11(l) = acos( (l^2+α^2-1)/(2*l*α) )
c22(l) = acos(  (-l^2+α^2-1)/(2*l)   )
y1 = c11.(x1)
y2 = c22.(x1)
f(x2) = π
g(x2) = 0
h(x2) = -π
Plots.plot(size = (800, 800))
Plots.plot(x1, [-y1 -y2], label=["θ1" "θ2"], lc=[:deepskyblue3 :orange2], lw=[4 4], ls=[:dashdot :dash])
Plots.plot!(x1, [y1 y2], label=false, lw=[4 4], lc=[:deepskyblue3 :orange2], ls=[:dashdot :dash])
Plots.plot!(x2, f, label="π", lw=2, ls=:dot, lc=:grey)
Plots.plot!(x2, h, label="-π", lw=2, ls=:dot, lc=:grey)
Plots.plot!(x2, g, label=false, lw=2, ls=:dot, lc=:grey)
Plots.plot!(legend=false, legendcolumns=3)
Plots.xlims!(1.0, 2.3)
Plots.ylims!(-π-1, π+1)
Plots.title!("")
Plots.xlabel!("L")
Plots.ylabel!("θ₁, θ₂")
Plots.annotate!([(1.7,1.,(" c₁",26, "Computer Modern"),:deepskyblue3)]),
Plots.annotate!([(1.7,-0.9,("-c₁",26, "Computer Modern"),:deepskyblue3)])
Plots.annotate!([(1.7,3.1,(" c₂",26, "Computer Modern"),:orange2)])
Plots.annotate!([(1.7,-2.9,("-c₂",26, "Computer Modern"),:orange2)])
Plots.annotate!([(2.15, π+0.35,("π",22, "Computer Modern"))]),
Plots.annotate!([(2.15,0.35,("0",22, "Computer Modern"))])
Plots.annotate!([(2.15,-π+0.35,("-π",22, "Computer Modern"))])
Plots.plot!(guidefontsize=24,  tickfontsize=18, fontfamily="Computer Modern", framestyle=:box,yrotation=90,yguidefontsize=2)

end

# ╔═╡ 8de5aaa8-7102-4e32-8ced-423308be44ff
md"""
# Adding ϵ around $(c1,c2)$
"""

# ╔═╡ a194a195-c8d6-44f3-9132-bba97563370e
md"""
disclaimer: this is not added to model in anyway, just investigating points around collions points
"""

# ╔═╡ 4e4b4a63-e7d0-49a8-b537-98523f650bed
md"""
to analyze stability in the vicinity of collision points since at (c1,c2) $r\to0$
"""

# ╔═╡ bfc11dd5-7339-40f5-822d-7e098112559f
md"""
define a small parameter ϵ =
$(@bind  ϵ PlutoUI.NumberField(0.00000005:10e-6:10.0,default=0.000001)) 

"""

# ╔═╡ 871fa5b3-22e2-41dd-979a-d818d3f623c4
eigvals(f2_c(-c1+ϵ,-c2+ϵ));

# ╔═╡ 052d3f5d-2156-4a6e-bbd5-c7cf3240cf62
md"""
### Vicinity check : eigen values for a point around (c1,c2) 
"""

# ╔═╡ 640441b8-53e3-4572-bc83-239f3ccef185
r(θ1,θ2)=sqrt(abs(α^2+1+l^2-2*l*(α*cos(θ1)-cos(θ2))-2*α*cos(θ1-θ2)));

# ╔═╡ 250717b0-af0e-4771-8dc1-d1c51bf8130f
r(c1-ϵ,c2+ϵ)

# ╔═╡ d93e2b04-4668-4391-b8f0-fbf7f338cf8a
J0_c = ForwardDiff.jacobian(f2_brute, [c1-ϵ,0.,c2+ϵ,0.])

# ╔═╡ 2c5277dc-5550-436c-84ad-c02040555f87
eigvals(J0_c)

# ╔═╡ 7bb76f52-188b-45c7-b5a4-dcc127da7e41
md"""
### plot of ϵ added to $(c1,c2)$ vicinity vs max of real eigenvalues
"""

# ╔═╡ 890b70ea-fbd6-486b-9ead-b84e19cdced3
md"""
# Adding ξ to the model, r 
"""

# ╔═╡ 5a76b756-d4b4-4267-aee8-dd9ae4de9d17
md"""
For figuring eigenvalues at (c1,c2), potential is taylor expanded and higher order terms were neglected.

$V_{0}  =\frac{1-e^{-Kr^{3}}}{r}=\frac{1}{r}-\frac{1}{r}+Kr^{2}-\frac{1}{2}K^{2}r^{5}\\$
$
V_{0} =Kr^{2}-\frac{1}{2}K^{2}r^{5}$
"""

# ╔═╡ 1fca5cda-1afd-4465-9e53-e8df24ca6d4b
begin
fx=range(0, stop=1, length=100)
potential(r)=(1-exp(-k*r^n))/r
approx(r)=k*r^2 - (k^2*r^5)/2
fy=potential.(fx)
fyy=approx.(fx)

Plots.plot(xlabel="r",ylabel="Energy",xlims=(0,0.8), legend=false)
Plots.plot!(fx,fy,lab="actual",lw=3)
Plots.plot!(fx,fyy,lab="approx",ls=:dash,color="black",lw=2)
Plots.plot!(guidefontsize=16,  tickfontsize=14)

end

# ╔═╡ 940fd240-1396-4427-a760-5a39af023e06
md"""
###### Inference : Taylor expansion is valid for calculating simplified $\mathcal{J}$ at c_1, c_2
###### Note : $\alpha$ parameter not incorporated yet, recheck this

"""

# ╔═╡ 6c91aad8-eefa-40a7-83ac-abb8fc60c433
md"""
Analyzing if we can add correction to model so that r doesn't go to 0
"""

# ╔═╡ c889f287-011a-44bb-b89a-7d263b044910
md"""
### Around collision Points
"""

# ╔═╡ fdbdf427-2762-49c9-85a8-d36ec43e56b9
md"""

By  reducing the computating power and  even further simplification around the collision points (5),

"""

# ╔═╡ 949ed6ca-6364-4fa4-b96c-bba5d50ba1fb
md"""

$\begin{align}
\frac{\partial\dot{p_{1}}}{\partial\theta_{1}} & =f(r)\\
\frac{\partial\dot{p_{1}}}{\partial\theta_{2}} & =f(r)(\frac{L^{2}}{2}-1)\\
\frac{\partial\dot{p_{2}}}{\partial\theta_{1}} & =f(r)(\frac{L^{2}}{2}-1)\\
\frac{\partial\dot{p_{2}}}{\partial\theta_{2}} & =f(r)(1-L^{2})
\end{align}$

"""

# ╔═╡ f6ae7a34-02ce-4d69-a8ff-97b05080120d
md"""where  $f(r)=\frac{e^{-Kr}}{r^{3}}(1+kr)$"""

# ╔═╡ be9cb208-7333-4a1d-9c0a-daaf0578e1d9
md"""
### Model's correction Parameters

 Exponential force parameter k-model = $(@bind k_model PlutoUI.NumberField(1.5:0.01:10.0,default=2.0)) 

 Length between 2 rotors l-model = $(@bind l_model PlutoUI.NumberField(0.5:0.01:10., default=1.5; ))

 height parameter α-model = $(@bind α_model PlutoUI.Slider(0.2:0.01:1.0,default=1.0,show_value=true))

 height parameter A-model = $(@bind A_model PlutoUI.Slider(-2.0:0.01:2.0,default=1.0,show_value=true))

"""

# ╔═╡ f773d141-21b6-4409-892b-41df9ad76c6f
md"""
define a small parameter ξ-model =
$(@bind  ξ_model PlutoUI.NumberField(0.05:10e-4:10.0,default=0.01)) 

"""

# ╔═╡ 3bf7748f-a570-4d40-aaac-0251157c9913
md"""
* still not brute force way using initial computation simplification
"""

# ╔═╡ 6cdfb974-385b-4783-a56a-3a95e38bcf4b
function f1_xi_new(u;k1=k_model,l1=l_model,α1=α_model,ξ1=ξr,A1=A_model)
	
	θ1,pθ1,θ2,pθ2  = u
	K,L = k1,l1
	α = α1
	ξ = ξ1
	A = A1

	r=sqrt(abs(α^2+1+L^2-2*L*(α*cos(θ1)-cos(θ2))-2*α*cos(θ1-θ2)));
	r=r+ξ

	# v0     = (1-exp(-K*r^3))/r
	# pv0_r  = -exp(-K*r^3)*(-1-3*K*r^3+exp(K*r^3))/(r^2)
	
	# pr_θ1  = (α*(sin(θ1-θ2)+L*sin(θ1)))/r
	# pr_θ2  = (α*sin(θ2-θ1) -L*sin(θ2)) /r
	pr_θ1=pr_θ2=0

	# ppr_θ1 = ( α*(l*cos(θ1)+cos(θ1-θ2))- (pr_θ1)^2 )/r
	# ppr_θ2 = ( (-l*cos(θ2)+α*cos(θ1-θ2))- (pr_θ2)^2 )/r
	# ppr_θ12 = ( α*(-cos(θ1-θ2)) - pr_θ1*pr_θ2)/r
	
	# linear approximated potential, the factor r cancels
	v0     = K*r^2 - (K^2*r^5/2)
	pv0_r  = 2*K*(1-(5/4)*K*r^3)

	
	ppr_θ1 = ( α*(l*cos(θ1)+cos(θ1-θ2))- (pr_θ1)^2 )
	ppr_θ2 = ( (-l*cos(θ2)+α*cos(θ1-θ2))- (pr_θ2)^2 )
	ppr_θ12 = ( α*(-cos(θ1-θ2)) - pr_θ1*pr_θ2)

	
	j21(θ1,θ2) = -A * pv0_r * ppr_θ1
	j23(θ1,θ2) = -A * pv0_r * ppr_θ12
	j41(θ1,θ2) = j23(θ1,θ2)
	j43(θ1,θ2) = -A * pv0_r * ppr_θ2

	j_mat(θ1,θ2) = [[0,j21(θ1,θ2),0,j41(θ1,θ2)]  [1/α^2,0,0,0]  [0,j23(θ1,θ2),0,j43(θ1,θ2)]  [0,0,1,0]]
	return j_mat(θ1,θ2) 

end

# ╔═╡ e29d0672-48a3-4078-8cd4-944d4483b9b9
eigvals(f1_xi_new([c1,0,c2,0];k1=k_model,l1=l_model,ξ1=ξ_model,A1=A_model))

# ╔═╡ 70156c76-2049-4190-9f85-ae80a60932fc
begin
eigsxi_list = Vector{Float64}(undef,0)
ξ_range = 0:0.001:1

for ξr in ξ_range
	push!(eigsxi_list,real(eigvals(f1_xi_new((c1,0,c2,0);k1=k_model,l1=l_model,α1=α_model,ξ1=ξr,A1=A_model))[4]))
end
	Plots.plot(ξ_range, round.(eigsxi_list,digits=8),
		legend = false,
	# title = "L=$(l_model) K=$(k_model) α=$(α_model) A=$(A_model)",
	title = "L=$(l_model) K=$(k_model) α=$(α_model) ",

	xaxis = "Additive Parameter ξ",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	ylims = (0, 5),
	yticks = 0:1:5,
		lw =2,
	widen = true
	)
end

# ╔═╡ 7f02946e-c697-4d76-afc6-33e5865491a0
function f1_xi(u;k1=k_model,l1=l_model,α1=α_model,ξ1=ξr,A1=A_model)
	θ1,pθ1,θ2,pθ2  = u
	k,l = k1,l1
	α = α1
	ξ = ξ1
	A = A1
	function f(θ1,θ2)
       r  = (sqrt(abs(1+α^2+ l^2 - 2*l*(α*cos(θ1)- cos(θ2)) - 2*α*cos(θ2-θ1))))+ξ
       h  = (-exp(-k*r^2) * (-1-2*k*r^2+exp(k*r^2)) )/ r^3;
       return h
		
end
j21(θ1,θ2) = A*f(θ1,θ2)*α*(l*cos(θ1)+cos(θ1-θ2))
j23(θ1,θ2) = A*f(θ1,θ2)*α*(-cos(θ1-θ2))
j41(θ1,θ2) = A*f(θ1,θ2)*α*(-cos(θ1-θ2))
j43(θ1,θ2) = A*f(θ1,θ2)*(-l*cos(θ2)+α*cos(θ1-θ2))

j_mat(θ1,θ2) = [[0,j21(θ1,θ2),0,j41(θ1,θ2)]  [1/α^2,0,0,0]  [0,j23(θ1,θ2),0,j43(θ1,θ2)]  [0,0,1,0]]
	return j_mat(θ1,θ2) 
end


# ╔═╡ e95481fc-15e5-4a1f-a6ad-da795e141e6d
md"""
* Without alpha consideration
"""

# ╔═╡ aed653e8-c28f-400d-bbdc-969dab14a7ab
function f_model(r;k1=k_model,l1=l_model)
	    k,l = k1,l1
        x = k * r 
        h = exp(-x) * (1 + x) / r^3
	
        j21 = h*(1)
        j23 = h*(-(1-l^2/2))
        j41 = h*(-(1-l^2/2))
        j43 = h*(1-l^2)

        j_mat1 = [[0,j21 ,0,j41 ]  [1,0,0,0]  [0,j23 ,0,j43 ]  [0,0,1,0]]
end

# ╔═╡ fdd81f8a-58fa-4861-a4e8-8e53660e23a2
eigvals(f_model(ξ_model;k1=k_model,l1=l_model));

# ╔═╡ 4186c551-2333-4dce-abd2-0de26b4935d3
begin
	epsi_range1=0.01:0.05:15
	eigs_model = Vector{Float64}(undef,0)
for epsi in epsi_range1
	J0_model = f_model(epsi;k1=k_model,l1=l_model)
	push!(eigs_model,real(eigvals(J0_model)[4]))
end
	
	Plots.plot(epsi_range1, round.(eigs_model,digits=15),
	
	legend = false,
	title = "at L=$(l_model) & K=$(k_model)",
	xaxis = "parameter ξ",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	xlims = (0,10),
	ylims = (0, 2),
	widen = true
		)
end

# ╔═╡ d49ff161-bfe9-4697-aa64-db0da1c49676
md"""
* doing brute force way yeilds inf
"""


# ╔═╡ 3a1917af-ef54-47b2-b9ad-b8af505cc20d
ξ_model

# ╔═╡ fd3753e4-2f10-4afa-bf49-20d9b72d1a2f
function f1_xi_brute(u;k1=k_model,l1=l_model,α1=params[3],ξ1=ξ_model)

f=zero.(u)

θ1,pθ1,θ2,pθ2  = u
K,L = k1,l1
α = α1
ξ = ξ1

r=sqrt(abs(α^2+1+L^2-2*L*(α*cos(θ1)-cos(θ2))-2*α*cos(θ1-θ2)));
r=r+ξ

r  = (sqrt(abs(1+α^2 + l^2 - 2*l*(α*cos(θ1)- cos(θ2)) - 2*α*cos(θ2-θ1))))+ξ
h  = exp(-k*(r+ξ)) * (1+k*(r+ξ)) / (r+ξ)^3;

v0     = (1-exp(-K*r^3))/r
pv0_r  = -exp(-K*r^3)*(-1-3*K*r^3+exp(K*r^3))/(r^2)
pr_θ1  = (α*(sin(θ1-θ2)+L*sin(θ1)))/r
pr_θ2  = (α*sin(θ2-θ1) -L*sin(θ2)) /r


f[1]  = pθ1/α^2;
f[2]  = -pr_θ1*pv0_r;
f[3]  = pθ2;
f[4]  = -pr_θ1*pv0_r;

return f

end


# ╔═╡ 04030668-48f9-40dc-a8f6-5f5237218bf0
		J0_c1 = ForwardDiff.jacobian(f1_xi_brute, [c1,0.,c2,0.])
	

# ╔═╡ dc2dc1a1-34d7-4ac1-9497-e4f3c266501a
# ╠═╡ disabled = true
#=╠═╡
begin
eigsxi_list1 = Vector{Float64}(undef,0)
ξ_range1 = 0.1:0.1:5

	ξrr = 0.1
	J0_c = ForwardDiff.jacobian(f1_xi_brute, [c1,0.,c2,0.])
	push!(eigsxi_list1,real(eigvals(J0_c))[4])
Plots.plot(ξ_range, round.(eigsxi_list,digits=8),
		legend = false,
	title = "at exactly (c1,c2) , L=$(l_model), K=$(k_model)",
	xaxis = "ξ",
	yaxis = "Re(Eigen Values) ",
	formatter = :plain,
	ylims = (0, 1),
	yticks = 0:0.1:1,
	widen = true
	)
end
  ╠═╡ =#

# ╔═╡ Cell order:
# ╟─1226574e-4bac-46d0-ac38-792ca403e6d7
# ╟─e863f615-11e7-4c8e-a90a-85bfcf8be042
# ╟─b24d7013-ac8c-41df-bc11-38385e690449
# ╠═ca771507-832d-4e2a-8c03-d13504632475
# ╟─cb195a84-99a4-4939-9111-b139c1830ae3
# ╟─4f9577de-6a29-40e9-8f3c-30ee6cb19c80
# ╟─21bd002f-6eaa-4016-be2d-c3ca2befa565
# ╟─1f9528ed-f6ab-4ffd-9aaa-3c1808706b9d
# ╟─4e6899c4-21d4-4b2a-aad1-b9330030b97a
# ╟─f8f6c083-06f0-46c5-98b5-ba2a7a379bae
# ╟─4ac3eabd-cb4e-49d2-9603-7a9d1b585922
# ╟─14900acf-7f22-4ba7-9fb6-2c5bea6052ae
# ╟─ec7df2bf-69fb-4244-b1ca-0c134a887496
# ╟─c9686e75-5f96-49e5-98cd-7fb2980c436d
# ╟─3f86d469-d127-4530-9300-a8bc556c7c1a
# ╟─c6ee834e-501e-4837-bb74-f7239ce67481
# ╟─d23ce50e-c492-499e-89ac-96a150c5449a
# ╟─c963b761-aa45-43de-acee-1803582e0b48
# ╟─0700966c-5993-4df6-bd43-09ac4904cf91
# ╟─10b499e6-3329-48b2-bad8-6382d8a5e328
# ╟─3d4474bf-cc5f-419c-b498-22fde0599b2c
# ╟─53c2b817-b5e9-4af7-a430-1dd864d7783e
# ╟─2ea8844a-91c4-11ee-218b-79f3922f9694
# ╟─91c2b868-76a2-4a14-ace3-d7526fe928da
# ╟─722eba29-ce5c-43b1-ad92-3ef99d9420b8
# ╟─9a261a75-bd2a-43b1-be8e-371ec5908449
# ╟─35a43101-b01a-4ef5-91e6-78a65f145cfb
# ╟─cc04b4c3-18b1-4bc5-8e1d-66dc85045a25
# ╠═6501775e-59ae-48a6-8792-56cc2d7347d1
# ╟─155f232f-a2a4-437b-a40a-cdd6a8ee1a33
# ╠═aa9608bc-3236-43ff-8f74-bdf37ab31b1c
# ╠═cb5d7133-ae1f-42cb-90f7-9abd223f0a6f
# ╟─d45fa4fc-9be2-44ab-9a0e-8883c63f3b09
# ╟─a3fe4298-5690-4b89-b278-973c1a0db888
# ╠═45029925-7e4f-44ae-b52f-0d72b8f7bf10
# ╟─e10f28cf-1968-488e-be56-1b962f0da0bc
# ╟─aef13861-a689-4cff-9d95-bdedc68d817e
# ╠═e42026de-4352-46ac-9882-6c018049b4ae
# ╟─37bf12eb-01b5-42c3-9f40-e01c78deb3df
# ╟─8eb14802-d2eb-4db5-8f02-24cde5177717
# ╟─099e8493-8131-455b-8ab5-3f3e59ca3e55
# ╟─c43d2dba-f3f2-42d2-ad93-c601a1f0840e
# ╟─3cae7b81-9d4b-48b7-ba26-c5592b73c58c
# ╟─5ed7f6ed-cbc8-4174-bfbb-bb1df72f4e65
# ╟─72b776bf-d2f8-44f2-bfa8-01f70df7f146
# ╟─49e7f646-826e-456b-a868-96589ea8d4c3
# ╟─d9e20040-31e5-4125-a037-7c90ddee908e
# ╟─70c103df-03b5-457a-8745-640ba2756321
# ╟─68a97aa0-4e69-4914-a27b-ddb42b54d552
# ╠═bf8e9b8d-e415-473c-9979-0ec5d8146ac2
# ╠═bc49f7ea-856f-401c-9fda-a311714f323a
# ╟─99821d72-9ed7-47cb-8473-576137bc1037
# ╟─53917c67-0ca9-4560-b807-96208d1d40f1
# ╠═a2bb65bd-4a54-4de6-835f-827f242bdb8c
# ╟─3a23d6fe-3086-442e-98ad-743c0ad83f95
# ╠═38e47a6c-1668-454f-8902-c83b9e945f7e
# ╟─9ece77d0-b198-4948-a594-6952bab4117b
# ╟─871fa5b3-22e2-41dd-979a-d818d3f623c4
# ╟─04119e03-660a-4048-9050-637d664ab764
# ╟─4daef6fc-8739-458a-aadc-98ef04af70a6
# ╟─ca2a7e83-4d07-4a18-a902-d6e41304d43a
# ╟─254cae6f-a68d-4b4c-a653-e1300bce1dfa
# ╟─3e046e80-f724-43ef-914c-17d28e184f68
# ╟─3847d0b2-cd87-4b38-8456-8fad52648fcc
# ╟─8f66444a-81b7-4e40-be82-058827753201
# ╟─f206ca9b-68eb-4f84-bea0-fa7354e20f88
# ╟─9ffea646-fdd4-4d72-8255-90626440237b
# ╟─889aa967-c5fb-4e10-8be1-1682c381dd86
# ╠═d8cc4ad7-1fe1-4ebe-9d49-8f30d60cf4fc
# ╠═89f4c60c-0307-40b4-83fa-17ce9b336c3b
# ╠═eaba2ce6-c5cd-48b4-91f1-de10f3f88f8b
# ╟─57640abf-90fb-4c74-a8e4-73bab525216d
# ╟─19b434bb-7a16-425a-a729-bee8daf589e3
# ╟─8de5aaa8-7102-4e32-8ced-423308be44ff
# ╟─a194a195-c8d6-44f3-9132-bba97563370e
# ╟─4e4b4a63-e7d0-49a8-b537-98523f650bed
# ╟─bfc11dd5-7339-40f5-822d-7e098112559f
# ╟─052d3f5d-2156-4a6e-bbd5-c7cf3240cf62
# ╟─640441b8-53e3-4572-bc83-239f3ccef185
# ╠═250717b0-af0e-4771-8dc1-d1c51bf8130f
# ╠═d93e2b04-4668-4391-b8f0-fbf7f338cf8a
# ╠═2c5277dc-5550-436c-84ad-c02040555f87
# ╟─7bb76f52-188b-45c7-b5a4-dcc127da7e41
# ╟─890b70ea-fbd6-486b-9ead-b84e19cdced3
# ╟─5a76b756-d4b4-4267-aee8-dd9ae4de9d17
# ╠═1fca5cda-1afd-4465-9e53-e8df24ca6d4b
# ╟─940fd240-1396-4427-a760-5a39af023e06
# ╟─6c91aad8-eefa-40a7-83ac-abb8fc60c433
# ╟─c889f287-011a-44bb-b89a-7d263b044910
# ╟─fdbdf427-2762-49c9-85a8-d36ec43e56b9
# ╟─949ed6ca-6364-4fa4-b96c-bba5d50ba1fb
# ╟─f6ae7a34-02ce-4d69-a8ff-97b05080120d
# ╟─be9cb208-7333-4a1d-9c0a-daaf0578e1d9
# ╟─f773d141-21b6-4409-892b-41df9ad76c6f
# ╠═e29d0672-48a3-4078-8cd4-944d4483b9b9
# ╟─3bf7748f-a570-4d40-aaac-0251157c9913
# ╠═70156c76-2049-4190-9f85-ae80a60932fc
# ╟─fdd81f8a-58fa-4861-a4e8-8e53660e23a2
# ╠═6cdfb974-385b-4783-a56a-3a95e38bcf4b
# ╟─7f02946e-c697-4d76-afc6-33e5865491a0
# ╟─e95481fc-15e5-4a1f-a6ad-da795e141e6d
# ╠═4186c551-2333-4dce-abd2-0de26b4935d3
# ╟─aed653e8-c28f-400d-bbdc-969dab14a7ab
# ╟─d49ff161-bfe9-4697-aa64-db0da1c49676
# ╠═3a1917af-ef54-47b2-b9ad-b8af505cc20d
# ╠═fd3753e4-2f10-4afa-bf49-20d9b72d1a2f
# ╠═04030668-48f9-40dc-a8f6-5f5237218bf0
# ╠═dc2dc1a1-34d7-4ac1-9497-e4f3c266501a