crimeacs commited on
Commit
f5471b4
1 Parent(s): bfda450

Now any sampling rate is suppoted

Browse files
Files changed (2) hide show
  1. Gradio_app.ipynb +144 -18
  2. app.py +52 -7
Gradio_app.ipynb CHANGED
@@ -2,14 +2,14 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 16,
6
  "metadata": {},
7
  "outputs": [
8
  {
9
  "name": "stdout",
10
  "output_type": "stream",
11
  "text": [
12
- "Running on local URL: http://127.0.0.1:7869\n",
13
  "\n",
14
  "To create a public link, set `share=True` in `launch()`.\n"
15
  ]
@@ -17,7 +17,7 @@
17
  {
18
  "data": {
19
  "text/html": [
20
- "<div><iframe src=\"http://127.0.0.1:7869/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
21
  ],
22
  "text/plain": [
23
  "<IPython.core.display.HTML object>"
@@ -30,7 +30,7 @@
30
  "data": {
31
  "text/plain": []
32
  },
33
- "execution_count": 16,
34
  "metadata": {},
35
  "output_type": "execute_result"
36
  },
@@ -38,8 +38,16 @@
38
  "name": "stdout",
39
  "output_type": "stream",
40
  "text": [
41
- "4\n",
42
- "0.02744414610788226\n"
 
 
 
 
 
 
 
 
43
  ]
44
  }
45
  ],
@@ -54,6 +62,7 @@
54
  "import io\n",
55
  "\n",
56
  "from scipy.stats import gaussian_kde\n",
 
57
  "from bmi_topography import Topography\n",
58
  "import earthpy.spatial as es\n",
59
  "\n",
@@ -72,10 +81,38 @@
72
  "\n",
73
  "from glob import glob\n",
74
  "\n",
75
- "def make_prediction(waveform):\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  " waveform = np.load(waveform)\n",
 
 
77
  " if len(waveform.shape) == 1:\n",
78
  " waveform = waveform.reshape(1, waveform.shape[0])\n",
 
 
 
 
79
  "\n",
80
  " orig_waveform = waveform[:, :6000].copy()\n",
81
  " processed_input = prepare_waveform(waveform)\n",
@@ -90,12 +127,12 @@
90
  " return processed_input, p_phase, s_phase, orig_waveform\n",
91
  "\n",
92
  "\n",
93
- "def mark_phases(waveform, uploaded_file, p_thres, s_thres):\n",
94
  "\n",
95
  " if uploaded_file is not None:\n",
96
  " waveform = uploaded_file.name\n",
97
  "\n",
98
- " processed_input, p_phase, s_phase, orig_waveform = make_prediction(waveform)\n",
99
  "\n",
100
  " # Create a plot of the waveform with the phases marked\n",
101
  " if sum(processed_input[0][2] == 0): #if input is 1C\n",
@@ -709,13 +746,24 @@
709
  " info=\"Acceptable uncertainty for S picks expressed in std() seconds\",\n",
710
  " interactive=True,\n",
711
  " )\n",
712
- "\n",
713
- " upload = gr.File(label=\"Or upload your own waveform\")\n",
 
 
 
 
 
 
 
 
714
  "\n",
715
  " button = gr.Button(\"Predict phases\")\n",
716
  " outputs = gr.Image(label='Waveform with Phases Marked', type='numpy', interactive=False)\n",
717
  " \n",
718
- " button.click(mark_phases, inputs=[inputs, upload, P_thres_inputs, S_thres_inputs], outputs=outputs)\n",
 
 
 
719
  "\n",
720
  " \n",
721
  "\n",
@@ -725,11 +773,60 @@
725
  },
726
  {
727
  "cell_type": "code",
728
- "execution_count": 33,
729
  "metadata": {},
730
- "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
731
  "source": [
732
- "output_csv.value"
 
 
 
 
733
  ]
734
  },
735
  {
@@ -795,10 +892,39 @@
795
  },
796
  {
797
  "cell_type": "code",
798
- "execution_count": null,
799
  "metadata": {},
800
- "outputs": [],
801
- "source": []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
802
  }
803
  ],
