)9#=4JoV&^fH%2+Kx+0JMlPOV2jP<8#!
z`jA)iEciR1jaDa1J=IxWL%ah@7jT9q=Nx2$CGHhT+SyBXWfdilW?$9)6_0ZmqZXm@
zj#FDmj?t99;SsIU8Fdt`{;|Avf?TE>($I
zab<-JGqeeQQP3$dmHUHUpqd^OCKJf7C;8&hhH!HvGk;G6I-~~GN~q!XbRN5BsBZk2
zF0oLQV9)@nnLGN^y>4*jc7HCR!Hm@Z>+R5+E_>S(S`dD4;|r%L2zhr2$41{nXaE&5
z9b1H7v#pzH#%de@w;ZcVx}2W>UTc=){CTpPC*(dwMf^}*s2g5gU2R^VQeD12co^_M
z{Z%Ic9Z>cqEG#&LVDkHX^q%fWOL^aI%Q^@u3O69!DF>m|>5hXSD>R!CT6w?{SVyuN
z8Yh4>{8}8Md|LMiusLWnDbQi`1|r!tB|56=gCR$N4+@fUbiDFwzR!=Gj_-`1APuyl
z@Yy&~4_bgR#oG&|p^1sXz(IsJ$HSq3t?h235}Uf=zhUP085#v`?U)){JG;wp1~8hq
z@79uTx_f$xqD_jcVq>4Drzb_?CUDW^wVpd;fPZ~J4gt9+&t>^8I`cud@CJJoD*Gr5
zjpOVZ2(q=l7(6#;Q3fy=@)4%0w*}F@Uec~<{r;N;#VcqPa`T{#5+fisexBsi{ospY
zi44u0Cyn>tu1D{gG}U0KP5xJx27Tc_U78G|c>kEe)BmGOgH1&F6c{v@Tvw+^#Ec8I
z=^q_IHhawq`Lr91@?U}`EGNcH*e6!2om#+CR$a^8_0l>7|73o%kQNswdY2Ez`c>xz
z8~_6fdZEsh`og2I6H_nnyUxhx^jtk={P1rzx7>{%)LhzYJUl$h^F>3bY`g@bjbFor
zZ5>bn3=It#+R{+^S3DFs#-9G(ybH9JrIi)4udR4=*G@<)#b5d3cDA;m;okPI`A=WI
z;FOg^YSy&!jYcwZDkMBTD|84_Yu(n`EDo;MHWc$7e!_hK7b>
z{rxQt80v7#qfx0J6EBqC#})P5Y(WIJ722*~o>lkt-S&J9k{>Y_7uO5<*CcGneiD+;
z;^&2gXg_}Z=(5@_lLrF|<^(|GgGTvU3~~zbLdVe{hS8T757`o2_C-fW_r5bc>@@$q
zYy7<(>W?Hx6t?_#9AdR1(myZ|8WVE}LKeP$e)p<<$x!ff;-WT7580tZ)nF@tB*G0T
zh|F7g`>e~?G{V#Ph|$9Qe9kb7XIiMD;AQLT+&5}Quiv&QiBAIqE!tD}5#TC;^6hyu
zpafV=%$+9OAC%Ow$lX%8Kwv(v+Z3
z0WXBiJ@#y4<9IpvF+oEf4Jd5EWvbN|w#2*y+5!5ml(Ob(yJVw_7&KFHy4mjOQ2T4>h?wZ<51
zERCQFqdzqpg7{G~N;^66EtIe8Ayv@)3<|X|$B&=&st4!6z`)>BW25O(0;sRK&>0@%
zr(8kfK@BZ{10Y@<=8GiySttl7Z>2R`1v
z%*4zriK^=8tpQbG4}ZB{MtX$o6*urd9v)<<3OjoPP0rl5E=9acNK(5=
z2zd1XLNOrlpquAMOZ?%#V1|P|9)FtSUyj&*<9I=U6=lD^o1-%5&aa}%mjwmKc6N4L
zwx-iA!6qwd0d%6Qr}yl<+Uw!!$A^o5wpD%cm2Z~i;3*koxkrFb&!H2Fqzkc$-d^oGOQkDfr`$kG%q|6L|%9D_jp|NRm;
z$}A>^$N?EzD|ZmIM+3TIrM{d}vr8HwDD{BeK?2#s{b0V3&>HWR@@_RN_+d}>MnBAQ
z+}OWre=Ip>k3wLfDU|AV&L9`f>dAx98b;+myJv*qt_iAOr`FgWEO6t^3MSMzXp4K;
z!M9R|Se!0VyyW5DX8<54FpYp48rD`m^nBs}=#>71VVUB*I0%hh0<3iyJtkl~^uJV8
zQNi53cdtF~o(!0q@`k6U8*iL{X2BxVZkzJ$ain(UEnWKITWT
z$-8&&^!Z}*ymmc71@G+aJOdpX=(JrtnjeG$5pbG21$>c7jtVtgH8l?+kQ|f*(D61S
zBhPwB)S@?+2oS~#e(MDH;Qxb`ks)p7XFmh!1>giBUQ;)~0xoj2$G@R(Y+kEnwiOv4
ziwGKG=Ez)$S+kxVklBe>1IMIXk8*fs@ueSi@JpZUiAq1Sx1JxnHMg(2%h<<>xSar<
z2IRX_m+s-)RK-&S0|BVjYg$tiY^xy@wA+5B^M(4M@
zeQWbmlCpX%Epb-&?R+=6l$IM3pS{*6g|k$2n2|4F7atDT{5g5=nz?h_segw2o10!h8WasJ90W
z9Ox}DRVz0~%{qsvqp(Sq{KS3}pMI3mGK39u6Hi
zgH@#jpnU1DnI0zsat3`si`=iXe_7H55HqE+_yH0>TfgR?f@*~(Q3X7I3xM5B@i%~Z
z<2BI>F+6RVoF0BtUgC3C+K|7KV0NYbQvcNt(9Ck|{@xLL_P^NHS4y%p6Se^l{7=b~
z{)WGkCpRsULS?R0Qpj9!x(WtC>Wh-CQRgN^Vt)A&y6o?n
zW+wxwJ+aQVuHHD#v0Gpdu%)$}xnNljR4?^NwWjs+xxYaXnvnU+n$6^qYpXXt#L!NN
z(V+R9zmDoK6BtLpYPNDSfs5_D0pUbo%ScGPJxc9?Nm(ez7bpoav!uS2TF>tzD)lai
zdZd|zvPH+~PPyusD;h{uB4csy=(g^I7hI#F*SqFAzYUhVEkoeC3cNpH#h}pI6m!Z^
z!Tmf4^WEja1EvcX4h^~g43doh2OIuw({8mtUYicsYtP&@H5j2p#3cHVaUj>bQ{gU%
zI*^XD-ArI6#|t@1$jcwOz|KA)^iTf!#Fm>lu2UM4G$lr9Ehu2>cUvqc*Mqn&u>aaP
zL3n{~KQt+Kjao
zV!o92DVsqQqQPe#A@RA#EG!I>JocW=a==j>I>otzo6wOl%@9`zOZ3{Ifh8eGmd0Ta
zYq>7(VCQxKXK81x49=RK%x{6d7X-dEfyiUP)2GL;n%!fJ
z6esuKU}r}&KJFeK6ZTM$0&vnW2OoO`Yh*l5OH0e$9ykXp3~$_z02O-(VKVm$aFQUi
z8!;R4T&UvA&D*!1!kunR+!gsNWLyS;pS!yTcV70)ev>(%&lvf!x!HCn0uF{H_A!yr
zBq2R?=n|{4>ojP$QJ$L0&xHVRcr{`c=@QU8>EcMQ+I0easPayk-gYisC)05(a$E1+=M{tPKsqg5
zU3vh&Pm_|)K()REC0
z{|aW393&sVf}J=a1doM;1H?*&8kPlu^n3@NEx92sF0Kl$B;EV6>E|3;SjYMAH?J!w
zL@FkVUbGzeaC4@=B!6|$Yxj0`$Kcim+^-v4WlN7%p+;qqRCoyEs*d$_FX=XkoNfJ{+w)=HES?9?&djg?TL4;=PJa8Ww5e(O
z{%fGE!k!7^)G0pWIMpWp{exqM&LogLD!aLs>BobYY8}Oox3LR(CgaXEjZ%@u4)C
z2Xv;_4wLcDdOtr5SVhURhOg#${kb9PJW_o?F0Dguv2xeboHwrypzkZ7F4ZIbl9VDW
zb#--eVVyhM8{5}9B6d(Gj0%|sQ`s&aRC3%`6W*_&S+|*4T2p?%Ig|O}11%I0Mc>il
zk`lBXgPR2p5nRf)@Uk%+septpfMS8wqC1tIq(_ceIRAlUEvRFTQ-_lRMHl)@s9_M+
z!5%sS0-U%H$w)K*P(;qvKG77BQ=;wypa|QH){-GrBQ<`Z@$nZI6<+y@?r5lOjaf8N
ze|W2#Ip|)eB=*Pm!-o$fMNEK%T<8j~A1NJp2GSZ1hdTo{Th+wH;|1CmVLy#3uNU=k
z795P_v#gG~3|G=+
zp=1)|lVhcyvj(ghAg-DRNmisPN!&+SS=k%rkHObeIm>>bOK7+@h>jl%<`nuw(q7;j
zfqhW78mg0~`>F++3W>Axx+_l@q&u@q>aMw=PYeA!dK}UkE6=K~sW}EDkz%b+&FkmN
zin6wLz(=2hHDJ^;FfgEbEr_rTkBktdwD&G-Pfbqxfvx3d4|=%_Fd(F1p2ssoWX%?=
z+80;MPoUEWY(CWXl9iXoL7zYjSC@-oz9!CoTft?0znRo-RtQ-Jd=1}zNN0k$wZgZ5
z-k(Jd9%pI*?K3nw+8-+4Z&vcj5pkf%r?+n3x`l@k=hQI-w%sUXnm@I+Mm51zfw%#G}UzwX*PJNy0VxfmGP)-W{sob6HJnuYHV
zu>ZqTJEl`1l{!6}Q~CV0d^F&RuTt-{vn&S+jNE=i8?!*>%@n56*JvK&aXUz6m$bms
zVXvyHuAS%MQQHDHAQgtec?eOH-yX25jCW*}o39K;TL*+1QqSIaE{h_J0^2d^bm)R#
zVeqr{XuY?H?tFFQY{uXYX%#qyelIs9zqZ|aB@+ZZNJzg=YY6?*Ep
z5Oh3vwCAbAR2$PYoG_GBq^4dd=$0&yaoP=MNjLoi$)^ZjleRPG`S~?Jx3oM5kl!@j
zOm5=*P&$ld8WoN95fh)y(qJEeR`C^#=e`eeJqO4wijZq)f7D4!PL|l}8`@zVaOhA_
z1;OdnK}L6FA^RWleOI)-hYr%7U0qHI77c@^-B@7eKvq}Dbu5VgbT+>s^y=tlqi{3|
za-N%8d1ZAq!m4EA#Ps8ndLbYR6PC|k{hZD0qvbw4{?n`PT|DqGpP3hk1@OQBm+w1_
ZGac
Date: Wed, 17 May 2023 00:00:46 -0400
Subject: [PATCH 05/16] add initial test workflow
---
.github/workflows/pr.yml | 41 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
create mode 100644 .github/workflows/pr.yml
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
new file mode 100644
index 0000000..0dff71e
--- /dev/null
+++ b/.github/workflows/pr.yml
@@ -0,0 +1,41 @@
+# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
+
+name: Python package
+
+on:
+ push:
+ branches: [ "dev" ]
+ pull_request:
+ branches: [ "main" ]
+
+jobs:
+ build:
+
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ python-version: ["3.8", "3.9", "3.10"]
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v3
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ python -m pip install flake8 pytest
+ pip install -r requirements.txt
+ - name: Lint with flake8
+ run: |
+ # stop the build if there are Python syntax errors or undefined names
+ flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
+ # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
+ flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
+ - name: Test with pytest
+ run: |
+ pytest
From b3d5b29bc7da3c41555b2b9f82cdb7cce126ddbc Mon Sep 17 00:00:00 2001
From: Amir Mardan <46511946+AmirMardan@users.noreply.github.com>
Date: Wed, 17 May 2023 00:22:47 -0400
Subject: [PATCH 06/16] add test of ricker
---
test/test_ricker.py | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
create mode 100644 test/test_ricker.py
diff --git a/test/test_ricker.py b/test/test_ricker.py
new file mode 100644
index 0000000..e2698c5
--- /dev/null
+++ b/test/test_ricker.py
@@ -0,0 +1,23 @@
+"""
+To test wavlets
+"""
+import sys
+import numpy as np
+import os
+pyfwi_path = os.path.abspath(os.path.join(__file__, "../../src"))
+sys.path.append(pyfwi_path)
+from PyFWI.acquisition import Source
+
+def ricker(fdom:np.float32, dt:np.float32):
+ src = Source(src_loc=np.array([[0,0]]), dh=1.0, dt=dt)
+ src.Ricker(fdom=fdom)
+ return src.w
+
+def test_ricker():
+ fdom = 20.0
+ dt = 0.004
+ w = ricker(fdom=fdom, dt=dt)
+ t = np.arange(-1.0/fdom, 1.0/fdom + dt/3, dt)
+ assert np.all(w == np.float32((1.0 - 2.0*(np.pi * fdom * t) **2 ) * \
+ np.exp(-(np.pi * fdom * t) ** 2)))
+
\ No newline at end of file
From 23387bf0a5f49daa257e5c93716bce1cba742bcb Mon Sep 17 00:00:00 2001
From: Amir Mardan <46511946+AmirMardan@users.noreply.github.com>
Date: Wed, 14 Jun 2023 12:00:45 -0400
Subject: [PATCH 07/16] add example for tlfwi
---
example/fwi_example_crosswell.ipynb | 2 +-
example/fwi_example_surface.ipynb | 2 +-
example/tlfwi_example_crosswell.ipynb | 515 ++++++++++++++++++++++++++
src/PyFWI/tl_fwi.py | 29 +-
4 files changed, 538 insertions(+), 10 deletions(-)
create mode 100644 example/tlfwi_example_crosswell.ipynb
diff --git a/example/fwi_example_crosswell.ipynb b/example/fwi_example_crosswell.ipynb
index ccba280..3997363 100644
--- a/example/fwi_example_crosswell.ipynb
+++ b/example/fwi_example_crosswell.ipynb
@@ -8,7 +8,7 @@
"Simple FWI Example\n",
"==================\n",
"\n",
- "In this section we see application of PyFWI for performin FWI.\n",
+ "In this section we see application of PyFWI for performing FWI.\n",
"First, forward modeling is shown and then we estimate a model of subsurface using FWI.\n"
]
},
diff --git a/example/fwi_example_surface.ipynb b/example/fwi_example_surface.ipynb
index f9fd9ea..0f6bb03 100644
--- a/example/fwi_example_surface.ipynb
+++ b/example/fwi_example_surface.ipynb
@@ -8,7 +8,7 @@
"Simple FWI Example\n",
"==================\n",
"\n",
- "In this section we see application of PyFWI for performin FWI.\n",
+ "In this section we see application of PyFWI for performing FWI.\n",
"First, forward modeling is shown and then we estimate a model of subsurface using FWI.\n"
]
},
diff --git a/example/tlfwi_example_crosswell.ipynb b/example/tlfwi_example_crosswell.ipynb
new file mode 100644
index 0000000..08da971
--- /dev/null
+++ b/example/tlfwi_example_crosswell.ipynb
@@ -0,0 +1,515 @@
+{
+ "cells": [
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Simple TL-FWI Example\n",
+ "==================\n",
+ "\n",
+ "In this section we see application of PyFWI for performing time-lapse FWI.\n",
+ "First, forward modeling is shown and then we estimate a model of subsurface using FWI.\n"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " **1. Forward modeling**\n",
+ "\n"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this simple example, we use PyFWI to do forward modeling. So, we need to first import the following packages amd modulus."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "import sys\n",
+ "sys.path.append('../src/')\n",
+ "\n",
+ "import PyFWI.wave_propagation as wave\n",
+ "import PyFWI.acquisition as acq\n",
+ "import PyFWI.seiplot as splt\n",
+ "import PyFWI.model_dataset as md\n",
+ "import PyFWI.fwi_tools as tools\n",
+ "import PyFWI.processing as process\n",
+ "from PyFWI.tl_fwi import TimeLapse\n",
+ "import copy \n",
+ "\n"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Baseline and monitor models can be created by using ```model_dataset``` module as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAScAAAD8CAYAAAA11GIZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAbcUlEQVR4nO3de5hdVZnn8e+vKlcIJIRoOlSiiUMAg91cRQQdmaASsR+jto3BHg2aNj1DEBC6W8CZYRxltB07igo4ESJBkYAQm8ikZRChu9EmECAtJOFSkmAq5mLIjSAkVtXbf+wVOcQ6dTmXnJWT3+d59pOz176sVTvZb9Z+91qnFBGYmeWmpdENMDPriYOTmWXJwcnMsuTgZGZZcnAysyw5OJlZlhyczCxLDk5mliUHJzPL0qBGN8AaS9JngDdHxIdKyq4GBPwJ8K/AmcAxwH3AxyNiSyPaagcW95xsIXC2pEMAJLUC5wDfT9s/BnwCGAd0Al9vRCPtwOPgdICLiOeAR4EPpKKpwG8j4sG0/t2IeCIiXgT+O3BOCmBmdeXgZFD0ks5Nnz/CK70mgLUln58DBgNj9lG77ADm4GQAPwDOkDSeogdVGpwmlHx+HfA7YPM+bJsdoOSvTDEASf9I8YJkTESckMruB44E3g2sARYAv4uIjzSomXYAcc/J9vg+8E5e3WsC+C5wI7ABGAZcuG+bZQcq95ysrNRz+l5EXN/ottiBxz0nM8tSXYKTpGmSnpLULumyetRhZvUnaZikhyT9m6QVkj6XyidJWpru8VslDUnlQ9N6e9o+seRcl6fypySd1WfdtX6sS2NgngbeBXQADwPnRsTKmlZkZnUnScDBEbFT0mDgAeAi4BJgUUQslPQt4N8i4jpJ5wN/EhH/RdIM4AMR8WFJU4BbgFOAI4CfAEdFRFe5uuvRczoFaI+IZyNiN8UI5Ol1qMfM6iwKO9Pq4LQExWDd21P5AuD96fP0tE7afmYKcNOBhRGxKyJWA+0UsaKsegSnNl49cK8jlZnZfkhSq6TlwCbgHuCXwLaI6Ey7lN7jv7//0/btwOFUEBcaNvFX0mxgNkBL67CTho94XaOaYrZfOebIQ3jkkUc2R8Rr9pSd1HJw7Cj/hFRWO7tWAC+XFM2LiHml+6RHr+MljQJ+SDEJvO7qEZzW8epRxeNT2aukCzAPYMSoo+O4t8/bexcz68HPfvQOJD1XWraDLq4ePnHA53rvS0+9HBEn92ffiNgm6T7grcAoSYNS76j0Ht9z/3dIGgSMBJ6nn3GhVD0e6x4GJqds/hBgBrC4DvWYWaIW0Tq8dcBLn+eVXpN6TEgaTvGiaxXF1+fs+ZqdmcCd6fPitE7a/tMo3rotBmakt3mTgMnAQ73VXfOeU0R0SroAuBtoBeZHxIpa12NmJQQtg1SPM48DFqS38C3AbRFxl6SVwEJJXwAeA25I+98AfFdSO7CFonNCRKyQdBuwkuKrd+b09qYO6pRzioglwJJ6nNvMeiDQ4NoHp4j4BXBCD+XP0sPbtoh4GfjzMue6Criqv3X7mzDNmoCkevWcGsbByawZtEDr8OaajebgZNYEBKjVPSczy42gxcHJzPIj1OLgZGaZkaB1SHP93gkHJ7NmINxzMrMcyTknM8uP5Ld1ZpYjQcsg55zMLDt+rDOzDMkJcTPLlVo8fcXMciPROtjBycwy48c6M8uWH+vMLD/uOZlZnkTLIPeczCwzRc7JwcnMMuRBmGaWH/n7nMwsQ/LcOjPLlXtOZpYhOSFuZhnyOCczy5NQq3NOZpYZz60zs2w552Rm+fE4JzPLlcc5mVl2nHMys0wJmiznVPFPI2mCpPskrZS0QtJFqXy0pHskPZP+PKx2zTWzciQNeOnHOcvd58dJ+ldJj0v6kaRDS465XFK7pKcknVVSPi2VtUu6rK+6qwm1ncClETEFOBWYI2kKcBlwb0RMBu5N62ZWTxItg1oHvPRDufv8euCyiPhj4IfA3xTN0BRgBnAsMA24VlKrpFbgGuA9wBTg3LRvWRUHp4hYHxGPps8vAKuANmA6sCDttgB4f6V1mFk/ieKxbqBLH3q5z48C/jntdg/wZ+nzdGBhROyKiNVAO3BKWtoj4tmI2A0sTPuWVZOHVEkTgROApcDYiFifNm0AxtaiDjPrnVo04GVA53/1fb6CV4LLnwMT0uc2YG3JYR2prFx5WVUHJ0kjgDuAiyNiR+m2iAggyhw3W9IySct+t3t7tc0wO6AJIbUMeAHG7LkP0zK7x/P/4X3+CeB8SY8AhwC7a/0zVfW2TtJgigbfHBGLUvFGSeMiYr2kccCmno6NiHnAPIARo47uMYCZWT8JVNk4p80RcXKvp+7hPo+IJ4F3p+1HAe9Nu6/jlV4UwPhURi/lParmbZ2AG4BVETG3ZNNiYGb6PBO4s9I6zKz/6vFYV+4+l/Ta9GcL8N+Ab6VNi4EZkoZKmgRMBh4CHgYmS5okaQhF0nxxb3VX03M6Hfgo8Lik5ansCuBLwG2SZgHPAedUUYeZ9UcxCrMeZy53n0+WNCetLwK+AxARKyTdBqykeNM3JyK6iibqAuBuoBWYHxErequ44uAUEQ9QvCPoyZmVntfMKlOPEeJ93OdXlznmKuCqHsqXAEv6W7dHiJs1Acnf52RmuWqy6SsOTmZNwhN/zSw/9UuIN4yDk1mTcM7JzPIjwI91ZpYf/946M8tVP76faX/i4GTWDCRwzsnMcuTHOjPLj/BQAjPLkfy2zszyI3mck5llySPEzSxXHkpgZlny2zozy47HOZlZtpxzMrMsOedkZtmRnHMys0y1OOdkZrlxz8nMsuWck5llyW/rzCw7HudkZjkKIPxYZ2b58cRfM8uVg5OZZUciPM7JzLLknJOZZcmDMM0sP2q6t3VVh1pJrZIek3RXWp8kaamkdkm3ShpSfTPNrFeCaBk04KXP00oTJN0naaWkFZIuSuXHS3pQ0nJJyySdksol6evp/v+FpBNLzjVT0jNpmdlX3bXoB14ErCpZ/zvgqxFxJLAVmFWDOsysV0q/5WCAS986gUsjYgpwKjBH0hTgy8DnIuJ44H+kdYD3AJPTMhu4DkDSaOBK4C3AKcCVkg7rreKqgpOk8cB7gevTuoCpwO1plwXA+6upw8z6J9Qy4KXPc0asj4hH0+cXKDoibRTjPg9Nu40Efp0+TwduisKDwChJ44CzgHsiYktEbAXuAab1Vne1OaevAX8LHJLWDwe2RURnWu9IP4iZ1Vudc06SJgInAEuBi4G7JX2FopNzWtqtDVhbctieGFCuvKyKg5OkPwU2RcQjks6o4PjZFN0+hgwfW2kzrAKSaDvq9Yw8fETV59r+/E7WPf0cEVGDllmlovJxTmMkLStZnxcR8/beSdII4A7g4ojYIekLwKcj4g5J5wA3AO+spAHlVNNzOh14n6SzgWEUXbyrKbpxg1LvaTywrqeD0wWYBzBi1NH+l70PDT14ON88bz1dN11T9bkGnXc+M754MC/t2FmDlllVKhshvjkiTu71tNJgisB0c0QsSsUzKfLNAD8gpXYo7vcJJYfviQHrgDP2Kr+/t3orDk4RcTlweWr8GcBfR8RfSPoB8CFgYfoB7qy0DqstSYyd1MZr20YzYtV87p37UNXnPPPEP2bycZ9k07otbFy9zj2oBgpq/1iX8sg3AKsiYm7Jpl8D76AIMFOBZ1L5YuACSQspkt/bI2K9pLuB/12SBH83KX6UU49xTp8BFqZu32MUP5hl4OBRhzLvLzcQd3yRJ76xoibnfOLaH/L5qU+jWefxka8cys6t22tyXhso9SvBXYHTgY8Cj0tansquAD4JXC1pEPAyKUUDLAHOBtqB3wIfB4iILZI+Dzyc9vtfEbGlt4prEpwi4n5SFy0inqV4VWgN1tLayugjXsOwg4YBMPLwEQx/7Fp++oV/qVkdG3++hY0//xemvn48r3/jp9j+fPEf4+6Xd7O5YyPdXV01q8t6Ieoyty4iHijO3qOTetg/gDllzjUfmN/fuj1CvImNPuI1LPjLtbQ+8GMAujs7WTW/+ke5nqxa8P/5P+/bRsvrin9Scdq7mHnjG9j03K/7ONJqIerXc2oYB6cmNuygYbQ+8GP+6ZIf1b2u9Q88z/oH/vH362//cidDD7qk7vVaiSabvuLgZNYk3HOy7Eni4FGHMvLwEXR3dvZ9QB1EZxejDh/B1sNG8uK2HX6LV3eiW831fU7NFWoNgLGT2vj+37zI19qupX1xfXJMfXnmrmXM/aNv8v2/3skf/YfxDWnDAUXUa25dw7jn1EQkMfTg4by2bTRxxxdr+lZuoIq3eDfzlivW8Nq2uWzd8Dy7XnzJPai6EdFkfY3m+mkOcG1HvZ6Fn+1i7qT5rP5pbcYxVWvN/av4+9d9m1s/28n4YyY2ujlNa89vXxnokjP3nJrIyMNH0HXTNTUZ+V0rRQ/qek769HJGjfnGq2Z+Wm01W87JwcmsKXick5llKvfHtIFycDJrAkF9Jv42koOTWTNQ841zcnAyaxLOOZlZlvxYZ2bZ8bcSmFm2uh2czCxHEX6sM7PsNN/cOgcnsybgcU5mlq1u95zMLD9yz8nM8uSEuJllxzknM8tWs+WcmuunOcBtf34ngz52Pmd+bxZjTxvd6OYAMPa00Zz5vVkM+dj5bHt+Z6Ob08RExMCXnDk4NZF1Tz/HjC8O4ZJffZJJU49tdHMAmHjGG7m0YzYf/tIwOp5c0+jmNK0AutGAl5w5ODWRiOClHTvZtG4L+uB5TP32uYx72+ENacvY00Yz9dvn0vpn57Fp3RZe2rHTv9ygziK9sRvIkjMHpya0cfU6PvKVEVy84VMc+b5TGtKGI88+kUs2XchHvjqSDb/saEgbDigB3dEy4CVnTog3oYhg59btbH/+MFpe15i/4pYhg9m2YScvPL+tIfUfePLPIQ2Ug5NZE/BQAtuv7H55N3Hau3j7l4tfSR6dXTxz1zI2/nxLzesae9pojjz7RFqGDAag5W3vZtdNu2pej5XnnpPtNzZ3bGTmjW9g6EGXADDq8BHMnfVNNv785prXdezHz+KSTReybUMxXGDXTbvY3LGx5vVYeV0OTq+QNAq4HngTRc/yE8BTwK3ARGANcE5EbK2mHqtMd1cXm5779e/Xtx42kpfeM5W3XLGGNfevqkkPauxpo5l4xht5+cSprPnqWueYGqReb98kTQBuAsZS3OPzIuJqSbcCR6fdRgHbIuL4dMzlwCygC7gwIu5O5dOAq4FW4PqI+FJvdVebrr8a+HFEHAMcB6wCLgPujYjJwL1p3TLw4rYd/NV3juDKQ+fypgs+WJNzvun8D3DloXOZfeN4dm7ZXpNzWmXqNAizE7g0IqYApwJzJE2JiA9HxPEpIN0BLAKQNAWYARwLTAOuldQqqRW4BngPMAU4N+1bVsU9J0kjgf8InAcQEbuB3ZKmA2ek3RYA9wOfqbQeq52IYH37WrZueJ4Xp72Nkz69vOpz/vbY03n6R7/kpR0e/d1o9eg5RcR6YH36/IKkVUAbsBJAkoBzgKnpkOnAwojYBayW1A7sGc/SHhHPpuMWpn1Xlqu7mse6ScBvgO9IOg54BLgIGJt+IIANFN1By8iuF1/igpsmMmrMN6o+17bv7uTlF9ZU3yirSkT9c06SJgInAEtLit8ObIyIZ9J6G/BgyfaOVAawdq/yt/RWXzXBaRBwIvCpiFgq6Wr2eoSLiJDU47BgSbOB2QBDhjt+7UsRwdpVq1/1L8X2fxW+rRsjaVnJ+ryImLf3TpJGUDy+XRwRO0o2nQvcUknFfakmOHUAHRGxJ4reThGcNkoaFxHrJY0DNvV0cLoA8wBGjDra8xrMqlTh7KDNEXFybztIGkwRmG6OiEUl5YOADwInley+DphQsj4+ldFLeY8qTohHxAZgraQ9GfszKZ4fFwMzU9lM4M5K6zCz/hr4pN/+TPxNOaUbgFURMXevze8EnoyI0vlJi4EZkoZKmgRMBh4CHgYmS5okaQhF0nxxb3VXO87pU8DNqbJngY9TBLzbJM0CnqNIlplZHQXQ3V2XnNPpwEeBxyUtT2VXRMQSigDzqke6iFgh6TaKjkonMCciugAkXQDcTTGUYH5ErOit4qqCU0QsB3rqEp5ZzXnNbODq9LbuAej5xBFxXpnyq4CreihfAizpb90eIW7WDAK6myxz6+Bk1gQCz60zs0x5bp2ZZanZvmjUwcmsCYS/bM7MsuSEuJnlqts9JzPLTeCek5llyglxM8uSg5OZZScCuuozt65hHJzMmoR7TmaWJSfEzSw7nltnZnkK6OpudCNqy8HJrAkUPadGt6K2HJzMmoSDk5llyQlxM8tOBHR1NboVteXgZNYk/FhnZllycDKz7IS/z8nMctXdZNHJwcmsSXR7EKaZ5SbCOSczy1STPdU5OJk1i+6u5opODk5mTcBv68wsW845mVmWPJTAzLIT4aEEZpaloLvJnutaqjlY0qclrZD0hKRbJA2TNEnSUkntkm6VNKRWjTWz8qJ74EtfJE2QdJ+klelev6hk26ckPZnKv1xSfnm6/5+SdFZJ+bRU1i7psr7qrrjnJKkNuBCYEhEvSboNmAGcDXw1IhZK+hYwC7iu0nrMrG/FN2HWpefUCVwaEY9KOgR4RNI9wFhgOnBcROyS9FoASVMo4sCxwBHATyQdlc51DfAuoAN4WNLiiFhZruKqek4UwW24pEHAQcB6YCpwe9q+AHh/lXWYWV8CurpiwEufp41YHxGPps8vAKuANuC/Al+KiF1p26Z0yHRgYUTsiojVQDtwSlraI+LZiNgNLEz7llVxcIqIdcBXgF9RBKXtwCPAtojoTLt1pB/EzOooKMY5DXQZCEkTgROApcBRwNtTCuefJL057dYGrC05bE8MKFdeVjWPdYdRRL5JwDbgB8C0ARw/G5gNMGT42EqbYWYAAVHZUIIxkpaVrM+LiHl77yRpBHAHcHFE7EhPS6OBU4E3A7dJekMlDSinmrd17wRWR8RvACQtAk4HRkkalHpP44F1PR2cLsA8gBGjjm6u1wxmDVBhymlzRJzc2w6SBlMEppsjYlEq7gAWRZHoekhSNzCG4n6fUHJ4aQwoV96janJOvwJOlXSQJAFnAiuB+4APpX1mAndWUYeZ9UNE0NXVPeClL+nevgFYFRFzSzb9A/Cf0j5HAUOAzcBiYIakoZImAZOBh4CHgcnpbf4QiqT54t7qrrjnFBFLJd0OPEqR0X+Moif0/4CFkr6Qym6otA4z67/+DA2owOnAR4HHJS1PZVcA84H5kp4AdgMzUy9qRXpzv5IiLsyJiC4ASRcAdwOtwPyIWNFbxVUNwoyIK4Er9yp+liIzb2b7UD0GYUbEA0C533P+n8sccxVwVQ/lS4Al/a3bI8TNmkSdxjk1jIOTWROINM6pmTg4mTWJCocSZMvByawJRDTfxF8HJ7Mm4Z6TmeXHOSczy1HgnpOZZSk8lMDMMhT+DnEzy1AA3f2YK7c/cXAyawaVf2VKthyczJqCxzmZWabcczKz7BRz65xzMrMMuedkZhnyOCczy1AERJP9PnIHJ7Mm4ZyTmeUnwjknM8uPJ/6aWba66/TrVxrFwcmsCUQE3Z0OTmaWIQ8lMLP8BHR7KIGZ5cgJcTPLTkTQ3dXV6GbUlIOTWZNwz8nMMhQeSmBm+Ql/E6aZZSmgu9M5JzPLThB+rDOz3ATN96uhWvraQdJ8SZskPVFSNlrSPZKeSX8elsol6euS2iX9QtKJ9Wy8mSXp+5wGuvRF0gRJ90laKWmFpItS+f+UtE7S8rScXXLM5SkGPCXprJLyaamsXdJlfdXdZ3ACbgSm7VV2GXBvREwG7k3rAO8BJqdlNnBdP85vZlUrxjkNdOmHTuDSiJgCnArMkTQlbftqRByfliUAadsM4FiKuHGtpFZJrcA1FDFiCnBuyXl61Gdwioh/BrbsVTwdWJA+LwDeX1J+UxQeBEZJGtdXHWZWpfS2bqBLn6eNWB8Rj6bPLwCrgLZeDpkOLIyIXRGxGmgHTklLe0Q8GxG7gYVp37IqzTmNjYj16fMGYGz63AasLdmvI5WtpxfHHHkIP/vROypsipkFUfev6ZU0ETgBWAqcDlwg6WPAMore1VaK+/3BksP2xAD4w9jwlt7qqzohHhEhacCZOEmzKR79AHaV5rQyNQbY3OhG9MFtrI39oY1Hl668uP3pu3921xljKjjPMEnLStbnRcS8vXeSNAK4A7g4InZIug74PEUu/vPA3wOfqKD+sioNThsljYuI9emxbVMqXwdMKNlvfCr7A+kCzAOQtCwiTq6wLfuE21gbbmNt7BVQiIi988K1rGswRWC6OSIWpfo2lmz/NnBXWu0tBvQrNuzRn4R4TxYDM9PnmcCdJeUfS2/tTgW2lzz+mdl+RpKAG4BVETG3pLw0l/wBYM+Tz2JghqShkiZRvBx7CHgYmCxpkqQhFEnzxb3V3WfPSdItwBnAGEkdwJXAl4DbJM0CngPOSbsvAc6mSIL9Fvh4X+c3s6ydDnwUeFzS8lR2BcXbtuMpHuvWAH8FEBErJN0GrKR40zcnIroAJF0A3A20AvMjYkVvFSuHb8+TNLun59ycuI214TbWxv7QxmplEZzMzPZWac7JzKyuGh6cBjqkfR+0p9xw/R6n7DS4ra2SHpN0V1qfJGlpupa3psRjI9s3StLtkp6UtErSW3O7jpI+nf6en5B0i6RhOVxHedpYY4NTJUPa94Fyw/XLTdlppIsoRuzu8XcUUwqOBLYCsxrSqldcDfw4Io4BjqNoazbXUVIbcCFwckS8iSJRO4M8ruONHOjTxiKiYQvwVuDukvXLgcsb2aYe2ngn8C7gKWBcKhsHPNXgdo2n+Ac6lWKMiSgGDg7q6do2oH0jgdWkvGZJeTbXkVdmNIymeHN9F3BWLtcRmAg80de1A/4vcG5P++3PS6Mf68pNd8nCXsP1y03ZaZSvAX8L7JmzcDiwLSI603qjr+Uk4DfAd9Kj5/WSDiaj6xgR64CvAL+imGK1HXiEvK5jqYFOG9uvNTo4ZWvv4fql26L476lhrzkl/SmwKSIeaVQb+mEQcCJwXUScALzIXo9wGVzHwygmn04CjgAO5g8fpbLU6Gu3LzQ6OPV7usu+1NNwfdKUnbS9dMpOI5wOvE/SGorZ3VMp8jujJO0ZWNvoa9kBdETE0rR+O0Wwyuk6vhNYHRG/iYjfAYsorm1O17FUuWuX5X1UrUYHpwEPaa+3csP1KT9lZ5+LiMsjYnxETKS4Zj+NiL8A7gM+lHZrdBs3AGsl7ZmgeibFqOFsriPF49ypkg5Kf+972pjNddzLgTVtrNFJL4rpLk8DvwQ+m0F73kbRXf4FsDwtZ1PkdO4FngF+AoxudFtTe88A7kqf30Axj6kd+AEwtMFtO57i6zR+AfwDcFhu1xH4HPAkxdyw7wJDc7iOwC0UebDfUfRCZ5W7dhQvQ65J99DjFG8fG/5vs9rFI8TNLEuNfqwzM+uRg5OZZcnBycyy5OBkZllycDKzLDk4mVmWHJzMLEsOTmaWpX8Haha39W8CopEAAAAASUVORK5CYII=",
+ "text/plain": [
+ "