From 3b15a008d5001cf166054230e72c47209844e6e8 Mon Sep 17 00:00:00 2001 From: Mohammadreza Kamyab Date: Mon, 14 Feb 2022 07:48:43 -0600 Subject: [PATCH 1/3] some suggestions --- .gitignore | 6 +- examples/build_a_well_from_sections.py | 2 +- setup.py | 11 +- .../error_mwdrev4_1_iscwsa_data.json | 1745 +++++++++++++- ...ror_mwdrev4_iscwsa_validation_results.xlsx | Bin 17882 -> 0 bytes .../error_mwdrev5_1_iscwsa_data.json | 2001 ++++++++++++++++- ...ror_mwdrev5_iscwsa_validation_results.xlsx | Bin 21243 -> 0 bytes welleng/errors/tool_errors.py | 9 +- welleng/survey.py | 65 +- welleng/utils.py | 33 +- 10 files changed, 3814 insertions(+), 58 deletions(-) delete mode 100644 tests/test_data/error_mwdrev4_iscwsa_validation_results.xlsx delete mode 100644 tests/test_data/error_mwdrev5_iscwsa_validation_results.xlsx diff --git a/.gitignore b/.gitignore index 9ac4073..6b067b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ .venv .vscode +.devcontainer/ + __pycache__ build @@ -16,4 +18,6 @@ work key.asc .~* -VERSION* \ No newline at end of file +VERSION* + +test/test_data/*.xlsx diff --git a/examples/build_a_well_from_sections.py b/examples/build_a_well_from_sections.py index 4518268..b07fc69 100644 --- a/examples/build_a_well_from_sections.py +++ b/examples/build_a_well_from_sections.py @@ -85,7 +85,7 @@ # make a mesh mesh = WellMesh(survey, method='circle') - + # finally, plot it plot([mesh.mesh], interactive=False) diff --git a/setup.py b/setup.py index 3cc39df..661b459 100644 --- a/setup.py +++ b/setup.py @@ -52,12 +52,15 @@ # if someone wants to output a requirements file # `python setup.py --list-all > requirements.txt` -if '--list-all' in sys.argv: - # will not include default requirements (numpy) - print('\n'.join(requirements_all)) +if '--list-default' in sys.argv: + print('\n'.join(requirements_default)) + exit() +elif '--list-all' in sys.argv: + requirements = requirements_all.union(requirements_default) + print('\n'.join(requirements)) exit() elif '--list-easy' in sys.argv: - # again will not include numpy+setuptools + requirements = requirements_easy.union(requirements_default) print('\n'.join(requirements_easy)) exit() diff --git a/tests/test_data/error_mwdrev4_1_iscwsa_data.json b/tests/test_data/error_mwdrev4_1_iscwsa_data.json index dba9ffc..b6ac347 100644 --- a/tests/test_data/error_mwdrev4_1_iscwsa_data.json +++ b/tests/test_data/error_mwdrev4_1_iscwsa_data.json @@ -1 +1,1744 @@ -{"header": {"name": null, "latitude": 60, "longitude": 0.0098, "altitude": 0.0, "survey_date": "2020-12-30", "b_total": 50000, "dip": 1.2566370614359172, "convergence": 0.0, "declination": -0.06981317007977318, "vertical_inc_limit": 1.7453292519943296e-06, "depth_unit": "meters", "surface_unit": "meters", "G": 9.80665, "azi_reference": "true"}, "survey": {"md": [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360, 390, 420, 450, 480, 510, 540, 570, 600, 630, 660, 690, 720, 750, 780, 810, 840, 870, 900, 930, 960, 990, 1020, 1050, 1080, 1110, 1140, 1170, 1200, 1230, 1260, 1290, 1320, 1350, 1380, 1410, 1440, 1470, 1500, 1530, 1560, 1590, 1620, 1650, 1680, 1710, 1740, 1770, 1800, 1830, 1860, 1890, 1920, 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310, 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2640, 2670, 2700, 2730, 2760, 2790, 2820, 2850, 2880, 2910, 2940, 2970, 3000, 3030, 3060, 3090, 3120, 3150, 3180, 3210, 3240, 3270, 3300, 3330, 3360, 3390, 3420, 3450, 3480, 3510, 3540, 3570, 3600, 3630, 3660, 3690, 3720, 3750, 3780, 3810, 3840, 3870, 3900, 3930, 3960, 3990, 4020, 4050, 4080, 4110, 4140, 4170, 4200, 4230, 4260, 4290, 4320, 4350, 4380, 4410, 4440, 4470, 4500, 4530, 4560, 4590, 4620, 4650, 4680, 4710, 4740, 4770, 4800, 4830, 4860, 4890, 4920, 4950, 4980, 5010, 5040, 5070, 5100, 5130, 5160, 5190, 5220, 5250, 5280, 5310, 5340, 5370, 5400, 5430, 5460, 5490, 5520, 5550, 5580, 5610, 5640, 5670, 5700, 5730, 5760, 5790, 5820, 5850, 5880, 5910, 5940, 5970, 6000, 6030, 6060, 6090, 6120, 6150, 6180, 6210, 6240, 6270, 6300, 6330, 6360, 6390, 6420, 6450, 6480, 6510, 6540, 6570, 6600, 6630, 6660, 6690, 6720, 6750, 6780, 6810, 6840, 6870, 6900, 6930, 6960, 6990, 7020, 7050, 7080, 7110, 7140, 7170, 7200, 7230, 7260, 7290, 7320, 7350, 7380, 7410, 7440, 7470, 7500, 7530, 7560, 7590, 7620, 7650, 7680, 7710, 7740, 7770, 7800, 7830, 7860, 7890, 7920, 7950, 7980, 8000], "inc": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90], "azi": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75]}, "vd": {"md": [1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000, 8000], "source": ["ABXY-TI1S", "ABXY-TI2S", "ABZ", "ASXY-TI1S", "ASXY-TI2S", "ASXY-TI3S", "ASZ", "MBXY-TI1S", "MBXY-TI2S", "MBZ", "MSXY-TI1S", "MSXY-TI2S", "MSXY-TI3S", "MSZ", "DECG", "DECR", "DBHG", "DBHR", "AMIL", "XYM1", "XYM2", "XYM3", "XYM4", "DRFR", "DSFS", "DSTG", "SAG", "Totals", "ABXY-TI1S", "ABXY-TI2S", "ABZ", "ASXY-TI1S", "ASXY-TI2S", "ASXY-TI3S", "ASZ", "MBXY-TI1S", "MBXY-TI2S", "MBZ", "MSXY-TI1S", "MSXY-TI2S", "MSXY-TI3S", "MSZ", "DECG", "DECR", "DBHG", "DBHR", "AMIL", "XYM1", "XYM2", "XYM3", "XYM4", "DRFR", "DSFS", "DSTG", "SAG", "Totals", "ABXY-TI1S", "ABXY-TI2S", "ABZ", "ASXY-TI1S", "ASXY-TI2S", "ASXY-TI3S", "ASZ", "MBXY-TI1S", "MBXY-TI2S", "MBZ", "MSXY-TI1S", "MSXY-TI2S", "MSXY-TI3S", "MSZ", "DECG", "DECR", "DBHG", "DBHR", "AMIL", "XYM1", "XYM2", "XYM3", "XYM4", "DRFR", "DSFS", "DSTG", "SAG", "Totals", "ABXY-TI1S", "ABXY-TI2S", "ABZ", "ASXY-TI1S", "ASXY-TI2S", "ASXY-TI3S", "ASZ", "MBXY-TI1S", "MBXY-TI2S", "MBZ", "MSXY-TI1S", "MSXY-TI2S", "MSXY-TI3S", "MSZ", "DECG", "DECR", "DBHG", "DBHR", "AMIL", "XYM1", "XYM2", "XYM3", "XYM4", "DRFR", "DSFS", "DSTG", "SAG", "Totals"], "nn": [0.2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.2775, 0, 0, 0, 0, 0, 4.5111, 0.8808, 0.0353, 0.1213, 0.0462, 0.0231, 0.0016, 0.0924, 1.9152, 0.1287, 1.2861, 0.4237, 0.1128, 0.1229, 0.8474, 6.8003, 0.022, 5.4949, 0.0831, 12.7039, 0.0212, 0.5247, 11.2525, 0.0022, 0.0062, 0.0039, 0.0071, 0.0847, 43.0442, 6.5736, 0.0316, 10.008, 2.0593, 1.0296, 0.0012, 4.1186, 48.5001, 6.3917, 116.6281, 22.6961, 6.2112, 5.3009, 45.3922, 337.6662, 0.2139, 272.8462, 0.8063, 1152.0003, 0.5363, 26.0545, 34.6306, 0.1402, 0.0064, 0.1926, 0.7056, 2.1453, 2102.8867, 7.0321, 0.2114, 43.4534, 2.2686, 1.1343, 0.1262, 4.5371, 52.8759, 24.3873, 535.6945, 31.0317, 4.9596, 13.3796, 62.0635, 1288.3506, 0.4585, 1041.0326, 1.7284, 5291.3497, 0.5847, 99.4098, 36.1537, 0.1573, 0.0084, 0.7348, 2.3143, 2.3388, 8547.7769], "ee": [0, 0.2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.2775, 0, 0, 0, 0, 4.5111, 0.0201, 0.2914, 0.0018, 0.0012, 0.0006, 0.0001, 0.0023, 0.1375, 0.0092, 0.0923, 0.0304, 0.0081, 0.0088, 0.0608, 0.4882, 0.0016, 0.3945, 0.006, 0.9121, 0.295, 0.0377, 0.0022, 10.1818, 0.0868, 0.054, 0.0994, 1.1799, 14.4041, 0.0005, 0.2885, 0.0266, 0.003, 0.0015, 0.0001, 0.0061, 3.4822, 0.4589, 8.3735, 1.6295, 0.4459, 0.3806, 3.259, 24.2433, 0.0154, 19.5895, 0.0579, 82.7099, 7.4699, 1.8706, 0.1402, 21.0459, 0.0886, 2.6823, 9.828, 29.8795, 217.9769, 0.0001, 0.1341, 1.1056, 0.0043, 0.0021, 0.0091, 0.0085, 3.7963, 1.7509, 38.4611, 2.228, 0.3561, 0.9606, 4.456, 92.4994, 0.0329, 74.7428, 0.1241, 379.9018, 8.1438, 7.1373, 0.1573, 21.5203, 0.1175, 10.2341, 32.2338, 32.5753, 712.6932], "vv": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1225, 0.4516, 0.1296, 0, 0.7037, 0.0173, 0, 0.0116, 0.0043, 0.0022, 0, 0.0087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2123, 0, 0.0212, 0.295, 0.0337, 1.1854, 0.8121, 0.8492, 3.453, 0.4373, 0, 1.0515, 0.2149, 0.1074, 0, 0.4297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.2524, 0, 0.5363, 7.4699, 0.0319, 3.7201, 6.6901, 77.0098, 116.9514, 0.4767, 0, 4.8297, 0.2373, 0.1187, 0, 0.4746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88.43, 0, 0.5847, 8.1438, 0.0042, 3.8878, 7.2192, 353.7202, 468.127], "ne": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1332, -0.1014, 0.0149, 0.0073, 0.0037, -0.0004, 0.0147, -0.5132, -0.0345, -0.3446, -0.1135, -0.0302, -0.0329, -0.2271, -1.8221, -0.0059, -1.4723, -0.0223, -3.404, 0.079, -0.1406, -0.1584, -0.1507, 0.0233, 0.0145, 0.0266, 0.3161, -7.9409, 0.0592, -0.0955, -0.5159, -0.079, -0.0395, -0.0003, -0.1581, -12.9956, -1.7127, -31.2504, -6.0814, -1.6643, -1.4204, -12.1628, -90.4774, -0.0573, -73.1089, -0.216, -308.6776, 2.0015, -6.9813, -2.2037, -1.7179, 0.0237, 0.7187, 2.6334, 8.0062, -538.1731, 0.028, 0.1684, -6.9314, -0.0985, -0.0492, -0.0338, -0.1969, -14.1681, -6.5346, -143.5389, -8.3149, -1.3289, -3.585, -16.6299, -345.2125, -0.1228, -278.9439, -0.4631, -1417.8129, 2.1821, -26.6368, -2.3846, -1.8397, 0.0315, 2.7422, 8.637, 8.7285, -2252.3087], "nv": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.1233, 0, -0.0375, -0.0141, -0.0071, 0, -0.0283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.0671, 0, -0.4882, 0.0256, 0.0136, 0.0678, 0.0761, -0.2682, -0.8506, -1.6954, 0, -3.244, -0.6652, -0.3326, 0, -1.3303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.2133, 0, -4.3096, 1.0235, 0.0133, 0.8464, 2.1727, -12.8532, -23.5877, -1.8309, 0, -14.4869, -0.7337, -0.3669, 0, -1.4675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.1906, 0, -4.5977, 1.1317, -0.0006, 1.6902, 4.0874, -28.7625, -52.528], "ev": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.0186, 0, -0.0046, -0.0022, -0.0011, 0, -0.0045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.2503, 0, 0.0069, -1.733, 0.0507, 0.253, 0.2841, -1.001, -2.4206, -0.0153, 0, 0.1672, 0.0255, 0.0128, 0, 0.0511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.9922, 0, 0.2742, -12.5383, 0.0497, 3.1589, 8.1087, -47.9689, -60.6667, -0.0073, 0, 2.3108, 0.0318, 0.0159, 0, 0.0637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26.8358, 0, 0.3032, -13.2385, -0.0023, 6.3078, 15.2545, -107.3431, -123.139]}} \ No newline at end of file +{ + "header": { + "name": null, + "latitude": 60, + "longitude": 0.0098, + "altitude": 0.0, + "survey_date": "2020-12-30", + "b_total": 50000, + "dip": 1.2566370614359172, + "convergence": 0.0, + "declination": -0.06981317007977318, + "vertical_inc_limit": 1.7453292519943296e-06, + "depth_unit": "meters", + "surface_unit": "meters", + "G": 9.80665, + "azi_reference": "true" + }, + "survey": { + "md": [ + 0, + 30, + 60, + 90, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 390, + 420, + 450, + 480, + 510, + 540, + 570, + 600, + 630, + 660, + 690, + 720, + 750, + 780, + 810, + 840, + 870, + 900, + 930, + 960, + 990, + 1020, + 1050, + 1080, + 1110, + 1140, + 1170, + 1200, + 1230, + 1260, + 1290, + 1320, + 1350, + 1380, + 1410, + 1440, + 1470, + 1500, + 1530, + 1560, + 1590, + 1620, + 1650, + 1680, + 1710, + 1740, + 1770, + 1800, + 1830, + 1860, + 1890, + 1920, + 1950, + 1980, + 2010, + 2040, + 2070, + 2100, + 2130, + 2160, + 2190, + 2220, + 2250, + 2280, + 2310, + 2340, + 2370, + 2400, + 2430, + 2460, + 2490, + 2520, + 2550, + 2580, + 2610, + 2640, + 2670, + 2700, + 2730, + 2760, + 2790, + 2820, + 2850, + 2880, + 2910, + 2940, + 2970, + 3000, + 3030, + 3060, + 3090, + 3120, + 3150, + 3180, + 3210, + 3240, + 3270, + 3300, + 3330, + 3360, + 3390, + 3420, + 3450, + 3480, + 3510, + 3540, + 3570, + 3600, + 3630, + 3660, + 3690, + 3720, + 3750, + 3780, + 3810, + 3840, + 3870, + 3900, + 3930, + 3960, + 3990, + 4020, + 4050, + 4080, + 4110, + 4140, + 4170, + 4200, + 4230, + 4260, + 4290, + 4320, + 4350, + 4380, + 4410, + 4440, + 4470, + 4500, + 4530, + 4560, + 4590, + 4620, + 4650, + 4680, + 4710, + 4740, + 4770, + 4800, + 4830, + 4860, + 4890, + 4920, + 4950, + 4980, + 5010, + 5040, + 5070, + 5100, + 5130, + 5160, + 5190, + 5220, + 5250, + 5280, + 5310, + 5340, + 5370, + 5400, + 5430, + 5460, + 5490, + 5520, + 5550, + 5580, + 5610, + 5640, + 5670, + 5700, + 5730, + 5760, + 5790, + 5820, + 5850, + 5880, + 5910, + 5940, + 5970, + 6000, + 6030, + 6060, + 6090, + 6120, + 6150, + 6180, + 6210, + 6240, + 6270, + 6300, + 6330, + 6360, + 6390, + 6420, + 6450, + 6480, + 6510, + 6540, + 6570, + 6600, + 6630, + 6660, + 6690, + 6720, + 6750, + 6780, + 6810, + 6840, + 6870, + 6900, + 6930, + 6960, + 6990, + 7020, + 7050, + 7080, + 7110, + 7140, + 7170, + 7200, + 7230, + 7260, + 7290, + 7320, + 7350, + 7380, + 7410, + 7440, + 7470, + 7500, + 7530, + 7560, + 7590, + 7620, + 7650, + 7680, + 7710, + 7740, + 7770, + 7800, + 7830, + 7860, + 7890, + 7920, + 7950, + 7980, + 8000 + ], + "inc": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 4, + 6, + 8, + 10, + 12, + 14, + 16, + 18, + 20, + 22, + 24, + 26, + 28, + 30, + 32, + 34, + 36, + 38, + 40, + 42, + 44, + 46, + 48, + 50, + 52, + 54, + 56, + 58, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 63, + 66, + 69, + 72, + 75, + 78, + 81, + 84, + 87, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90 + ], + "azi": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75, + 75 + ] + }, + "vd": { + "md": [ + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 1200, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 2100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 5100, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000, + 8000 + ], + "source": [ + "ABXY-TI1S", + "ABXY-TI2S", + "ABZ", + "ASXY-TI1S", + "ASXY-TI2S", + "ASXY-TI3S", + "ASZ", + "MBXY-TI1S", + "MBXY-TI2S", + "MBZ", + "MSXY-TI1S", + "MSXY-TI2S", + "MSXY-TI3S", + "MSZ", + "DECG", + "DECR", + "DBHG", + "DBHR", + "AMIL", + "XYM1", + "XYM2", + "XYM3", + "XYM4", + "DRFR", + "DSFS", + "DSTG", + "SAG", + "Totals", + "ABXY-TI1S", + "ABXY-TI2S", + "ABZ", + "ASXY-TI1S", + "ASXY-TI2S", + "ASXY-TI3S", + "ASZ", + "MBXY-TI1S", + "MBXY-TI2S", + "MBZ", + "MSXY-TI1S", + "MSXY-TI2S", + "MSXY-TI3S", + "MSZ", + "DECG", + "DECR", + "DBHG", + "DBHR", + "AMIL", + "XYM1", + "XYM2", + "XYM3", + "XYM4", + "DRFR", + "DSFS", + "DSTG", + "SAG", + "Totals", + "ABXY-TI1S", + "ABXY-TI2S", + "ABZ", + "ASXY-TI1S", + "ASXY-TI2S", + "ASXY-TI3S", + "ASZ", + "MBXY-TI1S", + "MBXY-TI2S", + "MBZ", + "MSXY-TI1S", + "MSXY-TI2S", + "MSXY-TI3S", + "MSZ", + "DECG", + "DECR", + "DBHG", + "DBHR", + "AMIL", + "XYM1", + "XYM2", + "XYM3", + "XYM4", + "DRFR", + "DSFS", + "DSTG", + "SAG", + "Totals", + "ABXY-TI1S", + "ABXY-TI2S", + "ABZ", + "ASXY-TI1S", + "ASXY-TI2S", + "ASXY-TI3S", + "ASZ", + "MBXY-TI1S", + "MBXY-TI2S", + "MBZ", + "MSXY-TI1S", + "MSXY-TI2S", + "MSXY-TI3S", + "MSZ", + "DECG", + "DECR", + "DBHG", + "DBHR", + "AMIL", + "XYM1", + "XYM2", + "XYM3", + "XYM4", + "DRFR", + "DSFS", + "DSTG", + "SAG", + "Totals" + ], + "nn": [ + 0.2336, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4.2775, + 0, + 0, + 0, + 0, + 0, + 4.5111, + 0.8808, + 0.0353, + 0.1213, + 0.0462, + 0.0231, + 0.0016, + 0.0924, + 1.9152, + 0.1287, + 1.2861, + 0.4237, + 0.1128, + 0.1229, + 0.8474, + 6.8003, + 0.022, + 5.4949, + 0.0831, + 12.7039, + 0.0212, + 0.5247, + 11.2525, + 0.0022, + 0.0062, + 0.0039, + 0.0071, + 0.0847, + 43.0442, + 6.5736, + 0.0316, + 10.008, + 2.0593, + 1.0296, + 0.0012, + 4.1186, + 48.5001, + 6.3917, + 116.6281, + 22.6961, + 6.2112, + 5.3009, + 45.3922, + 337.6662, + 0.2139, + 272.8462, + 0.8063, + 1152.0003, + 0.5363, + 26.0545, + 34.6306, + 0.1402, + 0.0064, + 0.1926, + 0.7056, + 2.1453, + 2102.8867, + 7.0321, + 0.2114, + 43.4534, + 2.2686, + 1.1343, + 0.1262, + 4.5371, + 52.8759, + 24.3873, + 535.6945, + 31.0317, + 4.9596, + 13.3796, + 62.0635, + 1288.3506, + 0.4585, + 1041.0326, + 1.7284, + 5291.3497, + 0.5847, + 99.4098, + 36.1537, + 0.1573, + 0.0084, + 0.7348, + 2.3143, + 2.3388, + 8547.7769 + ], + "ee": [ + 0, + 0.2336, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4.2775, + 0, + 0, + 0, + 0, + 4.5111, + 0.0201, + 0.2914, + 0.0018, + 0.0012, + 0.0006, + 0.0001, + 0.0023, + 0.1375, + 0.0092, + 0.0923, + 0.0304, + 0.0081, + 0.0088, + 0.0608, + 0.4882, + 0.0016, + 0.3945, + 0.006, + 0.9121, + 0.295, + 0.0377, + 0.0022, + 10.1818, + 0.0868, + 0.054, + 0.0994, + 1.1799, + 14.4041, + 0.0005, + 0.2885, + 0.0266, + 0.003, + 0.0015, + 0.0001, + 0.0061, + 3.4822, + 0.4589, + 8.3735, + 1.6295, + 0.4459, + 0.3806, + 3.259, + 24.2433, + 0.0154, + 19.5895, + 0.0579, + 82.7099, + 7.4699, + 1.8706, + 0.1402, + 21.0459, + 0.0886, + 2.6823, + 9.828, + 29.8795, + 217.9769, + 0.0001, + 0.1341, + 1.1056, + 0.0043, + 0.0021, + 0.0091, + 0.0085, + 3.7963, + 1.7509, + 38.4611, + 2.228, + 0.3561, + 0.9606, + 4.456, + 92.4994, + 0.0329, + 74.7428, + 0.1241, + 379.9018, + 8.1438, + 7.1373, + 0.1573, + 21.5203, + 0.1175, + 10.2341, + 32.2338, + 32.5753, + 712.6932 + ], + "vv": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.1225, + 0.4516, + 0.1296, + 0, + 0.7037, + 0.0173, + 0, + 0.0116, + 0.0043, + 0.0022, + 0, + 0.0087, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.2123, + 0, + 0.0212, + 0.295, + 0.0337, + 1.1854, + 0.8121, + 0.8492, + 3.453, + 0.4373, + 0, + 1.0515, + 0.2149, + 0.1074, + 0, + 0.4297, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19.2524, + 0, + 0.5363, + 7.4699, + 0.0319, + 3.7201, + 6.6901, + 77.0098, + 116.9514, + 0.4767, + 0, + 4.8297, + 0.2373, + 0.1187, + 0, + 0.4746, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 88.43, + 0, + 0.5847, + 8.1438, + 0.0042, + 3.8878, + 7.2192, + 353.7202, + 468.127 + ], + "ne": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.1332, + -0.1014, + 0.0149, + 0.0073, + 0.0037, + -0.0004, + 0.0147, + -0.5132, + -0.0345, + -0.3446, + -0.1135, + -0.0302, + -0.0329, + -0.2271, + -1.8221, + -0.0059, + -1.4723, + -0.0223, + -3.404, + 0.079, + -0.1406, + -0.1584, + -0.1507, + 0.0233, + 0.0145, + 0.0266, + 0.3161, + -7.9409, + 0.0592, + -0.0955, + -0.5159, + -0.079, + -0.0395, + -0.0003, + -0.1581, + -12.9956, + -1.7127, + -31.2504, + -6.0814, + -1.6643, + -1.4204, + -12.1628, + -90.4774, + -0.0573, + -73.1089, + -0.216, + -308.6776, + 2.0015, + -6.9813, + -2.2037, + -1.7179, + 0.0237, + 0.7187, + 2.6334, + 8.0062, + -538.1731, + 0.028, + 0.1684, + -6.9314, + -0.0985, + -0.0492, + -0.0338, + -0.1969, + -14.1681, + -6.5346, + -143.5389, + -8.3149, + -1.3289, + -3.585, + -16.6299, + -345.2125, + -0.1228, + -278.9439, + -0.4631, + -1417.8129, + 2.1821, + -26.6368, + -2.3846, + -1.8397, + 0.0315, + 2.7422, + 8.637, + 8.7285, + -2252.3087 + ], + "nv": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.1233, + 0, + -0.0375, + -0.0141, + -0.0071, + 0, + -0.0283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.0671, + 0, + -0.4882, + 0.0256, + 0.0136, + 0.0678, + 0.0761, + -0.2682, + -0.8506, + -1.6954, + 0, + -3.244, + -0.6652, + -0.3326, + 0, + -1.3303, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -3.2133, + 0, + -4.3096, + 1.0235, + 0.0133, + 0.8464, + 2.1727, + -12.8532, + -23.5877, + -1.8309, + 0, + -14.4869, + -0.7337, + -0.3669, + 0, + -1.4675, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -7.1906, + 0, + -4.5977, + 1.1317, + -0.0006, + 1.6902, + 4.0874, + -28.7625, + -52.528 + ], + "ev": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.0186, + 0, + -0.0046, + -0.0022, + -0.0011, + 0, + -0.0045, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.2503, + 0, + 0.0069, + -1.733, + 0.0507, + 0.253, + 0.2841, + -1.001, + -2.4206, + -0.0153, + 0, + 0.1672, + 0.0255, + 0.0128, + 0, + 0.0511, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -11.9922, + 0, + 0.2742, + -12.5383, + 0.0497, + 3.1589, + 8.1087, + -47.9689, + -60.6667, + -0.0073, + 0, + 2.3108, + 0.0318, + 0.0159, + 0, + 0.0637, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -26.8358, + 0, + 0.3032, + -13.2385, + -0.0023, + 6.3078, + 15.2545, + -107.3431, + -123.139 + ] + } +} \ No newline at end of file diff --git a/tests/test_data/error_mwdrev4_iscwsa_validation_results.xlsx b/tests/test_data/error_mwdrev4_iscwsa_validation_results.xlsx deleted file mode 100644 index eae5e20960943f125362fb1fc9cface2e40048d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17882 zcma)k1yr0%(l!u+2Djku7Th5)IKd^jyE72n-3jgx+}$05LvRi5?(Y1PT-n|G?SIY= zBWLDN-PQG0bw5wl+bt*c1`-_%3=9Sg$}UYFT2NZw2lTB9^g;%`3~dbLfHt=FjC!`V z49-@T(vf`d5KPFzuS0fi4T4=l`X9#?Dyxy)a2dZE0;+{P+qt@;tO;!1i>|_%&}gIkgvbe>DFy`Q0IMTvT6kOa49+g{0 zfsj)fToauhKl@|oE;>a*7eUvL;EmB5c@V8slKV@Io}_X0n00=0Ic>{!4+5^8^RjhD z!8SY=^S2ks?EZfu&J`fuVsc<7~<3 zU}|J#^v65XFWVfeYuGPvqI;fJj60j$Si$$P`_$K>*_$~o)+YNO%Mb>js76@27)JYh zb%?Pe4<{fT$4ED)@KaPrs?e1~9T%IuK?*#_OT{!FhWL%tWX<%Gg`^-#+BKQHj zpyI3(F7K0eow^xVH>bxS8fy2FZy1b}Gy3qX=9&f$BkAlx?c%bEznNv$doe>@4{bWr zkK;=6>NYw=wcCU&cNoJ;5k@)SXrBcsnu2RD?k#(t7FPI;#`d}KnSHE3;HnaNjoK7! z$*2dfD}C?jG&d1YvFM+e6!-QW^oV=gEOC=Fg#p8iz{8!cI_l_t({r2|KD6M#YK615 zdG5?vKRg*`iwC(T-;(h?{mQZTU*d3n;+BeHog5BK%7D+cm@jefQpNLiV#{DIi)*?E_ozjjmstsT!EsCKSnQMi-d1Ko?3}dF zsBJ49?D-?9hF%b*H4hq)8_z_@eeC8YI**)r?DQV)P=?opP$i*KYiw*QBOFNDvV5cJ zaU&~cO*&W9Swk`xCrT!gIY8gMg~C}UfxwI=0Fxe=WG;sXkqgU|kQI1W+gFORhUU@G z4l}SC5qw)>lfw5oOI2dQ{|;FcXCuvi$9}@{5jszF;zqf3DJM}C13dBlDr+$tUGJ=O zeCK&t8ZSN?>PQ?slwe>Y83k$)m#4Hi+6!&o!b{rJ$Fn#_vIoiND6<;U0tbqbJrtnOy0P8S)>g|gB zb=6V(CY)s^Yf+xmO4(xhbq9_{qQ8vJMkAucXmf!6cQouPN(Vt8r)0`;ww)^EbB1=e zMAx40u<>)FXW$HrC0*pL*ff^p77|5)z&om^fF9%Ff@O;>zblMNiC9wuE=VHzu<)*3yJM?R6BK zl2=tfY-I?B-|?96#^BdGeZyyaywP&pBF+1tm&6$xD-2^wK@YSaK ze!tflXM^h}WRpkIXRF=$iHXPEF8RuwQ{Dvp{@{yj;*+evq_J*5kc*p6l1Y4@94oq& zWhoh*XoGI!+&LZknxQWJH)y{Kd58-IWnCtXzBjaAv)w<1i|pC%CTi+zPQ+|3<{Q;n zS5P})TahSmeK$)&GbtHbF{{9Illbbf&{+LPp{=%JPG-V$R0 zH&0Jv&7H#M9_W0m{FRsuXRw9j+!k1zMliiWV8x4mtId>L&z`d-1IN4ca*9y- zy(e=0IIQCz3y9prlh8d27#O`IIN19?77!;JpoP7uk&%Nv|W0+1l&EJdO21-9uFTo+9NA6cXf)upU+bnpWR+x=PPP9c}!?ELO z()7}Iv9&&LbIqr~GL@+f4$Ha}tPWy}YlH|~ z9Vn#BimuJu9cd1urRPVdgGHN{mmNWiOQ;s8x6!%Ht%Ive%(Boq$x&;mMJWv@Z&fsm@;Er$R@pVaE zlVN@ATjqusjbI~;x72#{>KyrwSbyB4?{oxPd}9eVFW7E5XB_n{ z6RmR;tOe`{t`fKN1Pm9P9o*8|AYQtek$vA^8pk*maWVIBVe8dgE$7WFOeI2RJ=h|+ zB~m50F0?m3xFf_owl0>p)}Q@%Qh1M8l``|b_MWwV;2nN9X3%}f*NxjncIVEcK26Kd-hpB|swZ|>_!RXG^LG)vc=@Nea34*=jMibBbe-`y* z>Y(~D#&Q`p|3tzru*lj0^8-m2*V_ub{>?mr?wd|TFdm2_$V!$@2Cx>0BdAKAPEl`Z zu+&9WBhUS?dvZNbx-%V0OV1(;&yhk#@a{MBP`Vo4$6)o)^I(;4IwQe&z>nTl!grQ~ zwSXTXR-)*lb?&gMU~9kVJFC4X&}b@SVQ*bxYDHT}8SH!ltN;7DfgOQWl6J~~@w_>L zsHE+*25Wg^2{{j0*%YC?Q!s<|n6nCe^XUgz7)*7i*M=6FrI@F3#S#=squ?5*4-e!C z3MbK-cPA-?EDSH{nQtd8gbhq9sjcvue`nL1S<#|Q(V_r(W9vBAE-JUwoq`+oaHy6| zMwlfc+ptc2h+7yuWap1-C_a>sAWsoo!|>sNTtVR^u@zcd0=KYtpQKd3pj5YW)6|u7 zh!Wz;TE<3T-`7F@pZZq0CzEyX<6FN9(O#2vi2BHtC5;>L9v#vexlv>d(Z>xE5r&uO zEVvU5VhpC0=q$7o7vdBK4~3K1_QbnRnSURR{vK@v7QLZ3iu=ea$-vM~{?F1QBeqXBt>+$gr@-T4M03Wk^XEW8sQq5`Is_$;y$ z#Rm;y7g2R_GuCn<#%dzXdIH`(>;#3u%l*E)-t23z<^Lv+yA|s>5#u$H<~;%bF8oCP zgW=cPd_j_jw?4R#)+mjDH3FYE5J)h*BxnAeED($^tt4lGojed?kTNi7Ji1n2Wrakg zL`Cf-MHy|Go5hBn?Ak1%z6K}!&z%=e#1u`W6;HrxMw~>m8Gb!RK}BKvpX_$XvMjsP zC%z+Uf6zxK$B{3#{Pa>Qz&_?cIt%r`DnHvNJ}YX!&__4Uo-elewCk1bFhzu7{l!8=f0Swk^G*oK~nhV-yV-sQEG)qF~!(!#2fJ6Nu z?K=}ZdgQ)5r(s^XSzd5kQD*|Ijoc+YgcHmXsqM$Ltn(o)H2&-ing14jDi661;kgd) z3LJhwew9%|UgVgnRGhAa%>J5eWe+Lwm&QHqJj;9UBP;tV)jC2bZ z=NPI=_{+xiQS0?zUsQq(+&C|t%kUhfxEwuUg_X$b&3A^_RYd*dv5j?Ya+&#S% z$V$h$FXm~uj6^xN(@9#=z}AIkbN0*<@x%PmCgO7qF?M|TUb>-^t?Sm*SfI zBP|CTj8GTU>%UZ$kgddX{j8R`(G=eA*~t(z2f#lWwkcA$46i(nkN==13}>d8bkePG zjx$d|1_q<^QQ0*5W#*1@i>Q}j7Z^mAUfN4}0T|E~Z)VTZJkND;tVr%2hZbt6mf<;Lf97}#my~c;7NL<)icPM=K(+b0!r}2mks-BR~KYE%* zNLAkXaLk|Lv*GJa!DibRY%a8B_9VskBq=Yoj`+IVT6|}V0(^dsmk&DiZT|q9cV`!f zkT|ZNBP8DVBcg>tN0faisI?7QUgq7a5H3I^L;r)%cN7_UR#ujkL(6I=?n&WJdab?v z8l)k}Q!~`Hsa^@1bp3jElLuMg5OC4P9XyZsS=OWiBJ+TuY%EI&F8Kvvkk+Ir=o_3J zN0>AByo3K9EU*2STxtC<;A~aG_~4oG88ijZeYhU~Q6K1PQc^cLERwviQ)ek&asb5vL!xb1ZIP@5|D>6^&eGm0S9 zA89P53dbMyQuBz$)J*O^b91zVi&)j-Nvg?nCiM0Y2?UeMZ|`+Pf2SpE>L&8NHb&uq zPmM%Qm+QBOF6G;i7*z*7Wkweo*O>T#m@3dEt}`Wc?DyJqIc&W+t_I*(jb$Gn>|E)c z%uv+AItAO?B9nb7GO0}^ml$(N&_^cFHz3Lgdz$gcFWBO;>pZeg26}OL(EBf&lVqg!!Upb&E=Mi#vH^y;)bi+YtjDkIJ<=yS2hry_OUej(U?7X?+6( zVGFJM(Ms0MulcE=K*T3hUO>phdPxBd?#O<;R&GFQ(XcBFdhM&Ngr8IR@>9ceCHM4~HIVdrY8)%<)8 zb>jq0E!gcv`j8vrNmt(c000<=ZDaM8<`=`9xhk_0Nm9gZSpi^#XHk1y1qmu!A42H( z;@B8C?1V`*dTzDlr+%ZWbpYkG!wFkig@iNepbY9@0@|RpkGSLVP_(Jn^o#>#K(afG z3F^>=@@^kE0q~F$Q0%f+2RH`7L>wENp_NbhUqsgIjMiH5cv95CeM4|pRtbz_F4w@Rbv0#odU^}U@77ZW4TC8CuYjgI^Wt1#D zc{c+j#uvg*2RVhoc>3aEq|euI>sCo^Op_9q6z@-mM)hFa@qxm! z{B_gWkpqjS=LZ;+2cv~GVSt`}47Rr4fRW!pNP1U$YGFQ8sXSJR;q@bEblc6Ic|UII zWZ1@%dJ>l4W2t!hmMY~B@(hG?nB4gq{w`yfPi9r2wOS8-=?9bhW>539aM1t<)=YIeF#w}Gd@`_QwoKg9_2sz7e6}`z+`}Q;VhXQ?+;;1 zc@7Zp-AqpoPIR8;ghjvp7)6Zs#k%@NYv~G*2C)pi4m9Cinf^Lufe=Z`5J~G_S5B$f z8q=(RIinb2+cq6xgKf`e5?fQ#4QlqY!6HLv@G?KSp2Tca z^zVD7b>~1aWcdVyw(tfnH6Wu6y$LeNQ$WN5Q6T}jEhq9XY`-l#G$}C@qeuYiO|AKa z-Yy;JrW~{or^KQ6lWj1O4JnZWaUve$ZnQj&^IJg5>8}|*Bl}2B1{|*ajOdz*XGwBm zC~DU0dnt-C^_Og;5=6<}>Y4#Hyy=-+w zP;xGZ#!ciAZ}SN9%ky_KVZ^;acvF57n|nYuOe6MU0hJQiW4IfG4X@54q5>1X6r$); zzaBD5r7bBfL67vHL!n$augwguYU3E9l&gnXC^s_}+M!aHsb{=kdKd@wY^ za5RD4mAm)bgelx_f`) zWgx`Qa*uZBQ4G-=z@l@HtE&tWHv!q7u}QH|{MEE-Px!-^uPOej)!d~~l49+iT-lVF zIOg%Bw4+-}1Y@!k+3gGj^5LJSub@&_ny_rXJ0S!Gaz_dg=%|$OI`goi zvv4hl?dePg-tA))8MAeq^_&Hck~cF>;c?;1^6+w8F&a z8|hZ>n_Pu;S9r6f^`=nR(vdlDAIk8zBvM^LPnpz*w+qvLq17Xk!5No<`u5c^<5%`F zBwrG~kU$idaV)8z3p9=D^w`2L%%$%sZ*gG&0Leoe_toF>QYN((oyiJ=a^z5Z6$=9U zwrzRnI~0G$??U6?F2wr9q%Q)k1r0~o`2(`&2jp5s?NDV6FMLz6eW$xK^8| z#hi0Ysdh|hMr^64kKr|6Ox@?G2@QTo*g0KP)_waiT~w90{&m!B-GN9cQ_mFhF>-$= z1OzR(x!l-6^!iIJP_Qv24&vlYj9#Xv8UQ4iMWi?DI9O@PPH=<_&Xc0d(l6w5gtz7p%0NCutCyCEokv=n4y4h#~un7@9!0&r7yPdI;LloR)ibp1KX@yVd@o_jDG%?D+ zF=W?hH2GRFDI;}9+c94DTC&@LX>k)S6PN&et{8;cVurURoJ`~68M8ct`=7FucdVVF zGliNog{V{X=w9zWBQg98(qLfbc z4Kva>Q0+)oV#Y(wCzj)Wk1Nm4%mZrM-4VUatevLGbwCbqg*btd9V>?SrNZnOUp8hz zDkkN0qV!oKaGawxM@k_l?Ywxd@`7a4^PH_qV`$3uwvapxV}{R#FhiEHMba0l=j(lI zQ-z2mGGij15bmk{Pm>XKx??1S-covSWo&TC2-Ify|a(5Pbd||4Z&$ZuamNCLcZ_i5nt#nnqu5md5^9sR-DW`b{Q1s0^oUoR8Yz;cQ z4LVRHK-QK``m9e;oY2*TW=#Kj+Sg{0muHU7DNKjMY?DE2TM8v#+A1PcH5Ee=QsC;AK&CP__^UkaxHS8yaBHjxfw73=rI8FD`ds(1Q*^J-xuYT!?8D4gN=PZ z$U8{L53cq|OWRaFXNVZnbuXIR6i+&RqxnX^{*7Th$aC1!<)%QXN$qpPdOySZrt?xi z?Xys8L6f*L?Q8R)s}VF~h+TOX1R4rmVfjTX-5+JVM?K_1YZ~KjF9d|21XI|`-w(nKimX3t|$vA?8lNZ z*Lk__Chsr&dCzdtm5jW?tHRnlsi?l!MFN%Gt zT)|2c$^+Dfpp3X*s?vrL$SE0YT30RslE&fWM_anOqa^u7|qH` zLgeQReaybiupz?3HBX5V*@-RCO|K}|ps`3v8&dCd?suviLwNRp+rG2Phm9b7*FIo_ z;y1O;0Ip7PzPxVn@g2vnT}G@nwa_Gg$HHd{NGExG$${G~sl zTfN0}@Mjnp)jDjF4>u%WC|;X{A0 zD&(JB^9yyN?PqI3NfGyaqnxb9fNU$z2SUEvX}O_EXDiJ!ncVqw`Ok^Lg`>3Qu71*| zh5LVG3bN|V1Yl>WU{x}3S|Z^gEsn50S@+E=dqp0Rg#8$h>{0kI2z>}cRcrM&Vc8GZ zjox6cM2qbMIJ_q0@Wr7#dE^ooiM!eUszzt_VX06)eJfufg~WYRAG1iSutZAuXzQOu zvoJHwG%n3_E6r4MP1qm`?O1ufl)ILF(w(LnhZcKtNDs-=lnCMgM37FIrC+1b@_Byy zh}4^Ot)}kT3(k{qg>Ay35R$R8;0#yueZ$zPm4i}|nap74Zg|&m(5jJ@|2v<)1^}%Z z3+0)gjN?906y(p@`3#0HYc9)#jHpg|i!SZleJ2|N>yN;RPKsvn(AG2yTL5vDfdA4X3FIq7FZAq zS>-n{cV0JRuDN|?=AI?C0wqDIS+)V&NPVxw5kp4PZudF4KciAiX`dbq!!aI^4baALGQkUxl4D00nokK~8tCIAgju2|D6LvpB0g16x*{GplX34a33-9-QG;?lHaiTQy$RO^BG)f#~OONp7M?Icxwh~0Pk-`W+S;lxd8f7|>SqtGU zgSYK9G-X0t!hML>zhGx6O5W0)zcjgJPa1y7*WF{qv-RZg1I35NC!oxU@UsgK4pHLHQ?LPju$Z zd@b??_R;MVed*o!#$>|6Vv$;HqpAoN)+=f!9h$_LfvpoTOdYCRtmNJ5bu^Tvu!;KEfnijU2Kxk@uwEr!zhU<>=pmylrcR-vmv?)E>+ zp0}dEc>OR{h*Z0!djH!EW?%E65r`D!pxH9tfi$lWwx0#~j3TXisKCB?71Yxo#c7wj z`C1{3@ycm7KWld1N0V`|PM`lw25#nUmiU5rj=FcgxB)Z5qwi6)B!2;lJY-pxEld>r ztY+lXWtv7auGU8JH(`+}sZEx7V3TmLIy!!vXpi6u2?_tNQmQXfI*&AMhq&wpi^N9k z9Jofo+YJ_tu9LN z0t5MNEYs0M5tbE-K1$K5_j66!r>n!2AWP|~Wi}d{6t%!JB&SK;ymboOF{vCB z0ZhCXpt6$=W|RKP7O)310jdcgm1%8Cq)|wu0Uy;sI5(goq&gjGO!B!a8ac?m?_A-=HX!uq+vft2Rfw9(UrZtW#xl4R+;CJMK8;bA3sTaYBI z%o*XIcdMN-FN2guxBGSJXoc}{&0~;~6*$wN^(c!NrHQU6h*c>+G$UCzbbz&>d>YlQc#o!ScEvCoXT(o6AFvAFYCbsAgZ4C$`x(cp5-XYr}fV= zcxh&?LrgBK&igV&^$&-h_gluOQZt!u=x?zwwG^AwOWQcUP}bsL^xB|O+LehHmWfEF zpY{YbdypHbsL+K6CGbb~*;SZUQL9WSut;sv1>9^4VOXy#3~nHCi7*>_KAQn_G=TIN z0kj*=2TggdG#n{`xo>nvb#MrMRQ9)h$rv4}%VE!k|NTCaOlO4!355lB6TS2cUs;D? z@*KL$;?IiKLdY62rDRnb=o5hw@6{A|XLxrdVQH-TMY0=7EXP)RF2D@GF2p@}8uow+ zy?o+z@5;0k#)+Y2<+%mAr{yMj?_jrCGbv>dJhZsB)S1`Jp1TtFcM~qkr=N1SofKNv zI`htn(-?as=@J#rNV4W2i>yFVzES@dD;B(nT^x;B+}RxFradBR(y+xQFWF5|rw`gr z_A~6Ilh8yQBdh&JT(8FDhvL+H)Cdz%>%OsOLt@T>q=2h96la#0R;cV|N@YC!wxo84 zL8EFThOx-F$#RscS~~vjzFASqD7M;dYo(EH)RXl}*6?%%Tm6Vi-o5FZJ{*?3X+B7| zr>zM4e5B!>_!*BSsN^SvKZaj<6HPgoPChu|gfpkccsC$)zwNl;R*tP`C2TFT^TZ^O z)G_Eiv1B}ADWW9wSMjNVp$E8#%muaT8J|+9iy+NRV_G7Naz^TURg{-#$3UUZD0YEQ zAY|0TrZfJlSkmPQg0O!fA*dI!;u^AI7RurpwGU^W*IPS7SqEcftr%E8jk@2FxLn^P zez;O!2@#rG)U=PMO}`iKC=s~|J&MnC+&IOsgsfm=Mb8Uvd3Q@4OfCX25qnNms4URb z=pS=pb#N?Ka{4CrzWs~6`F@4RJ90anuz~ZXJ4}Xng>S{^`a2^1+a|DT@#HWgq#FqZ z7EoyyziS=X@@pX2bel3Ob4gZRLsor1-!kghW#%f(UYf6VeK0~JLJ--iMB<3iTMDv9 z*^-K`ntTEeabv+ZOG8M+vfIzwDM7+nsAEBDE!}u3EP(7CKOO=1av}MfOwWHmwmEHpe#1 zpmLeYTFb{xrc8=I`S!K60{UDck0e+8ten5E7mi+p{FCKA3a9`vJ~%Z=#Cvn*g6(TB zYI*dQZx1eYMQ-Z%?LKE&_6263lE)3F)J@Wpf#Hw0wReM4%Jxu|fQ zjHF}~6jwo{W|A|g$2Jh^v*iAr)=j;MZ5oMb+J+vVb@6E$SymsgZK!SrI>xs(?oiIr z%W9vYLemA}cr*I;gYw0Y6iq-$Q2wj|G@r&r-+-o&^8)%@cEmc*3o8 zi(jtEyN!{}5xg>C@Vj>8hE!IX^7I&{mbePvvU9W#fWf}$fP8r-N&S+zKo*MAi+LzT zA3svOg!yyCtSGOkY;KR|@M$O*avuN40BIsCM^Qp|Fr*+7M3$QRv1@=+TrAFaYl>oQ zT9Mt5f?gTPoE)xqrL@8zP6lx3sbJG{KDi#D)9I*k9}EG;stfp6ZaXP@@fdL)G7x?q zKNCz3qZ+=Az&rOQ7y&cCh-%XGW06=36Ppm5FP==x1(t8kmj&nKHbl6}A-km8b za;Y09lyH_6YB&X^YZ19_N1@I}GCLD>R?AeZaOi|aqvq+!jkV578raz!OV{}91jO9y<-6Jj#^*N?y;49$dt5c+Ua_<0WOAyuy*gWHK#JbTK-;KyjM2)R*zEj^LeZ36JS$R|V`VI# za8Nx%7P@*^w!=hLSu6$8xypvm!%yO_ASg# z8t0)2D7Kb}tn|i@x|_9`FjJJqG|F0;7UG!NNoM{`D05gxRj`PWl#id}VIHtC)ndRH zs!z+nVj!twH)8bOV2mdBwDttc`9eqT!a}*kFak-B*=UMil%~vCsDmyy{B_~1HvV|?aN1{?I92B&qdhSy1u^!z;5254$0E!=@kTfj z4Px%v+TiUIHL*kWj3hhLeE^g!B8g&Gktc_r!w9Aj&3Oi@73Y*S(xjVSZkae$UutyjcoYW#RHFFHt>z32pU*ql%x}C!R(1 zt#q}YWHNzF*bNsO`XPK?amuX@gX2n)Z*_(+hgiB0uBpC7k#munbOX8!05cp@h_~yC zQdT;MtQIL!!d=n!m+(oz^g<>HHVWu_Ce0fa0cIMmbw{I(?^;CBVe2S2eCvJo6-@R? zSABY9=_M|BRi5H{LEy^Ssb2tx3>u?n3SsZtE;e@N5!_ht{H-kZ#d^WpBY(~?lZ%8B zA}(B79}TItcYq3#kSDgL)E4eds(vyQYm4f;vshF?oBPXt zn+79!AVsJHP^Be`(97SL>Aze3DTY!0rbz#H;C;Ekor|`t+IctrKpdb|Aol+DAaquX zznal<^qJe1u@$^`pcOCSC^j*C1rCLlfuvA`K!iJPY;XA{g5oJ{Yg}$#O;IL2zBz;| z_)R)OKzf6uKupQIxuban?VmBh@7oyX*d>EdGrz|xgoV1ZyV&g6JlDfh%&PvD@%|bU14ChVvm^@@xoYna;y)#G zm_iL)&?!o_$Q@`Ty3PYbqg~AjL#Y#6OnRP3ln}S!ioQ25_7sfUOLE;t$MV6f54czS^a3FlFvgPqYl}@-Ajx z@Y`mHv>HEKH{j3`t^KGSVWQaR@S%*5Zsm49*ibnxf17t%s{G~m`|?N63i+jqryHR{ ziA&mx9n+KYxNz8ak+b=jKp&OSCzz}H1Q(NV${fsq45v@w{=6K1e6bUKm1zGv|azTCWy%uPA8V`ZMV?jBt3$02;vCEJ4N|76pL77-No-2jXDEIv*vYL_qvw~N7uRSj>7yBgw zp!-zsyT_1B9)^REGIfe*>n?P>uDd}SYC4|Q3+6i989L~l+&rItZIQX}-bL!*Pw@mG z-5q!Lzk2d+wY(zz=YCUzMQ4pN2rw`gcrY-8Keh|mJGfXH+5g&Ux~#Hjz4+nXGe$Sz zhdCzW9sr&$yqs<)JGwaG4NX6g?jx3Lf?uwVfC6xX44$tvN@_f1V`80{y7;8niE^-k zewTrprs$E`I{lEJT%yCGN&gvo$__!?pj00*!7=kHeY^A|I@hq;*>wo5*FSQOmaouc z`@z%%>UijmIx^`s_UU}D(-7Mx2|XS|k3~@^!`Ew_kB2lO0?)8}nDe^) zh2B!UpFE$tPeBOxuubACY)477ZN!}z5|4je!@Z9|+d-23(t(L8WX$bLNW{%yk>Arz zLi%KH|6S-hA(0}shP@jpy5?d0RspWTnvdUS;V&$n;)^ zrhmzvRXv9~x8-+QTl>%sZJj=!1&v6@x;G!L)yz83aF~CKWut^3#GTb&t1dssYv|ul z9`3bfmC%5n6bZJ$qtcZbfD1mad>M!^*`^!6_<Dco7c&`Z5RO;j(5uu!Vh-aYbN9A^ zsYFczEA1J95bi5^9gGS%VfI$`Ks7JrV#`ln83Vx0hq3b@7;)oZJO%ifm%2-qHy>Eo zy^;|w;!OGj>0FG32V+dQqmU;6Tj+0@z;ZEx0{~)5xLBfE+i4h;gmtc1?3g)sC>l7_ z@5JQ!9AibI+jr!nVXeYyD(H~@MA4!N(a75K*ukIPpb=-$!81;_+^PXR$H=Dy77thd z)315g^8z|S{)`FoZIEk&=>Ux^?HL(o-R{g~eW_a8H;b)-v-a2=RLID6`&ZAr*7X zs1z|XqU_@;;`!1!p07ngTt@{NBHNOr@sF&%uzAGvBb=S_c>*lAC6=iH8o4GyP31gN zV)a_lixcS~jNh5^e29NYbu9xSNR(CKxe=LP&l`(oRnHd7wEx*MS5~m=Rmri__c~K>V#cjDPbrK9 zENZVx$nQeA_=^482KId~{$MDzv5W?l@}wjUv2}{P{C9e+_uBfVXZgty10ho%!w^#v z!7i#$FiZXNn8+rd9*iAv!{3KDA=Q1p{p6|?95*=AV)LKo&7x=jQUNmSBgn)!f0*|V zSNeA&|KV2AV{m>S-UaF8U4dhMsqB`MZE?nT^T|F(s;_6oo@&t9N94Ax^h*rz5~$DGq}?3Hd3W>T_J9?V5LrHr3}nAHoke`Bevrt&1@)e7FTl*>Hu0P4n7g zCqL#b7+0fED)-W_=i~6@-BBTwp=I>(Nt{I&zNV2OPN@hNIRfD~^s1cEX`CTsF%a;! z&6@&MPUtblHeWt2$1#gq#F3%3ayokms;9#oLbC7bnvks638}SS{qSv_iwoCR3#KJw zptb)IU;`~aXnL2}G+r<2gJ^!*nA?~1(fkN(;3sJC>xN%Q(b^>Y!?PRog%7y$LU5k6ATOt7VK*)uG%{h1(QI~yIRl-74$N5G*xzSbaG`e zc5-6&w6{};6GVVuMHPP?cJ62r`5|iZVN$iG4#kInCBaOrPSn4X_eZ<~u_LbJI=m(Q zRv9u=*vI&7@+1^6ES#uDMg0;7!ZfQQQ!g<7{lxK@327Ol@>$|ixT5qug%{*F$y^s? z;!01&y`x$ubDG{FGH9e%7yDmjvz+JDH>o7^7yQ-+%Kx!kcG3IZBhWHOz`?-K{`YcC z9bL@d)?1YLL$UWgVwj=%aL1=iMU1Fcy$@L*L`~2mbay;;C1xZeRoa?pm~`I-5e(eD zJ}qh3T*E(pP|Ev_*__vmufHM@>dz22Y5*=Ski^caB%apeN0PO9jri^YW_>L119l$_ zVQp;~l6=o7i=?xLj$X;4ZWnaqgw|LmU>3B zbS&<4y>qi7v%LAtrlFgHS9-S&``a<$7@WYW&4sQ*rT=tHx?UCqDhwD{77Z8}2FNj< zb}VjI=Jw`){bYS}&8d#A>oO0f|9SPKr{%3ZLO)kvV?BnewfjnaddR6FNhq3Dteuxx zVn{%j6c_49D$;3^LTjb~6yxFJxP;XH0guw8-MC1gHv$VbE$=DeA!y#?!LD_Pjh32m)$t* z@i(@Co;-~s)6q_ZP#Y?3IX&6ec3p)caP|&^>%g!CxY3TNBZ{&^qIdM0@G)gPOOV#!KapbjePDMh4^lIVG>`TP@NUwb7F_ zt(P!ALD!&+51TO zAUf{U&Ikv5q|h}Er*YuNaN#4g6!o3By-h5lVw*U>hd)*nuq4q)tW?@q0K~rogf$ZU4*jvDSG&V{wLgl znJyLF$j2FT?kMyeQ38iUwHsN$!ftg7ZL@&x&S7<)n-Jr~y@26<{TKqfSd)v~QDaJH z12vEAb?vB=BJl_!zokGDQKQFKBF@KKefJ%TqW5ZPV$JxXosjme*{gg!IbRZ6;Ad15 z9DDB%`#kZtc$c7B{Jv<~?=MbGJ?{TdsVO)YNF^GGxXdRz%M1H5(JL12WW?MsGh+JsF1T6+;!;)Jh*h^Ak|81AS3XAKz-d2C&v1JxX?vyE zyuqQG&I8Y$T$Q)S`U{3-`S36E+8^pf6Y9E`HJvts^;n7%FWQxZxrk_r*a+y-rYShZ zviVndYMuKGGC$RMx+K^e(bI6-xAz8|71f&2-5XIL*jn0n%e>85EsHPLnGoR^btAOV zw-oeG=k_zRs=UeFAJRO27+pR)4N0Nw^6wj7>x)(S->z*xI3)8+%V&A@p@F+eKu`b( zVX$%7c9hSO5@0aE$5MvGFCc=oY$FVm2PHH2$UT=qN zCYsk3gIU3P96`yeg7gjI@8PbQ-pxG{6|Y+J#P@9LyiO~8zaS0vFc`%O{eSpHMSVsq zH|cDxR=TIk;;;7s29jnz&94;Ru5BRt&X(&GnK7UV%f0g@NrEwr(Y@v{jK?&oEUvBW zUuH%0`mA+@m}kMW9xjoA&psDj!5a(jC^Gk9S9oO>$?6t~gD?@=fHl35t6)bFUSRd* z9I2+~XWZs#bQk!47La~mj~<~27#K+jI2i6<1;oSA#n#oz+}zET<1g%waPPA7O3Ga1Y;>IOlyQH34w5yA1oPrJUIf^ZpxV`c z;2IQzFnoQUnRvY)@gNcQf7yC{y6aWydfFQ~7YcY8>GHdoV+puB+m2sT>pnY1yT45BkzK8KzTW*dGG%2T-F@4-Z+hp`Ry@h;^{HXNo$u@Q@8^L4otw*uuGibErgh)vtCFq& zpeyU|%<5O=mm1~{;ZYjkc>q0&?ZXp$-nv>qZr439-Z0=MJtzNZMKj>eGIM>CtIPM{ zcp~6#(dxI)>RCxHzCBm-*nozx?&_XnfNlL!hgYM9@FTaq&NJb!#Tgs+b|1&rW0Y8p z0T0KjrK9V!HBQ~w^Irzv=kC`YZ5vzLeS*g{7Mjj$b`P6CKj)5KZiyOo6dc!$%jcfn z{$z4oC$qi58YAdZB;GSj9&j9s&R{!#IVHHc(G2i8w6ZsNub}3J^g8aAv+?`)X$NQU z7k^EH&-M&EJ=wk40FXStb*y!D7Brtx66H4NFn#_Rb zXkJQXH<(3eBhAliVD3$WWFmjvig5b*C_#~@&=~o!My$0;Y`iU1jBg_WY()cCfg_!t z(yIO4BDfJ`cN`dhhtDD!hY;imL=8i?16UiR9mFDHO;N16&_TeB2#fC|8_D(JJHLT< z0c|h8UxCI#2YaIj&32X5!vcW37& zxdCm}ksroAd4XI5N0*J(T;HIPgXe!UN-8kJI)S*z4tXm-b3HoA?Thit^Awxo7q}ft z4P-aWXQIAdh-yJ_35xDVz+llG@r-7beFYu0YJ^_m>!0uHa)2mK$hI+!mOqQi_OI!dGUcvu&d-w;oX7|D6oX6p5hyDffNuEu+e}wr8;7)SfnT*U;=fa&QP1BHoyZRA>v^L$ehGC z@B(q54A4BqHi!Z-AS|JniE3_#X@2KZ-RJW@=C4n(v<`H|oOTe#-r+zwpf!ta5C^`4 zLWUI}zX<6@3$%nXK=qW^KnnDLQiRPyYj*2iCdn0uNfnRTlaKKi>pLLEVb5nGM!J3A z{-^8a#buJg9n;2r4hx$SB(@Oe7sf|p{r~ypkW7(?IFSwPKz^t*G|vwkpSvj_lwb+b zJV9|Ds0sB8)l+ICq#G|#?p;O4rOc$&(Bwt1uI+PJ!IWT<#mNZ_ng2iZ*Z_@b0hM_H zuVuk{0$1z6@{|8n8;aZv1)6#AKMEBRhyWKJNf(}sWS%{wNK4Q`v}+rmJhO<2$@*V)EA)4`&qcRA@M<7p1_D_sN=`TsLgnePjoVhWuQ zOPodt;0N3sC+z$eI(tGF3I18ckma7lTI*$Rp2T|f{`zuunts#S(a0Ln_0Kj=@N#G! z7j%uUf8l)lh)Cl&N^seKJ(w9T*SNqH(elr1>t7D7 z;ts7|$Q|2Wg|)B>?(J{TTC{c|AxI` zDHsD^(QlIf%AzKCOu7K&nSUYvQSy3ithja7dadIf(aN^R%d-K8em9 zUB2hP;rB98L3PTCKumhdMOY#W^L(D|!GcRsGU zMxtVn;5CE*Q&A9&Wuk^2vhrCmD`;5{5!$R!?|0f&`z3_fl#m##J;6u=qdPpjOxPYa9 zfQyZyi%qJljpAnDW~*kN_u)F0YssMh4pQ1+dORX^B8M<+=Qf{}iz!90oVbuR$ro`T z0T%~;<0K+cr5bNBr7%9yNc~74OnBb;yI0C=d<&ZgM(d1{0y%kayDxUh#m?Uf1o zdALtX-Y0jm&=+ppxz7{<+4Qu(g?ylxyowJK+adlRif}XNndGCG})*Pe**4RhYhWnND6qh#9K>v_fXD@yjRME@s$Lh!1~{z_Jo$SM4hz z2~n)(CM_uq+kf0XQidIH{65QdUP8nRus=dmuw4 zRo0%!NSMr*(KI6Dsdy|cf4@GZ?NgOUNQm(MUWRScLRt!ozO`Fgro7NvnI-f6`z$w6 zqIjfoU$=~TlCU10PDLJe=QChLi}=6D%H}q6c5#EPaG4xUnVisbWwzh;vfxo&vf26^ zBdOm>sM-R$EHL_5mpM;jj+$(f?e|H>IK{izoJVdP6~)n~9(*z89P&!(f{O;zUN$jT zSFYU&!WN*cgR$;{72POF@a;U3l&*ARa$PnYyw z@m-0Oqs`H9W}v)_ug5?aFj(Rr@b_RcrDV>(!}=kjQ?M;81V<)SYak>$L)*%-jv{9N zabw)q2G_<4$|6e1uF$x@NsGWj7rxj^P>iCsLgUWJx*h76?x$;!1tC+&+dDLLb*ka- zwc_5sHKZoDFjH+}^-K_!r5=ZQH(FlkO^WDEtLyXQU3d&@(^mmUeJL#6mo0{Hx)fA^CaoilT194uG`>zs9x5Z4sm0)^10~<2Z7$EdeGc; z(U$WpURfKDIG3Ty%pZ1bRKjl4dYv(^__C9qy_0|M@Uq;;t@x|*cy4@k-)30doEXWj zIb>@^MVCy37^ah$pSe2wj!S%xhg$pWR!gCPY)z{H92z* zee1*bJ_h4&b>)0*xy&GuUMsi-@%hWcPotO|_wpiYTic@eqEm!^qIzF%g0<2L%2SaF ztn728iI7-Fg3H*aKRHK`c8XqyVXptp9)0qcn{u-nlCwB-X%^0qEKj|&I4d+aZO~JC zwg>$(F?zHatEN85YhGnCm_ysfE|Z}0aOC7*L(@w>!``&G%E{5zOo+_jYlnBIQPRxb zEY^%np$CSkJ0`r#B*(eR74&ixwA)spX*RCLUV##%6^33OmD z;9f)ch;=olKFjPJ=2bYSM^otI6i2u4*m(cxhfdr;;B7FoJdjIRmqy4I55Mq&6n^4E z$i`T_XYGUkrolmM12h&!b65ELxvMWhOc2y zH*0K;R#GzyA*J&IDBWQ)lglyZL!Lihy!(@rlzNOH8& zd4K|sc>=)wH_T6hjVJUzk3)Nf?YnKcmMCyWvvYq_{~t6NWUX$P3op-RpF7Mx3tE1D zCV*M=K7_o3t?Q_aKV23Sf40g@(L%lZEe+t93NYfq z0opsjaoeYZWuN%YJ-p<_q?PxPb*7_41Z#meF;*O5)%*W)rM@z?Dr^o@z_@8Ix}{o_ zIZgHI%~o9OSwGjP>Qu8dq zjN*`KLU|4YsS4DT8Fl(KB7_FF5x(tTbE;|%kvKajoPxY9|LmKg@Vzq2y|O>Q@#*?S zUT3CSgKkfusf;6C-z2ih#rRmy@vuX%b{&w!ys?g zMl04tX&YoS29hG0ZEqE$kArnlA}X^jPqI+5tp1hd$t7RAr|R*V$)v2Md5cOb*)Jd9 zjy~Ca5f2oMMZ>36v=hw{G=XL*En%?p4n82F11TF~9daesrwdBO({ja0B-Z+m-10@| z2IHq1YQU_vZK%O88Ct3;9WQY;@BRb2k%d8@*_Y4VB0?Q;^~5pDeWZ#|Bm}7kg#}7n zGw{<MTVUE8~{@S(~wHjLzcD8kQelA33%*Ygdc@iFT zf6?bSrUJc|?ZOx&mF7<$43W0T2z6BU5;(BAF(A7m^v%+1GGE3fmd#_-dy=4Xgq`AO20}7_1w*Ma|V`r(DfDlpl#KZr!M8f{we{Xbxb)0 z)5CcF>X(G5YaSwg`o=S$YA+4^*OQ(5vn7bIB|Q06_Y%Oceb$K@<1{m>*Qvj3c>uA9p^owWnUI;BL9TUkWQMnCp)gQv=1LaT<`TB+0E` zcVxemUDaJ=gOjxJ^3TKlEswASpeKo-Cke7`&weT$!tbAe4L{*{uyiQ}MDx~{TpMz@M`Ekhe# zeFsCT`Ux)Lu}$>Nmq+e@gueyr(|IK!Hffn)h+cPVjCRHp46z z<;N?spCJr?IGtu$B z8GIl}%7^i$Wg3*+)OgmVi`1q2;@A-Vs!7iqu(+j%3eDJ1+nNT^a@@|f_FagK$JscK zo&~7K?nM#xTlxnYOccGGr=XI&l(0jsx~882dKBB5J|O^1&l!`3_thNXSJ8q<$?CW9 zPhecm$CB2ab(p+f0DF4vzB`^o7O{KLiHtj*@^N-E4g<;iOmg~tLSaUCqy*wn(7L=a z|I%3FlWF+zDfx#h^}@MNtPW}mI(j7X_7FOpYtM5Ds1<~{_g^8mWFWUO8n$i2|G>p$ zjkqpW(nS5}j@WNnCOU#7jtQR!LUDhQ-4JhL0*m_ryqYZ8-zJdn^bZgt65k5S;&oic zA9eGZuQK~dCJ6>~DJF$+Q(7M+7Ot5{10)r4^*VLi;evE`;>Muwc-QndV)FOG-ET#I zx(*0L_}^J}hHT$Ug<5K1~?J2#?*LEZ_Xd)zGTvwYfWwNRnM#D?XgYnlO_!t6a zGx0VRw4W|{Le}rZ?aGTK)E-N8B9R1_ph(d#nGn5F>OQ613j3S{~mFV*et*-vP#mgqw^HUN* zvkY>57q8Iz26m&wiy$>sIWi|Ch^(`gCARp+lW|BO2qSB4(G#4bQ%@#9PZ1#+5b8@H z@>o|Ff!T@YEO0*UNf6l?%)uhAj?7*2105|Oy4y#b@+2f<99ECdNKhl^+CJr)Ny)t- z&hcPnu~Klk3=+#$awfvplYrW|VXzek&5HnUqD;V2{rBIL35iJghrf@gJRGiS#g0lIWq7PbU|P?-x@TC^1`_DdE4=$1LPAn##^5-^VQ% z-B1$`h>ajQv!o89DL4O3JmL}_PxEdjJ(IdrlDd2~oru;Gx@x6f+!55(@hkPIXfA`* z$5ZG}(%Ea;WVgh$sCu8BNbqViVi%n%B}VDZ#yt_4W@MFBr~58K2WpMY z@{0l+=e7N(ZzyBkrs$)ht)zi1=5|ZADOb!|&WBH{HSGyYiSuW>ay<-O9KS?|sR2JL zmM=ZrV?Q5tNJx{3xdk1>wCaO4MmmSkB?ZJ~85e+nnyXlm>D>f=s+xS#&_2}7RYt>L z$Ci-Y+NU_Vh!|oY=DhpLUdS}3r=)&T`#ftv4`x)7-8CD(NH1IRa3qI>L-C!SGbn=Yhvy@(+NPDB|}?Bq~v zMEqNQyV>wmolsGo5Fpi(dbMzJJMVFiGV05SpG#M&%#;nD=wzx(2%PFrg2gd^&LS!~m>a45EKOe zN71aY=XFvz1i28u@1{DClFSz|Lv>wKofbBT7f(R8IBqpG z(U!8OwE#lTgNXgvS?i^{nV(m524o|Tvf2h|b&^msl>ia?cn0BH-NfRG@nXGSRP$H? zNr7xU=e{S2*{u4Ws_T=g=f^@~AEanwb)B(o zx$%C+)+3FAA~M3H6Dnbtfo0jZJm4VvhAtp|5Fk z$(xCy__+|`xvwjl!fD4R;wBjdT337mjb%2a87#JR@@Vfgm=R&FZJh zhr+WYR7YP41;?60BF=2189YvXZv|VH0M#WK)upHQMZP6&gI`RQE90D*Hi{Y}rZs?{ z!4K#!`f`))xGl--{*7jbn~DaJRvF;;JUkaP!2F}U`Y;HOj1dY@g6ta=8Ph|FmFvRy zB0)d&EEJ_vsTG*{zXZrW9?9=86DmQpOBuZ7wF7&Y57w zE#=)P%M~uz`;Q4hAlY;Ns?83)B?c=Lxrk~R=k?ZHELsh@bfwljg@v^}Z?}GtSM(b* zoXV)?>@`g0FO|PW6b2;?j>32clz3MD7UtQ%-cObdeCSQm0L<6WLkWAFW>9|$dRe3H z=0Bsq5Nk0Tf~)_FGI@HdJ7j9-21{ctybsBD(Y>U`ul*&I=RXjp62Fwz2}R}t56nVc z_Yolibs&FFlJA<|`o<+Cd|ny+bj>sU5^fHcqp87c8x4R^WiLH0vAvzDf|`y9zCFfQ zI1jA5A4e`|iR`A*KS1nx2CTfYWH2yb1te$4R_@COif!rEfCdhW9I`84)n&%|xCIlx z$%(F>VsUo-8MwRi6%@-=zcJ@!Zkgq@@U-LWuv-PeWgP69Z}k~2ZYr}j<>DN?@y-2N zU|mfhM;aHQPq23V>GyTwtBG2)cq97-b(dAXVe#oI4n#4@rzEzRCtdDZSqLgbo}resXQ%!>o(+p{11Z@4 z&pQ^$I~MmshkPBI7HUm4jH@CQ^;H#GlJ=@&usY5%7MWlqZ;!R>ogX8iEM)Pfa5gdT zqMva!qJ)wO&D2dPud2pvyG}^9d?Aq3&Zv$>_(jDeKtN@p7;*I999NHD7;c^sPGkH> zJ*y$(Tm|@b8gP}N9YT{^ zU&z-GZz5eTtVSUf-2D5Xn=CYYPf$RD8b=%NKVyFPR*)+lo+;VBQ?jwsuw4<5vwI}J z_c&Hlr*B}f_34nnx<`Dr;dr zX41?aFV-E_4rsa90@dXAV@i7vjt)RIN_mDK0#u`FW{PI&Z%=5v(y6?LTq8lAykvW` zhVT(&&E*;a2$=woW=w%uM;ZFuzpTFT4nuP(LRILGwe5RT^jL2VcNOIC_l-qT? z<<}TT?soV^$tXg5qb=dClJdWxKe>e}IF=rQ&TY){|B-|QABO}ih6FANp^u-!yhhhX zzOSLH1BPoZGfFrXcOLSKF`DKZ@oM8*s1G!zfIfJCwZ_2f{=1JF@mtpmD)^%QrNe!E z=gFnu(GNtrl80Fh`7hbhbV+FZZ?61XU4Y62jVSn{-qeLS?diCukQ2VHJR){lh?RD% z99#TxE4+xB<+6+tuoa7+JbM{k-aC{V4zajWZ!)u7nMo1J(C|+;CdAqok>WJdHW|!Q zNuqeB@{hdZa#J1Hx-pi8$3fk;lGp1<`5uLye~UB?hQcxfj51RG8!p-F32`kx9u1lq z-==W~x$`%s8PJ;Q>ZWBRD@;K_VoY^>dip0u=C9J~g31c@_U@7JQ>}2aSOAUp_v>$d z#FMZcK###qq}|Ly8}RtQs5P%N%_=vY7$CE7k97E@jmoGEP(}|}UIbv{QF8(0b*M_Z z8%|;t2jHKKNJ_$f(xXqs!xCmRYMHu5>C6hCNm}3Vbl9k(7jD9R;%|(Z{xL&%2G|0Q z@ru2m{ToJLv;LYu#S0$}Fdj;s*@5=Ve{{{IW{n)QXDP$xb&GBNEkm4hmiH=MG17zZ zPalX6B)Gl{s)7y;P1f}aM17}M**m8_Q6A+$NH+Sy6g%FCp2HhNZRy#G z{{oV;XEUus{hAI%@pv}p(ccEfP|I&a4y~K8u_>v>)nI?Xd6VnWe{x^p9C;Cf0!VacY z^t`xu_p7V)Ul@HeXA)4zc2-}}@2WMweN+FYF5@+pl^H$hkv2dnAJXCxo7xH~0O%&B z=lS4f^~I>JiP}nRM8aRR%@_%ql52lQZiBIksk?I^)p{5@n-&p;8pyQDKIeCZzx#)SAH@b8a{awyGX`tme9M%2ytY}Q}$2Xm#;=X|G&c)(X*&?YfF~y>z6i$I}1iBi@?QmSpKegjrXZ&?l=lHYp2i<2qF*xkR=uXt~X(=QTC`DL( z2QET3Tf%lD?pd7jbe7Vmxf72+__{Eh^)=wUlrLm$TzOP<} z!_qGY_}G$&XJiWsfcEuiQ;YjeWSx(gnki37W#`Pkc>MIr{r z@fFVGI5`PZCNBbmC7Xud^30Rfd1)U@Et#_nGo--d$95aLP<*2VIqizN8Pb%3>)N4a z7TI(|RTXCswZ=)E*vjvbX`7>qhMlm_x2HWx%JhincnyPaN?xkv4G{6%0#bxCaoG>x z=^WbKjJd3OM!qJdR1HRb2RTAy#`II0dW}tXC0cEn#PzVHKaSH#gD30UnN8xm-U$!u z-&@AyhB|~H_?BKr1$pKexG)2$fxCxU^V+kWf(>>|-llBYWb zdVDyFu18wBL}nhtG1(5jWoOeq0UY84!=Uw{X5S@8hy**7x)Xe7#W3uT*@@;<+IU+D z>rCbMm9jAP@{i>y_c$iK5_TJhL{0MIG1vxh^T63ipVCdRsXTK?KV3aGs!%kgNRT9q zF+}uGu6Q#)d93p`9+!bP?bYq|)@c$i zw%W}DS!hRxE>n{lRk?CcU7^XJ4RL7`NLO-INj5Z)L zVyMiuvN;oz>9_tz+99pO=u#`HK37n^MuUV&oO~M_U+rUV?{=xWX_h~+8ByX?-V?Th z`~W^vP|()!-6q?7v&BU_Wx_;tS zsXIip7zGjsfBAN5I`E0^lH1pArA+Qfkl{=|XBj4W&nTsIkGGMjgethGYxfy&%izSv zqXZeqvdMg!Cc-ZM^+QbVatoU^uM6r3(iB`i`ei<5Hp)}qV5X^%4tPwB zBON!eeA1-LulIduYkS*xC zawv6U!SJwgo1;g9#uNZso+Y18Upj!*g9Y&n!6226a$W`lD}c|P+pd6ZMuOAdQrH}p04ht z_0&R~W_Sn3dWg3f_*~?~`vsj=){pP;P&VOuU6Dp=FAd4IZxHaR3Csj?!52{I1U|Nw z0aR`mbsQPV8Wumyb9SsrlZ{JcEs8C|F_9a}G66+qrgcB&8?o&g-%%CinJ2MgJ~F^7 z-4)-|n(Mc)NZHEZzvp0g>Jn;*VJf2>9&*#chx;XgUq$Q{RB^+>xQpzv&6(0#JTJs- z5N)ow9h)NR%OMp~S2=k%{K14c&m-cmLpRD?b_QBrYeu_Xij6m7@FB5lA_F94l$5zCkLG_XeLr+y_YB|%wz@MnV82LVJiaO*(VyGSC#K$h( zg7`)||1yf*(z5gfVv0fBk#qS@`GW;<9%xcTJpA+=`egyhBGjjjH*H}qxVbnLGunjfSSU~mqRfZ+YOCdK;p}3n+73MxNLk}xOs<72WG%KmGAl3UUnxJ zkMepy2aie`2Dd-Fv%LK+N*&cOE+P=S%Q`w)Q#MOVpTfI-&dU|Uuu!cwnfK8W(+9aE zwQNsC*MN6yB0P?%T))Ls6&su0vQy5(p%X&WCiy-I7`*P-QEw1_Ma_#v=Y8Ftu>?5A zDS*L-x9Es84z6+p70qf^0&bR+b_eB4-(=_Kgr4nUT~=JG#mbv$N?QU34+GsanvxY4 zG^QhkQ=7yskvNvK-=bl~X7}mFN)+D|k&!ax%WCrVUAAh5YRz+)njqC(iki75YFuq_ z2_T?@N{N=dDfXPvKBw~ixM(xftTIF- za-$;T&Ur5&w)W<*{m}IVB>!ATdC(Sm9=OTD6%ckd7+gX=c>SC-=JduglyOLpz~yY8 zucAF^4#!7ECDP&2!pT?IRk<(zS!)~*zdMREcCbvZvTzOMLy|d0gL5M(;!mTcY|yCGZ6U5@F+ z^S#Xcggz?4ST{N%UOF^&&Xz7>>>aAA^XG%fdQkw|!Y*uUbJSdolqLK$aa!@uRO}-! zy9|wQo|A(K1WTY4>Pd+_e`n(h8pr=lZo(~yUqwqZVe-a*zn@2;I{^xc5@F+%-{3dV z4_$@~EVwydXPvLllTU9m9C4&v?QPlNOgn+BvGq_&$id`h2_P)J568ylz#}N|{I!H} z;$^43XT63-JPN54W`o{PTRVo{I=`&WvrV5KmoJVd`CL2|`;=~jD1#|lrMViWrdzy1 zv>k6RZawUTV$FW7X=cfwhvis@xG&*&oniJT;E4UD(rp@yY@_pBFGn;fk`v1PoD=f zK_jh*SS(ucMpFs`m<=HAZ8V{!+6eP@n1y@^mMp3Ge)KN zqxB#rAAg<-9kx;iFlZXyy4x?tro*8VKeeMK7sx64-dM~!AQpw6CpH2@pgJ^jDo!?I z+Dmv-4Y4xi#3J~kYM|I!V`@=`H4^vc&C=UPxho!!36z?FF`GptnJrHUGWPhCoUi0> z*tgp@7qrP`RiwG1-XcZk+u2ztuU7K)8EctxHpA>*IA|B^QHIukMs8=m#G`L}Z$7QFNvd4LU(6c=P}Q{^a)1^ZUH4?JINBqAxZR|R&RXPJH!*m5!S zYnig{BKOUa^&eG3R?t@m=NP`xjHbv~4j{6IoYx$KIE#3i!@%g0A+E`cQN(@c4-k-M zcVzCjX+BiUTl@0Z*O2p}lg! zQNDwnvz^$;DAo4d3hbS$I?5SJh?dmMg2V1F@3zR@9V4oR9m0pP@nUmgp?Uh1C$ldv)|4%`79+0bcKE1pR4Q@a}PCbVNJ>TT6 z{qIY+rmrA-&Fbjde+p$EB}$x*bhpOAyC`poo>alvw^-rmNl&n=$^W=qYaR#G0epWK z#!~)f%sjpLHF1Q1$n1k7TCaDYpFY{!`JOjGd71=OnyXu!mpQIG&G94)8x;HmJyCxfr^!%5lnmkNrrxr71tR>Lc+Q-VogQ}@1TJhsa zV0OI1_Heejlp(e=#RI50BlX_ZhjR>HWe}yQ@D7UwQGoX6P@e{*vpM?B)AMG{m5$`q z@(zt-4(e)IY}L(+Ip{^zlq5^jB@mcwABW6)WBokb7yS5V{@)!S~V^+U0lG*|10TGvulrv7QWm+B5d0b#4rfswEbz+Qw7hk z&C3C;Nj?Knq8SYd4dqt%!``|h(&5$B!}wjY+Vespd~b0Xme55&pts?X70(piUUDA9 zd@Nrp66sCM-#8_p^dp96B>)7LyJY+D1ncj8!&_-qJ^L@FXU4K#LfsmWrU8Zz1|aa7 z@n9hLD6gNBtt=v8ynsZ`)QNyFtGs7@uxFyk?%X;-SLhLFT@ynBkt%z3x3ZQGWDRcj zVS>w3^%Wh`@Bu-f1A`-WihKZx8Xhi>zwAX#{(bOuJKVrKHodFseO2R+=1VphP^WwQ z+aYhqVX0B4%y4Qz3kJw3Y)!FVzs`oXd2;h<0ZXCC#0SRuO=Vf!udr@8+Sh=NXW@sc*1zOawQPe=r$@>;N~tG1Zxh)0{^3g=?brD19s$O>_QCeM zhV!6IXyY%s%l9%77@p-LIEMQ&h*qO^0BJyXSkhSZ{1Yx&&!P4WNR5CA zwm+@>ncu1bQIl*Dw{~^KcJ7M;lR1T76_z2igDu%15KCXm)klx27P28+7PN=UjUjbT zv2ptVzDE0L4$*duhNwT)M=w7<8c3ct@)vCG0~K`sl%F>oJ2Pd?4ItCA4|dum=>AXw%$7MjgfcA1RwzC%&hVXccIooh$9nWridFU`1i-^OiZ8{29Wy%y2VkN|j)Rt0MKePwJOYK?uzaZaTaxT^McUMG8Z5Oasb&$o(!m63ApZ>KR#b zJHm;@Ve$-W=JvdLjFJiU8HK7J&HPLOlQqjlN!mq)B4`xSI`*<&`uL+!>$8H~hM(!u z)v_nj*A<&N)+G?=4KQkau20A6j7!N4WPvZPdw$;B=GWX63Yu zE6)12^;vYPKtz<}Cefe6;x2KC1+sRX=b_Jey=8|_0A_$L~?BE>Tq9uaJ0i$G)z=&E}S&?4LDo%MW`a2yC{A?M4sE= zOF^aNKJ==4i8O>eVtj_%HIUnJ#R^XK%!>@xLtI+->^+mSGGrA=@A^a&0L)QG{uTvJMquTuYO^n6lNi)F`3L zB|Bpo*Zv#%-TF1Z?m5qMp6C4W{+#puJnzrvobUHJ=jG@RXKSG^{*1ftM|e~)eYENn z?5$NcnwrFhM6wv%K`51Gsup3c`SUtzjYdjvIg(}&=(lxBB7X>TrC|8HXm(_|6<*o? zEvD+hztWDhP)ZRHO|8pEePEE@;?laYVLori2Gua4o^af9AJJpxJDzJL_AyW|@o}h3 zaJuN0u4c?}Jy_-puK>>@S@Nkq4~uSO0ioOj`oxb=VhKEam+f0)_*iJ+70MZ_&KKsN zTjCOgDg6B&R?r&n(OU-|-0fU-44@_Q`Znop&=35#3y~H>i~8QflD+Z5kGAjQNRNJ( z7H5eUkUy(zq0d@+CWS5Iy`(W9=ag){!~)aNAbDdc8{nt+i!(jIi&+BkmT8K#cy3kX z(9U#OWa;(C>TvO;)DBcO( zh>mG=lG<0Okkc{GbCP))yluV~j?BP^dKz`qyU1^J@c2O_rptIVkvX6WVI>-&9M-OR z+37H|ydsYxVo|n12E*EYbPvBp46@ntgA(?y`#{c5+x9CM??`Fh3%%6X)4t7A1$MPh zhXb=y!Zz=K^EUX|4N$txr=i+2c$)=DwHv)&psJX8#A-I;Dm7t%dE7=1Spy}k)+ z-CuuA7$uPf_DTQz6NCy#5Q2><55WH1Q29F{Gj{41uxP^A>%ham7uxn#37~>rA+i1K zuPcXpW7UUi+e5I^R&B-12M2Rs52HfX`VXmoCMsw+i$+}{&% z1mhWV7`>Z!mUW-AlO|i@F%T?b%kPUe52&{#7FA2;T<+$ETV^lff5SpU2-Y&y2VMmUQMcd!b_`_cFUD z=cGX#?B`vpHwqsi7fK%T*2zwltDAqQz|ES~C&y6|mAXo(vOJsJY{3rk{g!m$^g9Xo z#WWSwU{Myx*xA^)n603LgK!;Cs30-t8r6*S>s`&p)$3~9Cn7p>nT3!+Z-LqH4x;hz ztlb|Mai7&{(_9$tzcUco|OKE@QbBSF%Q&zHOr-C_w^cda;xQB^mF6sLZt zJ$Jh6tiTi{-Lo<3uaIc&mG#k-xFFccH>SIr)g9^w?%`s0qi^_^0ot_}&WG>Fb-Bu( zuEn}r3MrMXT)9*|k}Czj!x{L6#XFdWo>?sN%ZC&}c%fO5-fOSQL9|}$CAIoCpAtCh zAf0yN``a&OL`1cGJ@=?UHO*D+!<4Hlj?}u;YA0$cW|;U(BRk|8-Har+`I(^)V4*Fp zm$C`sH^0{NfE6El3A4YLF>wvVp~oPuX?lQ91p2rr8tvWGTc#C&Q>?M#+`K1!ITuZz z9V%8!JcIzcX;JA#5&`w4Rk34+K2w32sWmcRL~Rvr%k?5^oAdgo&Z=HvS{KlbH&imH z6TxOI!DMxn0m>fhsE@);TAHd?dX&Y?%e3sm@!UZlLl^(K6kA*f7vb1oPMD+k6rnEkUT?6;`(!{)zVpO0)A6$25@Q#s4Y%f zHFrx}Sxz!We|gh?@5=ddWQzCK3q)7v1Ij-L$B8q!ppx;pi-^my|B8?@$ z&^=UtT#YrelvT5A7eA3)G*({KmpjaK&fLE6_Hv!D#)R9-d(&N(-Yv!# z1i@R5%Egt&<;xC3UV-`3C|ZB&Z=Avx+Vlb)H|Kel8sVDUK-Rz-a} zH}UjXD_9v>|Hie!M%&6M#D~CW)e~h>F6FM3#U9XbE=zF^;$I5V?>Gd9w#RN3=nuS) ztV4rSMFHuv7=ySq`==YKg_FG7U4q@WrM)gX1MLURWkjw%u(5e5&&}iN?z38!d*@Bc zkX|bD0~BBl!^Tw^hgK9H+}rUALFVud+LL&Q@ZgV~%71Fwd7UJZeP z!>@TFT#lSnW!Fn`66+ok2+4ka?aQqPu0Y6ajL=zP8D<{UJeql+&0h{KrhohxJL39o zxo^bp%tSg{&FsU?k!(Sms8f{oG#A|kMZ=6gW#o%94>=e;2@PhLbi;&k$b?aXIGF^d z;n+lnWqHnbQwMru*-FNK+2ZWY>R~tZogUIIoKXFG*;{lx$N<{B(HGl{&rWlPCd-N| z$Rhd@0%=UUef~ya|7b9dVTP|fFU95P!50B@DW6(~2A2jpjAbDVmga zPP{y?cSkweG>Z&kWh9N+b5p2l%b7}miJeduI>S+w*^1%Z2nRwz|30HH3UBvY^huk) z=5VQpyGSO)QYoQLW1H6PH&x-ao31xVS)`!kp!#=EA;~e{wp*m!{y(;mTusgmJk|mL zw_CEe&_%6L~=2CjsFlwT>K{fmx?EkLtaEb;<$kT afM1l9wFNZ^h6n)Ak#-$Y|1P&aI{Ocqvl3_k diff --git a/welleng/errors/tool_errors.py b/welleng/errors/tool_errors.py index 55d197f..39fdc00 100644 --- a/welleng/errors/tool_errors.py +++ b/welleng/errors/tool_errors.py @@ -1,12 +1,11 @@ +import os + import numpy as np -from numpy import sin, cos, tan, pi, sqrt -from numpy.core.defchararray import index import yaml -import os + from collections import OrderedDict -# import imp +from numpy import sin, cos, tan, pi, sqrt -# import welleng.error from ..utils import NEV_to_HLA # since this is running on different OS flavors diff --git a/welleng/survey.py b/welleng/survey.py index a81bde7..346ce50 100644 --- a/welleng/survey.py +++ b/welleng/survey.py @@ -49,11 +49,7 @@ def __init__( deg=True, depth_unit='meters', surface_unit='meters', - mag_defaults={ - 'b_total': 50_000., - 'dip': 70., - 'declination': 0., - }, + mag_defaults=None, **kwargs ): """ @@ -142,7 +138,11 @@ def __init__( self.G = G self.azi_reference = azi_reference - self.mag_defaults = mag_defaults + self.mag_defaults = mag_defaults or { + 'b_total': 50_000., + 'dip': 70., + 'declination': 0., + } self._get_mag_data(deg) def _get_mag_data(self, deg): @@ -234,8 +234,8 @@ def __init__( cov_nev=None, cov_hla=None, error_model=None, - start_xyz=[0., 0., 0.], - start_nev=[0., 0., 0.], + start_xyz=None, + start_nev=None, start_cov_nev=None, deg=True, unit="meters", @@ -325,8 +325,10 @@ def __init__( ) self.unit = unit self.deg = deg - self.start_xyz = start_xyz - self.start_nev = start_nev + + self.start_xyz = start_xyz or [0., 0., 0.] + self.start_nev = start_nev or [0., 0., 0.] + self.md = np.array(md).astype('float64') self.start_cov_nev = start_cov_nev @@ -384,6 +386,7 @@ def _process_azi_ref(self, inc, azi, deg): self.azi_true_deg - math.degrees(self.header.declination) ) self._get_azi_mag_and_true_rad() + elif self.header.azi_reference == 'true': if deg: self.azi_true_deg = np.array(azi).astype('float64') @@ -400,6 +403,7 @@ def _process_azi_ref(self, inc, azi, deg): self._get_azi_mag_and_true_deg() azi_temp = self._get_azi_temp(deg) self._make_angles(inc, azi_temp, deg) + else: # azi_reference is "magnetic" if deg: self.azi_mag_deg = np.array(azi).astype('float64') @@ -444,8 +448,10 @@ def _get_azi_mag_and_true_deg(self): def _get_radius(self, radius=None): if radius is None: self.radius = np.full_like(self.md.astype(float), 0.3048) + elif np.array([radius]).shape[-1] == 1: self.radius = np.full_like(self.md.astype(float), radius) + else: assert len(radius) == len(self.md), "Check radius" self.radius = np.array(radius) @@ -469,8 +475,10 @@ def _min_curve(self, vec): if self.x is None: # self.x, self.y, self.z = (mc.poss + self.start_xyz).T self.x, self.y, self.z = (mc.poss).T + if self.n is None: self._get_nev() + if vec is None: self.vec_xyz = get_vec(self.inc_rad, self.azi_grid_rad, deg=False) self.vec_nev = get_vec( @@ -512,8 +520,8 @@ def get_error(self, error_model, return_error=False): if return_error: return self.err - else: - return self + + return self def _get_errors(self): """ @@ -521,18 +529,20 @@ def _get_errors(self): covariance matrices with the specified error model. """ if self.error_model: - # if self.error_model == "iscwsa_mwd_rev4": self.err = ErrorModel( self, error_model=self.error_model ) self.cov_hla = self.err.errors.cov_HLAs.T self.cov_nev = self.err.errors.cov_NEVs.T + else: if self.cov_nev is not None and self.cov_hla is None: self.cov_hla = NEV_to_HLA(self.survey_rad, self.cov_nev.T).T + elif self.cov_nev is None and self.cov_hla is not None: self.cov_nev = HLA_to_NEV(self.survey_rad, self.cov_hla.T).T + else: pass @@ -547,10 +557,7 @@ def _curvature_to_rate(self, curvature): with np.errstate(divide='ignore', invalid='ignore'): radius = 1 / curvature circumference = 2 * np.pi * radius - if self.unit == 'meters': - x = 30 - else: - x = 100 + x = 30 if self.unit == 'meters' else 100 rate = np.absolute(np.degrees(2 * np.pi / circumference) * x) return rate @@ -563,10 +570,7 @@ def _get_toolface_and_rates(self): # split the survey s = SplitSurvey(self) - if self.unit == 'meters': - x = 30 - else: - x = 100 + x = 30 if self.unit == 'meters' else 100 # this is lazy I know, but I'm using this mostly for flags with np.errstate(divide='ignore', invalid='ignore'): @@ -732,6 +736,7 @@ def project_to_bit(self, delta_md, dls=None, toolface=None): """ if dls is None: dls = self.dls[-1] + if toolface is None: toolface = self.toolface[-1] @@ -817,10 +822,10 @@ def interpolate_md(survey, md): x = md - survey.md[idx] assert x >= 0 - return _interpolate_survey(survey, x=x, index=idx) + return _interpolate_survey(survey, md=x, index=idx) -def _interpolate_survey(survey, x=0, index=0): +def _interpolate_survey(survey, md=0, index=0): """ Interpolates a point distance x between two survey stations using minimum curvature. @@ -829,7 +834,7 @@ def _interpolate_survey(survey, x=0, index=0): ---------- survey: welleng.Survey A survey object with at least two survey stations. - x: float + md: float Length along well path from indexed survey station to perform the interpolate at. Must be less than length to the next survey station. @@ -861,7 +866,7 @@ def _interpolate_survey(survey, x=0, index=0): total_dogleg = survey.dogleg[index + 1] - dogleg = x * (total_dogleg / survey.delta_md[index + 1]) + dogleg = md * (total_dogleg / survey.delta_md[index + 1]) t = ( (math.sin(total_dogleg - dogleg) / math.sin(total_dogleg)) * t1 @@ -876,7 +881,7 @@ def _interpolate_survey(survey, x=0, index=0): sh.azi_reference = 'grid' s = Survey( - md=np.array([survey.md[index], survey.md[index] + x]), + md=np.array([survey.md[index], survey.md[index] + md]), inc=np.array([survey.inc_rad[index], inc]), azi=np.array([survey.azi_grid_rad[index], azi]), start_xyz=np.array([survey.x, survey.y, survey.z]).T[index], @@ -885,8 +890,8 @@ def _interpolate_survey(survey, x=0, index=0): deg=False, ) interpolated = False if any(( - x == 0, - x == survey.md[index + 1] - survey.md[index] + md == 0, + md == survey.md[index + 1] - survey.md[index] )) else True s.interpolated = [False, interpolated] @@ -932,7 +937,7 @@ def tidy_up_angle(d): dogleg = s_temp.dogleg[-1] if np.isnan(dogleg): - return _interpolate_survey(survey, x=0, index=idx) + return _interpolate_survey(survey, md=0, index=idx) if dogleg == 0: x = ( @@ -989,7 +994,7 @@ def tidy_up_angle(d): assert x <= delta_md - interpolated_survey = _interpolate_survey(survey, x=x, index=idx) + interpolated_survey = _interpolate_survey(survey, md=x, index=idx) interpolated = True if x > 0 else False node = get_node(interpolated_survey, 1, interpolated=interpolated) diff --git a/welleng/utils.py b/welleng/utils.py index f515829..be2f704 100644 --- a/welleng/utils.py +++ b/welleng/utils.py @@ -161,6 +161,7 @@ def get_vec(inc, azi, nev=False, r=1, deg=True): else: inc_rad = inc azi_rad = azi + # REVIEW: why `r` is needed while at the end the vector is normalized? y = r * np.sin(inc_rad) * np.cos(azi_rad) x = r * np.sin(inc_rad) * np.sin(azi_rad) z = r * np.cos(inc_rad) @@ -173,9 +174,7 @@ def get_vec(inc, azi, nev=False, r=1, deg=True): return vec / np.linalg.norm(vec, axis=-1).reshape(-1, 1) -def get_nev( - pos, start_xyz=np.array([0., 0., 0.]), start_nev=np.array([0., 0., 0.]) -): +def get_nev(pos, start_xyz=None, start_nev=None): """ Convert [x, y, z] coordinates to [n, e, tvd] coordinates. @@ -183,24 +182,27 @@ def get_nev( pos: (n,3) array of floats Array of [x, y, z] coordinates start_xyz: (,3) array of floats - The datum of the [x, y, z] cooardinates + The datum of the [x, y, z] coordinates start_nev: (,3) array of floats The datum of the [n, e, tvd] coordinates Returns: An (n,3) array of [n, e, tvd] coordinates. """ - # e, n, v = ( - # np.array([pos]).reshape(-1,3) - np.array([start_xyz]) - # ).T + start_xyz = start_xyz or np.array([0., 0., 0.]) + start_nev = start_nev or np.array([0., 0., 0.]) + e, n, v = ( - np.array([pos]).reshape(-1,3) - np.array([start_xyz]) + np.array([pos]).reshape(-1, 3) - np.array([start_xyz]) ).T return (np.array([n, e, v]).T + np.array([start_nev])) -def get_xyz(pos, start_xyz=[0., 0., 0.], start_nev=[0., 0., 0.]): +def get_xyz(pos, start_xyz=None, start_nev=None): + start_xyz = start_xyz or [0., 0., 0.] + start_nev = start_nev or [0., 0., 0.] + y, x, z = ( np.array([pos]).reshape(-1, 3) - np.array([start_nev]) ).T @@ -215,7 +217,7 @@ def _get_angles(vec): return np.stack((inc, azi), axis=1) - +# REVIEW: did using numba helped? if NUMBA: _get_angles = njit(_get_angles) @@ -284,6 +286,7 @@ def get_transform( # return trans + def NEV_to_HLA(survey, NEV, cov=True): """ Transform from NEV to HLA coordinate system. @@ -295,11 +298,11 @@ def NEV_to_HLA(survey, NEV, cov=True): The NEV coordinates or covariance matrices. cov: boolean If cov is True then a (3,3,d) array of covariance matrices - is expecte, else a (d,3) array of coordinates. + is expected, else a (d,3) array of coordinates. Returns: Either a transformed (n,3) array of HLA coordinates or an - (3,3,n) array of HLA covariance matrices. + (3,3,n) array of HLA covariance matrices. """ trans = get_transform(survey) @@ -309,10 +312,10 @@ def NEV_to_HLA(survey, NEV, cov=True): np.dot(np.dot(t, NEV.T[i]), t.T) for i, t in enumerate(trans) ] - HLAs = np.vstack(HLAs).reshape(-1,3,3).T + HLAs = np.vstack(HLAs).reshape(-1, 3, 3).T else: - NEV = NEV.reshape(-1,3) + NEV = NEV.reshape(-1, 3) HLAs = [ np.dot(NEV[i], t.T) for i, t in enumerate(trans) ] @@ -328,7 +331,7 @@ def HLA_to_NEV(survey, HLA, cov=True, trans=None): np.dot(np.dot(t.T, HLA.T[i]), t) for i, t in enumerate(trans) ] - NEVs = np.vstack(NEVs).reshape(-1,3,3).T + NEVs = np.vstack(NEVs).reshape(-1, 3, 3).T else: NEVs = [ From 81988c5b001dad7d9c866c86dbdbefafa6453a9c Mon Sep 17 00:00:00 2001 From: Mo Kamyab <> Date: Wed, 16 Feb 2022 13:30:31 +0000 Subject: [PATCH 2/3] minor changes --- welleng/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/welleng/utils.py b/welleng/utils.py index be2f704..d2c421c 100644 --- a/welleng/utils.py +++ b/welleng/utils.py @@ -161,7 +161,7 @@ def get_vec(inc, azi, nev=False, r=1, deg=True): else: inc_rad = inc azi_rad = azi - # REVIEW: why `r` is needed while at the end the vector is normalized? + y = r * np.sin(inc_rad) * np.cos(azi_rad) x = r * np.sin(inc_rad) * np.sin(azi_rad) z = r * np.cos(inc_rad) @@ -217,7 +217,6 @@ def _get_angles(vec): return np.stack((inc, azi), axis=1) -# REVIEW: did using numba helped? if NUMBA: _get_angles = njit(_get_angles) From 90a1d8cd144627637526670279b2fca4af8b99a8 Mon Sep 17 00:00:00 2001 From: Mo Kamyab <> Date: Wed, 16 Feb 2022 14:07:52 +0000 Subject: [PATCH 3/3] minor change --- examples/build_a_well_from_sections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/build_a_well_from_sections.py b/examples/build_a_well_from_sections.py index b07fc69..4518268 100644 --- a/examples/build_a_well_from_sections.py +++ b/examples/build_a_well_from_sections.py @@ -85,7 +85,7 @@ # make a mesh mesh = WellMesh(survey, method='circle') - + # finally, plot it plot([mesh.mesh], interactive=False)