804
  "metadata": {
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 30,
6
  "metadata": {},
7
  "outputs": [
8
  {
9
  "name": "stdout",
10
  "output_type": "stream",
11
  "text": [
12
+ "Running on local URL: http://127.0.0.1:7876\n",
13
  "\n",
14
  "To create a public link, set `share=True` in `launch()`.\n"
15
  ]
 
17
  {
18
  "data": {
19
  "text/html": [
20
+ "<div><iframe src=\"http://127.0.0.1:7876/\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
21
  ],
22
  "text/plain": [
23
  "<IPython.core.display.HTML object>"
 
30
  "data": {
31
  "text/plain": []
32
  },
33
+ "execution_count": 30,
34
  "metadata": {},
35
  "output_type": "execute_result"
36
  },
 
38
  "name": "stdout",
39
  "output_type": "stream",
40
  "text": [
41
+ "Loaded (6000,)\n",
42
+ "Reshaped (1, 6000)\n",
43
+ "Resampled (1, 3000)\n"
44
+ ]
45
+ },
46
+ {
47
+ "name": "stderr",
48
+ "output_type": "stream",
49
+ "text": [
50
+ "No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
51
  ]
52
  }
53
  ],
 
62
  "import io\n",
63
  "\n",
64
  "from scipy.stats import gaussian_kde\n",
65
+ "from scipy.signal import resample\n",
66
  "from bmi_topography import Topography\n",
67
  "import earthpy.spatial as es\n",
68
  "\n",
 
81
  "\n",
82
  "from glob import glob\n",
83
  "\n",
84
+ "\n",
85
+ "def resample_waveform(waveform, original_freq, target_freq):\n",
86
+ " \"\"\"\n",
87
+ " Resample a waveform from original frequency to target frequency using SciPy's resample function.\n",
88
+ " \n",
89
+ " Args:\n",
90
+ " waveform (numpy.ndarray): The input waveform as a 1D array.\n",
91
+ " original_freq (float): The original sampling frequency of the waveform.\n",
92
+ " target_freq (float): The target sampling frequency of the waveform.\n",
93
+ " \n",
94
+ " Returns:\n",
95
+ " resampled_waveform (numpy.ndarray): The resampled waveform as a 1D array.\n",
96
+ " \"\"\"\n",
97
+ " # Calculate the resampling ratio\n",
98
+ " resampling_ratio = target_freq / original_freq\n",
99
+ " # Calculate the new length of the resampled waveform\n",
100
+ " resampled_length = int(waveform.shape[-1] * resampling_ratio)\n",
101
+ " # Resample the waveform using SciPy's resample function\n",
102
+ " resampled_waveform = resample(waveform, resampled_length, axis=-1)\n",
103
+ " \n",
104
+ " return resampled_waveform\n",
105
+ "\n",
106
+ "def make_prediction(waveform, sampling_rate):\n",
107
  " waveform = np.load(waveform)\n",
108
+ " print('Loaded', waveform.shape)\n",
109
+ "\n",
110
  " if len(waveform.shape) == 1:\n",
111
  " waveform = waveform.reshape(1, waveform.shape[0])\n",
112
+ " print('Reshaped', waveform.shape)\n",
113
+ " if sampling_rate != 100:\n",
114
+ " waveform = resample_waveform(waveform, sampling_rate, 100)\n",
115
+ " print('Resampled', waveform.shape)\n",
116
  "\n",
117
  " orig_waveform = waveform[:, :6000].copy()\n",
118
  " processed_input = prepare_waveform(waveform)\n",
 
127
  " return processed_input, p_phase, s_phase, orig_waveform\n",
128
  "\n",
129
  "\n",
130
+ "def mark_phases(waveform, uploaded_file, p_thres, s_thres, sampling_rate):\n",
131
  "\n",
132
  " if uploaded_file is not None:\n",
133
  " waveform = uploaded_file.name\n",
134
  "\n",
135
+ " processed_input, p_phase, s_phase, orig_waveform = make_prediction(waveform, sampling_rate)\n",
136
  "\n",
137
  " # Create a plot of the waveform with the phases marked\n",
138
  " if sum(processed_input[0][2] == 0): #if input is 1C\n",
 
746
  " info=\"Acceptable uncertainty for S picks expressed in std() seconds\",\n",
747
  " interactive=True,\n",
748
  " )\n",
749
+ " with gr.Column(scale=1):\n",
750
+ " upload = gr.File(label=\"Or upload your own waveform\")\n",
751
+ " sampling_rate_inputs = gr.Slider(minimum=10,\n",
752
+ " maximum=1000,\n",
753
+ " value=100,\n",
754
+ " label=\"Samlping rate, Hz\",\n",
755
+ " step=10,\n",
756
+ " info=\"Sampling rate of the waveform\",\n",
757
+ " interactive=True,\n",
758
+ " )\n",
759
  "\n",
760
  " button = gr.Button(\"Predict phases\")\n",
761
  " outputs = gr.Image(label='Waveform with Phases Marked', type='numpy', interactive=False)\n",
762
  " \n",
763
+ " button.click(mark_phases, inputs=[inputs, upload, \n",
764
+ " P_thres_inputs, S_thres_inputs,\n",
765
+ " sampling_rate_inputs], \n",
766
+ " outputs=outputs)\n",
767
  "\n",
768
  " \n",
769
  "\n",
 
773
  },
774
  {
775
  "cell_type": "code",
776
+ "execution_count": 24,
777
  "metadata": {},
778
+ "outputs": [
779
+ {
780
+ "data": {
781
+ "text/plain": [
782
+ "[<matplotlib.lines.Line2D at 0x14eb2da90>]"
783
+ ]
784
+ },
785
+ "execution_count": 24,
786
+ "metadata": {},
787
+ "output_type": "execute_result"
788
+ },
789
+ {
790
+ "data": {
791
+ "image/png": "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lMjYDJmIsI8IkXawRoTI2AyZiPC4R6QdvC4gMjZjJiLMRIg0gzUiRMZm0ESEiLSDiQiRkRk0EWFlMJFW8NdIZGwGTUSISCucPAwRGRqPAESkqiNIVzsEIlIRExEiIiJSDRMRIiIiUg0TESIiIlINExEiIiJSDRMRIiIiUg0TESIiIlKNIRMRjuNIRESkDYZMRIiIiEgbmIgQERGRapiIEBERkWqYiBAREZFqmIgQERGRapiIEBERkWqYiBAREZFqmIgQERGRapiIEBERkWqYiBAREZFqmIgQERGRapiIEBERkWqMmYjwqXdERESaYMxEhIiIiDSBiQgRERGphokIERERqYaJCBEREamGiQgRERGphokIERERqcaYiYgkqR0BERERwaiJiOBAIkRERFpgzESEiIiINIGJCBEREanGmIkI+4gQERFpgjETEfYRISIi0gRjJiJ86h0REZEmGDQRISIiIi1gIkJERESqMWgiwqYZIiIiLYhZIvLMM89AkiRMnDgxVkUSERGRxsUkEfnjjz/w1ltv4fTTT49FcURERKQTiicilZWVGDNmDN555x1kZmYqXRwRERHpiOKJyPjx4zFq1CgMHz486Lw2mw3l5eVeL2WwjwgREREAxJvV7S5qUXLlc+bMwZo1a/DHH3+ENH9+fj6eeOIJJUMiIiKiOmb88wxVy1csDSooKMDdd9+NTz75BAkJCSEtM3nyZJSVlXleBQUFSoVHREREANpmJatavmI1IqtXr0ZJSQn69u3rmeZ0OrF06VK89tprsNlsMJvNXstYrVZYrValQiIiIqJ61H78mmKJyLBhw7BhwwavaTfffDO6dOmCBx98sEESElPsIkJERKQJiiUiqamp6NGjh9e05ORkZGVlNZhORERE6pCgbpWIQUdWJSIiIi1Q9K6Z+hYvXhzL4oiIiCgItfuIGLNGRLCTCBERkRYYMxEhIiIiTWAiQkREZGAqt8wwESEiIiL1GDQRYR8RIiIiAKpXiRg0ESEiIiItYCJCRERkYBzQTBVsmiEiItICgyYiREREBHBAMyIiIjIwJiJEREQGxnFE1MAh3omIiDTBmIkIERERAQAklTuJMBEhIiIi1TARISIiMjD2EVED+4gQERFpgjETESIiIgLAcUSIiIjIwJiIEBERGRifNaMCic+aISIicmPTDBEREaklPTFO1fKZiBAR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F2w2G/dVHcOGDcOGDRuwbt06z6t///4YM2aM5/+5r/yrrKzErl270Lx5c36v6hk8eHCDIQa2b9+ONm3aANDJ8T3q7q46M2fOHGG1WsWMGTPE5s2bxa233ioyMjK8elc3RhUVFWLt2rVi7dq1AoB48cUXxdq1a8Vff/0lhHDf3pWRkSG++uorsX79enHZZZf5vL2rT58+YsWKFeLXX38VnTp18rq9q7S0VOTm5oobbrhBbNy4UcyZM0ckJSXp6vbdO+64Q6Snp4vFixd73Tp4/Phxzzy33367aN26tfj555/FqlWrxKBBg8SgQYM879feOnjBBReIdevWifnz54umTZv6vHXw/vvvF1u2bBGvv/66Lm8dnDRpkliyZInYs2ePWL9+vZg0aZKQJEn8+OOPQgjuq0Dq3jUjBPdVXffdd59YvHix2LNnj/jtt9/E8OHDRXZ2tigpKRFCcF/VtXLlSmGxWMTTTz8tduzYIT755BORlJQkPv74Y888Wj++Gy4REUKIV199VbRu3VrEx8eLAQMGiOXLl6sdkuJ++eUXAaDBa+zYsUII9y1eU6ZMEbm5ucJqtYphw4aJbdu2ea3jyJEj4tprrxUpKSkiLS1N3HzzzaKiosJrnj///FOcffbZwmq1ipYtW4pnnnkmVpsoC1/7CID44IMPPPNUV1eLO++8U2RmZoqkpCRx+eWXi4MHD3qtZ+/evWLkyJEiMTFRZGdni/vuu0/Y7XaveX755RfRu3dvER8fL9q3b+9Vhl7885//FG3atBHx8fGiadOmYtiwYZ4kRAjuq0DqJyLcV6dcffXVonnz5iI+Pl60bNlSXH311V7jYnBfefvmm29Ejx49hNVqFV26dBFvv/221/taP75LQggRXZ0KERERUWQM1UeEiIiItIWJCBEREamGiQgRERGphokIERERqYaJCBEREamGiQgRERGphokIERERqYaJCBEREamGiQgRERGphokIERERqYaJCBEREamGiQgRERGp5v8Bjf6vxL9TJoUAAAAASUVORK5CYII=",
792
+ "text/plain": [
793
+ "<Figure size 640x480 with 1 Axes>"
794
+ ]
795
+ },
796
+ "metadata": {},
797
+ "output_type": "display_data"
798
+ },
799
+ {
800
+ "name": "stderr",
801
+ "output_type": "stream",
802
+ "text": [
803
+ "Traceback (most recent call last):\n",
804
+ " File \"/usr/local/lib/python3.9/site-packages/gradio/routes.py\", line 393, in run_predict\n",
805
+ " output = await app.get_blocks().process_api(\n",
806
+ " File \"/usr/local/lib/python3.9/site-packages/gradio/blocks.py\", line 1108, in process_api\n",
807
+ " result = await self.call_function(\n",
808
+ " File \"/usr/local/lib/python3.9/site-packages/gradio/blocks.py\", line 915, in call_function\n",
809
+ " prediction = await anyio.to_thread.run_sync(\n",
810
+ " File \"/usr/local/lib/python3.9/site-packages/anyio/to_thread.py\", line 31, in run_sync\n",
811
+ " return await get_asynclib().run_sync_in_worker_thread(\n",
812
+ " File \"/usr/local/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 937, in run_sync_in_worker_thread\n",
813
+ " return await future\n",
814
+ " File \"/usr/local/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 867, in run\n",
815
+ " result = context.run(func, *args)\n",
816
+ " File \"/var/folders/ky/4j6xbvhs5m583jflkhyzxf9h0000gn/T/ipykernel_9385/3876498698.py\", line 76, in mark_phases\n",
817
+ " waveform = resample_waveform(waveform, sampling_rate, 100)\n",
818
+ " File \"/var/folders/ky/4j6xbvhs5m583jflkhyzxf9h0000gn/T/ipykernel_9385/3876498698.py\", line 46, in resample_waveform\n",
819
+ " resampled_length = int(waveform.shape[-1] * resampling_ratio)\n",
820
+ "AttributeError: 'str' object has no attribute 'shape'\n"
821
+ ]
822
+ }
823
+ ],
824
  "source": [
825
+ "a = np.load(\"test.npy\") \n",
826
+ "plt.plot(a)\n",
827
+ "\n",
828
+ "b = resample_waveform(a, 200, 100)\n",
829
+ "plt.plot(b)"
830
  ]
831
  },
832
  {
 
892
  },
893
  {
894
  "cell_type": "code",
895
+ "execution_count": 20,
896
  "metadata": {},
897
+ "outputs": [
898
+ {
899
+ "name": "stderr",
900
+ "output_type": "stream",
901
+ "text": [
902
+ "\n",
903
+ "KeyboardInterrupt\n",
904
+ "\n"
905
+ ]
906
+ },
907
+ {
908
+ "data": {
909
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGdCAYAAAAfTAk2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABhtUlEQVR4nO3deXxTdbo/8E+WJum+r1AoZStlp0gtIKB0KMqIOG44OCiD8BtHvCJeF2ZGmHEZ3MY7V+XKiOKO28ygiE4Ryw6FYmtZW6BQaKFN9yZdkyY5vz/SE6i00EKTk5x83q9XXrxIT5InoZw857s8j0IQBAFEREREMqKUOgAiIiKi3sYEh4iIiGSHCQ4RERHJDhMcIiIikh0mOERERCQ7THCIiIhIdpjgEBERkewwwSEiIiLZUUsdgBRsNhvKysoQGBgIhUIhdThERETUDYIgoKGhAXFxcVAqLz9G45UJTllZGeLj46UOg4iIiK5CaWkp+vbte9ljvDLBCQwMBGD/gIKCgiSOhoiIiLrDaDQiPj7e8T1+OV6Z4IjTUkFBQUxwiIiIPEx3lpdwkTERERHJDhMcIiIikh0mOERERCQ7THCIiIhIdpjgEBERkewwwSEiIiLZYYJDREREssMEh4iIiGSHCQ4RERHJjlMTnJ07d+LWW29FXFwcFAoFvvrqqys+Zvv27Rg3bhy0Wi0GDRqE999//5JjVq9ejYSEBOh0OqSmpiInJ6f3gyciIiKP5dQEp6mpCaNHj8bq1au7dXxxcTFmzZqFG2+8Efn5+Vi6dCkefPBBbN682XHM559/jmXLlmHlypXIy8vD6NGjkZGRgcrKSme9DSIiIvIwCkEQBJe8kEKBDRs2YM6cOV0e89RTT+Hbb7/FkSNHHPfNnTsX9fX1yMzMBACkpqbiuuuuw5tvvgkAsNlsiI+PxyOPPIKnn366W7EYjUYEBwfDYDCwFxUREZGH6Mn3t1s128zOzkZ6enqH+zIyMrB06VIAgNlsRm5uLpYvX+74uVKpRHp6OrKzs7t8XpPJBJPJ5Pi70Wjs3cCpUxarDQXlDTh0vh56QytMFht0aiX6hPpiWGwQhscFQ6W8csM0IqLLEQQB5+pakFdSh3N1LahvNkOjViLMX4uh0YEY0y8EAVq3+rojF3Crf3G9Xo/o6OgO90VHR8NoNKKlpQV1dXWwWq2dHlNYWNjl865atQp/+ctfnBIzXerIeQPW55Tgm4NlaGi1dHlcuL8GN4+MwQMTEzAoKtCFERKRHNQ0mvBpTgn+nXcep6ubujxOo1Ji8uAI3Hd9P0wbEgUlL6y8glslOM6yfPlyLFu2zPF3o9GI+Ph4CSOSp6LKRryyuRCbj1Y47gvUqTGuXyj6hvrCX6tGs9mCszXNyC+pR02TGR/vK8HH+0owa1Qslt+chL6hfhK+AyLyBE0mC/5vexHe23MGzWYrAMBHpcDwuGAMjgpAqL8GZosNekMrjpQZcK6uBVsLK7G1sBJDowPxzC+TMXlwhMTvgpzNrRKcmJgYVFRUdLivoqICQUFB8PX1hUqlgkql6vSYmJiYLp9Xq9VCq9U6JWYCrDYBa3edxmvfn4DZaoNSAcwaFYd7r4tHamJ4p9NQbVYbsk/V4KN9Z/FDQQW+PVSOH45V4I+zhuE31/eHQsErLCK61N6iajz5r0M4V9cCABjZJxjz0/rj5pGxnU5DCYKAospGfPFjKT7LKcXxigbc9+5+zB4dh+dvH4EgnY+r3wK5iFslOGlpafjuu+863LdlyxakpaUBADQaDVJSUpCVleVYrGyz2ZCVlYUlS5a4OlwCUN9sxsPr87CnqAYAMHVIJP40axgGR19+yslHpcSUIZGYMiQSR8sMeG7TMew7XYsVXx/FzhNV+J97xiCQJx4iaicIAt7YWoTXtpwAAPQJ8cUzv0xGxvDoy14QKRQKDI4OxB9nJWPJjYPxPz+cwEf7zmLjwTL8VFqHt+alYESfYFe9DXIhp24Tb2xsRH5+PvLz8wHYt4Hn5+ejpKQEgH3qaP78+Y7jf/e73+H06dN48sknUVhYiP/7v//DF198gccee8xxzLJly7B27Vp88MEHKCgowEMPPYSmpiYsWLDAmW+FOnGqqhFzVu/BnqIa+GlUePmOUXh/wXVXTG5+bnhcMD5ddD3+fGsyNGolfiioxF1rslFW3+KkyInIk5gsVixZ/5Mjubl3Qjw2PzYFM0fE9Gi0N9jPB3+ePRxf/i4NfUN9UVrbgrvWZGNbIcuMyJFTt4lv374dN9544yX333///Xj//ffxwAMP4MyZM9i+fXuHxzz22GM4duwY+vbti2eeeQYPPPBAh8e/+eabeOWVV6DX6zFmzBi8/vrrSE1N7XZc3CZ+7U5UNODXa/ejutGEPiG+eOf+8RgWe+2f5eFzBvz2gwOoajAhJkiHzxZfj4QI/16ImIg8UYvZiv/3cS52nqiCj0qB524bgbkT+l3z8xpa2rBkfR52nayGSqnAq3eNwu1j+/ZCxORMPfn+dlkdHHfCBOfaHNc34Ndr96GmyYxhsUH4aOEERAT03hqnc3XNeOC9AyiqbERcsA6f/780xIdx8TGRt2lts+K37x/A3lM18PVR4d37x2PioN5bHNxmteHpfx3Gv/LOQakAXr93LH45Kq7Xnp96X0++v9mLinqk3NCC+9floKbJjBF9gvDpotReTW4AoG+oH9YvSkVipD/KDK349Tv7UN1ouvIDiUg2rDYBy77Ix95TNQjQqvHhwgm9mtwA9rWAr9w5CveMj4dNAJZ+ls/pKhlhgkPd1tDahgXvHYDe2IpBUQH4eGEqQvw0TnmtqEAdPl10PfqF+aG0tgWLP/wRrW1Wp7wWEbmf5789hu8O66FRKbF2/nhclxDmlNdRKhX4669GYs6YOFhsApasz8NxfYNTXotciwkOdYvNJmDpZ/ko1DcgMlCL9x64zmnJjSg6SId1D1yHIJ0aeSX1eOpfh+CFM6pEXueLA6V4b88ZAMCrd49G2sBwp76eSqnAK3eNxvWJYWgyW7HwgwMcNZYBJjjULWt2nkJWYSU0aiXevX+8y9bEDIoKwJr7UqBWKvB1fhk+2nfWJa9LRNI4WmbAM1/b+xEu+8UQzB7tmjUxPiol3pqXgv7hfjhX14JHP/sJNhsvqDwZExy6on2na/Dq5uMAgGdnD8eoviEuff2JgyKw/JZhAIDnNxXgyHmDS1+fiFzD0NKGhz7Og8liw01JUVhy4yCXvn6ovwbvzB8PXx8V9hTV4K0dp1z6+tS7mODQZRma2+xXMgLwq3F9cM910rS4+O2kBKQPi4bZasOS9XloNHXd44qIPNOfNx5FSW0z+ob64rW7R0vSM2pwdCD+cttwAMBrW07gxzO1Lo+BegcTHLqsv3xzFBVGExIj/PH8nBGStVBQKOx1KvqE+OJMTTNe+k/XzVWJyPNkHinHhp/OO7ZrO3uN3+XcldIXt42Jg9Um4LEv8tFs5gWVJ2KCQ136/qge/24/4bx692j4aaTt7BHip8HLd44CAHy07yyyT9VIGg8R9Y7qRhP+uMG+7uZ3UwdiXL9QSeNRKBR4fs4IxAXrUFrbglc3n5A0Hro6THCoU/XNZvyh/YSzeIr0JxzRpEERuLe9iulT/zrEKysiGVi58ShqmsxIignEo+mDpQ4HABCo88FffzUSAPDe3mLknuVUladhgkOdemXzcVQ3mjAoKgBL3eSEI/rDLUmIC9ahpLYZf//hpNThENE12HmiCt8eKm9vlzAaWrVK6pAcpg2Nwh3j+kIQgCf/eQhmi03qkKgHmODQJQ6dq8f6HHtD1BfmjIDOx31OOID9yur520cAANbtLkZRJYtyEXkik8WKlRuPAgDuT0twy67ez/xyGCICNDhV1YT39xZLHQ71ABMc6sBmE/DM10chCMDtY/sgNdG5Bbau1k1J0UgfFgWLTcCfNx5jAUAiD7R252kUVzchMlCLpb9wr5FiUYifBk/OTAIA/O8PJ1FpbJU4IuouJjjUwRc/luJgaT0CtGosvzlJ6nAu65lfJkOjVmJ3UTU2H9VLHQ4R9cD5+ha8ua0IAPCnWcMQpPOROKKu3TmuL0bHh6DJbMWLmdzB6SmY4JBDk8mCV7+37xZYmj4YUUE6iSO6vP7h/vjdlEQAwPPfFsBkYa8qIk/xt++Po7XNhgkDwlxWrfhqKZUK/GW2vTbOv/POI6+kTuKIqDuY4JDDu7uLUd1oQv9wP8xPS5A6nG55aNogRAdpca6uBZ/sK5E6HCLqhmNlRmz46TwA4I+3DJOsvlZPjIkPwZ0pfQEAL35XyGlxD8AEhwDY61D8o70s+X/PGAqN2jN+NXw1KixNHwIAeHNbERpa2ySOiIiu5MXMQggC8MtRsRgdHyJ1ON32+Iwh0KiVyDlTi+0nqqQOh67AM77FyOne3FqEJrMVo/oGY9bIWKnD6ZG7UvoiMdIftU1mrN15WupwiOgydp+sxs4TVfBRKfBExlCpw+mR2GBfPDAxAQDwcuZxNuN0c0xwCCU1zfhkv71L99MzkyTp/3It1Colnmw/Ua7dVYzKBu5yIHJHgiDg5c32RbrzUvujf7i/xBH13ENTByJQq0ZBuRHfHCqTOhy6DCY4hNXbitBmFXDD4AhMHBQhdThXJWN4DMbEh6ClzYp/7OAoDpE72n68CofOGeDro8IjN7m2U3hvCfXX4P9NtW9u+Nv3J2Cxsvifu2KC4+XO1TXjX3nnAMCxlsUTKRQKPPYLe/yf7D+L6kaTxBER0cUEQcDfs+yVx+en9Ud4gFbiiK7ebycPQLi/BiW1zdh4kKM47ooJjpd7a/spWGwCJg+KQEp/9+g3dbWmDI7A6L7BaG2zYe0ujuIQuZOdJ6txsLQeOh8lHrwhUepwromfRo2FNwwAYB8Bt3ItjltiguPFyg0t+PJH++iNpw4XX0yhUOCRm+zVUD/KPou6JrPEERERYB+9+d8f7DW25qX2R2Sg547eiH5zfX8E6dQ4VdWEzCMsNOqOmOB4sX/sOA2z1V5oy11bMvTU9GFRSI4NQrPZinV72DeGyB3sPVWDvJJ6aNVK/L8pnj16IwrU+WDBJPsozhtbT7IujhtiguOlqhtN+LS9oeaj092zB8zVUCgU+K/p9tGo9/ecYV0cIjfw1nZ7ja17J/Rz+wrpPbFgUgL8NSoU6huQVVApdTj0M0xwvNSH2WdhstgwOj4EEwfKY/RGNCM5BgMj/dFgsuDzA6VSh0Pk1Y6VGbG7qBoqpQILJw+QOpxeFeKnwW/aq76/1V4oldwHExwv1Npmxcf77HVvFt0wwCPKpPeEUqnAwsn2YfD39pzhNk4iCb3TvuD/5hExiA/zkzia3vfbyQnQqJTIPVuHn9ijyq0wwfFC/847j9omM/qE+GLm8Bipw3GKX43rg3B/Dc7Xt+A/XABIJIlyQ4tjG/Vimay9+bmoQB1ubW8W+u5urvtzJ0xwvIzNJuDd3fYrqt9OHgC1Sp6/AjofFe67vj8A+xUkFwASud77e8/AYhOQOiAMo/qGSB2O04hTb/85ose5umaJoyGRPL/dqEvbT1TiVFUTArVq3D2+r9ThONVv0vpDo1bi4DkDcoprpQ6HyKs0tLZh/T77RoZFHl735kqS44IwcWA4rDYBH+w9I3U41I4JjpdZu9M+hHpvaj8E6nwkjsa5IgK0uGNcHwDAOxw6JnKpf+aeQ4PJgsRIf9yUFCV1OE73YHvhv89yStFoskgcDQFMcLxKod6I7NM1UCkVjo64cicOHWcVVHDomMhFBEHAR+0bGRZMTPC4Br5XY9qQKCS279788kfu3nQHLklwVq9ejYSEBOh0OqSmpiInJ6fLY6dNmwaFQnHJbdasWY5jHnjggUt+PnPmTFe8FY8m7pyakRyNuBBfiaNxjUFRgZg4MBw2AY66P0TkXHtP1eB0VRP8NSrcPk7eU+EipVKBBe0Xjh/vO8t1f27A6QnO559/jmXLlmHlypXIy8vD6NGjkZGRgcrKzosi/fvf/0Z5ebnjduTIEahUKtx1110djps5c2aH4z799FNnvxWP1miyYEPeeQD2EuPeRHy/nx8ohclilTgaIvn7KNt+MfWrcX0RoFVLHI3rzBnbB34aFU5VNSH7dI3U4Xg9pyc4r732GhYtWoQFCxYgOTkZa9asgZ+fH9atW9fp8WFhYYiJiXHctmzZAj8/v0sSHK1W2+G40FDPbhTpbF/9dB5NZisSI/2RJrPCfleSnhyN6CAtqhvN7BlD5GTlhhZsKagAYF/o700CdT6YM9a+7u+TfRwxlppTExyz2Yzc3Fykp6dfeEGlEunp6cjOzu7Wc7z77ruYO3cu/P39O9y/fft2REVFYejQoXjooYdQU9N1tmwymWA0GjvcvIkgCI7pqXmp/WVX2O9KfFRK3DuhHwCedIic7dP9JbC2bw0fEh0odTgud1+qPanbfFSPSmOrxNF4N6cmONXV1bBarYiOju5wf3R0NPT6K19J5+Tk4MiRI3jwwQc73D9z5kx8+OGHyMrKwksvvYQdO3bg5ptvhtXa+fTDqlWrEBwc7LjFx8df/ZvyQHkldSjUN0Dno8SdXjIf/nP3TugHlVKBnDO1KNR7V4JL5Cpmiw2ftrdH8bbRG1FyXBDG9QuBxSawVYzE3HoX1bvvvouRI0diwoQJHe6fO3cuZs+ejZEjR2LOnDnYtGkTDhw4gO3bt3f6PMuXL4fBYHDcSku965dOnA+/dVQcgv3kvTW8K9FBOmQMtyfa4udBRL3r+2N6VDWYEBmoxYxkeVZJ7w6xyOinOfbRLJKGUxOciIgIqFQqVFRUdLi/oqICMTGX/+VvamrCZ599hoULF17xdRITExEREYGioqJOf67VahEUFNTh5i1qm8z47rB9tMxbr6hE4tDx1/llaDFzsTFRbxNHLO4ZHw+N2q2vn53qlpGxCPXzQZmhFVsL2WVcKk79DdRoNEhJSUFWVpbjPpvNhqysLKSlpV32sV9++SVMJhPuu+++K77OuXPnUFNTg9jY2GuOWW42/HQeZqsNI/sEy7pUendcnxiOfmF+aDRZ8N3hcqnDIZKVc3XN2F1UDQC4e7x3LQP4OZ2PCnem2JcDfMGaOJJxeoq9bNkyrF27Fh988AEKCgrw0EMPoampCQsWLAAAzJ8/H8uXL7/kce+++y7mzJmD8PCOO34aGxvxxBNPYN++fThz5gyysrJw2223YdCgQcjIyHD22/EogiA4Ck7dfZ13n3AAe52Ku3jSIXKKf+aegyAAEweGo1+4/LqG95SY5G0trERlAxcbS8HpCc4999yDV199FStWrMCYMWOQn5+PzMxMx8LjkpISlJd3vJo+fvw4du/e3en0lEqlwqFDhzB79mwMGTIECxcuREpKCnbt2gWtVuvst+NRjpw3olDfAI1aidmj4qQOxy3cOb4vFApgf3EtzlQ3SR0OkSzYbAK+/PEcAI7eiAZHB2JsvxBYbQK++um81OF4JZdUYFqyZAmWLFnS6c86Wxg8dOjQLqtA+vr6YvPmzb0ZnmyJoxQZw2O8dnHxz8UG+2LK4EjsOFGFL3NL8URGktQhEXm8vadqcL6+BYE6NWaO8N7FxT93V0o8fiqpxxc/nsOiGxK9rkSH1Lx3FZjMtbZZ8XW+/apB7l3De+qe9um6f+aeg8VqkzgaIs8nXkzdNiYOOh+VxNG4j1+OjoXOR4miykbkl9ZLHY7XYYIjU1uOVcDYakFcsA4TB0ZIHY5bmT4sCqF+PqgwmrDrZLXU4RB5NENzGzKP2ndqcnqqoyCdD24ZYd/88kX7FB65DhMcmRKvqO5I6QuVF3Ty7QmtWoXbx9pHtViIi+jafH3wPMwWG5JiAjGyT7DU4bidO9tH0L85yPIUrsYER4bK6lsc2zXFrYrU0d3X2T+XrMIK1DWZJY6GyHNdvLiYa0wudf2AcMSH+aLRZMF/jrA8hSsxwZGhf+fZt2umDghD/3D/Kz/ACyXFBCE5NghtVgHfsiYO0VUpqmzA4fMGqJQK3DaGOzU7o1QqcOc4+9Tdv/O4m8qVmODIjCAI2NC+JfEOjt5c1pyx9hOyuBibiHrmq5/KAABTh0QiPIBlOrpye3uH8b2nqtmA04WY4MjM0TIjTlU1QaNW4mZu17ys2aP7QKEADpypQ2lts9ThEHkUQRDwVfvFAUdvLq9fuB/G9QuBTQA2HiyTOhyvwQRHZsTRiPRhUQjUsfbN5cQE6zBxoL1SNkdxiHom92wdztW1wF+j8urGmt01p30U5+t8JjiuwgRHRqw2wXF1cNuYPhJH4xnmtH9OG34632VxSSK6lDh6kzE8Br4a1r65klkjY6FSKnD4vAFFlY1Sh+MVmODIyP7iGlQYTQjSqTFtaKTU4XiEmSNioFUrcaqqCUfLjFKHQ+QRzBYbvj1kX5wvjkzQ5YUHaDF1iP28zBFj12CCIyNfty/4u2VkLLRqXlF1R6DOB+nJ9r5oG9gvhqhbdp6oQl1zGyIDtY5pXroyca3S1/llHDF2ASY4MmGyWPFde40FTk/1zO3tn9fGg2Vs3UDUDeL01K2j4qBW8Wuku36RHA0/jQoltc3IK6mXOhzZ42+mTGwrrEJDqwUxQTqkDgiTOhyPMmVIJEL9fFDVYMLeUzVSh0Pk1hpa27DlWAWAC9ufqXv8NGpkDLcvyOY0lfMxwZGJjQft/1lmj4mDkq0ZekSjVuKWkfZ+MeK6AiLq3JZjFTBZbEiM9MeIPkFSh+NxxGmqTYfK0cYRY6digiMDxtY2/FBQCYD1KK7WrFH2BCfzqJ4nHaLLEC8Cbh0Vx9YMV2HyoAiE+2tQ22TGvtMcMXYmJjgy8MOxCpgtNgyKCkByLK+orkbqgHBEBGhhaGlz9PEioo4MLW3YebIKwIWLAuoZtUqJjPYirBwxdi4mODLwXXsvpVtGxvKK6iqplArcMpInHaLL+eFYBdqsAgZHBWBIdKDU4XisX7ZPiW/miLFTMcHxcMbWNuw8YR9xmDWSV1TXYtZFJx2zhScdop8TG9Ny9ObaTBgQhnB/Deqa25DNjQ1OwwTHw20tqITZasPASH8MiQ6QOhyPNj4hDFGBWjS0WrC7qErqcIjciqGlDbvE6SleTF0TtUqJme3TVOIIPPU+JjgeznFFxempa2afprKfuDdxmoqogy3t01NDogMwmNNT10xMErmxwXmY4HiwhtY27Dhhv6K6hUPGvUIcet9ytAImi1XiaIjcx7eH7JXSZ43kTs3eMGFAGCICNKhvbmP9LSdhguPBthZWwmyxITHCH0N5RdUrUvqFIiZIhwaTxbG2icjbGZrbsOtk+1q/Uewc3hvUKqWj6N93HDF2CiY4Hkzc7cPdU71HedE0lXjFSuTtNh/Tw2ITMDQ6EIOieDHVW8QR483HOE3lDExwPFSjyYLt4vQUF/z1Ksc01bEKtLZxmoroO+6ecgp7/S1OUzkLExwPlVVgL+43IMIfw2J5RdWbxsaHICZIhyazFXtY9I+8XH2zGbvbp6d4MdW7VEqFYzcVR4x7HxMcD3WhuF8Mp6d6mVKpwIzh0QDsNXGIvFlWQeVF01MsRdHbxKRxy7EKWDhN1auY4HigJpMF249zesqZZrYv/vuhoJInHfJqYpKf0Z70U++akBCGED8f1DW34cezdVKHIytMcDzQzhNVMFls6Bfmx95TTjJhgP2kU9tk5kmHvFaL2eroPTVjOHdPOYNapcT0JI4YOwMTHA+05VgFAGBGcjSnp5yEJx0iYOfJKrS22dAnxBfD43gx5Szi6Nj3RysgCILE0cgHExwP02a1IauwEgCvqJyNJx3ydt8fbb+YGs6LKWeaMiQSvj4qnK9vwdEyo9ThyAYTHA9zoLgWhpY2hPlrkNI/VOpwZO3ik86R8zzpkHexWG3IKrQnOBm8mHIqnY8KU4dEAuCIcW9ySYKzevVqJCQkQKfTITU1FTk5OV0e+/7770OhUHS46XS6DscIgoAVK1YgNjYWvr6+SE9Px8mTJ539NtzC9+3TU+nDoqBS8orKmXjSIW+Wc6YW9c1tCPXzwXheTDndjItGjKl3OD3B+fzzz7Fs2TKsXLkSeXl5GD16NDIyMlBZWdnlY4KCglBeXu64nT17tsPPX375Zbz++utYs2YN9u/fD39/f2RkZKC1tdXZb0dSgiDg+/Yv2hnJvKJyhYwRXIdD3kn8ok0fFg21ioP9zjY9KRpqpQLHKxpwprpJ6nBkwem/ta+99hoWLVqEBQsWIDk5GWvWrIGfnx/WrVvX5WMUCgViYmIct+joC9sTBUHA3//+d/zpT3/CbbfdhlGjRuHDDz9EWVkZvvrqK2e/HUkdLTOizNAKXx8VJg+OkDocr3DTUPtJ52RlI05XNUodDpFLXHwxxekp1wj288H1ieEAeEHVW5ya4JjNZuTm5iI9Pf3CCyqVSE9PR3Z2dpePa2xsRP/+/REfH4/bbrsNR48edfysuLgYer2+w3MGBwcjNTW1y+c0mUwwGo0dbp5IPOFMHRIJnY9K4mi8Q7CfD9IGiicdDh2Tdzhy3n4x5afhxZQrscBo73JqglNdXQ2r1dphBAYAoqOjodd3/g84dOhQrFu3Dl9//TU+/vhj2Gw2TJw4EefOnQMAx+N68pyrVq1CcHCw4xYfH3+tb00S4vqbGSy45VLiFWwmTzrkJTbzYkoS4tKDn0rrUWmU95ILV3C7idW0tDTMnz8fY8aMwdSpU/Hvf/8bkZGR+Mc//nHVz7l8+XIYDAbHrbS0tBcjdo2zNU0o1DdApVTgpqQoqcPxKjOS7QnlwdJ6VPCkQ17g+2Pta/14MeVSMcE6jI4PgSAAWwo4YnytnJrgREREQKVSoaKi4z9URUUFYmK6N6/r4+ODsWPHoqioCAAcj+vJc2q1WgQFBXW4eRqxuF/qgDCE+Gkkjsa7RAXZTzoAsLWw68XxRHJQXN2EExWNUCsVuGkoExxXy3BMUzHBuVZOTXA0Gg1SUlKQlZXluM9msyErKwtpaWndeg6r1YrDhw8jNtbec2nAgAGIiYnp8JxGoxH79+/v9nN6ou8vql5MrpfePmqWxasqkrkt7aM31yeGI9jPR+JovI94jt93qgaNJovE0Xg2p09RLVu2DGvXrsUHH3yAgoICPPTQQ2hqasKCBQsAAPPnz8fy5csdxz/77LP4/vvvcfr0aeTl5eG+++7D2bNn8eCDDwKw77BaunQpnn/+eWzcuBGHDx/G/PnzERcXhzlz5jj77UiiptGEH8/UAgB+wR0Nkpg+zH7S2V1UjdY2q8TREDnPDwX2Ucpf8GJKEgMjA9A/3A9mqw27T1ZLHY5HUzv7Be655x5UVVVhxYoV0Ov1GDNmDDIzMx2LhEtKSqBUXsiz6urqsGjRIuj1eoSGhiIlJQV79+5FcnKy45gnn3wSTU1NWLx4Merr6zF58mRkZmZeUhBQLrIKK2ETgOFxQegT4it1OF5pWGwg4oJ1KDO0Yk9RtSPhIZKT+mYzctuby3KtnzQUCgWmJ0Vj3Z5iZBVUYOYIXtReLYXghU12jEYjgoODYTAYPGI9zu8+ykXmUT2Wpg/G0vQhUofjtZ756gg+2ncW907oh1W/Gil1OES97uv883j0s3wMiQ7A949NlTocr7WnqBrz3tmPiAANcv6QDiWr1jv05Pvb7XZRUUdmiw27TlYB4BWV1KYPs3/+WwvZfJPkKat9eoojlNK6LiEMgVo1qhvNOHiuXupwPBYTHDeXU1yLJrMVkYFajIgLljocr3Z9Yjj8NCpUGE1svkmyY7HasP14e4LDiylJadRKTBlq74MnJp3Uc0xw3JzYzfemoVEcppSYzkeFG9qruv7A3VQkM7ln62BstSDUzwdj+7G5ptTEJDOLpSmuGhMcNyYIgqPuyk3DeEXlDsShezHxJJIL8Yv0xqFRUPFiSnLThkZBqQAKyo04X98idTgeiQmOGztd3YSzNc3QqJSYPIj9YNzBTUlRUCjsvXr0BlY1JvkQazzxYso9hPlrMK59JI0FRq8OExw3trV97jU1MQz+Wqfv6KduiAjQYkx7VWOO4pBcnKluwqmqJqiVCkwZEil1ONTOMWLMKfGrwgTHjYlfoFzw517SHScdXlWRPIgjBBMGhCFIx+rF7iK9fTRt76kaNJtZ1binmOC4KUNLGw6cEQtuccumOxETnD1F1Wgxs6oxeT7HZgZeTLmVQVEBiA/zhdnCqsZXgwmOm9p5ogpWm4BBUQHoF+4ndTh0kSHRAegb6guTxYbdRTzpkGdraG3D/tP2VjCsf+NexKrGAEeMrwYTHDe1rZD1KNyV/aRj/3fZdpwnHfJsu05Ww2ITkBjpjwER/lKHQz8jjhhvPV4Jm40FRnuCCY4bstoExxcnh4zd07T2f5fthZWsakweTazpxIsp9zRhQBgCtGpUNZhw+LxB6nA8ChMcN5RfWoe65jYE6dRI6c+CW+4oLTEcWrUSZYZWnKxslDocoqtitQnYflxsBcPpKXekUSsdBUY5YtwzTHDckDjXOm1oFNQq/hO5I52PCmkDwwFcmE4k8jT5pfWobTIjUKfG+AReTLmrae1tG8RklLqH355uyFG9mEPGbu3Goe3TVDzpkIfa0T4iMGVIJHx4MeW2pg6xn2sOnrMnpNQ9/I12M+frW1Cob4BSAUxlwS23Jl5VHThTi4bWNomjIeq57Sfsyfk0nmvcWkywDkkxgRAEYNdJXlB1FxMcNyN28x3XLxSh/hqJo6HL6R/uj8QIf1hsAvYU1UgdDlGPVDeacOicfdEqL6bc341JHDHuKSY4bmZH+y+vODpA7m2qY26c63DIs4gjAcmxQYgK0kkcDV2JOMq240QVt4t3ExMcN2K22LD3lH0kQJxzJfd28TocbhcnT7KdF1MeZVz/UARq1ahtMuMQt4t3CxMcN5J7tg6NJgsiAjQYHhckdTjUDRMGhMHXRwW9sRWF+gapwyHqFqtNwE5x/c1QXkx5Ah+VEpPbt4tzxLh7mOC4kR3tJ5wpgyOhVCokjoa6Q+ejwkRxuzhPOuQhDp2rR11zGwK1aoztFyJ1ONRN3C7eM0xw3IiY4EzlkLFH4UmHPI14rpk8OILbwz0It4v3DH+z3USFsRUF5UYoFMANg5ngeBJxiD/3bB0MLdwuTu6P6288E7eL9wwTHDchXlGN6huCMG4P9yjxYX4YGOkPq03AHnYXJzdX22TGwXP1ALiZwROJ28VZQf3KmOC4Ccf0FOtReCRxNxVPOuTudp2sgiAASTGBiAnm9nBPI24X33mymtvFr4AJjhuwWG3YfdJ+5c8ExzOJ01TbT3C7OLk3sdYW1/p5Jm4X7z4mOG7g4Ll6GFraEOzrgzHxIVKHQ1fhugGh8NOoUNVgwtEyo9ThEHXKZhMco8XTOD3lkbhdvPuY4LgB8YrqhsERUHF7uEfSqlWYONB+0hG/QIjczZEyA2qazAjQqpHSn93DPRV3bnYPExw3wPU38iAO+TPBIXclfiFOHBgOjZqnf0918XbxmkaTxNG4L/6GS6ym0eSYR2WC49mmtm/vzztbx+7i5JZ2sHqxLHTcLs6dm11hgiOxXSerIQhseCcH/cL9kBDuB4tNQPYpdhcn91LfbMZPJXUAWP9GDsQkdSdHjLvEBEdirF4sL1PaR+F4VUXuZtfJatgEYEh0AOJCfKUOh67RlCH2NX87T1Zz52YXXJLgrF69GgkJCdDpdEhNTUVOTk6Xx65duxY33HADQkNDERoaivT09EuOf+CBB6BQKDrcZs6c6ey30etsFzW84/SUPIhVqHeyyii5GXH9Dc818pDSPxS+PipUN5pQUM5Gv51xeoLz+eefY9myZVi5ciXy8vIwevRoZGRkoLKy8+1t27dvx7333ott27YhOzsb8fHxmDFjBs6fP9/huJkzZ6K8vNxx+/TTT539VnoddzTIT9rAcKiVCpytacbZmiapwyECAAiC4Ei6uf5GHrRqFdLaG/2ybUPnnJ7gvPbaa1i0aBEWLFiA5ORkrFmzBn5+fli3bl2nx3/yySf4/e9/jzFjxiApKQnvvPMObDYbsrKyOhyn1WoRExPjuIWGel6CIG4PnzQonA3vZOLiZJVz4+QuCvUNqGowwddHhfEJnneupM7dMFicpuK5pjNO/VY1m83Izc1Fenr6hRdUKpGeno7s7OxuPUdzczPa2toQFhbW4f7t27cjKioKQ4cOxUMPPYSamq4XdZpMJhiNxg43d7DdMT3FKyo5Edfh7DjBdTjkHsQr/NTEMGjVKomjod4inmsOFNehxWyVOBr349QEp7q6GlarFdHR0R3uj46Ohl6v79ZzPPXUU4iLi+uQJM2cORMffvghsrKy8NJLL2HHjh24+eabYbV2/g+8atUqBAcHO27x8fFX/6Z6iaG5zbGjgQuM5UVc45B9qhptVpvE0RBdWPQurhEjeUiM8EefEF+YrTbsK+bOzZ9z63mRF198EZ999hk2bNgAne7CFuq5c+di9uzZGDlyJObMmYNNmzbhwIED2L59e6fPs3z5chgMBsettLTURe+ga3tO2Xc0DIoKQB/uaJCV5NgghPtr0GS2Iu9sndThkJdrbbMip7gWADClfUqD5EGhUDh2U+3iiPElnJrgREREQKVSoaKiosP9FRUViImJuexjX331Vbz44ov4/vvvMWrUqMsem5iYiIiICBQVFXX6c61Wi6CgoA43qV24ouIJR26USoWjVwznxklqB87UwmSxISZIh0FRAVKHQ71MHJXjQuNLOTXB0Wg0SElJ6bBAWFwwnJaW1uXjXn75ZTz33HPIzMzE+PHjr/g6586dQ01NDWJjY3slbmcTBMHxyziFQ8ayJP677uRVFUns4osphYK97uRm0sAIKBXAycpGlNW3SB2OW3H6FNWyZcuwdu1afPDBBygoKMBDDz2EpqYmLFiwAAAwf/58LF++3HH8Sy+9hGeeeQbr1q1DQkIC9Ho99Ho9GhsbAQCNjY144oknsG/fPpw5cwZZWVm47bbbMGjQIGRkZDj77fSKszXNOFfXAh+VAqmJYVd+AHkccWTuSJmBvWJIUuJuvhtY/0aWgv18MDo+BACwmwVGO3B6gnPPPffg1VdfxYoVKzBmzBjk5+cjMzPTsfC4pKQE5eXljuPfeustmM1m3HnnnYiNjXXcXn31VQCASqXCoUOHMHv2bAwZMgQLFy5ESkoKdu3aBa1W6+y30yt2Fdl/Ccf1C4WfRi1xNOQMUUEXesXsLuJJh6RRaWxFob4BCgUweRCnw+VKHDHewWmqDlzy7bpkyRIsWbKk05/9fGHwmTNnLvtcvr6+2Lx5cy9FJo1d7VdUU3hFJWtTh0SiUN+AnSeqcduYPlKHQ15ITK5HxAUjzF8jcTTkLFOGROB/s05iT1E1rDYBKiWnIgE330UlRxarzdGIkVdU8nahL1UVe8WQJLiZwTuM7huCQJ0a9c1tOHzeIHU4boMJjosdPFePBpMFIX4+GNEnWOpwyInGJ9h7xVQ2mFCoZ68Yci2bTXAkOJOZ4MiaWqXEpIHidnFOU4mY4LiYeMKZNDCCw4gyp1WrcH37InJu4SRXK9Q3oLrR3p6Bve7kTxwxZmmKC5jguBiHjL3LDdwuThLZXWT/orue7Rm8gvidkldSj4bWNomjcQ9McFzI2NqG/NJ6ABwy9hbiVVXOmVr2iiGXYnsG7xIf5ofECH9YbQL2nmLbBoAJjkvtO1UDq03AgAh/9A31kzoccoGBke29YizsFUOu09pmxX6xPcMQXkx5C3EUh1PidkxwXIjTU97n4l4xO7n4j1wkp7gWZosNscE6DIxkewZv4ViHwylxAExwXEqsScHt4d5FnCJglVFyFfEKnu0ZvMv1ieHwUSlQUtuMszVNUocjOSY4LlJa24zi6iaolAqkDQyXOhxyoYkDw6Fo7xWjN7RKHQ55Aa6/8U7+WrVjxxxHjJnguIw4ejM2PgSBOh+JoyFXCvHTYFR7zSO2bSBnu7g9wySOFnsdMandwWkqJjiuIg4Zc/eUdxL/3Xdz8R85mTh6w/YM3mlq+zqcfadr0Ga1SRyNtJjguIDVJmBPkX0HDYeMvdPkQe3rcIpq2LaBnOri9TfkfZJjgxDmr0GjyeIoS+KtmOC4wOHzBhha2hCoU2N0X7Zn8Ebj+ofA10eF6ka2bSDnsdkE7ObFlFdTKhWOqUlvb9vABMcFxGmJiQPDoVbxI/dGWrUKqe1tG7ibipxFbM/gp1FhXP8QqcMhiYijdzu9/FzDb1sXuNDwjldU3kwsD7CLC43JScTpqesTw9mewYuJCc6hc/WobzZLHI10mOA4WZPJgrySOgDAFM6JezVxyiCnuAatbWzbQL2PxUQJAGKDfTE4KgA2AV7dtoEJjpPtL65Bm1VAfJgv+of7Sx0OSWhIdACiArVobbMh72yd1OGQzLSYrcg5Y2/PwPU3JP4O7PLiaSomOE4mlswWd9GQ91IoFJymIqfJOWNvzxAXrMPASF5MebsbLmoR4607N5ngOJlY2I3TUwRcXA+HCQ71LnHHzGS2ZyAAqQPCoFEpcb6+BWdqmqUORxJMcJyo3NCCospGKBXAxIFMcOjCQuMjZQbUNXnv4j/qfWzPQBfz01xo2+Ct3cWZ4DiReMIZ1TcEwX5sz0BAVJAOQ6MDIQjAnlMcxaHeUWFsxfEKtmegji5MU3nnuYYJjhPt5o4G6gSnqai37WZ7BurElMHe3baBCY6T2CuKcsiYLiUmOLtOVnvt4j/qXWzPQJ3x9rYNTHCc5Fi5EbVNZvhrVBjbL0TqcMiNXLz476yXLv6j3iMIF9ozsJkvXUypvGjnphe2bWCC4yTi+pvrE8Phw/YMdBE/jdpRRp/bxelaie0ZfH1UjkWlRKLJXty2gd+8TrK7iEPG1DVx2nK3l+5uoN4jrr+ZMCCM7RnoEt7ctoEJjhO0mK04UGyvVMv+U9QZcdh476kaWLxw8R/1nl1F3MxAXfPmtg1McJwg50wtzFZWFKWujegTjGBfHzS0WnDovEHqcMhDmSxW5BRz/Q1d3oW2Dd41YswExwnEaQdWFKWuqJQKTBoUDoDbxenq5Z6tQ2ubDZGBWgyNDpQ6HHJTF9fD8aadm0xwnIAVRak7xP5kTHDoaom/O5MH8WKKuuatbRuY4PSySmMrCvWsKEpXJq7DySupQ6PJInE05InEWluTea6hy/DTqDE+wfvaNrgkwVm9ejUSEhKg0+mQmpqKnJycyx7/5ZdfIikpCTqdDiNHjsR3333X4eeCIGDFihWIjY2Fr68v0tPTcfLkSWe+hW4TTzjD44JYUZQuq1+4H/qF+cFiE7D/tHct/qNrV9dkxuH29Vtcf0NX4tgu7kVtG5ye4Hz++edYtmwZVq5ciby8PIwePRoZGRmorKzs9Pi9e/fi3nvvxcKFC/HTTz9hzpw5mDNnDo4cOeI45uWXX8brr7+ONWvWYP/+/fD390dGRgZaW1ud/XauaDenp6gHLq5qTNQTe0/VQBCAIdEBiA7SSR0OuTmxbUP2qWqvadvg9ATntddew6JFi7BgwQIkJydjzZo18PPzw7p16zo9/n//938xc+ZMPPHEExg2bBiee+45jBs3Dm+++SYA++jN3//+d/zpT3/CbbfdhlGjRuHDDz9EWVkZvvrqK2e/ncsSBOHClk0OGVM3iL8nu1nwj3pIrLXFqXDqDrFtQ5PZip9K6qUOxyWcmuCYzWbk5uYiPT39wgsqlUhPT0d2dnanj8nOzu5wPABkZGQ4ji8uLoZer+9wTHBwMFJTU7t8TpPJBKPR2OHmDMcrGlDVYILOR4mUBFYUpSubODACSgVQVNmIckOL1OGQhxAE4aLNDExw6Mo6tG3wknU4Tk1wqqurYbVaER0d3eH+6Oho6PX6Th+j1+sve7z4Z0+ec9WqVQgODnbc4uPjr+r9XIk4PZU6IJwVRalbgv18MLJvCADupqLuO1vTjHN1LfBRKZA6IFzqcMhD3OBlU+JesYtq+fLlMBgMjltpaalTXmfiwAgsuXEQ7kjp65TnJ3niNBX1lDgVPrZfKPy1aomjIU8hrg31lrYNTk1wIiIioFKpUFFR0eH+iooKxMTEdPqYmJiYyx4v/tmT59RqtQgKCupwc4bkuCD8d8ZQzB4d55TnJ3kSFxrvKaqGzeY9Rbjo6onFRLnWj3oiJljnVW0bnJrgaDQapKSkICsry3GfzWZDVlYW0tLSOn1MWlpah+MBYMuWLY7jBwwYgJiYmA7HGI1G7N+/v8vnJHJn4/qFwk+jQnWjGYX6BqnDITdnsdocX07cHk495U1tG5w+RbVs2TKsXbsWH3zwAQoKCvDQQw+hqakJCxYsAADMnz8fy5cvdxz/6KOPIjMzE3/7299QWFiIP//5z/jxxx+xZMkSAIBCocDSpUvx/PPPY+PGjTh8+DDmz5+PuLg4zJkzx9lvh6jXadRKpA4IA3BhZwxRVw6dN6Ch1YIgnRqj2tdvEXWXN7VtcPrk7T333IOqqiqsWLECer0eY8aMQWZmpmORcElJCZTKC3nWxIkTsX79evzpT3/CH/7wBwwePBhfffUVRowY4TjmySefRFNTExYvXoz6+npMnjwZmZmZ0OlYC4I80+TBkdh2vAq7TlZj8ZSBUodDbkxcjD5xYARUSrZnoJ65uG1DcXUTEiMDpA7JaRSC3FO4ThiNRgQHB8NgMDhtPQ5RT5yoaMCM/9kJrVqJgytnQOfDXXjUubvXZCPnTC2enzMC913fX+pwyAP9eu0+7D1Vg7/MHo77JyZIHU6P9OT72yt2URG5u8FRAYgO0sJksSH3bJ3U4ZCbajRZkFdi//1g/Ru6WhfW4ch75yYTHCI3oFAoHBVpuV2curL/dA0sNgHxYb7oH+4vdTjkocTkWO5tG5jgELkJ8aTDgn/UlQvdw9nrjq6et7RtYIJD5CbEEZwjZQbUNcm/CBf13G62Z6Be4C1tG5jgELmJqEAdkmICIQjAnlMcxaGO9IZWnKxshEIBTBzI9gx0bcQkeaeMR4yZ4BC5EcdV1Qn5nnTo6ojTU6P6BCPETyNxNOTpvKFtAxMcIjdywxD7SWd3kfyLcFHPiO0ZWL2YekNMsA5DogMgyLhtAxMcIjcyISEMGrW9CNfp6iapwyE3IQgCdhe1t2fgAmPqJeLvklzX4TDBIXIjvhoVrksIBQDsOiHPkw71XKG+AdWNJvj6qDCuf4jU4ZBMyL1tAxMcIjfjLUW4qPvE3VMTBoRBq2aVa+odP2/bIDdMcIjcjLi7Yd/pGpgt8i3CRd23q4jbw6n3+WnUGC+OGMvwgooJDpGbGRYThIgAsQgX2zZ4u9Y2K3KK29ffMMGhXnZhxFh+U+JMcIjcTMciXPK7qqKeyTtbh9Y2GyIDtRgaHSh1OCQzF9o21MiubQMTHCI3NFnGV1XUM7sc7RkioFAoJI6G5CY5NgjhMm3bwASHyA2JV1WHzrNtg7cTFxiLo3pEvUmpvNDoV24XVExwiNxQdJAOQ6MDZV2Ei66srsmMI2UGAFx/Q84j17YNTHCI3JR40pHbVRV1355T1RAEYEh0AKKDdFKHQzIl17YNTHCI3JTYtmHXSXkW4aIruzA9xerF5DwXt23YUySfEWMmOERuakLChSJcbNvgfQRBcOyiY/0bcjY5bhdngkPkpnw1Klw3gG0bvNWZmmacr2+Bj0qB1MQwqcMhmbswJS6fEWMmOERujG0bvNfu9u3h4/qFwk+jljgakrvUAeGya9vABIfIjbFtg/cSR+04PUWu4KtRya5tAxMcIjfGtg3eqc1qc5QHmDKEC4zJNeS2DocJDpEb61iESx5XVXRlP5XUo9FkQaifD4bHBUsdDnmJi9s2yGHEmAkOkZuT21UVXZn4bz15cCRUSrZnINfo2LbB80eMmeAQuTm2bfA+O9vX30zh+htyIaVS4aiYLS5y92RMcIjcHNs2eJfaJjMOnbe3ZxBH74hcRex5Joe2DUxwiDzAZLZt8Bq7i+ztGYZGByImmO0ZyLXk1LaBCQ6RB5BjES7qnLg9fMoQTk+R68mpbQMTHCIPcHERLrZtkC9BELDzpJjgcHqKpCGXjQ1McIg8ANs2eIcTFY2oMJqgVStxXQLbM5A05DJi7NQEp7a2FvPmzUNQUBBCQkKwcOFCNDY2Xvb4Rx55BEOHDoWvry/69euH//qv/4LBYOhwnEKhuOT22WefOfOtEEmObRvkT7xiTk0Mh85HJXE05K3kMmLs1ARn3rx5OHr0KLZs2YJNmzZh586dWLx4cZfHl5WVoaysDK+++iqOHDmC999/H5mZmVi4cOElx7733nsoLy933ObMmePEd0IkPXF3A9s2yNcObg8nN3DxiPFuD76gcloHt4KCAmRmZuLAgQMYP348AOCNN97ALbfcgldffRVxcXGXPGbEiBH417/+5fj7wIED8cILL+C+++6DxWKBWn0h3JCQEMTExDgrfCK3Ixbhqmky46eSOqQmhksdEvWi1jYrcoprAXD9DUlv8qBI7Cmqwa6TVbh/YoLU4VwVp43gZGdnIyQkxJHcAEB6ejqUSiX279/f7ecxGAwICgrqkNwAwMMPP4yIiAhMmDAB69atu+w8oclkgtFo7HAj8jQXF+HiNJX87C+uhcliQ0yQDoOjAqQOh7ycHNo2OC3B0ev1iIqK6nCfWq1GWFgY9Hp9t56juroazz333CXTWs8++yy++OILbNmyBXfccQd+//vf44033ujyeVatWoXg4GDHLT4+vudviMgNyGV3A13q4u3hCgXbM5C05NC2occJztNPP93pIt+Lb4WFhdccmNFoxKxZs5CcnIw///nPHX72zDPPYNKkSRg7diyeeuopPPnkk3jllVe6fK7ly5fDYDA4bqWlpdccH5EU2LZBvrg9nNyJHEaMe5zgPP744ygoKLjsLTExETExMaisrOzwWIvFgtra2iuunWloaMDMmTMRGBiIDRs2wMfH57LHp6am4ty5czCZTJ3+XKvVIigoqMONyBNFB10owiWHXjFkV25owYmKRigUwKSBXGBM7sHTR4x7vMg4MjISkZFXvsJIS0tDfX09cnNzkZKSAgDYunUrbDYbUlNTu3yc0WhERkYGtFotNm7cCJ3uyqXK8/PzERoaCq1W2/03QuShpg6JxImKRuw4UYVbR1+6WJ88j3iFPKpvCEL9NRJHQ2R38YhxfbMZIX6e9bvptDU4w4YNw8yZM7Fo0SLk5ORgz549WLJkCebOnevYQXX+/HkkJSUhJycHgD25mTFjBpqamvDuu+/CaDRCr9dDr9fDarUCAL755hu88847OHLkCIqKivDWW2/hr3/9Kx555BFnvRUitzJtqH1t244TVbDZPLcIF10gdg+fyu3h5EYuHjH2xLYNTtsmDgCffPIJlixZgunTp0OpVOKOO+7A66+/7vh5W1sbjh8/jubmZgBAXl6eY4fVoEGDOjxXcXExEhIS4OPjg9WrV+Oxxx6DIAgYNGgQXnvtNSxatMiZb4XIbYxPCIWfRoWqBhOOlRsxok+w1CHRNbDaBMd04w1cf0Nu5obB9hHjXSerMGtUrNTh9IhTE5ywsDCsX7++y58nJCR02N49bdq0K5aFnjlzJmbOnNlrMRJ5Gq1ahYkDw/FDQSV2nKhiguPhDp83oL65DYFaNcbEh0gdDlEHNwyOwLu7ix1tGzxphx97URF5oKniNNVxz1z8RxeI28MnDgqHj4qnZHIvnty2gf+biDzQtPapjNySOhhb2ySOhq6FuD1c3LFC5E48udEvExwiDxQf5ofESH9YbQL2eGiNCgIMzW3IK6kHYN8dR+SOPLXRLxMcIg81bYh9mmo7p6k81q6iKlhtAgZFBSA+zE/qcIg65amNfpngEHmoqUPtV1U7TlRdcXE+uScxOZ3G0RtyY57atoEJDpGHSh0QBp2PEnpjK45XNEgdDvWQzSY4Epwbk6KucDSRdDy1bQMTHCIPpfNRIS0xHACnqTzRsXIjqhtN8NOoMD4hVOpwiC7LE9s2MMEh8mDiwlRuF/c82wrtvfomDYqAVq2SOBqiy/PERr9McIg8mNi24ceztWg0WSSOhnpie/uW22lDuf6G3F90kA5DowPtbRtOecY0FRMcIg+WEOGPhHA/tFkF7GF3cY9R32x2LNYUk1Qidyeuw9ntIetwmOAQeTjHNJWHFeHyZjtPVsMmAEOiA9AnxFfqcIi6RZym8pSdm0xwiDzctIvaNnjCSYeA7cft629u5OgNeZDrE8Oh81Gi3NCKQr3779xkgkPk4a5PDIdGbe8VU1TZKHU4dAU2m+BYFD6V62/Ig+h8VJg00D6Ks7V9kbw7Y4JD5OF8NSqkDggDwGkqT3CkzICaJjP8NSqM7x8mdThEPSLWbNrGBIeIXEGcpmI9HPe3rdD+bzR5cAQ0ap6CybOICU5eSZ3bbxfn/y4iGRC3GucU16KJ28Xd2vYT9itf7p4iT9QnxBdJMYGwCe4/YswEh0gGEiP80S/MD2arjdvF3Vhtkxn5pfUAWP+GPJc4iuPu63CY4BDJgEKhwE3tJ52sAvc+6XizXSerIAhAUkwgYoO5PZw8k3iu2XGiChar+3YXZ4JDJBPTh7VfVR2vhM3G7eLuSFyYyekp8mRj40MQ7OsDQ0sbfmofkXRHTHCIZGLCgDD4a1SoajDhSJlB6nDoZ6w2wbFmgdNT5MnUKqWjwKg7T1MxwSGSCa1ahSntJx1OU7mfvJI61DW3IUinRkp/dg8nz3aTB2wXZ4JDJCM3ecjiP28kJp3ThkbBR8VTL3m2qUMioVQAhfoGnK9vkTqcTvF/GZGMTBsaBYUCOHzegApjq9Th0EWyCioAXFgrReTJQv01GNfPPhLprhdUTHCIZCQyUIvRfUMAuO9JxxuV1DTjZGUjVEoFpg1hgkPy4O5VjZngEMnMdG4Xdzs/tI/eXJcQimA/H4mjIeod4pT43lPVaG2zShzNpZjgEMnMTe1TIHuK3POk442yCu0JTvqwaIkjIeo99npOOrS22ZB9qkbqcC7BBIdIZpJjgxAbrENLmxXZp93vpONtjK1t2H+6FgAwnQkOyYhCoXDrqsZMcIhk5uKqxls5TSW5nSeqYLEJSIz0x4AIf6nDIepVNw29kOAIgnsVGGWCQyRDjqrGbnjS8TbiWihOT5EcTRoUAZ2PEufrW3Cs3Ch1OB0wwSGSoYkDL5x0jlc0SB2O17LaBGw7bk9wxMXfRHLiq1HhhsH2AqNbjlVIHE1HTHCIZEjno8KkgREAuJtKSnkldahvbkOwrw+rF5Ns/SLZPjrpVQlObW0t5s2bh6CgIISEhGDhwoVobGy87GOmTZsGhULR4fa73/2uwzElJSWYNWsW/Pz8EBUVhSeeeAIWi8WZb4XI44i7qcQtyuR64md/49BIqFm9mGRqelIUlArgaJnRraoaO/V/3Lx583D06FFs2bIFmzZtws6dO7F48eIrPm7RokUoLy933F5++WXHz6xWK2bNmgWz2Yy9e/figw8+wPvvv48VK1Y4860QeZzpSfarqvzSelQ2sKqxFMTRM+6eIjkLD9A6Rih/cKNRHKclOAUFBcjMzMQ777yD1NRUTJ48GW+88QY+++wzlJWVXfaxfn5+iImJcdyCgoIcP/v+++9x7NgxfPzxxxgzZgxuvvlmPPfcc1i9ejXMZrOz3g6Rx4kJ1mF0fAgEAfjhGKepXO1sTROKKhuhViocTVCJ5GpGcgwA4PtjeokjucBpCU52djZCQkIwfvx4x33p6elQKpXYv3//ZR/7ySefICIiAiNGjMDy5cvR3Nzc4XlHjhyJ6OgLV0QZGRkwGo04evRop89nMplgNBo73Ii8wYz2ufHNR93npOMtvj9qv5KdMCAMwb6sXkzyJq7D2X+6FoaWNomjsXNagqPX6xEV1XHXgFqtRlhYGPT6rk+2v/71r/Hxxx9j27ZtWL58OT766CPcd999HZ734uQGgOPvXT3vqlWrEBwc7LjFx8df7dsi8igZw+1XVXtPVaOh1T1OOt5CTCrFfwMiOUuI8MfgqABYbAK2H3ePEeMeJzhPP/30JYuAf34rLCy86oAWL16MjIwMjBw5EvPmzcOHH36IDRs24NSpU1f9nMuXL4fBYHDcSktLr/q5iDzJoKgAJEb6o80qYNvxKqnD8RpVDSbkltQBAGYM5/ob8g7iKM73brIOR93TBzz++ON44IEHLntMYmIiYmJiUFnZMYuzWCyora1FTEz3r2hSU1MBAEVFRRg4cCBiYmKQk5PT4ZiKCvuH2dXzarVaaLXabr8mkZxkDI/BW9tP4fujesweHSd1OF5hy7EKCAIwum8wYoN9pQ6HyCVmDI/B/20/hR3Hq2CyWKFVqySNp8cJTmRkJCIjr7xgLi0tDfX19cjNzUVKSgoAYOvWrbDZbI6kpTvy8/MBALGxsY7nfeGFF1BZWemYAtuyZQuCgoKQnJzcw3dDJH8zkqPx1vZT2O4mJx1vIE5PzeD0FHmRUX2CERWoRWWDCftO12KqxIvrnbYGZ9iwYZg5cyYWLVqEnJwc7NmzB0uWLMHcuXMRF2e/ijx//jySkpIcIzKnTp3Cc889h9zcXJw5cwYbN27E/PnzMWXKFIwaNQoAMGPGDCQnJ+M3v/kNDh48iM2bN+NPf/oTHn74YY7SEHVidN8QRAdp0WiyYK8bdvyVG2NrG/aeqgbA9TfkXZRKBdLFaSo32Njg1Do4n3zyCZKSkjB9+nTccsstmDx5Mt5++23Hz9va2nD8+HHHLimNRoMffvgBM2bMQFJSEh5//HHccccd+OabbxyPUalU2LRpE1QqFdLS0nDfffdh/vz5ePbZZ535Vog8llKpuDA3ftQ95sblbFthJdqsAgZG+mNQVIDU4RC5lHiu+aGgAjabtH3wejxF1RNhYWFYv359lz9PSEjo0AgwPj4eO3bsuOLz9u/fH999912vxEjkDTKGx+DjfSXYcqwCz88ZAZVSIXVIsiUmkRy9IW80cWA4/DUqVBhNOHzegNHxIZLFwtrhRF4gdUA4AnVqVDeakF9aJ3U4stXaZnVskWWCQ95Iq1Zh2lD7+lip628xwSHyAhq10tHNejOnqZxmT1E1msxWxAbrMKpvsNThEEkiY0QM/DQqWCSeomKCQ+QlxB09m4/qO0wNU+9x7J5KjoZCwWlA8k4Zw6OR98wv8IdbhkkaBxMcIi8xdUgkNGolztY0o1DfIHU4smOx2vBDAaeniLRqFXQ+0pejYIJD5CX8tWpMa69L8d3hcomjkZ8DZ+pQ22RGiJ8PJgwIkzocIq/HBIfIi8waZS+Y+e2hck5T9bJvD5cBsE9PqVU8tRJJjf8LibzI9GHR0KiVOF3dxGmqXmSx2pB5xL7+ZtYotsMgcgdMcIi8SMBF01TfHuI0VW/JKa5FdaN9emriwHCpwyEiMMEh8jriNNV3hzlN1Vu+bV/TNHN4DHw4PUXkFvg/kcjLXDxNVVDOaaprdfH01C0jYyWOhohETHCIvEyAVo0bh3I3VW/ZX1yLmiYzQv18kMbpKSK3wQSHyAuJIw3fcprqmm1qX8s0cwSnp4jcCf83Enmh6cOioVUrUcxpqmtin56yJzizRnL3FJE7YYJD5IUCtGpMa5+mEuu3UM9ln65BXXMbwvw1uD6Rxf2I3AkTHCIvJdZrYdG/qyeuYZo5IobF/YjcDP9HEnmp6UlR0PkocaamGYfOGaQOx+OYLTb8Ryzux91TRG6HCQ6Rl/LXqvGLZHtTyK/yz0scjefZeaIK9c1tiAzU4vpE7p4icjdMcIi82O1j7dNU3xwsh8Vqkzgaz7KhPSmcPToOKqVC4miI6OeY4BB5sRsGRyLMX4PqRhP2nKqROhyP0dDahh+OVQAAbh/bR+JoiKgzTHCIvJiPSulYP/L1T5ym6q7MI3qYLDYMjPTH8LggqcMhok4wwSHycnPap6k2H9WjxWyVOBrPIK5Zun1sHygUnJ4ickdMcIi83Lh+oYgP80WT2YotBRVSh+P2Koyt2Ns+nXfbGE5PEbkrJjhEXk6hUGBO+xf1V5ymuqKN+WUQBGB8/1DEh/lJHQ4RdYEJDhE5RiJ2nqhCbZNZ4mjc24b2JHAOFxcTuTUmOESEQVEBGNknGBabgE2H2LqhKycrGnCs3Ai1UsHifkRujgkOEQG4MCLxz9xzEkfivsTPZtrQKIT6aySOhoguhwkOEQEA5oyJg49KgUPnDCgoN0odjttps9rwrzz79NTd4/tKHA0RXQkTHCICAIQHaJE+LBoA8OWPHMX5ue3Hq1DdaEJEgAY3JkVJHQ4RXQETHCJyuHt8PABgw0/nYLawdcPFPj9QCgD41bi+8GHncCK3x/+lRORww+AIRAdpUdfchh9YE8ehsqEV245XAgDuSuH0FJEnYIJDRA5qlRJ3tn+Bf/FjqcTRuI8NeedhtQkY2y8Eg6MDpQ6HiLrBqQlObW0t5s2bh6CgIISEhGDhwoVobGzs8vgzZ85AoVB0evvyyy8dx3X2888++8yZb4XIa9yVYp+m2nmiCuWGFomjkZ4gCI5kT5zCIyL359QEZ968eTh69Ci2bNmCTZs2YefOnVi8eHGXx8fHx6O8vLzD7S9/+QsCAgJw8803dzj2vffe63DcnDlznPlWiLxGQoQ/JgwIg00A/sUt48grqcepqibofJT45SjWviHyFGpnPXFBQQEyMzNx4MABjB8/HgDwxhtv4JZbbsGrr76KuLi4Sx6jUqkQExPT4b4NGzbg7rvvRkBAQIf7Q0JCLjmWiHrHPePjkVNciy9+PIffTxsEpdJ7G0p+mlMCALhlZCwCdT4SR0NE3eW0EZzs7GyEhIQ4khsASE9Ph1KpxP79+7v1HLm5ucjPz8fChQsv+dnDDz+MiIgITJgwAevWrYMgCF0+j8lkgtFo7HAjoq7Zv8zVKKltxs6TVVKHI5n6ZjO+OWiv7DwvtZ/E0RBRTzgtwdHr9YiK6lgrQq1WIywsDHq9vlvP8e6772LYsGGYOHFih/ufffZZfPHFF9iyZQvuuOMO/P73v8cbb7zR5fOsWrUKwcHBjlt8POfRiS7HV6NyrMX5eN9ZiaORzj9zz8FksWFYbBDG9QuVOhwi6oEeJzhPP/10lwuBxVthYeE1B9bS0oL169d3OnrzzDPPYNKkSRg7diyeeuopPPnkk3jllVe6fK7ly5fDYDA4bqWl3B1CdCXzrrePWGQVVqK0tlniaFzPZhMcyd1vru8PhcJ7p+mIPFGP1+A8/vjjeOCBBy57TGJiImJiYlBZWdnhfovFgtra2m6tnfnnP/+J5uZmzJ8//4rHpqam4rnnnoPJZIJWq73k51qtttP7iahrAyMDMHlQBHYXVWN9TgmempkkdUgutedUNc7UNCNQq8ZtYy5dM0hE7q3HCU5kZCQiIyOveFxaWhrq6+uRm5uLlJQUAMDWrVths9mQmpp6xce/++67mD17drdeKz8/H6GhoUxiiHrZfdf3x+6ianx+oBRL0wdDq1ZJHZLLfJRtH7351bg+8Nc6bT8GETmJ09bgDBs2DDNnzsSiRYuQk5ODPXv2YMmSJZg7d65jB9X58+eRlJSEnJycDo8tKirCzp078eCDD17yvN988w3eeecdHDlyBEVFRXjrrbfw17/+FY888oiz3gqR10ofFoXYYB1qm8z47nC51OG4TFl9i6OS833X95c4GiK6Gk6tg/PJJ58gKSkJ06dPxy233ILJkyfj7bffdvy8ra0Nx48fR3Nzx/n9devWoW/fvpgxY8Ylz+nj44PVq1cjLS0NY8aMwT/+8Q+89tprWLlypTPfCpFXUquU+PUE+1qcD7O9Z7HxJ/vPwiYA1yeGsXIxkYdSCJfbXy1TRqMRwcHBMBgMCAoKkjocIrdW2dCKSS9uRZtVwIbfT8RYme8majZbMPHFrahvbsOa+8Zh5ggW9yNyFz35/mYvKiK6rKhAHWaP7gMAeGdXscTRON+/8s6jvrkN/cL88ItkFhMl8lRMcIjoih68YQAA4D9HymW9ZdxmE7Butz2J++2kBKi8uIIzkadjgkNEVzQsNgg3DI6ATQDe3S3fUZyswkoUVzchSKfGXWysSeTRmOAQUbcsuiERAPDFj6UwNLdJHI1zrN11GgDw69T+3BpO5OGY4BBRt9wwOAJJMYFoNlvxSY78dlQdLK1HTnEt1EoF7p/IreFEno4JDhF1i0KhwIPtozjv7TmD1jarxBH1rje3FQEAZo+JQ2ywr8TRENG1YoJDRN02e3Qc+oT4oqrBhM9ySqQOp9cUlBux5VgFFArg99MGSR0OEfUCJjhE1G0atRIPTRsIAHhrxynZjOK8udU+ejNrZCwGRQVIHA0R9QYmOETUI3eN74vYYB0qjCZ8mXtO6nCuWVFlA747Ym9DseQmjt4QyQUTHCLqEa1adWEUZ1sRzBabxBFdmze3FkEQgBnJ0UiKYWVzIrlggkNEPXb3+HhEBWpRZmjFl7mlUodz1Y7rG/D1wTIAwCM3DZY4GiLqTUxwiKjHdD4XRnFezzqJFrNnrsV5ZfNxCAJw84gYjOwbLHU4RNSLmOAQ0VX5dWo/9A31RYXRhHV7PK+68Y9navFDQQWUCuDxGUOlDoeIehkTHCK6Klq1Ck9k2BODt7afQk2jSeKIuk8QBLyUWQjAPt3GnVNE8sMEh4iu2q2j4jCyTzAaTRa80b7V2hNkFVTiwJk6aNVKPJrOtTdEcsQEh4iumlKpwNM3JwEAPtl/FsXVTRJHdGUmixXPf3sMAPDApARWLSaSKSY4RHRNJg2KwI1DI9FmFbBy41EIgiB1SJf1zq5inKlpRlSgFktuZN0bIrligkNE12zlrcOhUSux80QVMo/opQ6nS+WGFkfV4uW3JCFQ5yNxRETkLExwiOiaJUT443dT7dvGn910DM1mi8QRde75TQVoabNifP9QzBnTR+pwiMiJmOAQUa/4/bSBiA/zRbmhFf+z5YTU4Vwi84ge3x4uh0qpwJ9nD4dCoZA6JCJyIiY4RNQrdD4qPDt7BADgnd3F+PFMrcQRXWBobsMzXx8BACyekogRfVjUj0jumOAQUa+5MSkKd6b0hSAA//3lQbeZqnp20zFUNZiQGOmPR6dzWziRN2CCQ0S9asWtyYgL1uFMTTNe/E+h1OFg06Ey/CvvHBQK4JU7R0Hno5I6JCJyASY4RNSrgnQ+eOnOUQCAD7PPIvNIuWSxlNQ0Y/m/DgMAHpo6ECn9wySLhYhciwkOEfW6GwZHYvGURADAE18ekqQAoMlixSOf/YQGkwUp/UOx7BdDXB4DEUmHCQ4ROcUTGUMxISEMDSYLHvo4F00m163HEQQBf9xwBAdL6xHs64PX7x0LtYqnOyJvwv/xROQUPiol3vj1WEQEaFGob8CS9XmwWG0uee1/7DyNf+aeg1IBvH7vWPQJYTsGIm/DBIeInCY6SIe356dAq1Zi2/Eq/OmrI05v5bDhp3OOTuErbx2OqUMinfp6ROSemOAQkVON6xeKN+4dC6UC+OxAKf7yzTGnJTnfHirH418chCAAD0xMwP0TE5zyOkTk/pjgEJHTzRgegxduHwkAeH/vGfzxqyOw2no3yfln7jk8+tlPsAnA3eP7YsUvk3v1+YnIszDBISKXuHdCP7x85ygoFMD6/SV48IMDMLa2XfPz2mwC/v7DCfz3lwdhsQn41dg+WPWrUVAq2YqByJs5LcF54YUXMHHiRPj5+SEkJKRbjxEEAStWrEBsbCx8fX2Rnp6OkydPdjimtrYW8+bNQ1BQEEJCQrBw4UI0NjY64R0QUW+7e3w83rh3rGNNzpw39+Cnkrqrfr6qBhMeeP8A/v6D/Tzxu6kD8epdo6FickPk9ZyW4JjNZtx111146KGHuv2Yl19+Ga+//jrWrFmD/fv3w9/fHxkZGWhtbXUcM2/ePBw9ehRbtmzBpk2bsHPnTixevNgZb4GInOCXo+Lwz99NRGywDqerm3DHW3vx3KZjqGsyd/s5LFYbPso+g/TXdmDniSrofJR46Y6RePrmJI7cEBEAQCE4eUvD+++/j6VLl6K+vv6yxwmCgLi4ODz++OP47//+bwCAwWBAdHQ03n//fcydOxcFBQVITk7GgQMHMH78eABAZmYmbrnlFpw7dw5xcXHdisloNCI4OBgGgwFBQUHX9P6I6OrUN5vx541H8VV+GQAgQKvG3OvicUdKXyTFBHba7bvc0IJNB8vx/t4zOF/fAgAYFhuE1+eOweDoQJfGT0Su15Pvb7WLYrqi4uJi6PV6pKenO+4LDg5GamoqsrOzMXfuXGRnZyMkJMSR3ABAeno6lEol9u/fj9tvv73T5zaZTDCZTI6/G41G570RIuqWED8N/j53LOaM7YOXM4/jWLkR7+wuxju7ixERoMXIPkGIDtJBoVCgvtmMExUNOFV1oSJymL8GS9MH49cT+rGIHxFdwm0SHL1eDwCIjo7ucH90dLTjZ3q9HlFRUR1+rlarERYW5jimM6tWrcJf/vKXXo6YiHrDtKFRmDI4EtuOV+LLH89h6/FKVDeasO141SXHKhT2bed3jOuLX43rw8aZRNSlHiU4Tz/9NF566aXLHlNQUICkpKRrCqq3LV++HMuWLXP83Wg0Ij4+XsKIiOhiSqUC04dFY/qwaLS2WXHkvAEnKhpR3WgfeQ3QqjEwKgAj4oIQHqCVOFoi8gQ9SnAef/xxPPDAA5c9JjEx8aoCiYmJAQBUVFQgNjbWcX9FRQXGjBnjOKaysrLD4ywWC2prax2P74xWq4VWy5MikSfQ+agwPiEM4xPY+ZuIrl6PEpzIyEhERjqn7PmAAQMQExODrKwsR0JjNBqxf/9+x06stLQ01NfXIzc3FykpKQCArVu3wmazITU11SlxERERkedx2sq8kpIS5Ofno6SkBFarFfn5+cjPz+9QsyYpKQkbNmwAACgUCixduhTPP/88Nm7ciMOHD2P+/PmIi4vDnDlzAADDhg3DzJkzsWjRIuTk5GDPnj1YsmQJ5s6d2+0dVERERCR/TltkvGLFCnzwwQeOv48dOxYAsG3bNkybNg0AcPz4cRgMBscxTz75JJqamrB48WLU19dj8uTJyMzMhE6ncxzzySefYMmSJZg+fTqUSiXuuOMOvP766856G0REROSBnF4Hxx2xDg4REZHn6cn3N4tHEBERkewwwSEiIiLZYYJDREREssMEh4iIiGSHCQ4RERHJDhMcIiIikh0mOERERCQ7THCIiIhIdpjgEBERkew4rVWDOxOLNxuNRokjISIiou4Sv7e704TBKxOchoYGAEB8fLzEkRAREVFPNTQ0IDg4+LLHeGUvKpvNhrKyMgQGBkKhUPTqcxuNRsTHx6O0tJR9rpyIn7Nr8HN2DX7OrsHP2XWc9VkLgoCGhgbExcVBqbz8KhuvHMFRKpXo27evU18jKCiI/4FcgJ+za/Bzdg1+zq7Bz9l1nPFZX2nkRsRFxkRERCQ7THCIiIhIdpjg9DKtVouVK1dCq9VKHYqs8XN2DX7OrsHP2TX4ObuOO3zWXrnImIiIiOSNIzhEREQkO0xwiIiISHaY4BAREZHsMMEhIiIi2WGC04tWr16NhIQE6HQ6pKamIicnR+qQZGXVqlW47rrrEBgYiKioKMyZMwfHjx+XOizZe/HFF6FQKLB06VKpQ5Gl8+fP47777kN4eDh8fX0xcuRI/Pjjj1KHJStWqxXPPPMMBgwYAF9fXwwcOBDPPfdct/oZUdd27tyJW2+9FXFxcVAoFPjqq686/FwQBKxYsQKxsbHw9fVFeno6Tp486bL4mOD0ks8//xzLli3DypUrkZeXh9GjRyMjIwOVlZVShyYbO3bswMMPP4x9+/Zhy5YtaGtrw4wZM9DU1CR1aLJ14MAB/OMf/8CoUaOkDkWW6urqMGnSJPj4+OA///kPjh07hr/97W8IDQ2VOjRZeemll/DWW2/hzTffREFBAV566SW8/PLLeOONN6QOzaM1NTVh9OjRWL16dac/f/nll/H6669jzZo12L9/P/z9/ZGRkYHW1lbXBChQr5gwYYLw8MMPO/5utVqFuLg4YdWqVRJGJW+VlZUCAGHHjh1ShyJLDQ0NwuDBg4UtW7YIU6dOFR599FGpQ5Kdp556Spg8ebLUYcjerFmzhN/+9rcd7vvVr34lzJs3T6KI5AeAsGHDBsffbTabEBMTI7zyyiuO++rr6wWtVit8+umnLomJIzi9wGw2Izc3F+np6Y77lEol0tPTkZ2dLWFk8mYwGAAAYWFhEkciTw8//DBmzZrV4feaetfGjRsxfvx43HXXXYiKisLYsWOxdu1aqcOSnYkTJyIrKwsnTpwAABw8eBC7d+/GzTffLHFk8lVcXAy9Xt/h/BEcHIzU1FSXfS96ZbPN3lZdXQ2r1Yro6OgO90dHR6OwsFCiqOTNZrNh6dKlmDRpEkaMGCF1OLLz2WefIS8vDwcOHJA6FFk7ffo03nrrLSxbtgx/+MMfcODAAfzXf/0XNBoN7r//fqnDk42nn34aRqMRSUlJUKlUsFqteOGFFzBv3jypQ5MtvV4PAJ1+L4o/czYmOOSRHn74YRw5cgS7d++WOhTZKS0txaOPPootW7ZAp9NJHY6s2Ww2jB8/Hn/9618BAGPHjsWRI0ewZs0aJji96IsvvsAnn3yC9evXY/jw4cjPz8fSpUsRFxfHz1nGOEXVCyIiIqBSqVBRUdHh/oqKCsTExEgUlXwtWbIEmzZtwrZt29C3b1+pw5Gd3NxcVFZWYty4cVCr1VCr1dixYwdef/11qNVqWK1WqUOUjdjYWCQnJ3e4b9iwYSgpKZEoInl64okn8PTTT2Pu3LkYOXIkfvOb3+Cxxx7DqlWrpA5NtsTvPim/F5ng9AKNRoOUlBRkZWU57rPZbMjKykJaWpqEkcmLIAhYsmQJNmzYgK1bt2LAgAFShyRL06dPx+HDh5Gfn++4jR8/HvPmzUN+fj5UKpXUIcrGpEmTLil1cOLECfTv31+iiOSpubkZSmXHrzuVSgWbzSZRRPI3YMAAxMTEdPheNBqN2L9/v8u+FzlF1UuWLVuG+++/H+PHj8eECRPw97//HU1NTViwYIHUocnGww8/jPXr1+Prr79GYGCgYx43ODgYvr6+EkcnH4GBgZesa/L390d4eDjXO/Wyxx57DBMnTsRf//pX3H333cjJycHbb7+Nt99+W+rQZOXWW2/FCy+8gH79+mH48OH46aef8Nprr+G3v/2t1KF5tMbGRhQVFTn+XlxcjPz8fISFhaFfv35YunQpnn/+eQwePBgDBgzAM888g7i4OMyZM8c1Abpkr5aXeOONN4R+/foJGo1GmDBhgrBv3z6pQ5IVAJ3e3nvvPalDkz1uE3eeb775RhgxYoSg1WqFpKQk4e2335Y6JNkxGo3Co48+KvTr10/Q6XRCYmKi8Mc//lEwmUxSh+bRtm3b1uk5+f777xcEwb5V/JlnnhGio6MFrVYrTJ8+XTh+/LjL4lMIAks5EhERkbxwDQ4RERHJDhMcIiIikh0mOERERCQ7THCIiIhIdpjgEBERkewwwSEiIiLZYYJDREREssMEh4iIiGSHCQ4RERHJDhMcIiIikh0mOERERCQ7THCIiIhIdv4/PI2wfcCbA7cAAAAASUVORK5CYII=",
910
+ "text/plain": [
911
+ "<Figure size 640x480 with 1 Axes>"
912
+ ]
913
+ },
914
+ "metadata": {},
915
+ "output_type": "display_data"
916
+ }
917
+ ],
918
+ "source": [
919
+ "# generate sin of shape (1,5000)\n",
920
+ "x = np.linspace(0, 10, 5000)\n",
921
+ "y = np.sin(x)\n",
922
+ "\n",
923
+ "y_resampled = resample_waveform(y, 1000, 100)\n",
924
+ "# plot sin\n",
925
+ "plt.plot(x, y)\n",
926
+ "plt.plot(x, y_resampled)"
927
+ ]
928
  }
929
  ],
930
  "metadata": {
app.py CHANGED
@@ -7,6 +7,7 @@ from phasehunter.data_preparation import prepare_waveform
7
  import torch
8
  import io
9
 
 
10
  from scipy.stats import gaussian_kde
11
  from bmi_topography import Topography
12
  import earthpy.spatial as es
@@ -31,10 +32,38 @@ from mpl_toolkits.axes_grid1 import ImageGrid
31
  from glob import glob
32
 
33
 
34
- def make_prediction(waveform):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  waveform = np.load(waveform)
 
 
36
  if len(waveform.shape) == 1:
37
  waveform = waveform.reshape(1, waveform.shape[0])
 
 
 
 
38
 
39
  orig_waveform = waveform[:, :6000].copy()
40
  processed_input = prepare_waveform(waveform)
@@ -49,12 +78,14 @@ def make_prediction(waveform):
49
  return processed_input, p_phase, s_phase, orig_waveform
50
 
51
 
52
- def mark_phases(waveform, uploaded_file, p_thres, s_thres):
53
 
54
  if uploaded_file is not None:
55
  waveform = uploaded_file.name
56
 
57
- processed_input, p_phase, s_phase, orig_waveform = make_prediction(waveform)
 
 
58
 
59
  # Create a plot of the waveform with the phases marked
60
  if sum(processed_input[0][2] == 0): # if input is 1C
@@ -73,7 +104,6 @@ def mark_phases(waveform, uploaded_file, p_thres, s_thres):
73
  ax[1].set_ylabel("N")
74
  ax[2].set_ylabel("E")
75
 
76
- print(p_phase.std().item() * 60)
77
  do_we_have_p = p_phase.std().item() * 60 < p_thres
78
  if do_we_have_p:
79
  p_phase_plot = p_phase * processed_input.shape[-1]
@@ -577,8 +607,17 @@ with gr.Blocks() as demo:
577
  info="Acceptable uncertainty for S picks expressed in std() seconds",
578
  interactive=True,
579
  )
580
-
581
- upload = gr.File(label="Or upload your own waveform")
 
 
 
 
 
 
 
 
 
582
 
583
  button = gr.Button("Predict phases")
584
  outputs = gr.Image(
@@ -587,7 +626,13 @@ with gr.Blocks() as demo:
587
 
588
  button.click(
589
  mark_phases,
590
- inputs=[inputs, upload, P_thres_inputs, S_thres_inputs],
 
 
 
 
 
 
591
  outputs=outputs,
592
  )
593
 
 
7
  import torch
8
  import io
9
 
10
+ from scipy.signal import resample
11
  from scipy.stats import gaussian_kde
12
  from bmi_topography import Topography
13
  import earthpy.spatial as es
 
32
  from glob import glob
33
 
34
 
35
+ def resample_waveform(waveform, original_freq, target_freq):
36
+ """
37
+ Resample a waveform from original frequency to target frequency using SciPy's resample function.
38
+
39
+ Args:
40
+ waveform (numpy.ndarray): The input waveform as a 1D array.
41
+ original_freq (float): The original sampling frequency of the waveform.
42
+ target_freq (float): The target sampling frequency of the waveform.
43
+
44
+ Returns:
45
+ resampled_waveform (numpy.ndarray): The resampled waveform as a 1D array.
46
+ """
47
+ # Calculate the resampling ratio
48
+ resampling_ratio = target_freq / original_freq
49
+ # Calculate the new length of the resampled waveform
50
+ resampled_length = int(waveform.shape[-1] * resampling_ratio)
51
+ # Resample the waveform using SciPy's resample function
52
+ resampled_waveform = resample(waveform, resampled_length, axis=-1)
53
+
54
+ return resampled_waveform
55
+
56
+
57
+ def make_prediction(waveform, sampling_rate):
58
  waveform = np.load(waveform)
59
+ print("Loaded", waveform.shape)
60
+
61
  if len(waveform.shape) == 1:
62
  waveform = waveform.reshape(1, waveform.shape[0])
63
+ print("Reshaped", waveform.shape)
64
+ if sampling_rate != 100:
65
+ waveform = resample_waveform(waveform, sampling_rate, 100)
66
+ print("Resampled", waveform.shape)
67
 
68
  orig_waveform = waveform[:, :6000].copy()
69
  processed_input = prepare_waveform(waveform)
 
78
  return processed_input, p_phase, s_phase, orig_waveform
79
 
80
 
81
+ def mark_phases(waveform, uploaded_file, p_thres, s_thres, sampling_rate):
82
 
83
  if uploaded_file is not None:
84
  waveform = uploaded_file.name
85
 
86
+ processed_input, p_phase, s_phase, orig_waveform = make_prediction(
87
+ waveform, sampling_rate
88
+ )
89
 
90
  # Create a plot of the waveform with the phases marked
91
  if sum(processed_input[0][2] == 0): # if input is 1C
 
104
  ax[1].set_ylabel("N")
105
  ax[2].set_ylabel("E")
106
 
 
107
  do_we_have_p = p_phase.std().item() * 60 < p_thres
108
  if do_we_have_p:
109
  p_phase_plot = p_phase * processed_input.shape[-1]
 
607
  info="Acceptable uncertainty for S picks expressed in std() seconds",
608
  interactive=True,
609
  )
610
+ with gr.Column(scale=1):
611
+ upload = gr.File(label="Or upload your own waveform")
612
+ sampling_rate_inputs = gr.Slider(
613
+ minimum=10,
614
+ maximum=1000,
615
+ value=100,
616
+ label="Samlping rate, Hz",
617
+ step=10,
618
+ info="Sampling rate of the waveform",
619
+ interactive=True,
620
+ )
621
 
622
  button = gr.Button("Predict phases")
623
  outputs = gr.Image(
 
626
 
627
  button.click(
628
  mark_phases,
629
+ inputs=[
630
+ inputs,
631
+ upload,
632
+ P_thres_inputs,
633
+ S_thres_inputs,
634
+ sampling_rate_inputs,
635
+ ],
636
  outputs=outputs,
637
  )
638