Skip to content

Instantly share code, notes, and snippets.

@andyfaff
Last active March 7, 2023 23:59
Show Gist options
  • Save andyfaff/efa84c2a88bbb837ff6dc5acdb84dea4 to your computer and use it in GitHub Desktop.
Save andyfaff/efa84c2a88bbb837ff6dc5acdb84dea4 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "ff2c5513",
"metadata": {},
"source": [
"# Comparison of kernel execution times\n",
"\n",
"This notebook compares kernel execution times for the core reflectivity calculation for various refl1d versions, and those offered by the various backends in refnx."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "a87afb2e",
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"import platform\n",
"import itertools\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import numba\n",
"\n",
"from refl1d.reflectivity import reflectivity\n",
"\n",
"import refnx\n",
"from refnx.reflect import available_backends, use_reflect_backend, abeles, Structure, SLD\n",
"\n",
"q = np.linspace(0.01, 0.5, 3000)\n",
"\n",
"si = SLD(2.07)\n",
"sio2 = SLD(3.47)\n",
"layer = SLD(-0.5+1e-5j)\n",
"d2o = SLD(6.36)\n",
"\n",
"structure = si | sio2(100, 3) | layer(500, 3) | d2o(0, 3)\n",
"\n",
"slabs = structure.slabs()[:, :-1]\n",
"microslabs = structure._micro_slabs()[:, :-1]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a9265590",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'python_version': '3.8.16.final.0 (64 bit)',\n",
" 'cpuinfo_version': [9, 0, 0],\n",
" 'cpuinfo_version_string': '9.0.0',\n",
" 'arch': 'X86_64',\n",
" 'bits': 64,\n",
" 'count': 8,\n",
" 'arch_string_raw': 'x86_64',\n",
" 'vendor_id_raw': 'GenuineIntel',\n",
" 'brand_raw': 'Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz',\n",
" 'hz_advertised_friendly': '2.8000 GHz',\n",
" 'hz_actual_friendly': '2.8000 GHz',\n",
" 'hz_advertised': [2800000000, 0],\n",
" 'hz_actual': [2800000000, 0],\n",
" 'l2_cache_size': 262144,\n",
" 'stepping': 9,\n",
" 'model': 158,\n",
" 'family': 6,\n",
" 'flags': ['1gbpage',\n",
" '3dnowprefetch',\n",
" 'abm',\n",
" 'acapmsr',\n",
" 'acpi',\n",
" 'adx',\n",
" 'aes',\n",
" 'apic',\n",
" 'avx',\n",
" 'avx1.0',\n",
" 'avx2',\n",
" 'bmi1',\n",
" 'bmi2',\n",
" 'clflush',\n",
" 'clflushopt',\n",
" 'clfsh',\n",
" 'clfsopt',\n",
" 'cmov',\n",
" 'cx16',\n",
" 'cx8',\n",
" 'de',\n",
" 'ds',\n",
" 'ds_cpl',\n",
" 'dscpl',\n",
" 'dtes64',\n",
" 'dts',\n",
" 'em64t',\n",
" 'erms',\n",
" 'est',\n",
" 'f16c',\n",
" 'fma',\n",
" 'fpu',\n",
" 'fpu_csds',\n",
" 'fxsr',\n",
" 'ht',\n",
" 'htt',\n",
" 'ibrs',\n",
" 'intel_pt',\n",
" 'invpcid',\n",
" 'ipt',\n",
" 'l1df',\n",
" 'lahf',\n",
" 'lahf_lm',\n",
" 'lzcnt',\n",
" 'mca',\n",
" 'mce',\n",
" 'mdclear',\n",
" 'mmx',\n",
" 'mon',\n",
" 'monitor',\n",
" 'movbe',\n",
" 'mpx',\n",
" 'msr',\n",
" 'mtrr',\n",
" 'osxsave',\n",
" 'pae',\n",
" 'pat',\n",
" 'pbe',\n",
" 'pcid',\n",
" 'pclmulqdq',\n",
" 'pdcm',\n",
" 'pge',\n",
" 'pni',\n",
" 'popcnt',\n",
" 'prefetchw',\n",
" 'pse',\n",
" 'pse36',\n",
" 'rdrand',\n",
" 'rdrnd',\n",
" 'rdseed',\n",
" 'rdtscp',\n",
" 'rdwrfsgs',\n",
" 'seglim64',\n",
" 'sep',\n",
" 'sgx',\n",
" 'smap',\n",
" 'smep',\n",
" 'ss',\n",
" 'ssbd',\n",
" 'sse',\n",
" 'sse2',\n",
" 'sse3',\n",
" 'sse4.1',\n",
" 'sse4.2',\n",
" 'sse4_1',\n",
" 'sse4_2',\n",
" 'ssse3',\n",
" 'stibp',\n",
" 'syscall',\n",
" 'tm',\n",
" 'tm2',\n",
" 'tpr',\n",
" 'tsc',\n",
" 'tsc_thread_offset',\n",
" 'tscdeadline',\n",
" 'tsci',\n",
" 'tsctmr',\n",
" 'tsxfa',\n",
" 'vme',\n",
" 'vmx',\n",
" 'x2apic',\n",
" 'xd',\n",
" 'xsave',\n",
" 'xtpr'],\n",
" 'l2_cache_line_size': 256,\n",
" 'l2_cache_associativity': 6}"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import cpuinfo\n",
"cpuinfo.get_cpu_info()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "839a3833",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('darwin',\n",
" sys.version_info(major=3, minor=8, micro=16, releaselevel='final', serial=0))"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.platform, sys.version_info"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "cd83619f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.1.31'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"refnx.version.version"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "19baf7cf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.23.5'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.version.version"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ad068f90",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.56.4'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numba._version.version_version"
]
},
{
"cell_type": "markdown",
"id": "112bc096",
"metadata": {},
"source": [
"## Nevot-Croce comparison, 2 layers"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "146b56eb",
"metadata": {},
"outputs": [],
"source": [
"refnx_R = abeles(q, slabs)\n",
"R = reflectivity(\n",
" q / 2.0,\n",
" slabs[:, 0],\n",
" slabs[:, 1],\n",
" irho=slabs[:, 2],\n",
" sigma=slabs[1:, 3]\n",
")\n",
"\n",
"kz = np.ascontiguousarray(q / 2.0)\n",
"depth = np.ascontiguousarray(slabs[:, 0])\n",
"rho = np.ascontiguousarray(slabs[:, 1])\n",
"irho = np.ascontiguousarray(slabs[:, 2])\n",
"sigma = np.ascontiguousarray(slabs[1:, 3])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4de4975f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"refnx kernel timings\n",
"--------------------\n",
"\n",
"\n",
"backend = python, threads = 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/anz/miniconda3/envs/dev38/lib/python3.8/site-packages/refnx/reflect/reflect_model.py:233: UserWarning: Using the SLOW reflectivity calculation.\n",
" warnings.warn(\"Using the SLOW reflectivity calculation.\")\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.25 ms ± 60.7 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n",
"backend = c, threads = -1\n",
"238 µs ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n",
"backend = c, threads = 1\n",
"618 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n",
"backend = c_parratt, threads = -1\n",
"221 µs ± 7.82 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n",
"backend = c_parratt, threads = 1\n",
"539 µs ± 11 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n",
"backend = py_parratt, threads = 1\n",
"923 µs ± 14.7 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"\n"
]
}
],
"source": [
"# -1 means use all the processors\n",
"threads = [-1, 1]\n",
"\n",
"print(\"refnx kernel timings\")\n",
"print(\"--------------------\")\n",
"print(\"\\n\")\n",
"\n",
"for backend, thread in itertools.product(available_backends(), threads):\n",
" with use_reflect_backend(backend) as f:\n",
" if backend in ['py_parratt', 'python'] and thread == -1:\n",
" continue\n",
" print(f\"backend = {backend}, threads = {thread}\")\n",
" %timeit f(q, slabs, threads=thread)\n",
" print(\"\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0cafb647",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"928 µs ± 11 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n"
]
}
],
"source": [
"# measure timings for refl1d.reflectivity.reflectivity\n",
"%timeit reflectivity(kz, depth, rho, irho=irho, sigma=sigma)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "cec72ae5",
"metadata": {},
"outputs": [],
"source": [
"refl1d_version = ['0.8.10', '0.8.11', '0.8.12', '0.8.14', '0.8.15']\n",
"reflectivity_time = [1.46, 1.4, 1.43, 1.5, 1.02]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "1c5f225c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlN0lEQVR4nO3deXxMZ/8//tcsmcm+ySKJSIJQKiVE3FQbVa2bfrS62VoSW6nlpm61VEmjRTfFt5Sb1tIF1aL8Sqkq7lYRS6K2WBNxk0VClsk2ycz1+2NkkpGZyGSbZPJ6Ph7zMHPmfa55nzmTmbfrus45EiGEABEREZGVkFo6ASIiIqLaxOKGiIiIrAqLGyIiIrIqLG6IiIjIqrC4ISIiIqvC4oaIiIisCosbIiIisipySydQ37RaLW7fvg0nJydIJBJLp0NERERVIIRAbm4ufH19IZVW3jfT5Iqb27dvw9/f39JpEBERUTXcvHkTLVq0qDSmyRU3Tk5OAHRvjrOzs4WzISIioqrIycmBv7+//ne8Mk2uuCkdinJ2dmZxQ0RE1MhUZUoJJxQTERGRVWFxQ0RERFaFxQ0RERFZFRY3REREZFVY3BAREZFVYXFDREREVoXFDREREVkVFjdERERkVVjcEBERkVVhcUNERERWhcUNERERWRUWN0RERGRVWNwQEVGDoSoqQWGxxtJpUCPX5K4KTkRElpddUIyr6bm4kqbC5TQVrqTn4mq6CinZhfBxscUPE3qghZu9pdOkRorFDRER1ZmsfDWupKvuFzG6AuZKei7ScopMrpOSXYio9SewbUJPuNjb1GO2ZC1Y3BARUY3dzVPjSlru/ULm/r/pKtzJNV3E+LjYItjbCcFejrqbtxOcbeUYuS4WV9NVGPfNSXw9Ohy2NrJ63BKyBixuiIioyjJURbiSpsLV9FyD4aQMldrkOn6udgj2vl/AeDkh2NsRbbwc4WRrvFdm/ahueHXVUcQm3sW/fziDz4eGQiqV1NUmkRVicUNERAaEELijKsLVNF3vy+X7PTFX01W4m2e6iGnhZoe293ti2ng5oq23E1p7OcJRad5PzSPNnfGfEV0RuT4Wu/9Oga+LLeY+16Gmm0VNCIsbIqImSgiB9Nwi/XwYXQGj+zcrv9joOhIJ0NLd/n4BoytkdEWMA+wVtfeT0rONBz59tROmbonH2j8S4etqh1GPB9Va+2TdWNwQEVk5IQRScwofmNSrmxuTU1hidB2pBAho5oA29+fDtPV2QhsvR7T2dISdon7mwLzQ2Q+3swrx0d4ELPj5AnxcbPHPjj718trUuLG4ISKyEkII3M4u1E3ovT8f5kq6ClfTVMgtMl7EyKQSBDSzN5gPE+zlhFaeDg1iIu+EiFa4nVWAb47dwNQt8fhurBJhge6WTosaOBY3RESNjFYrcCurAFfLzYfRFTG5yFMbPwGeXCpBoIeDwZFJwd6OCPJwgFJu+SLGFIlEgveefxQp2YX47WIaxn59Etve7InWno6WTo0aMIkQQlg6ifqUk5MDFxcXZGdnw9nZ2dLpEBGZpNUK/O9eAa48cGTS1XQV8k0UMTYyCYI8HBDs5aSf1Bvs7YjAZg5QyBvvSekL1BoMW3sM8Tez0MLNDtsn9oSXk62l06J6ZM7vN4ubWpKdX4zV/72GwGb2CGjmgCAPB3g5KSGR8PBFIqqcRitw826+/sik0hPdXU1XobBYa3QdhUyKVp6lc2Kc0NbbEcHejgho5gAbWeMtYiqTqSrCy6v+QlJmPkL8XLDljX/AwcwjsajxMuf3m5+KWnL1jgqrDl0zWGZnI0NAM3sENnNAgMf9f5vZI8jDAd5OtjxvA1ETU6LRIvluPi6nlR2VdDlNhWt3VFCXmChi5FK09nSsMJwU4G4PuZUWMaY0c1Riw6hwvLTqL5y9lY3Jm05j7ciwJvc+0MOx56aWXE3PxddHbyApMx83MvPwv3sF0GhNv7VKuRQB5Xp5SougQA8H+Diz8CFqzIo1WtzIzDc4U++VtFxcv5MHtcZ4EaOUS/VHJunP2uvtBH83O/54PyAu+R6GrT2GwmIthoX7Y9GLIewlbwI4LFWJ+ppzoy7R4lZWAZIy83AjIw9Jmfm6+5n5uHk3HyWVFD4KuRQt3e0RqO/1cdDf93W1g4yFD1GDoC7R4kZmnn4+TGkRk5iRh2KN8b9xOxuZkSLGES3c7Pm3bYb9F9Iw/puT0Arg38+0xZSngy2dEtUxFjeVaAgTiks0pYWPrpcnMUNX9CRl5uHm3XyTX4qAbrKgv/v9Xp5mDgj00PX+BDazh58r/4dHVBeKSjRIysg3ONHd5TQVkjLyTP5HxV4h05/ornQ+TLCXE/xc7dgzW0u+OXYD8346BwD45JXH8GqYv4UzorrEOTcNnFwmRUAzBwQ0cwDgafBciUaLlOxCJGXe7+3JyMON+/eTM/Oh1mhx/U4ert/Jq9iuVFf46Ie4mtnf7/VxQAs3O6udZEhUWwqLNUjMyCub1JumwuX0XNzIzDc5zOyolBue6O7+NZR8XVjE1LUR/wjA7awCrDp0DXO2n4W3sy2ebOv58BXJ6rHnphHRaAVSsgv0vTxJ94e7btwf7ioyMSER0J2oq4WbnW6Oz/25PqW9Pv5u9o36EFEicxUWa/SHVJceZn01XYUbmXkwNWLspJTre1+CvcuGlHxcbDnfw4K0WoHpW+PxU/xtOChk2DqhBx71dbF0WlQHOCxVicZc3FRGq9WdXr10Xk9p8VN639ThpIDuNOt+bnb6o7nKD3n5u9s36BN8EVWmQK3RFzCl82GupKuQfDcfpr75nG3l+nPDlD9jr7czT+3QUKlLtIhaH4u/rmXCy0mJHZMeh5+rnaXTolrG4qYS1lrcVEYIgbScovuFT9lwV2mvj6mTgQG6i+T5utjpe3mCSgsgDwe0dLdvEKdnp6anRKNFTmEJsvLVyCooRnZ+Me7lq5GVX4y0nML7Ryjl4n/3CkwWMa72NmjrpRtGaltucq8nz0/VKOUUFmPw6qNISM1FsJcjfpzQEy72NpZOi2oRi5tKNMXipjJCCNzJLSp3NFcekjLKen5Mncod0BU+Ps62+iGuwPvziAI97BHg7lBvF9ejxqtYo0V2QTGy8ouRXaArTu7lFyMrX61fnlVQ9ri0gMk1cbFHY5o5KAzO1Ft6v5mDgkWMlUnJLsCLK/9Cak4hwoPc8c2YcPY8WxEWN5VgcVN1Qghk5qkNenn0R3Zl5Jm8EF+p5s62BufvKT17c0Aze55V1MqoS7TIKlAj+34xci+vrEcl637RUv7xvbxiZBcUQ/WQz9DDOCnlcHWwgaudAq72NnCxs4GHoxKtvcpOetfMUVlLW0mNQUJqDl5ddRS5RSX4v8d88P+GhnJit5VgcVMJFje1QwiBe/nF94udsuInKUNXAOU85H/WXk7Ksjk+94/oKr3vyMLHYgqLNWU9Jvlq3CvXo5JlpIcl+/6wUGVDm1XhYmcDV3sbuNrZwMVeAdcHHrvZ29wvXhT65c52NjwCkIz662oGItfHolgj8MaTrfDOgPaWTolqAYubSrC4qR9Z+WqD8/fcyMzXF0L38osrXdfDUVnuGl2l5/HRXcLC2ZZj6A8jhEBhsbasx+R+oZKlH+a538NSvlfl/v3KJp4/jESiK1Lc7BUGxYrr/ce6AkUBl3LLS4sUnryOattPcbcw7ft4AMB7Azsg6vEgyyZENcbiphIsbiwvO7/4/nl8Kh7ZlZmnrnTdZg6Ksut1lZvrE9jMweomDwohkK/WlM05KZ2Pcr8gyb6/vPy8lNL7pq5TVBUyqeR+j4lhEaJ7rICbg8394qV8D4sCTrZydv9Tg/LFoav4eO8lSCTAqte64p8dm1s6JaqBRlPc/Pe//8Unn3yCU6dOISUlBTt27MCgQYOqtO6RI0cQERGBjh07Ij4+vsqvyeKmYcspLEZyuV6e8kd2ZaiKKl3Xzd5Gf7bmB6/Z5eagqKctqEgIAVVRib4guZdffg5KxSGfe/ll9ys7W/XDyKUSXQGiL1IMh3VcHQyLE1d7XQHjqGCRQtZBCIF5O8/h22PJUMql2DSuO7oGuFs6LaqmRnOG4ry8PHTq1AmjR4/GSy+9VOX1srKyMHLkSDz99NNIS0urwwypvjnb2qCjnws6+lU8CZeqqMTgaK7y99Nzi3Avvxj38rMQfzOrwroudjb6oifw/tye0vvuVTxqRqsVyC0qKZsU++BRPeWGfO7ll59QW1zpRVQfRiGT6gqQ+0WIS7lipax4KZtQW7rcQSHj0UDUpEkkErw38FGkZhfit4vpGLPxJLa92ROtPR0tnRrVsQYzLCWRSKrcczN06FAEBwdDJpPhp59+Ys8NIa+oBMl3Dc/fk3S/+EnNKax0XSdbuX5Cs5+bHYqKtfohn3vlhn+yC4pNnr22KpRyKdzsHyhCyvWYuD0w/FNa0NjZsEghqol8dQmGrT2OMzez4O9uh+1vPg5PJx5F19g0mp6b6li/fj2uX7+Ob7/9Fh988MFD44uKilBUVDackZOTU5fpkYU4KOVo7+OM9j4VP/AFag2S7+YbPbLrdnYhcgtLcPZWNs7eyq7Sa9nZyOBm/8BRPeWGfNzKD/+UK1R4wkMiy7BXyPFVZBheXvUXbmTmY8zGE9jyxj9gr2h0P4FURY1qz165cgWzZ8/GH3/8Abm8aqkvXrwYMTExdZwZNWR2ChnaNXdCu+ZOFZ4rLNbgpr7wycetrALYK2RlQz52NgbzVpztWKQQNUYejkpsHBWOl1b9hb//l43Jm+KwZkRXyHk6AavUaIobjUaD4cOHIyYmBm3btq3yenPmzMH06dP1j3NycuDv718XKVIjZGsj051237ti4UNE1iXQwwFfRoZh+Npj+D0hHfN2nsOiF0M47GuFGk1xk5ubi5MnTyIuLg6TJ08GAGi1WgghIJfL8euvv6JPnz4V1lMqlVAqObZKRERAl5Zu+H9DQzHh21PYHHsTfq52mNwn2NJpUS1rNMWNs7Mzzp49a7Dsiy++wO+//44ff/wRQUE8QRMRET3cs482x3vPP4r5O8/j018vo7mLHV7p2sLSaVEtsmhxo1KpcPXqVf3jxMRExMfHw93dHS1btsScOXNw69YtfP3115BKpejYsaPB+l5eXrC1ta2wnIiIqDIjewTidlYhVh++htnb/oa3sxJPBHtaOi2qJRadSXXy5EmEhoYiNDQUADB9+nSEhoZi/vz5AICUlBQkJydbMkUiIrJSM/u1wwudfVGiFXjz29O4cJtH01qLBnOem/rC89wQEVGpohINItfF4tj1u/B2VmL7xMfh52pn6bTICHN+v3kMHBERNVlKuQz/GRGGtt6OSMspQtS6WGQ/5OK+1PCxuCEioibNxc4GG0aFw9tZiSvpKrzxzUkUlWgsnRbVAIsbIiJq8nxd7bBhVDgclXIcT7yLGT/8DW1NrrdCFsXihoiICEB7H2f8Z0RXyKUS/H9nbuOjvQmWTomqicUNERHRfY+38cDHrzwGAPjPf69j419Jlk2IqoXFDRERUTkvdWmBt/u1AwC89/+dx95zqRbOiMzF4oaIiOgBE3u3xvDuLSEEMHVLHE7duGfplMgMLG6IiIgeIJFIsOD5R/H0I14oKtFi7MYTuH5HZem0qIpY3BARERkhl0nx+fBQdGrhgnv5xYhafwIZqiJLp0VVwOKGiIjIBHuFHF9FdUNLd3sk383HmA0nkK8usXRa9BAsboiIiCrh4ajExtHhcLO3wZn/ZWPKpjiUaLSWTosqweKGiIjoIYI8HPBlZDco5VIcSEjHvJ3n0cQuzdiosLghIiKqgq4Bbvh/w0IhkQCbY5PxxaFrlk6JTGBxQ0REVEX9Hm2OmOcfBQB8su8Stp36n4UzImNY3BAREZlhZI9AjI9oBQCYte1v/Hklw8IZ0YNY3BAREZlpVr9HMLCTL0q0AhO+PYULt3MsnRKVw+KGiIjITFKpBJ+++hi6B7lDVVSCURticTurwNJp0X0sboiIiKpBKZdhzcgwtPV2RFpOEaLWxyK7oNjSaRFY3BAREVWbi50N1o8Kh7ezEpfTVBj/zUkUlWgsnVaTx+KGiIioBvxc7bA+KhyOSjmOXb+Lt3/4G1otz4FjSSxuiIiIaqiDrzNWvd4FcqkEu87cxsf7Llk6pSaNxQ0REVEteCLYEx+9/BgAYPXha/j6aJJlE2rCWNwQERHVkpe7tsCMZ9sCAKJ3nce+86kWzqhpYnFDRERUiyY91QbDwltCCOBfm+Nw6sY9S6fU5LC4ISIiqkUSiQTvv/Ao+jzihaISLcZuPIHrd1SWTqtJYXFDRERUy+QyKVYMD8VjLVxwL78YUetPIENVZOm0mgwWN0RERHXAXiHHV5Hd4O9uh+S7+Riz4QTy1SWWTqtJYHFDRERURzydlNg4Khxu9jY4879sTNkUhxKN1tJpWT0WN0RERHWolacjvowMg1IuxYGEdMzfdR5C8CR/dYnFDRERUR3rGuCO5UNDIZEAm44n44tD1yydklVjcUNERFQP/tmxOd4b+CgA4JN9l7Aj7n8Wzsh6sbghIiKqJ5E9A/HGk60AADN//BtHrmZYOCPrxOKGiIioHs3+5yP4v8d8UKwRmPDNKVxMybF0SlaHxQ0REVE9kkolWDK4E7oHuSO3qASj1p/A7awCS6dlVVjcEBER1TOlXIY1I8IQ7OWI1JxCRK2PRXZBsaXTshosboiIiCzAxd4GG0aHw8tJictpKoz/5iSKSjSWTssqsLghIiKyED9XO6wf1Q0OChmOXb+LmT/+Da2W58CpKRY3REREFvSorwtWvd4VcqkEO+Nv45NfL1k6pUaPxQ0REZGFPdnWEx++/BgAYNWha/jmaJJlE2rkWNwQERE1AK90bYF/P9MWABC96zx+PZ9q4YwaLxY3REREDcTkPm0wLNwfWgH8a0scTiffs3RKjRKLGyIiogZCIpHg/Rc64ql2nigs1mLsxpNIysizdFqNjkWLm//+978YOHAgfH19IZFI8NNPP1Uav337djzzzDPw9PSEs7MzevTogX379tVPskRERPVALpNixfAuCPFzwd08NSLXxyJTVWTptBoVixY3eXl56NSpE1auXFml+P/+97945plnsGfPHpw6dQpPPfUUBg4ciLi4uDrOlIiIqP44KOVYF9UN/u52uJGZj9EbT6JAzXPgVJVECNEgDqiXSCTYsWMHBg0aZNZ6jz76KIYMGYL58+dXKT4nJwcuLi7Izs6Gs7NzNTJ9iDx2HxIRUe24fkeF4V8eR3Z+MZ56xBP/b2go5LJGMKPEwaHWmzTn91te669ej7RaLXJzc+Hu7m4ypqioCEVFZd15OTl1fIEyR8e6bZ+IiJqMVgCOlV8w3kKJmMvC/SaNoPwz7dNPP4VKpcLgwYNNxixevBguLi76m7+/fz1mSERERPWt0fbcbNq0CTExMdi5cye8vLxMxs2ZMwfTp0/XP87JyanbAkelqru2iYioyfrmaBIW7UkAAHz8ymMY2MnXwhk1XI2yuNmyZQvGjh2LH374AX379q00VqlUQqlU1lNmqJNxRiIiohF9H0VykQRr/0jE9N1X0MzLDT3beFg6rQap0Q1Lbd68GaNGjcLmzZvx3HPPWTodIiKiejOnf3s895gPijUC4785hYTUOp5H2khZtLhRqVSIj49HfHw8ACAxMRHx8fFITk4GoBtSGjlypD5+06ZNGDlyJJYsWYLu3bsjNTUVqampyM7OtkT6RERE9UoqlWDJq50QHuSO3KISRK07gZTsAkun1eBYtLg5efIkQkNDERoaCgCYPn06QkND9Yd1p6Sk6AsdAFizZg1KSkowadIk+Pj46G9Tp061SP5ERET1zdZGhrUjwtDGyxGpOYWIWncCOYXFlk6rQWkw57mpL3V+nhsiIqJ68L97+Xjxi79wJ7cIPVo1w8bR4VDIG91skyoz5/fbet8FIiIiK9bCzR7ro7rBQSHD0euZmPnjGTSx/gqTWNwQERE1Uh39XLDq9a6QSyX4Kf42Ptl3ydIpNQgsboiIiBqxJ9t6YvFLIQCALw5dwzfHblg4I8tjcUNERNTIvRrmj+nPtAUARO88h/0X0iyckWWxuCEiIrICU/q0wdBu/tAKYMrm04hLvmfplCyGxQ0REZEVkEgkeH9QR/Ru54nCYi3GbjyJpIw8S6dlESxuiIiIrISNTIqVw7ugo58zMvPUiFofi0xVkaXTqncsboiIiKyIg1KOdVHd0MLNDkmZ+Riz8SQK1BpLp1WvWNwQERFZGS8nW2wcHQ5XexvE38zClM1x0GibzjlwWNwQERFZodaejvhyZBgUcil+u5iG6F3nmsxJ/ljcEBERWamwQHcsH9IZEgnw7bFkrD583dIp1QsWN0RERFasf4gP5j3XAQDw0d4E7Iy/ZeGM6h6LGyIiIis3ulcQxvYKAgDM+OEM/rqWYeGM6haLGyIioibgnQHt8dxjPijWCIz/+hQSUnMsnVKdYXFDRETUBEilEix5tRPCA92RW1SCUetPICW7wNJp1QkWN0RERE2ErY0Ma0Z2RWtPB6RkF2LU+hPIKSy2dFq1jsUNERFRE+Jqr8CGUeHwdFIiITUXb357CuoSraXTqlUsboiIiJoYf3d7rI/qBgeFDEeuZmLWtr+t6hw4LG6IiIiaoI5+Lvji9a6QSSXYEXcLn/56ydIp1RoWN0RERE1URFtPLH4pBACw8uA1fHvshoUzqh0sboiIiJqwwWH+mNY3GAAwf+c5/HYhzcIZ1RyLGyIioiZu6tPBGBzWAloBTN58GvE3syydUo2wuCEiImriJBIJFr4Ygoi2nigs1mLMhhO4kZln6bSqjcUNERERwUYmxRevdUFHP2dk5qkRuS4WmaoiS6dVLSxuiIiICADgoJRjXVQ3tHCzQ1JmPsZ+fRIFao2l0zIbixsiIiLS83KyxYZR4XCxs0Fcchb+tSUOGm3jOgcOixsiIiIy0MbLEV9GhkEhl2L/hTTE/H/nG9VJ/ljcEBERUQXdAt2xbEhnSCTA10dvYM1/r1s6pSpjcUNERERGDQjxwbvPdQAALP4lATvjb1k4o6phcUNEREQmjekVhDG9ggAAM344g7+uZVg4o4djcUNERESVmjugPQaENEexRmD8N6dwKTXX0ilVisUNERERVUoqleCzwZ3RLdANuYUliFofi9TsQkunZRKLGyIiInooWxsZ1o4MQ2tPB6RkFyJqfSxyC4stnZZRLG6IiIioSlztFdgwKhyeTkokpObizW9PQ12itXRaFbC4ISIioirzd7fH+qhusFfI8OfVDMze9neDOwcOixsiIiIyS0c/F3zxWhfIpBJsj7uFJb9etnRKBljcEBERkdl6t/PCohc7AgBWHLyK747fsHBGZVjcEBERUbUM6dYSU58OBgDM++kcDlxMs3BGOixuiIiIqNqm9Q3Gq11bQCuAyZvicOZmlqVTYnFDRERE1SeRSLDopRA82dYTBcUajN5wAjcy8yyaE4sbIiIiqhEbmRRfvNYFj/o6IzNPjaj1J5CvLrFYPixuiIiIqMYclXKsj+oGf3c7jPhHAOwVcovlYtHi5r///S8GDhwIX19fSCQS/PTTTw9d59ChQ+jSpQuUSiXatGmDDRs21HmeRERE9HBezrb4dVoERt+/0KalWLS4ycvLQ6dOnbBy5coqxScmJuK5557DU089hfj4eEybNg1jx47Fvn376jhTIiIiqgo7hczSKcByfUYA+vfvj/79+1c5fvXq1QgKCsKSJUsAAO3bt8eff/6JpUuXol+/fnWVJhERETUiFi1uzHX06FH07dvXYFm/fv0wbdo0k+sUFRWhqKhI/zgnJ6eu0gOg640iIiJqyhwcHCz6+o2quElNTYW3t7fBMm9vb+Tk5KCgoAB2dnYV1lm8eDFiYmLqK0U4OjrW22sRERE1RJa+1pTVHy01Z84cZGdn6283b960dEpERERUhxpVz03z5s2RlmZ4aue0tDQ4Ozsb7bUBAKVSCaVSWR/pAQBUKlW9vRYRERFV1KiKmx49emDPnj0Gy/bv348ePXpYKKOKLD3OSERE1NRVa1jq9OnTOHv2rP7xzp07MWjQILzzzjtQq9VVbkelUiE+Ph7x8fEAdId6x8fHIzk5GYBuSGnkyJH6+AkTJuD69euYOXMmEhIS8MUXX2Dr1q146623qrMZREREZIWqVdyMHz8ely9fBgBcv34dQ4cOhb29PX744QfMnDmzyu2cPHkSoaGhCA0NBQBMnz4doaGhmD9/PgAgJSVFX+gAQFBQEHbv3o39+/ejU6dOWLJkCb788kseBk5ERER6ElGNKc0uLi44ffo0WrdujY8++gi///479u3bhyNHjmDo0KENetJuTk4OXFxckJ2dDWdnZ0unQ0RERFVgzu93tXpuhBDQarUAgN9++w0DBgwAAPj7+yMjI6M6TRIRERHVimoVN2FhYfjggw/wzTff4PDhw3juuecA6ObMPHgeGiIiIqL6VK3iZtmyZTh9+jQmT56MuXPnok2bNgCAH3/8ET179qzVBImIiIjMUa05N6YUFhZCJpPBxsamtpqsdZxzQ0RE1PiY8/td4/PcqFQq/fybUg25uCEiIiLrVq1hqcTERDz33HNwcHCAi4sL3Nzc4ObmBldXV7i5udV2jkRERERVVq2em9dffx1CCKxbtw7e3t6QSCS1nRcRERFRtVSruDlz5gxOnTqFdu3a1XY+RERERDVSrWGpbt26NegT9REREVHTVa2emy+//BITJkzArVu30LFjxwoTiB977LFaSY6IiIjIXNUqbu7cuYNr165h1KhR+mUSiQRCCEgkEmg0mlpLkIiIiMgc1SpuRo8ejdDQUGzevJkTiomIiKhBqVZxc+PGDezatUt/ZmIiIiKihqJaE4r79OmDM2fO1HYuRERERDVWrZ6bgQMH4q233sLZs2cREhJSYULx888/XyvJEREREZmrWteWkkpNd/g09AnFvLYUERFR41Pn15Z68FpSRERERA1FtebcEBERETVULG6IiIjIqrC4ISIiIqvC4oaIiIisilnFze+//96gj4QiIiIiMqu4GTt2LDw9PTF8+HB8//33yMnJqau8iIiIiKrFrOLm+vXrOHToEDp06IAlS5bA29sbzzzzDD7//HMkJyfXVY5EREREVVatk/iVun37Nnbt2oVdu3bh4MGDaNeuHZ5//nk8//zzCAsLq808aw1P4kdERNT4mPP7XaMJxb6+vpgwYQL27NmDjIwMzJs3D0lJSfjnP/+JRYsW1aRpIiIiomqpUc+NKRqNBnfv3oWnp2dtN11j7LkhIiJqfOqt58YUmUzWIAsbIiIisn48zw0RERFZFRY3REREZFVY3BAREZFVqXZxc+3aNbz77rsYNmwY0tPTAQC//PILzp8/X2vJEREREZmrWsXN4cOHERISguPHj2P79u1QqVQAgDNnziA6OrpWEyQiIiIyR7WKm9mzZ+ODDz7A/v37oVAo9Mv79OmDY8eO1VpyREREROaqVnFz9uxZvPjiixWWe3l5ISMjo8ZJEREREVVXtYobV1dXpKSkVFgeFxcHPz+/GidFREREVF3VKm6GDh2KWbNmITU1FRKJBFqtFkeOHMGMGTMwcuTI2s6RiIiIqMqqVdwsWrQIjzzyCPz9/aFSqdChQwc8+eST6NmzJ959993azpGIiIioymp0bank5GScO3cOKpUKoaGhCA4Ors3c6gSvLUVERNT4mPP7La/JC7Vs2RItW7asSRNEREREtapaxY0QAj/++CMOHjyI9PR0aLVag+e3b99eK8kRERERmataxc20adPwn//8B0899RS8vb0hkUhqOy8iIiKiaqlWcfPNN99g+/btGDBgQG3nQ0RERFQj1TpaysXFBa1ataqVBFauXInAwEDY2tqie/fuiI2NrTR+2bJlaNeuHezs7ODv74+33noLhYWFtZILERERNX7VKm7ee+89xMTEoKCgoEYv/v3332P69OmIjo7G6dOn0alTJ/Tr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ePAgHB0d9bdHHnkEgG6uTW25ePEi/P394evrq1/Wo0ePh6732muvYdu2bSgqKgIAfPfddxg6dCikUqk+/wULFhjkP27cOKSkpCA/P1/fTlhYmEG7b775JrZs2YLOnTtj5syZ+OuvvyrNvUePHpBIJPpljz/+OFQqFf73v//plz322GMG6/n4+CA9Pf2h20hEVcNZcERklIODg8FjlUqFgQMHGp0I7OPjU19pmTRw4EAIIbB7925069YNf/zxB5YuXap/XqVSISYmBi+99FKFdW1tbfX3H9zu/v3748aNG9izZw/279+Pp59+GpMmTcKnn35a7VxtbGwMHkskkgrzhYio+ljcEFGVdOnSBdu2bUNgYGCdHh3Uvn173Lx5EykpKfqi6dixYw9dz9bWFi+99BK+++47XL16Fe3atUOXLl0M8r906RLatGljdk6enp6IjIxEZGQknnjiCbz99ttGi5v27dtj27ZtEELoe2+OHDkCJycntGjRwuzXJaLq4bAUEVXJpEmTcPfuXQwbNgwnTpzAtWvXsG/fPowaNQoajabK7dy9exfx8fG4cOECAODSpUuIj49HamoqAKBv375o27YtIiMjcebMGfzxxx+YO3duldp+7bXXsHv3bqxbt04/kbjU/Pnz8fXXXyMmJgbnz5/HxYsXsWXLFrz77ruVtjl//nzs3LkTV69exfnz5/Hzzz+jffv2RmMnTpyImzdvYsqUKUhISMDOnTsRHR2N6dOn64fHiKju8a+NiKrE19cXR44cgUajwbPPPouQkBBMmzYNrq6uZv1w79q1C6GhoXjuuecAAEOHDkVoaChWr14NAJBKpdixYwcKCgoQHh6OsWPHVjiiyZQ+ffrA3d0dly5dwvDhww2e69evH37++Wf8+uuv6NatG/7xj39g6dKlCAgIqLRNhUKBOXPm4LHHHsOTTz4JmUyGLVu2GI318/PDnj17EBsbi06dOmHChAkYM2bMQwsoIqpdEiGEsHQSRERERLWFPTdERERkVVjcEBERkVVhcUNERERWhcUNERERWRUWN0RERGRVWNwQERGRVWFxQ0RERFaFxQ0RERFZFRY3REREZFVY3BAREZFVYXFDREREVuX/B3azTV0TCjzkAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(refl1d_version, reflectivity_time, label='refl1d')\n",
"plt.hlines(1.20, '0.8.10', '0.8.15', 'r', label='python')\n",
"plt.hlines(0.277, '0.8.10', '0.8.15', 'r', label='c, -1', linestyle='dashed')\n",
"plt.hlines(0.642, '0.8.10', '0.8.15', 'r', label='c, 1', linestyle='dashdot')\n",
"plt.hlines(0.995, '0.8.10', '0.8.15', 'black', label='py_parratt')\n",
"plt.hlines(0.238, '0.8.10', '0.8.15', 'black', label='c_parratt, -1', linestyle='dashed')\n",
"plt.hlines(0.552, '0.8.10', '0.8.15', 'black', label='c_parratt, 1', linestyle='dashdot')\n",
"\n",
"plt.legend()\n",
"plt.ylabel(\"time / ms\")\n",
"plt.xlabel(\"refl1d version\");"
]
},
{
"cell_type": "markdown",
"id": "d1c70d98",
"metadata": {},
"source": [
"## Microslabs comparison"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "17dca2ab",
"metadata": {},
"outputs": [],
"source": [
"kz = np.ascontiguousarray(q / 2.0)\n",
"depth = np.ascontiguousarray(microslabs[:, 0])\n",
"rho = np.ascontiguousarray(microslabs[:, 1])\n",
"irho = np.ascontiguousarray(microslabs[:, 2])\n",
"sigma = np.ascontiguousarray(microslabs[1:, 3])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "5d7953ab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1317, 4)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"microslabs.shape"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6f523de1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"refnx kernel timings\n",
"--------------------\n",
"\n",
"\n",
"backend = python, threads = 1\n",
"691 ms ± 23.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"\n",
"backend = c, threads = -1\n",
"44.3 ms ± 685 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"\n",
"backend = c, threads = 1\n",
"235 ms ± 5.84 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"\n",
"backend = c_parratt, threads = -1\n",
"36.1 ms ± 105 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"\n",
"backend = c_parratt, threads = 1\n",
"162 ms ± 3.63 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"\n",
"backend = py_parratt, threads = 1\n",
"538 ms ± 10.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"\n"
]
}
],
"source": [
"# -1 means use all the processors\n",
"threads = [-1, 1]\n",
"\n",
"print(\"refnx kernel timings\")\n",
"print(\"--------------------\")\n",
"print(\"\\n\")\n",
"\n",
"for backend, thread in itertools.product(available_backends(), threads):\n",
" with use_reflect_backend(backend) as f:\n",
" if backend in ['py_parratt', 'python'] and thread == -1:\n",
" continue\n",
" print(f\"backend = {backend}, threads = {thread}\")\n",
" %timeit f(q, microslabs, threads=thread)\n",
" print(\"\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "8c57ab9e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"341 ms ± 4.19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"# measure timings for refl1d.reflectivity.reflectivity\n",
"%timeit reflectivity(kz, depth, rho, irho=irho, sigma=sigma)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "7e334080",
"metadata": {},
"outputs": [],
"source": [
"refl1d_version = ['0.8.10', '0.8.11', '0.8.12', '0.8.14', '0.8.15']\n",
"reflectivity_time = [547, 532, 553, 586, 339]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "50845a92",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0mklEQVR4nO3deVhUZfsH8O/MwAzrgMiuKJgrbuCO+RMrk9RMc0tzwT23Cs1Sy73UskxNU197C63XJTXbzCVzqxQFSUxFcQMxZXEDZJuBmef3BzEyMCCD4AzD93Nd58o55z7Puc+cYebuOc85RyKEECAiIiKyUFJTJ0BERERUlVjsEBERkUVjsUNEREQWjcUOERERWTQWO0RERGTRWOwQERGRRWOxQ0RERBaNxQ4RERFZNBY7REREZNFY7BBVUxKJBAsWLDB1Ggb5+vpi1KhRRq935MgRSCQS7Ny5s/KTsnAbN26ERCJBQkKCqVMhMjssdohMqPAHSiKR4M8//yyxXAgBHx8fSCQSvPjiiybIkIio+rMydQJEBNjY2GDLli3o0qWL3vyjR4/in3/+gUKhKLFOTk4OrKz4J0wFRowYgSFDhhj8rBDVdOzZITIDvXr1wo4dO5Cfn683f8uWLWjbti08PT1LrGNjY1MpxU5WVtZjt0GmU3j8ZDIZbGxsIJFITJwRkflhsUNkBoYOHYq7d+/iwIEDunlqtRo7d+7Eq6++anAdQ2N2bt68ibFjx8Lb2xsKhQJ+fn6YNGkS1Go1gIenzY4ePYrJkyfD3d0ddevW1a2/du1aNG/eHAqFAt7e3pgyZQrS0tL0tnH58mUMGDAAnp6esLGxQd26dTFkyBCkp6eXun/37t3DjBkz0LJlSzg4OECpVKJnz544c+aMwXiNRoN3330Xnp6esLe3x0svvYQbN26U9RaW+z0AgGvXrmHQoEFwcXGBnZ0dOnXqhF9++UWvncLxQ9u3b8fChQtRp04dODo6YuDAgUhPT4dKpUJYWBjc3d3h4OCA0aNHQ6VS6bUhkUgwdepUbN68GU2aNIGNjQ3atm2L33//XS/u+vXrmDx5Mpo0aQJbW1vUrl0bgwYNKjH+pqzjZ2jMzqlTpxASEgJXV1fY2trCz88PY8aM0WszKysLb731Fnx8fKBQKNCkSRN88sknEEIY3JcffvgBLVq0gEKhQPPmzbFv375yHRciU2IfOJEZ8PX1RVBQELZu3YqePXsCAPbu3Yv09HQMGTIEn3322SPbuHXrFjp06IC0tDRMmDABTZs2xc2bN7Fz505kZ2dDLpfrYidPngw3NzfMmzdP1zOwYMECLFy4EN27d8ekSZMQFxeHdevWISoqCseOHYO1tTXUajVCQkKgUqnw+uuvw9PTEzdv3sTu3buRlpYGJycng7ldu3YNP/zwAwYNGgQ/Pz+kpKTgP//5D4KDgxEbGwtvb2+9+MWLF0MikWDmzJlITU3FypUr0b17d8TExMDW1vax3oOUlBR07twZ2dnZeOONN1C7dm1s2rQJL730Enbu3ImXX35Zr82lS5fC1tYWs2bNwpUrV7B69WpYW1tDKpXi/v37WLBgAU6cOIGNGzfCz88P8+bN01v/6NGj+Pbbb/HGG29AoVBg7dq1eOGFFxAZGYkWLVoAAKKionD8+HEMGTIEdevWRUJCAtatW4du3bohNjYWdnZ2em0aOn7FpaamokePHnBzc8OsWbPg7OyMhIQE7Nq1SxcjhMBLL72Ew4cPY+zYsQgICMD+/fvx9ttv4+bNm1ixYoVem3/++Sd27dqFyZMnw9HREZ999hkGDBiAxMRE1K5du9TjQmRygohMJjw8XAAQUVFRYs2aNcLR0VFkZ2cLIYQYNGiQeOaZZ4QQQtSvX1/07t1bb10AYv78+brXI0eOFFKpVERFRZXYjlar1dtely5dRH5+vm55amqqkMvlokePHkKj0ejmr1mzRgAQX331lRBCiNOnTwsAYseOHWXuV/369UVoaKjudW5url67QggRHx8vFAqFWLRokW7e4cOHBQBRp04dkZGRoZu/fft2AUCsWrWqzO2W5z0ICwsTAMQff/yhW/bgwQPh5+cnfH19dXkW5tKiRQuhVqt1sUOHDhUSiUT07NlTr/2goCBRv359vXkABABx6tQp3bzr168LGxsb8fLLL+vmFR7zoiIiIgQA8fXXX+vmlXb8ii6Lj48XQgjx/fff6z5bpfnhhx8EAPHBBx/ozR84cKCQSCTiypUrevsil8v15p05c0YAEKtXry51G0TmgKexiMzE4MGDkZOTg927d+PBgwfYvXt3qaewitNqtfjhhx/Qp08ftGvXrsTy4uM4xo8fD5lMpnv922+/Qa1WIywsDFKpVC9OqVTqTvEU9tzs378f2dnZ5d43hUKha1ej0eDu3btwcHBAkyZN8Ndff5WIHzlyJBwdHXWvBw4cCC8vL+zZs6fUbZT3PdizZw86dOigNxjcwcEBEyZMQEJCAmJjY0vkYm1trXvdsWNHCCFKnA7q2LEjbty4UWLcVVBQENq2bat7Xa9ePfTt2xf79++HRqMBAL3eqry8PNy9excNGzaEs7Ozwfen+PEzxNnZGQCwe/du5OXlGYzZs2cPZDIZ3njjDb35b731FoQQ2Lt3r9787t2746mnntK9btWqFZRKJa5du1ZmLkSmxmKHyEy4ubmhe/fu2LJlC3bt2gWNRoOBAweWa93bt28jIyNDd1rkUfz8/PReX79+HQDQpEkTvflyuRwNGjTQLffz88P06dPx3//+F66urggJCcHnn39e5ngdoKAQWbFiBRo1agSFQgFXV1e4ubnh77//Nrhuo0aN9F5LJBI0bNiwzHvIlPc9uH79eon9BIBmzZrplhdVr149vdeFBZ+Pj0+J+VqttsT+FN8XAGjcuDGys7Nx+/ZtAAVX1s2bN083bqbw/UlLSzP4/hQ/foYEBwdjwIABWLhwIVxdXdG3b1+Eh4frjSu6fv06vL299QpLoPzvBQDUqlUL9+/ff2Q+RKbEYofIjLz66qvYu3cv1q9fj549e+r+77yylTXu5VGWL1+Ov//+G++++y5ycnLwxhtvoHnz5vjnn39KXWfJkiWYPn06unbtiv/973/Yv38/Dhw4gObNm0Or1VY4lyehtB6U0uaLYgN7y+P111/H4sWLMXjwYGzfvh2//vorDhw4gNq1axt8f8pz/ApvzhgREYGpU6fi5s2bGDNmDNq2bYvMzEyjcwQqd5+JniQWO0Rm5OWXX4ZUKsWJEyfKfQoLKOgVUiqVOHfuXIW2W79+fQBAXFyc3ny1Wo34+Hjd8kItW7bEnDlz8Pvvv+OPP/7AzZs3sX79+lLb37lzJ5555hl8+eWXGDJkCHr06IHu3buXuNKr0OXLl/VeCyFw5coV+Pr6lrqN8r4H9evXL7GfAHDx4kXd8spUfF8A4NKlS7Czs4ObmxuAgvcnNDQUy5cvx8CBA/H888+jS5cupb4/xujUqRMWL16MU6dOYfPmzTh//jy2bdsGoGBfb926hQcPHuitU1XvBZGpsNghMiMODg5Yt24dFixYgD59+pR7PalUin79+uHnn3/GqVOnSix/1P95d+/eHXK5HJ999ple7Jdffon09HT07t0bAJCRkVFiTErLli0hlUpLXHZdlEwmK5HDjh07cPPmTYPxX3/9td4P8M6dO5GUlKS7Us2Q8r4HvXr1QmRkJCIiInTLsrKysGHDBvj6+sLf37/UbVRERESE3ribGzdu4Mcff0SPHj10PSWG3p/Vq1frxvRUxP3790u0GRAQAAC6Y9WrVy9oNBqsWbNGL27FihWQSCRlvt9E1QkvPScyM6GhoRVab8mSJfj1118RHByMCRMmoFmzZkhKSsKOHTvw559/lnlKzM3NDbNnz8bChQvxwgsv4KWXXkJcXBzWrl2L9u3bY/jw4QCAQ4cOYerUqRg0aBAaN26M/Px8fPPNN5DJZBgwYECp7b/44otYtGgRRo8ejc6dO+Ps2bPYvHkzGjRoYDDexcUFXbp0wejRo5GSkoKVK1eiYcOGGD9+/GO/B7NmzdJd4v/GG2/AxcUFmzZtQnx8PL777ju9AdqVoUWLFggJCdG79BwAFi5cqIt58cUX8c0338DJyQn+/v6IiIjAb7/99liXc2/atAlr167Fyy+/jKeeegoPHjzAF198AaVSiV69egEA+vTpg2eeeQbvvfceEhIS0Lp1a/z666/48ccfERYWpjcYmag6Y7FDZCHq1KmDkydPYu7cudi8eTMyMjJQp04d9OzZs8R9WgxZsGAB3NzcsGbNGkybNg0uLi6YMGEClixZorsaqXXr1ggJCcHPP/+Mmzdvws7ODq1bt8bevXvRqVOnUtt+9913kZWVhS1btuDbb79FmzZt8Msvv2DWrFmlxv/9999YunQpHjx4gOeeew5r16595H6U5z3w8PDA8ePHMXPmTKxevRq5ublo1aoVfv75Z10PVmUKDg5GUFAQFi5ciMTERPj7+2Pjxo1o1aqVLmbVqlWQyWTYvHkzcnNz8fTTT+O3335DSEjIY203MjIS27ZtQ0pKCpycnNChQwds3rxZN8BZKpXip59+wrx58/Dtt98iPDwcvr6++Pjjj/HWW2899r4TmQuJ4MgyIqIqIZFIMGXKlBKniYjoyeKYHSIiIrJoLHaIiIjIorHYISIiIovGAcpERFWEQyKJzAN7doiIiMiisdghIiIii8bTWCh4SOGtW7fg6OhY4unQREREZJ6EEHjw4AG8vb3LvCEoix0At27dKvEEYyIiIqoebty4gbp165a6nMUOAEdHRwAFb5ZSqTRxNkRERFQeGRkZ8PHx0f2Ol4bFDqA7daVUKlnsEBERVTOPGoLCAcpERERk0VjsEBERkUVjsUNEREQWjcUOERERWTQWO0RERGTRWOwQERGRRWOxQ0RERBaNxQ4RERFZNBY7REREZNFMWuz4+vpCIpGUmKZMmQIAyM3NxZQpU1C7dm04ODhgwIABSElJ0WsjMTERvXv3hp2dHdzd3fH2228jPz/fFLtDREREZsikxU5UVBSSkpJ004EDBwAAgwYNAgBMmzYNP//8M3bs2IGjR4/i1q1b6N+/v259jUaD3r17Q61W4/jx49i0aRM2btyIefPmmWR/iIiIyPxIhBDC1EkUCgsLw+7du3H58mVkZGTAzc0NW7ZswcCBAwEAFy9eRLNmzRAREYFOnTph7969ePHFF3Hr1i14eHgAANavX4+ZM2fi9u3bkMvl5dpuRkYGnJyckJ6ezmdjERERVRPl/f02mweBqtVq/O9//8P06dMhkUgQHR2NvLw8dO/eXRfTtGlT1KtXT1fsREREoGXLlrpCBwBCQkIwadIknD9/HoGBgQa3pVKpoFKpdK8zMjKqbseysqqubSIiourA3t6kmzebYueHH35AWloaRo0aBQBITk6GXC6Hs7OzXpyHhweSk5N1MUULncLlhctKs3TpUixcuLDyki+Lg8OT2Q4REZG5MvFJJLO5GuvLL79Ez5494e3tXeXbmj17NtLT03XTjRs3qnybREREZBpm0bNz/fp1/Pbbb9i1a5dunqenJ9RqNdLS0vR6d1JSUuDp6amLiYyM1Gur8GqtwhhDFAoFFApFJe5BGTIzn8x2iIiIyCCzKHbCw8Ph7u6O3r176+a1bdsW1tbWOHjwIAYMGAAAiIuLQ2JiIoKCggAAQUFBWLx4MVJTU+Hu7g4AOHDgAJRKJfz9/Z/8jhhi4vOURERENZ3Jix2tVovw8HCEhobCyuphOk5OThg7diymT58OFxcXKJVKvP766wgKCkKnTp0AAD169IC/vz9GjBiBZcuWITk5GXPmzMGUKVOeXM8NERERmTWTFzu//fYbEhMTMWbMmBLLVqxYAalUigEDBkClUiEkJARr167VLZfJZNi9ezcmTZqEoKAg2NvbIzQ0FIsWLXqSu0BERERmzKzus2MqvM8OERFR9VPe32+zuRqLiIiIqCqw2CEiIiKLxmKHiIiILBqLHSIiIrJoLHaIiIjIorHYISIiIovGYoeIiIgsGosdIiIismgsdoiIiMiisdghIiIii8Zih4iIiCwaix0iIiKyaCx2iIiIyKKx2CEiIiKLxmKHiIiILBqLHSIiIrJoLHaIiIjIorHYISIiIovGYoeIiIgsGosdIiIismgsdoiIiMiisdghIiIii8Zih4iIiCwaix0iIiKyaCx2iIiIyKKx2CEiIiKLxmKHiIiILBqLHSIiIrJoLHaIiIjIorHYISIiIovGYoeIiIgsGosdIiIismgsdoiIiMiisdghIiIii8Zih4iIiCwaix0iIiKyaCx2iIiIyKKx2CEiIiKLxmKHiIiILJrJi52bN29i+PDhqF27NmxtbdGyZUucOnVKt1wIgXnz5sHLywu2trbo3r07Ll++rNfGvXv3MGzYMCiVSjg7O2Ps2LHIzMx80rtCREREZsikxc79+/fx9NNPw9raGnv37kVsbCyWL1+OWrVq6WKWLVuGzz77DOvXr8fJkydhb2+PkJAQ5Obm6mKGDRuG8+fP48CBA9i9ezd+//13TJgwwRS7RERERGZGIoQQptr4rFmzcOzYMfzxxx8Glwsh4O3tjbfeegszZswAAKSnp8PDwwMbN27EkCFDcOHCBfj7+yMqKgrt2rUDAOzbtw+9evXCP//8A29v70fmkZGRAScnJ6Snp0OpVFbeDhIREVGVKe/vt0l7dn766Se0a9cOgwYNgru7OwIDA/HFF1/olsfHxyM5ORndu3fXzXNyckLHjh0REREBAIiIiICzs7Ou0AGA7t27QyqV4uTJk09uZ4iIiMgsmbTYuXbtGtatW4dGjRph//79mDRpEt544w1s2rQJAJCcnAwA8PDw0FvPw8NDtyw5ORnu7u56y62srODi4qKLKU6lUiEjI0NvIiIiIstkZcqNa7VatGvXDkuWLAEABAYG4ty5c1i/fj1CQ0OrbLtLly7FwoULq6x9IiIiMh8m7dnx8vKCv7+/3rxmzZohMTERAODp6QkASElJ0YtJSUnRLfP09ERqaqre8vz8fNy7d08XU9zs2bORnp6um27cuFEp+0NERETmx6TFztNPP424uDi9eZcuXUL9+vUBAH5+fvD09MTBgwd1yzMyMnDy5EkEBQUBAIKCgpCWlobo6GhdzKFDh6DVatGxY0eD21UoFFAqlXoTERERWSaTnsaaNm0aOnfujCVLlmDw4MGIjIzEhg0bsGHDBgCARCJBWFgYPvjgAzRq1Ah+fn6YO3cuvL290a9fPwAFPUEvvPACxo8fj/Xr1yMvLw9Tp07FkCFDynUlFhEREVk2k156DgC7d+/G7NmzcfnyZfj5+WH69OkYP368brkQAvPnz8eGDRuQlpaGLl26YO3atWjcuLEu5t69e5g6dSp+/vlnSKVSDBgwAJ999hkcHBzKlQMvPSciIqp+yvv7bfJixxyw2CEiMj9arcCt9BxkqvLR1JPfzVRSeX+/TXoai4iIajYhBO5lqRF/JwvX7mQh/k4W4m8X/DfhbhZU+VoAwBvPNsT0Hk1MnC1VVyx2iIioymWr8wsKmSLFzLU7Wbh2OxMZufmlrmctkyBPI/DZoStwU9pgRKf6TzBrshQsdoiIqFLkabS4cS9bV9RcK1LYJGfklrqeRAJ4O9migZs9/FwfTg1cHeDtbIM1h69g5W+XMe/Hc3BzkOOFFl5PcK/IErDYISKichNCICVDhWt3MnHt30KmcEq8lw2NtvRhoC728n+LGHv4uf37X1cH1K9tBxtrWanrvflcI6RkqLA1MhFvbIvB/8Yq0MHPpSp2jywUix0iIiohPTsP1+5kGuylycnTlLqerbWsoGdGV8w8nJzt5BXKRSKR4P2+zXEnU4UDsSkYtykKOyZ2RhNPx4ruHtUwvBoLvBqLiGqm3DwNEu4WFDHX7uj30tzLUpe6npVUgnoudg8LGbeHp508lApIJJIqy3fYf08i+vp9eCpt8N3kzqjjbFsl26LqgZeeG4HFDhFZKo1W4Ob9HP1emn97aG6l56CsXwBPpY3BXhofFztYy0xzA/60bDUGrY/A5dRMNHR3wM6JQRXuMaLqj8WOEVjsEFF1JoTA7UyV7jRT0cu4E+9mQ63Rlrqu0sYKDdwcHhYz//bS+Na2h73CPEc63ErLQf+1x5GckYu29Wth87iOZY75IcvFYscILHaIqDp4kJtXonemcMpUlX75ttxKCr/a+sXMU24Fg4Nr2VlX2WmnqnQp5QEGrjuOjNx8dG/mgfXD28DKRL1NZDosdozAYoeIzIUqX4Mb97L1ipnCXprbD1SlrieVAHVrPRxHU/Qybm8nW0il1a+geZTI+HsY/uVJqPO1GNqhHpa83KJaFm5UcbyDMhGRmSp8DIKhXpp/7mejjKu34eqgQINixUwDt4JxNAqrmnUqp4OfCz4bEojJm6OxNTIRHkoFwro3fvSKVOOw2CEiqgJCCNzPzkN8kfvRXDPwGARDHBRW+jfXKxxH42oPpY31E9wL8/dCC08s6tsCc344h5W/XYa7ow1e7VjP1GmRmWGxQ0T0GEp7DEL8nSyk5+SVup61TIL6te0f3mSvyABhN4equ3zbEg3vVB+pGbn47NAVzPnhLFwd5OjR3NPUaZEZYbFDRPQIFX0MAgDUcbbV66UpvIy7jrMtB9RWomnPN0ZKhgrfnrqB17eexuZxHdHOl3dZpgIsdoiIoP8YhKK9NIWPQcgvx2MQHj7TqaCoqe9iD1t5zRpHYyoSiQSLX26BO5kqHLyYirGbTmHnxCA08uBdlolXYwHg1VhENUlpj0FIuJuFbHXpj0GwsZbCz9WhxCmnBo/xGASqfDlqDV797wmcTkyDt1PBXZa9nHiXZUvFS8+NwGKHyDJotAJ3s1S4/UCF1Af//jcjFwl3H56CKusxCLLij0Eo0kvj4WhjkZdvW6L7WWoMWH8c125noYmHI7a/FgQnOw7stkQsdozAYofIfAkhkKnKx+1/i5fbmSqkZhT8Vzfv3+LmXpaqzMu2C3koFf8WMw7/3lzP9I9BoMr1z/1s9F97HKkPVOjg64Kvx3bgXZYtEIsdI7DYIXry8jRa3M1UI/VBbomipbCoKZxX1lO2i5NIgNr2Crg5FkzujooSvTXm+hgEqlwXkjIweH0EHqjy8UJzT3w+rA1k7J2zKCx2jFBVxc6OUzeQk6eBk6213uRsJ4fSxopXYpDFEUIgIycftzNzHxYtpRQyZZ1OMsRBYVVQwDg8LGT0JgcF3JUKuNjJ+bdFOhFX7yL0q0ioNVqM6FQfi/o252X9FoR3UDYD649exdXbWaUud1BYGSiECv6rLPJvJ1trONvKdf92tLHi2AF6olT5Gv3CpZRTSbcfqMp86GRxMqkErg5yuDva6BUy7sqSRY2dnF9XZLygp2pjxSsBmLr1L3xz4jo8lApMfbaRqdOiJ4zfHlXouWYeaOyRjbTsPKTnFEwZOXl48O8D+zJV+chU5eNmWo5R7UokgNJGv0BS6ooiw/MLe5Ts5TL+Xw0BKHhkQVpOXonTSIZOJZV1czxDlDZWRU4j2ZTofSn8dy07OQt3qnK9W3nh9gN/LPg5Fp/8egnujjYY3N7H1GnRE8Ripwq926uZwfn5Gi0ycvORnpOHtGy1rhBKz8lDepHCKK1IgVRYMOXkaSAEdDHGspJKCnqNbIsUSHbWJXqYihZIhf+2sZayUKoGctT/9sJk5uoXLsUKmTuZqjLvHVOcXCaFm6MCrkV7YIqdSnJ3VMDVQcGBoGR2Rj3th9QHKqw9chWzvz+L2g5yPNfMw9Rp0RPCMTuoXgOUVfkaXQGkK4qy9f+dUaxYKiyijDm9YIjcSlrktNrDgqjEKTe94qmgWJJbcQzF4yh6SXVpp5Lu/FvIZP7bc1heteys9XtfivbAFDmV5GRrzWKXqjUhBGbs+Bvf/fUPbKyl2DK+E9rUq2XqtOgxcICyEapTsVNRQgjk5mmLFEXFepQMFE8ZRQomjRE9AIbYWsuMPuXmZGtt0QO5hRDI+rcXJjUj1+Cl1IVFzd3M8l1SXUhhJdUVK6UWMo4K1LZXsBClGiVPo8X4r0/hSNxtONtZY+fEzmjo7mDqtKiCWOwYoSYUO4+j8Ee5aIGUUbxHqch8vYIpNw+P+wlzVFgZPuVW7PRb0UHcTnbWcFSYZiB34SXVhaeSUjNKXkpdWMg8ziXVhnpfCk8lOSis2AtDVIpsdT6GbjiBM/+ko46zLXZN7gwPpY2p06IKYLFjBBY7VUerFXjw7/ikgqKojDFK2fo9TMaejilOKgEcbfQLJKWBHqWH8+W6Aqr4QG4hBDJy83H7geFLqosWMvey1UYVePZyWcmBvMV7YhwVcLHnJdVEleVupgoD10cg/k4Wmno6YvvEIChteJfl6obFjhFY7Jin8gzkLjouqfhA7sdhJZXoCiJVvha3M1VQ5xt/SbWuiDHQ++L272Be3uCOyDRu3MtG/3XHcfuBCp0auGDTmA5QWHFwfXXCYscILHYsT/GB3MV7jSo6kLvoJdVujjYPr0Zy0C9keEk1UfVw7mY6hmw4gUxVPnq39MJnQwN5l+VqhDcVpBpNYSWDu6MM7o7GnYc3NJDbSibVFTW8pJrIsrSo44QNI9oiNDwSv5xNgquDHAte4l2WLQ2LHaIiJBIJbOUy2Mpl8HTigEWimqBzQ1d8OjgAr289jU0R1+HhZIPJ3RqaOi2qRBztSERENV6f1t6Y96I/AGDZvjjsOHXDxBlRZWLPThXLyir92VhERGQ+Xgl0x43b9/DlHwl4Z1sU7GX5CG7sbuq0LIK9vb1Jt89ip4o5OPBmVURE1VHv5abOwHKY+loonsYiIiIii8aenSqWmZlp6hSIiMhIWap8jAqPxLmbGahTywZbxncy+upOMh+8zw54nx0iIirpTqYKA9Ydx/W72fD3UuLb1zrBkXdZNivl/f3maSwiIiIDXB0U+HpMB7g6yBGblIGJ/4uGKv/x7s5OpsFih4iIqBT1a9sjfFQH2MtlOHblLmbs+BtabY0/IVLtsNghIiIqQ8u6Tlg/oi2spBL8fOYWPvjlgsmvLiLjmLTYWbBgASQSid7UtGlT3fLc3FxMmTIFtWvXhoODAwYMGICUlBS9NhITE9G7d2/Y2dnB3d0db7/9NvLzH+9p2UREREX9XyM3fDKoNQDgq2Px+OKPaybOiIxh8p6d5s2bIykpSTf9+eefumXTpk3Dzz//jB07duDo0aO4desW+vfvr1uu0WjQu3dvqNVqHD9+HJs2bcLGjRsxb948U+wKERFZsH6BdfBer2YAgCV7LuL70/+YOCMqL5Nfem5lZQVPT88S89PT0/Hll19iy5YtePbZZwEA4eHhaNasGU6cOIFOnTrh119/RWxsLH777Td4eHggICAA77//PmbOnIkFCxZALpc/6d0hIiILNr5rA6Rk5OK/f8bj7R1/o7a9Al0bu5k6LXoEk/fsXL58Gd7e3mjQoAGGDRuGxMREAEB0dDTy8vLQvXt3XWzTpk1Rr149REREAAAiIiLQsmVLeHh46GJCQkKQkZGB8+fPl7pNlUqFjIwMvYmIiKg83u3VDC+19ka+VmDi/6Lx9z9ppk6JHsGkxU7Hjh2xceNG7Nu3D+vWrUN8fDz+7//+Dw8ePEBycjLkcjmcnZ311vHw8EBycjIAIDk5Wa/QKVxeuKw0S5cuhZOTk27y8fGp3B0jIiKLJZVK8Mmg1ujS0BXZag1Gh0ch4Q6fg2jOTFrs9OzZE4MGDUKrVq0QEhKCPXv2IC0tDdu3b6/S7c6ePRvp6em66cYNPt2WiIjKT24lxbrhbdDcW4m7WWqEhkfi9gOVqdOiUpj8NFZRzs7OaNy4Ma5cuQJPT0+o1WqkpaXpxaSkpOjG+Hh6epa4OqvwtaFxQIUUCgWUSqXeREREZAxHG2uEj24PHxdbXL+bjTEbo5Cp4tXA5sisip3MzExcvXoVXl5eaNu2LaytrXHw4EHd8ri4OCQmJiIoKAgAEBQUhLNnzyI1NVUXc+DAASiVSvj7+z/x/ImIqGZxd7TB12M6wsVejrM30zHpf9FQ52tNnRYVY9JiZ8aMGTh69CgSEhJw/PhxvPzyy5DJZBg6dCicnJwwduxYTJ8+HYcPH0Z0dDRGjx6NoKAgdOrUCQDQo0cP+Pv7Y8SIEThz5gz279+POXPmYMqUKVAoFKbcNSIiqiH8XO0RPqo9bK1l+OPyHbyz8wzvsmxmTFrs/PPPPxg6dCiaNGmCwYMHo3bt2jhx4gTc3Aou41uxYgVefPFFDBgwAF27doWnpyd27dqlW18mk2H37t2QyWQICgrC8OHDMXLkSCxatMhUu0RERDVQax9nrBveBlZSCX6IuYWP9l00dUpUBJ96Dj71nIiIKsd30f/grR1nAABzejfDuP9rYOKMLBufek5ERPSEDWhbF7N6Fjz26INfLuDHmJsmzogAFjtERESV6rWuDTD6aV8AwIwdZ/Dn5TumTYhY7BAREVUmiUSCub390buVF/I0Aq99cwrnbqabOq0ajcUOERFRJZNKJfh0cGsENaiNLLUGo8KjkHg329Rp1VgsdoiIiKqAwkqG/4xsi2ZeStzJVGHkVydxJ5N3WTYFFjtERERVRGljjU2j26OOsy0S7mZj7MYoZPEuy08cix0iIqIq5K60wddjO6CWnTXO/JOOyZv/Qp6Gd1l+kljsEBERVbGn3Bzw1b93WT566TZmfvc3eJu7J4fFDhER0RMQWK8WPh8WCJlUgl1/3cSy/XGmTqnGYLFDRET0hDzb1ANL+7cEAKw7chXhx+JNnFHNwGKHiIjoCRrczgdvhzQBACzaHYvdf98ycUaWj8UOERHREza521MYGVQfQgDTvz2D41d5l+WqxGKHiIjoCZNIJJjfpzl6tvCEWqPFa19HI/ZWhqnTslgsdoiIiExAJpVgxSsB6ODnggeqfIwKj8SNe7zLclVgsUNERGQiNtYyfDGyHZp4OCL1gQqh4ZG4l6U2dVoWh8UOERGRCTnZWmPTmA7wdrLBtdtZGLMxCtlq3mW5MrHYISIiMjFPp4K7LDvZWiPmRhqmbjmNfN5ludKw2CEiIjIDDd0d8dWodlBYSXHoYire/f4s77JcSVjsEBERmYm29V2w5tU2kEqA7af+wacHLpk6JYvAYoeIiMiMPO/vgcUvF9xlefWhK/gmIsG0CVkAFjtERERmZmiHepjWvTEAYN5P57HvXJKJM6reWOwQERGZoTeea4hhHetBCOCNbTE4ce2uqVOqtljsEBERmSGJRIJFfVugh78H1PlajP/6FC4m8y7LFcFih4iIyEzJpBJ8NjQQ7X1r4UFuPkK/isTNtBxTp1XtsNghIiIyYzbWMvx3ZHs09nBASoYKI788ifu8y7JRWOwQERGZOSc7a2wc3QFeTja4ejsLYzdFIUetMXVa1QaLHSIiomrA29kWm8Z0gNLGCn8lpuH1rbzLcnmx2CEiIqomGns44stR7aGwkuK3CymY++M53mW5HFjsEBERVSPtfV3w2dBASCXA1sgbWPnbZVOnZPZY7BAREVUzIc09sahvCwDAqoOXsfnkdRNnZN4qVOz89ddfOHv2rO71jz/+iH79+uHdd9+FWs0R4kRERFVteKf6eOO5RgCAuT+cw/7zySbOyHxVqNh57bXXcOlSwcPJrl27hiFDhsDOzg47duzAO++8U6kJEhERkWHTujfCkPY+0Argja2nEZVwz9QpmaUKFTuXLl1CQEAAAGDHjh3o2rUrtmzZgo0bN+K7776rzPyIiIioFBKJBB/0a4Huzdyhytdi7MYoXEp5YOq0zE6Fih0hBLTagsvdfvvtN/Tq1QsA4OPjgzt37lRedkRERFQmK5kUq4e2QZt6zsj49y7LSem8y3JRFSp22rVrhw8++ADffPMNjh49it69ewMA4uPj4eHhUakJEhERUdls5TJ8GdoeT7nZIyk9F6FfRSI9O8/UaZmNChU7K1euxF9//YWpU6fivffeQ8OGDQEAO3fuROfOnSs1QSIiInq0WvZybBrTAR5KBS6lZGL816eQm8e7LAOARFTi3Yhyc3Mhk8lgbW1dWU0+ERkZGXByckJ6ejqUSqWp0yEiIqqwi8kZGLQ+Ag9y8xHS3ANrh7WFTCoxdVpVory/3499n53MzExkZGQgIyMDarUaOTk8T0hERGQqTT2V+GJkO8hlUuw/n4J5vMtyxYqd+Ph49O7dG/b29nByckKtWrVQq1YtODs7o1atWpWdIxERERmhU4PaWDkkABIJsPlkItYcumLqlEzKqiIrDR8+HEIIfPXVV/Dw8IBEYpndY0RERNVVr5ZeWNCnOeb/dB7LD1yCm6MCQzrUM3VaJlGhnp0zZ84gPDwcr7zyCrp164bg4GC9qSI+/PBDSCQShIWF6ebl5uZiypQpqF27NhwcHDBgwACkpKTorZeYmIjevXvDzs4O7u7uePvtt5Gfn1+hHIiIiCxJaGdfTHnmKQDAu9+fxW+xKY9YwzJVqNhp3749bty4UWlJREVF4T//+Q9atWqlN3/atGn4+eefsWPHDhw9ehS3bt1C//79dcs1Gg169+4NtVqN48ePY9OmTdi4cSPmzZtXabkRERFVZzN6NMHAtnWhFcDUrX8h+vp9U6f0xFXoaqyrV69i4sSJGD58OFq0aFHi6qviRUtZMjMz0aZNG6xduxYffPABAgICsHLlSqSnp8PNzQ1btmzBwIEDAQAXL15Es2bNEBERgU6dOmHv3r148cUXcevWLd39fdavX4+ZM2fi9u3bkMvl5cqBV2MREZEly9NoMeHrUzgcdxvOdtbYObEzGro7mDqtx1alV2Pdvn0bV69exejRo9G+fXsEBAQgMDBQ919jTJkyBb1790b37t315kdHRyMvL09vftOmTVGvXj1EREQAACIiItCyZUu9GxmGhIQgIyMD58+fL3WbKpVKdwVZ4URERGSprGVSfD6sDQJ8nJGWnYfQryKRnJ5r6rSemAoVO2PGjEFgYCAiIiJw7do1xMfH6/23vLZt24a//voLS5cuLbEsOTkZcrkczs7OevM9PDyQnJysiyl+x+bC14UxhixduhROTk66ycfHp9w5ExERVUd2cit8Nao9Grja42ZaDkaFRyI9p2bcZblCV2Ndv34dP/30k+7OyRVx48YNvPnmmzhw4ABsbGwq3E5FzJ49G9OnT9e9zsjIYMFDREQWz+Xfuyz3X3ccF5MfYMLXp7BpTAfYWMtMnVqVqlDPzrPPPoszZ8481oajo6ORmpqKNm3awMrKClZWVjh69Cg+++wzWFlZwcPDA2q1GmlpaXrrpaSkwNPTEwDg6elZ4uqswteFMYYoFAoolUq9iYiIqCbwcbHDptEd4Kiwwsn4e5i+PQYarWXfdLBCPTt9+vTBtGnTcPbsWbRs2bLEAOWXXnrpkW0899xzOHv2rN680aNHo2nTppg5cyZ8fHxgbW2NgwcPYsCAAQCAuLg4JCYmIigoCAAQFBSExYsXIzU1Fe7u7gCAAwcOQKlUwt/fvyK7RkREZPH8vZX4z8i2GPVVFPacTYarw3ksfKm5xd43r0JXY0mlpXcISSQSaDQVe/BYt27ddFdjAcCkSZOwZ88ebNy4EUqlEq+//joA4Pjx4wAKLj0PCAiAt7c3li1bhuTkZIwYMQLjxo3DkiVLyr1dXo1FREQ10e6/b+H1rachBPB2SBNMeabiw1NMoby/3xXq2dFqtRVOzBgrVqyAVCrFgAEDoFKpEBISgrVr1+qWy2Qy7N69G5MmTUJQUBDs7e0RGhqKRYsWPZH8iIiIqrMXW3nj9gMVFv4ci4/3x8HdUYFB7SxvDGulPvW8umLPDhER1WQf7r2I9UevQiaV4L8j2+GZpu6mTqlcnthTz4mIiKh6m/lCE/RvUwcarcDkzX/hdKJl3WWZxQ4REVENJ5FI8NGAVuja2A05eRqM2RiFa7czTZ1WpWGxQ0RERLCWSbFuWBu0quuE+9l5GPlVJFIzLOMuy0YVO4cOHarwlVZERERk3uwVBXdZ9q1th3/u5yA0PAoZudX/LstGFTvjxo2Dm5sbXn31VXz77bd8phQREZGFcXVQ4OsxHeHqIMeFpAxM/CYaqvzq3dFhVLFz7do1HDlyBP7+/li+fDk8PDzw/PPPY/Xq1UhMTKyqHImIiOgJqlfbDhtHd4C9XIbjV+/ire1noK3Gd1l+rEvPb926hZ9++gk//fQTDh8+jCZNmuCll17CSy+9hHbt2lVmnlWKl54TERGV9Mfl2xizMQp5GoHRT/ti3ov+ZnWX5Sdy6bm3tzcmTpyIPXv24M6dO5g7dy4SEhLwwgsvGHUHYyIiIjI//9fIDZ8Mag0ACD+WgA2/XzNxRhVTJTcV1Gg0uHfvHtzc3Cq76SrBnh0iIqLS/fePa/jglwsAgE8Ht0b/NnVNnFEBk95UUCaTVZtCh4iIiMo27v8aYPz/+QEA3tn5N45eum3ijIzD++wQERHRI83u2Qx9A7yRrxWY9L9o/P1PmqlTKjcWO0RERPRIUqkEHw9sjS4NXZGt1mB0eBQS7mSZOq1yYbFDRERE5SK3kmL9iLZoUUeJu1lqjPwqErcfqEyd1iNVuNi5evUq5syZg6FDhyI1NRUAsHfvXpw/f77SkiMiIiLz4qCwQvioDqjnYofEe9kYvTESmap8U6dVpgoVO0ePHkXLli1x8uRJ7Nq1C5mZBQ8LO3PmDObPn1+pCRIREZF5cXNU4OsxHVDbXo5zNwvusqzO15o6rVJVqNiZNWsWPvjgAxw4cAByuVw3/9lnn8WJEycqLTkiIiIyT76u9ggf3R52chn+vHIHb+8037ssV6jYOXv2LF5++eUS893d3XHnzp3HToqIiIjMX6u6zlg3vC2spBL8GHMLS/deMHVKBlWo2HF2dkZSUlKJ+adPn0adOnUeOykiIiKqHoIbu2HZwFYAgC/+iMcXZniX5QoVO0OGDMHMmTORnJwMiUQCrVaLY8eOYcaMGRg5cmRl50hERERmrH+bupjdsykAYPGeC/gx5qaJM9JXoWJnyZIlaNq0KXx8fJCZmQl/f3907doVnTt3xpw5cyo7RyIiIjJzE7o2wJinC+6yPGPHGfxx2XzusvxYz8ZKTEzEuXPnkJmZicDAQDRq1Kgyc3ti+GwsIiKix6fVCryx7TR2/50Ee7kM374WhBZ1nKpse+X9/a6SB4FWNyx2iIiIKocqv+Duysev3oWrgxzfTeqM+rXtq2RbVVrsCCGwc+dOHD58GKmpqdBq9a+t37Vrl/EZmxCLHSIiosrzIDcPg/9zAheSMuBb2w47J3WGq4Oi0rdTpU89DwsLw4gRIxAfHw8HBwc4OTnpTURERFRzOdpYY9Po9qhbyxYJd7MxZmMUskx4l2Wriqz0zTffYNeuXejVq1dl50NEREQWwF1pg6/HdMDA9RE4dzMdkfH38ExTd5PkUqFix8nJCQ0aNKjsXIiIiMiCNHBzwJeh7XAnU22yQgeo4GmsBQsWYOHChcjJyansfIiIiMiCBNarhef9PUyaQ4V6dgYPHoytW7fC3d0dvr6+sLa21lv+119/VUpyRERERI+rQsVOaGgooqOjMXz4cHh4eEAikVR2XkRERESVokLFzi+//IL9+/ejS5culZ0PERERUaWq0JgdHx8f3o+GiIiIqoUKFTvLly/HO++8g4SEhEpOh4iIiKhyVeg01vDhw5GdnY2nnnoKdnZ2JQYo37t3r1KSIyIiInpcFSp2Vq5cWclpEBEREVWNCl+NRURERFQdlLvYycjI0A1KzsjIKDOWg5eJiIjIXJS72KlVqxaSkpLg7u4OZ2dng/fWEUJAIpFAo9FUapLmQKPRIC8vz9RpkJmQyWSwsrLiPaaIiKqBchc7hw4dgouLCwDg8OHDVZaQOcrMzMQ///wDIYSpUyEzYmdnBy8vL8jlclOnQkREZSh3sRMcHKz7t5+fH3x8fEr8X60QAjdu3Ki87MyARqPBP//8Azs7O7i5ufH/5AlCCKjVaty+fRvx8fFo1KgRpNIK3cWBiIiegAoNUPbz89Od0irq3r178PPzs6jTWHl5eRBCwM3NDba2tqZOh8yEra0trK2tcf36dajVatjY2Jg6JSIiKkWF/ne0cGxOcZmZmUZ96a9btw6tWrWCUqmEUqlEUFAQ9u7dq1uem5uLKVOmoHbt2nBwcMCAAQOQkpKi10ZiYiJ69+4NOzs7uLu74+2330Z+fn5FdqtM7NGh4tibQ0RUPRjVszN9+nQABT/8c+fOhZ2dnW6ZRqPByZMnERAQUO726tatiw8//BCNGjWCEAKbNm1C3759cfr0aTRv3hzTpk3DL7/8gh07dsDJyQlTp05F//79cezYMd02e/fuDU9PTxw/fhxJSUkYOXIkrK2tsWTJEmN2jYiIiCyURBgx6vaZZ54BABw9ehRBQUF6AzPlcjl8fX0xY8YMNGrUqMIJubi44OOPP8bAgQPh5uaGLVu2YODAgQCAixcvolmzZoiIiECnTp2wd+9evPjii7h16xY8PDwAAOvXr8fMmTNx+/btcg8czcjIgJOTE9LT00tcNp+bm4v4+Hj4+flZ/KkKIQRee+017Ny5E/fv38fp06cRFhaGgICAx76RpEQiwffff49+/fpVSq7moCZ9NoiIzFFZv99FGdWzU3gV1ujRo7Fq1apKvZ+ORqPBjh07kJWVhaCgIERHRyMvLw/du3fXxTRt2hT16tXTFTsRERFo2bKlrtABgJCQEEyaNAnnz59HYGCgwW2pVCqoVCrd60fdN6im2LdvHzZu3IgjR46gQYMGcHV1LRGza9curF+/HtHR0bh37x5Onz5tVG8eERHRk1ahQQfh4eGVVuicPXsWDg4OUCgUmDhxIr7//nv4+/sjOTkZcrkczs7OevEeHh5ITk4GACQnJ+sVOoXLC5eVZunSpXByctJNPj4+lbIv5kytVj8y5urVq/Dy8kLnzp3h6ekJK6uStXBWVha6dOmCjz76qCrSJCIiqnQmH2HZpEkTxMTE4OTJk5g0aRJCQ0MRGxtbpducPXs20tPTdZOlXS4PAN26dcPUqVMRFhYGV1dXhISE4Ny5c+jZsyccHBzg4eGBESNG4M6dOwCAUaNG4fXXX0diYiIkEgl8fX0NtjtixAjMmzdPr8etuMuXL6Nr166wsbGBv78/Dhw4UBW7SEREVC4VuvS8MsnlcjRs2BAA0LZtW0RFRWHVqlV45ZVXoFarkZaWpte7k5KSAk9PTwCAp6cnIiMj9dorvFqrMMYQhUIBhUJRoXyFEMjJM82l9bbWMqOuCtu0aRMmTZqEY8eOIS0tDc8++yzGjRuHFStWICcnBzNnzsTgwYNx6NAhrFq1Ck899RQ2bNiAqKgoyGSyCuWo1WrRv39/eHh44OTJk0hPT0dYWFiF2iIiIqoMJi92itNqtVCpVGjbti2sra1x8OBBDBgwAAAQFxeHxMREBAUFAQCCgoKwePFipKam6u75c+DAASiVSvj7+1dJfjl5GvjP218lbT9K7KIQ2MnLf8gaNWqEZcuWAQA++OADBAYG6l2l9tVXX8HHxweXLl1C48aN4ejoCJlMVmah+Ci//fYbLl68iP3798Pb2xsAsGTJEvTs2bPCbRIRET0OkxY7s2fPRs+ePVGvXj08ePAAW7ZswZEjR7B//344OTlh7NixmD59OlxcXKBUKvH6668jKCgInTp1AgD06NED/v7+GDFiBJYtW4bk5GTMmTMHU6ZMqXDPjSVp27at7t9nzpzB4cOH4eDgUCLu6tWraNy4caVs88KFC/Dx8dEVOgB0xSkREZEpmLTYSU1NxciRI5GUlAQnJye0atUK+/fvx/PPPw8AWLFiBaRSKQYMGACVSoWQkBCsXbtWt75MJsPu3bsxadIkBAUFwd7eHqGhoVi0aFGV5WxrLUPsopAqa/9R2zaGvb297t+ZmZno06ePwYHFXl5ej50bERGRuTJpsfPll1+WudzGxgaff/45Pv/881Jj6tevjz179lR2aqWSSCRGnUoyF23atMF3330HX19fg1dZVZZmzZrhxo0bSEpK0hVRJ06cqLLtERERPYrJr8aiJ2PKlCm4d+8ehg4diqioKFy9ehX79+/H6NGjjXqW2b179xATE6O7Yi4uLg4xMTG6S/27d++Oxo0bIzQ0FGfOnMEff/yB9957r0r2iYiIqDxY7NQQ3t7eOHbsGDQaDXr06IGWLVsiLCwMzs7ORj3j6aeffkJgYCB69+4NABgyZAgCAwOxfv16AAXPi/r++++Rk5ODDh06YNy4cVi8eHGV7BMREVF5GPW4CEvFx0VQRfCzQURkWuV9XAR7doiIiMiisdghIiIii8Zih4iIiCwaix0iIiKyaCx2iIiIyKKx2CEiIiKLxmKHiIiILBqLHSIiIrJoLHaIiIjIorHYoXJLSEiARCJBTEyMqVMhIiIqNxY7ZNCoUaPQr18/U6dBRET02FjsEBERkUVjsWOhunXrhqlTp2Lq1KlwcnKCq6sr5s6dCyEEFi1ahBYtWpRYJyAgAHPnzsWCBQuwadMm/Pjjj5BIJJBIJDhy5Igu7tq1a3jmmWdgZ2eH1q1bIyIiQq+d7777Ds2bN4dCoYCvry+WL1+ut9zX1xdLlizBmDFj4OjoiHr16mHDhg1V8j4QERGx2KmorKwnO1XApk2bYGVlhcjISKxatQqffvop/vvf/2LMmDG4cOECoqKidLGnT5/G33//jdGjR2PGjBkYPHgwXnjhBSQlJSEpKQmdO3fWxb733nuYMWMGYmJi0LhxYwwdOhT5+fkAgOjoaAwePBhDhgzB2bNnsWDBAsydOxcbN27Uy2358uVo164dTp8+jcmTJ2PSpEmIi4ur0H4SERGVxcrUCVRbDg5PdntCGL2Kj48PVqxYAYlEgiZNmuDs2bNYsWIFxo8fj5CQEISHh6N9+/YAgPDwcAQHB6NBgwYAAFtbW6hUKnh6epZod8aMGejduzcAYOHChWjevDmuXLmCpk2b4tNPP8Vzzz2HuXPnAgAaN26M2NhYfPzxxxg1apSujV69emHy5MkAgJkzZ2LFihU4fPgwmjRpYvR+EhERlYU9OxasU6dOkEgkutdBQUG4fPkyNBoNxo8fj61btyI3NxdqtRpbtmzBmDFjytVuq1atdP/28vICAKSmpgIALly4gKefflov/umnn9Zt11AbEokEnp6eujaIiIgqE3t2Kioz09QZPJY+ffpAoVDg+++/h1wuR15eHgYOHFiuda2trXX/LiymtFqtUdsv2kZhO8a2QUREVB4sdirK3t7UGTzSyZMn9V6fOHECjRo1gkwmAwCEhoYiPDwccrkcQ4YMga2trS5WLpfr9cSUV7NmzXDs2DG9eceOHUPjxo112yUiInqSWOxYsMTEREyfPh2vvfYa/vrrL6xevVrvyqhx48ahWbNmAFCiQPH19cX+/fsRFxeH2rVrw8nJqVzbfOutt9C+fXu8//77eOWVVxAREYE1a9Zg7dq1lbdjRERERmCxU9Uq0DsCqRQoHGsjBKDVFryWFhli9ah2hcDIESOQk52NDh06QCaT4c033sCECRN0yxs1aIDOQUG4d/8+OnbsqNfu+DFjcOTwYbRr1w6ZmZk4/Ntv8PX1fRhTuP1iebQJDMT2bdswb8ECvP/++/Dy8sKiRYswauRI/VittuQ+FJ9XdJ8L3wcAKNpDpNUaP3i7tPey6PtennY1moK47OyCf0ulQJHeMd1VdLa2D7enVgN5ecbna2f38HV2dkFuNjYP34u8vIK2jVW0hzInp2B/FArA6t+vhvx8QKV6vHZzcwveH7kcKDx9qdEUzDeWnd3DY6RSFeRnbV3QNlCQf06O8e0aOkZWVgXvBVDwfmdnG9+uoWMkkxXML1SRqy0NHaPSPn/GMHSMSvv8GaO0Y2To82eM0o6Roc+fMUo7RoY+f8aoyd8Rpj4bIkikp6cLACI9Pb3EspycHBEbGytycnIq1nhUlPHT3bsP1797t2DexYv67Z4+XWYbwW3aiDeHDNGfn5LycP2MDKGNjBRP+fiI5cuXP5x/9qzx+d68+XD97OyCeadP6+d78aLx7SYkPFxfrX44v6grV4xv98oVw8dIrX44LyHhke3kREWJ2L17RU79+kIAQgQH67fr6low/9y5h/Pmzy+YZ8zk76/frr9/wfzDhx/OW7PG+HZdXfXbDQ4umL99+8N527cb327xr5WBAwvmrVnzcN7hwxVrNzX1YRuTJxfMmz//4bxz5yrWrqFjNHnyw3mpqRVr19AxGjhQ//2pSLuGjlFpnz9jJkPHqLTPnzGToWNU2ufPmKm0Y1RU4efPmKm0Y2To82fMVJO/I6pIWb/fRbFnp4a6fecOtm3fjuQ7dzB69GhTp0NERFRlJEIIYeokTC0jIwNOTk5IT0+HUqnUW5abm4v4+Hj4+fnBpmi3ZnmZ6DRWt2efRUBAAFZ++unDmUXakEgkcHV1xaoVK/Dq8OGPl++TON1UVe0CFT6NlZubi/iEBPh5ecFGoajZXdRltcvTWAX/5mmsgn/zNFbJdmvCd0QVncYq6/e7KBY7qOJihywWPxtERKZV3mKHNxUkIiIii8Zih4iIiCwaix0iIiKyaCx2iIiIyKKx2CEiIiKLxmKHiIiILBqLHSIiIrJoLHao3JKSkvDqq6+icePGkEqlCAsLM3VKREREj8Rih8pNpVLBzc0Nc+bMQevWrU2dDhERUbmw2LFQWq0Wy5YtQ8OGDaFQKFCvXj0sXrz4sdr09fXFqlWrMHLkSDg5OVVSpkRERFWLDwKtqLKeO2PMs2/K+zwbI58rMnv2bHzxxRdYsWIFunTpgqSkJFy8eNGoNoiIiCwBi52KcnAofVmvXsAvvzx87e5e+kMEg4OBI0cevvb1Be7cKRlnxCPMHjx4gFWrVmHNmjUIDQ0FADz11FPo0qVLudsgIiKyFDyNZYEuXLgAlUqF5557rsJtODg46KaJEydWYnZERERPlkmLnaVLl6J9+/ZwdHSEu7s7+vXrh7i4OL2Y3NxcTJkyBbVr14aDgwMGDBiAlJQUvZjExET07t0bdnZ2cHd3x9tvv438/PyqTT4zs/Tpu+/0Y1NTS4/du1c/NiHBcJwRbIueFqugmJgY3bRo0aLHbo+IiMhUTHoa6+jRo5gyZQrat2+P/Px8vPvuu+jRowdiY2Nh/+8YlWnTpuGXX37Bjh074OTkhKlTp6J///44duwYAECj0aB3797w9PTE8ePHkZSUhJEjR8La2hpLliypuuSNGUNTVbGlaNSoEWxtbXHw4EGMGzeuQm00bNjwsfMgIiIyByYtdvbt26f3euPGjXB3d0d0dDS6du2K9PR0fPnll9iyZQueffZZAEB4eDiaNWuGEydOoFOnTvj1118RGxuL3377DR4eHggICMD777+PmTNnYsGCBZDL5abYNZOysbHBzJkz8c4770Aul+Ppp5/G7du3cf78eYwdO/ax2o6JiQEAZGZm4vbt24iJiYFcLoe/v38lZE5ERFT5zGqAcnp6OgDAxcUFABAdHY28vDx0795dF9O0aVPUq1cPERER6NSpEyIiItCyZUt4eHjoYkJCQjBp0iScP38egYGBJbajUqmgUql0rzMyMqpql0xm7ty5sLKywrx583Dr1i14eXnpjb3p1q0bfH19sXHjRqPaLfp+RkdHY8uWLahfvz4SEhIqKXMiIqLKZTbFjlarRVhYGJ5++mm0aNECAJCcnAy5XA5nZ2e9WA8PDyQnJ+tiihY6hcsLlxmydOlSLFy4sJL3wLxIpVK89957eO+99wwuj4+Px6hRo4xuVxhxVRgREZE5MJursaZMmYJz585h27ZtVb6t2bNnIz09XTfduHGjyrdpTs6fPw8nJyeMHDnS1KkQERFVObPo2Zk6dSp2796N33//HXXr1tXN9/T0hFqtRlpaml7vTkpKCjw9PXUxkZGReu0VXq1VGFOcQqGAQqGo5L2oPpo3b46///7b1GkQERE9ESbt2RFCYOrUqfj+++9x6NAh+Pn56S1v27YtrK2tcfDgQd28uLg4JCYmIigoCAAQFBSEs2fPIjU1VRdz4MABKJVKDpolIiIi0/bsTJkyBVu2bMGPP/4IR0dH3RgbJycn2NrawsnJCWPHjsX06dPh4uICpVKJ119/HUFBQejUqRMAoEePHvD398eIESOwbNkyJCcnY86cOZgyZUqN7r0hIiKiAiYtdtatWweg4MqgosLDw3WDZ1esWAGpVIoBAwZApVIhJCQEa9eu1cXKZDLs3r0bkyZNQlBQEOzt7REaGsob4REREREAQCJ4eQ0yMjLg5OSE9PR0KJVKvWW5ubmIj4+Hn58fbIo+3JNqPH42iIhMq6zf76LM5mosIiIioqrAYoeIiIgsGosdIiIismgsdoiIiMiisdghg3JzczFq1Ci0bNkSVlZW6Nevn6lTIiIiqhAWO2SQRqOBra0t3njjDb0HsRIREVU3LHYslFarxbJly9CwYUMoFArUq1cPixcvLvf69vb2WLduHcaPH1/qYzeIiIiqA7N4Nla1lJVVrjCNRvPwhUIBWP37lufnAyoVIJUCtrZ67UqlUkgkEgAFj9TQarWQODhAKpUabteAWbNm4csvv8Ty5cvx9NNPIykpCXFxcbrlhe0CBTdmLKtdIQSEEKVuUyKR6HIrrV2tVmv0E9OfRLvAw30u+r6Xp12NRgOtVovs7GxoNBpIpVLYFjmWWf9+RmxtbXXbU6vVyMvLMzpfOzs73evs7GwIIWBjY6N7L/Ly8qBWq41qFygoagvl5ORAq9VCoVDA6t/PaX5+PlQq1WO1m5ubC41GA7lcDmtrawAF711ubq7R7drZ2emOkUqlQn5+PqytrSGXywEUHLecnByj2zV0jKysrHR3YRdCIDs72+h2DR0jmUymd1+mrHJ+lxRl6BiV9vkzhqFjVNrnzxilHSNDnz9jlHaMDH3+jFHaMTL0+TNGTf6OKNqOSQgS6enpAoBIT08vsSwnJ0fExsaKnJwc/QWA0dOVpUtFVFSUiIqKEleWLhUCEBlt2ujmRUVFCbWzs8F1L168qLf506dP661XdDpy5IiQy+Xivffe05ufkpKiWz8jI0NERUWJs2fP6rV79uzZEu317t1bBAcHl7q9mzdv6tbPzs4WUVFR4vTp03rtXrx4sdT1S5sSEhJ066vVat38oq5cuWJ0u1euXNFrQ/feq9W6eQkJCeVqa+/evaJ+/foCgAgODtZr19XVVQAQ586d082bP3++AGDU5O/vr9euv7+/ACAOHz6sm7dmzRqj23V1ddVrNzg4WAAQ27dv183bvn270e0W/1oZOHCgACDWrFmjm3f48OEKtZuamqprY/LkyQKAmD9/vm7euXPnKtSuoWM0efJk3bzU1NQKtWvoGA0cOFDv/alIu4aOUWmfP2MmQ8eotM+fMZOhY1Ta58+YqbRjVFTh58+YqbRjZOjzZ8xUk78jqkpZv99F8TSWBUpISIBarUb79u1NnQoREZHJ8XERqODjIsz4NNbZs2cRGBiIy5cv6z1JvjynhQy1O2bMGKSlpWHXrl0Gt1dTT2Pl5uYiISEBXl5eUCgUNbqLuqx2eRqLp7F4GqtATf6OqKrTWOV9XATH7FRUOQ+crNQFsoLip7hiB0tSShtFf/CLa9q0KWxtbXHkyBE0bNjQYIxEIjHYhqF5Eomk1Pjytlu0uKiIqmoXMLzP5WlXJpNBKpXCzs7O4LOxDP1xy+Vy3Zd+RRX9UitkbW2t+5GqqKJfwoWsrKx0X2oVZei9kclkj/3lp1AodD90haRS6WO3a+gYSSSSx263tGP0uO2Wdowet93SjpGhz58xSjtGhj5/xijtGFXGc+sMtWvo81cZ7dbE74gnwfwzJKPZ2Nhg5syZeOeddyCXy/H000/j9u3bOH/+PMaOHVvudmJjY6FWq3Hv3j08ePAAMTExAICAgICqSZyIiKgKsNixUHPnzoWVlRXmzZuHW7duwcvLCxMnTtQt79atG3x9fbFx48ZS2+jVqxeuX7+uex0YGAgARndhExERmRKLHQsllUrx3nvv4b333jO4PD4+HqNGjSqzjYSEhMpPjIiI6Anj1Vg10Pnz5+Hk5ISRI0eaOhUiIqIqx56dGqh58+b4+++/TZ0GERHRE8GeHSIiIrJoLHaIiIjIorHYISIiIovGYoeIiIgsGosdIiIismgsdoiIiMiisdghIiIii8Zih4iIiCwaix2yCEeOHIFEIkFaWpre/G7duiEsLMwkORERkXlgsUNmIy8vr8Q8tVptgkyIiMiSsNixUN26dcPUqVMxdepUODk5wdXVFXPnzoUQAosWLUKLFi1KrBMQEIC5c+c+su1Ro0ahX79+WLhwIdzc3KBUKjFx4kS9wmTfvn3o0qULnJ2dUbt2bbz44ou4evWqbnlCQgIkEgm+/fZbBAcHw8bGBps3b9a1vXjxYnh7e6NJkyYAgG+++Qbt2rWDo6MjPD098eqrryI1NVXX1jPPPAMAqFWrFiQSCUaNGoVRo0bh6NGjWLVqFSQSCSQSCR9uSkRUA/HZWBWUlZX1RLdnb29v9DqbNm3C2LFjERkZiVOnTmHChAmoV68exowZg4ULFyIqKgrt27cHAJw+fRp///03du3aVa62Dx48CBsbGxw5cgQJCQkYPXo0ateujcWLFwMoeH+mT5+OVq1aITMzE/PmzcPLL7+MmJgYSKUPa+xZs2Zh+fLlCAwM1LV38OBBKJVKHDhwQBeXl5eH999/H02aNEFqaiqmT5+OUaNGYc+ePfDx8cF3332HAQMGIC4uDkqlEra2tgCAS5cuoUWLFli0aBEAwM3Nzej3kYiIqjlBIj09XQAQ6enpJZbl5OSI2NhYkZOTozcfwBOdjBUcHCyaNWsmtFqtbt7MmTNFs2bNhBBC9OzZU0yaNEm37PXXXxfdunUrV9uhoaHCxcVFZGVl6eatW7dOODg4CI1GY3Cd27dvCwDi7NmzQggh4uPjBQCxcuXKEm17eHgIlUpVZg5RUVECgHjw4IEQQojDhw8LAOL+/ft6ccHBweLNN98s134Zq7TPBhERPRll/X4XxdNYFqxTp06QSCS610FBQbh8+TI0Gg3Gjx+PrVu3Ijc3F2q1Glu2bMGYMWPK3Xbr1q1hZ2en13ZmZiZu3LgBALh8+TKGDh2KBg0aQKlUwtfXFwCQmJio1067du1KtN2yZUvI5XK9edHR0ejTpw/q1asHR0dHBAcHG2yPiIioOJ7GqqDMzExTp/BY+vTpA4VCge+//x5yuRx5eXkYOHBgpbZfv359fPHFF/D29oZWq0WLFi1KDDg2dHqu+LysrCyEhIQgJCQEmzdvhpubGxITExESEsIBzERE9EgsdiqoImNonrSTJ0/qvT5x4gQaNWoEmUwGAAgNDUV4eDjkcjmGDBmiG+dSHmfOnEFOTo5unRMnTsDBwQE+Pj64e/cu4uLi8MUXX+D//u//AAB//vlnhffj4sWLuHv3Lj788EP4+PgAAE6dOqUXU9gTpNFoSswvPo+IiGoWnsayYImJiZg+fTri4uKwdetWrF69Gm+++aZu+bhx43Do0CHs27fPqFNYQMEl4WPHjkVsbCz27NmD+fPnY+rUqZBKpahVqxZq166NDRs24MqVKzh06BCmT59e4f2oV68e5HI5Vq9ejWvXruGnn37C+++/rxdTv359SCQS7N69G7dv39b1vPn6+uLkyZNISEjAnTt3oNVqK5wHERFVTyx2LNjIkSORk5ODDh06YMqUKXjzzTcxYcIE3fJGjRqhc+fOaNq0KTp27GhU28899xwaNWqErl274pVXXsFLL72EBQsWAACkUim2bduG6OhotGjRAtOmTcPHH39c4f1wc3PDxo0bsWPHDvj7++PDDz/EJ598ohdTp04dLFy4ELNmzYKHhwemTp0KAJgxYwZkMhn8/f11p7+IiKhmkQghhKmTMLWMjAw4OTkhPT0dSqVSb1lubi7i4+Ph5+cHGxsbE2VovG7duiEgIAArV64sNUYIgUaNGmHy5MlG9byMGjUKaWlp+OGHHx4/0Wqsun42iIgsRVm/30VxzE4Ndfv2bWzbtg3JyckYPXq0qdMhIiKqMix2aih3d3e4urpiw4YNqFWrlt4yBweHUtfbu3dvVadGRERUqVjsWKgjR46Uubyss5cxMTGlLqtTp47uCisiIqLqwKQDlH///Xf06dMH3t7ekEgkJcaACCEwb948eHl5wdbWFt27d8fly5f1Yu7du4dhw4ZBqVTC2dkZY8eOrfb3wDG1hg0bljoZc3k6ERGROTBpsZOVlYXWrVvj888/N7h82bJl+Oyzz7B+/XqcPHkS9vb2CAkJQW5uri5m2LBhOH/+PA4cOIDdu3fj999/17viiIiIiGo2k57G6tmzJ3r27GlwmRACK1euxJw5c9C3b18AwNdffw0PDw/88MMPGDJkCC5cuIB9+/YhKipK99iB1atXo1evXvjkk0/g7e39xPaFiIiIzJPZ3mcnPj4eycnJ6N69u26ek5MTOnbsiIiICABAREQEnJ2d9Z6v1L17d0il0hJ3DyYiIqKayWwHKCcnJwMAPDw89OZ7eHjoliUnJ8Pd3V1vuZWVFVxcXHQxhqhUKqhUKt3rjIyMykqbiIiIzIzZ9uxUpaVLl8LJyUk3FT5viYiIiCyP2RY7np6eAICUlBS9+SkpKbplnp6eSE1N1Vuen5+Pe/fu6WIMmT17NtLT03XTjRs3Kjl7IiIiMhdmW+z4+fnB09MTBw8e1M3LyMjAyZMnERQUBAAICgpCWloaoqOjdTGHDh2CVqst81lPCoUCSqVSbyLz1q1bN4SFhenNO3LkCCQSCdLS0iplG4sXL0bnzp1hZ2cHZ2fnSmmTiIhMz6RjdjIzM3HlyhXd6/j4eMTExMDFxQX16tVDWFgYPvjgAzRq1Ah+fn6YO3cuvL290a9fPwBAs2bN8MILL2D8+PFYv3498vLyMHXqVAwZMoRXYpkZtVoNuVxeYn5eXh6sra1NkFFJarUagwYNQlBQEL788ktTp0NERJVFmNDhw4cFgBJTaGioEEIIrVYr5s6dKzw8PIRCoRDPPfeciIuL02vj7t27YujQocLBwUEolUoxevRo8eDBA6PySE9PFwBEenp6iWU5OTkiNjZW5OTkVHg/TUGj0YiPPvpIPPXUU0IulwsfHx/xwQcfPHK9+Ph4AUBs3bpVBAUFCYVCIZo3by6OHDmii8nPzxdjxowRvr6+wsbGRjRu3FisXLlSr53Q0FDRt29f8cEHHwgvLy/h6+ura3vbtm2ia9euQqFQiPDwcHHnzh0xZMgQ4e3tLWxtbUWLFi3Eli1b9Noq/hkpbMvQ5+ZxhYeHCycnp0fGVdfPBhGRpSjr97sok/bsdOvWrczHFkgkEixatAiLFi0qNcbFxQVbtmypivTKlJWVVeoymUym9xTssmKlUqneXYlLi7W3tzcqv9mzZ+OLL77AihUr0KVLFyQlJeHixYvlXv/tt9/GypUr4e/vj08//RR9+vRBfHw8ateuDa1Wi7p162LHjh2oXbs2jh8/jgkTJsDLywuDBw/WtXHw4EEolUocOHBAr+1Zs2Zh+fLlCAwMhI2NDXJzc9G2bVvMnDkTSqUSv/zyC0aMGIGnnnoKHTp0wKpVq3Dp0iW0aNFC91lwc3PDd999hwEDBiAuLg5KpZJ3dyYiIsOeTO1l3irSswMDPVKFU69evfRi7ezsSo0NDg7Wi3V1dTUYZ4yMjAyhUCjEF198YdR6Qjzs2fnwww918/Ly8kTdunXFRx99VOp6U6ZMEQMGDNC9Dg0NFR4eHkKlUpVou3gvkCG9e/cWb731lu51cHCwePPNN/ViCnsG79+/X449Kz/27BARVQ/l7dkx2wHKVHEXLlyASqXCc889V+E2CgeBAwX3LmrXrh0uXLigm/f555+jbdu2cHNzg4ODAzZs2IDExES9Nlq2bGlwnE7Rm0ACgEajwfvvv4+WLVvCxcUFDg4O2L9/f4n2KsvEiRPh4OCgm4iIyLKZ7U0FzV1ZDxuVyWR6r4tfHl+UVKpfbyYkJDxWXgCq/HTOtm3bMGPGDCxfvhxBQUFwdHTExx9/XOKu1aWdeis+/+OPP8aqVauwcuVKtGzZEvb29ggLC4Nara6S/BctWoQZM2ZUSdtERGR+WOxUkDFjaKoqtjSNGjWCra0tDh48iHHjxlWojRMnTqBr164ACu5dFB0djalTpwIAjh07hs6dO2Py5Mm6+KtXr1Y432PHjqFv374YPnw4AECr1eLSpUvw9/fXxcjlcmg0Gr31CnuNis9/FHd39xJ33iYiIsvF01gWyMbGBjNnzsQ777yDr7/+GlevXsWJEyeMupz6888/x/fff4+LFy9iypQpuH//PsaMGQOgoJg6deoU9u/fj0uXLmHu3LmIioqqcL6NGjXCgQMHcPz4cVy4cAGvvfZaiZtJ+vr64uTJk0hISMCdO3eg1WpRv359SCQS7N69G7dv3y6zt608EhMTERMTg8TERGg0GsTExCAmJuax2yUiItNisWOh5s6di7feegvz5s1Ds2bN8Morr5R5Oq24Dz/8EB9++CFat26NP//8Ez/99BNcXV0BAK+99hr69++PV155BR07dsTdu3f1enmMNWfOHLRp0wYhISHo1q0bPD09dfdSKjRjxgzIZDL4+/vDzc0NiYmJqFOnDhYuXIhZs2bBw8ND1/O0ceNGSCQSo/OYN28eAgMDMX/+fGRmZiIwMBCBgYE4depUhfeNiIhMTyJEGdd+1xAZGRlwcnJCenp6ibsp5+bmIj4+Hn5+fnqXk1uqhIQE+Pn54fTp0wgICDB1OhUyf/58HD16FEeOHKnS7dS0zwYRkbkp6/e7KI7ZIYuzd+9erFmzxtRpEBGRmeBprBpmyZIlepddF5169uxp6vQqRWRkJDp06GDqNIiIyEywZ6eGmThxot5djouytbVFnTp1yryrNRERUXXDYqeGcXFxgYuLi6nTICIiemJ4GouIiIgsGosdIiIismgsdoiIiMiisdghIiIii8Zih4iIiCwaix0iIiKyaCx2qFro1q0bwsLC9OYdOXIEEokEaWlpRre3YcMGdOvWDUqlssJtEBFR9cBih54ItVptcH5eXt4TzqRAdnY2XnjhBbz77rsm2T4RET05LHYslFarxbJly9CwYUMoFArUq1cPixcvfuR6CQkJkEgk2LZtGzp37gwbGxu0aNECR48e1cVoNBqMHTsWfn5+sLW1RZMmTbBq1Sq9dkaNGoV+/fph8eLF8Pb2RpMmTXRtf/vttwgODoaNjQ02b96Mu3fvYujQoahTpw7s7OzQsmVLbN26Va+to0ePYtWqVZBIJJBIJEhISMAzzzwDAKhVqxYkEglGjRpV7vcnLCwMs2bNQqdOncq9DhERVU+8g3IFZWVllS9Qo9H9U6FQwMqq4C3Pz8+HSq2G1MoKtra2utjS2rV3cACkRWrTIu2WIJFg9uzZ+OKLL7BixQp0CQpCUlISLsbFGV5PJivR7ttvv42Vn34K/2bN8OnKlejTpw/ir1xBbXd3aLVa1K1bFzu+/Ra1XVxwPCICEyZOhJeHBwYPGlTQjhA4ePAglEolDhw4AGi1urZnzZqF5R9/jMAvv4SNjQ1ys7LQtm1bzJw5E0qlEr/s3o0RI0bgKV9fdOjQAas+/RSX4uLQokULLFqwAJDJ4Obmhu+++w4DBgxAXGwslEplwftYfP+kUkAiKfi3VgsUfxRGYbxGU7CsrNji7RZSq8s+Hra2D+PVaqCs3iwbm4fHw5jYvLyC+NIoFMC/nz2jYvPzAZWq9Fi5HLC2Nj5WowFyc0uPtbYuiDc2VqsFcnIqJ9bKquC9AAo+C9nZlRMrkxUcu0JlfZcYEyuVFnzWKhKbnV36510iAezsKhabk1PwPpfG3r5isbm5Zf/NGRNrZ/fw716lKvgcV0asMX/3NeU7wpQEifT0dAFApKenl1iWk5MjYmNjRU5Ojt58AEZP25cuFSIqSoioKLF96VIBQAQHBz9sNDpauDo7G1xXXLyon9jp07q2ik8ZkZFCoVCIL774oiD2zJlSY8XZs3rNxu/bJwCID6dO1cXkRUSIuu7u4qOwMP0czp/XxUwZNEgMePZZ3evQPn2Eh4eHUKlUBbEXL4r4H38UAMTK6dP1c4iO1m/30iXRu0sX8dawYbqY4DZtxJtDhhS8/tfhw4cFAHH/0KHS9y8//2G7166VWH54/fqHbajVD2MTEkpvMypKiNzch5+NhQuFKPj6NzydO/ew3fnzy46NjHwYu2xZ2bGHDz+MXbOm7Njdux/GhoeXHbt9+8PY7dvLjg0Pfxi7e3fZsWvWPIw9fLjs2GXLHsZGRpYdO3/+w9hz58qOnTHjYWx8fNmxkyc/jE1NLTs2NPRhbGZm2bEDBwo9ZcX26qUfa2dXemzR7xIhhHB1LT22XTv92Pr1S4/199eP9fcvPbZ+ff3Ydu1Kj3V11Y8NDi491s5OP7ZXr7Lft6IGDiw7NjPzYWxoaNmxqakPYydPLjs2Pv5h7IwZZcfWlO+IKlDW73dR7NmxQBeuXoVKpcJzzz1X4TaCWrbU/dvKygrt/P1x4do13bzPP/8cX61di8Rbt5CjUkGdl4eAxo312mjZsiXkhf8XXUQ7f3+91xqNBkvefx/bt2/HzZs3oVapoFKpYFf0/2iJiIgqSCKEEKZOwtQyMjLg5OSE9PR0KJVKvWW5ubmIj4+Hn58fbIr8+Jrzaayz586hVUAArl27Bj8/v7K7cAG901gJV6/Cr2FDHD10CF27dtXNf3nAADg7OyN840Zs27YNo0ePxvJPPkFQx45wdHTEx8uX42RkJGKiowEAo8aMQVp6On744YeCBrRaJMTHw69hQ5w+dQoBAQG6tj/86CN88umnWLlyJVq2bAl7W1uETZsGKysr/LBrFwCg27PPIiAgACs//VSX75EjR/DMM8/g/p07cHZ2NrxvjziNdeTIETzTvXtBGy4uRp3GylWpCj4bderApuipwOJqShc1T2OVL5ansR7iaSzjY6vzd0QVKOv3uyj27FSQfdE/pjJoiv2RFb6SWFnB1toa0iIFjAaATSntaqE/mrys8uWpRo1ga2uLgwcPYty4cWXGAkDRn+nC2OMnT+Lpf4ud/Px8RP/1FyZPngwAOHbsGDp37oyJkyahsFa+cvWq3vrFvwq1RZZpiuX/5/Hj6Nu3L4YPH67b3qXLl9GsWTNdnLVcjnyNBpoi+Rb2Gqn/nW+IFICkSA7F8yqak3hEbPF2C6lR9vGwLRKvBlDW9Wc2eLh/xsTm/RtfGgUe/rEbE5sPoIyvMcgBWFcgVgOgjPIF1v/GGxurBVBG+WJUrBUK3gug4LNQRvliVKwMBceuUFn/22RMrBQFn7WKxGaj9M+7BIBdBWNzUPA+l6bot50xsbko+2/OmFg7PPy7V6Hgc1wZscb83deU7wiTqtKTadVERcbslFdUVFSp06VLl/Rio6OjS429WGzMzunTp0uNPX/+vFiwYIGoVauW2LRpk9i9e7f46quvxJw5c0rEni02Zmffv2N2PD09xbJly8SOHTvEyy+/LOzs7MSRI0eEEEKsWrVKKJVK8Z///Efs3LlTjBkzRtjb24tGjRrp2u3Tp4/o27evrt2LFy+KH/8ds/O///1PL4dhw4YJHx8fcezYMREbGysGDRok7O3tRXBwsC6mX79+wt/fX/z444/i9u3bQqPRiH/++UdIJBIxf/588euvv4qjR4+W2L/8ImN2rl27ppu/d+9e8b///U+89957AoDYsGGDiIyMFHfv3hVCCJGQkFDmscstMmZn4cKFAih9rNa5Iufj58+fX2ZsZJHz8cuWLSsz9nCR8/Fr1qwpM3Z3kfPx4eHhZcZuL3I+fvv27WXGhhc5H7979+4yY9cUGbNTON6qtGlZkTE7kZGRZcbOLzJm59y5c2XGzigyZic+Pr7M2MlFxuykpqaWGRtaZMxOZmZmmbEDi43ZKSu2V7ExO3Z2dqXGBhcbs+Pq6lpqbLtiY3bq169faqx/sTE7/v7+pcbWLzZmp127dqXGuhYbsxMcHFxqrF2xMTu9evUq830rauDAgWXGZhYZsxMaGlpmbGqRMTuTJ08uMza+yJidGTNmlBlbU74jqkJ5x+zw0nMLNXfuXLz11luYN28e+vXrh3fffRf37t0r9/pTp07Fpk2b8OqrryImJgbLly9HrVq1AACvvfYa+vfvjxkzZmD06NFIT0/HwIEDK5zr2LFj0aZNG4SEhKBbt25wc3NDt27d9GKGDx8OmUyGwYMHw83NDYmJiahTpw7efPNNrFmzBiEhIVi2bBkA4Oeff0b79u3L3OauXbswfPhw3eX4EyZMQIcOHfDTTz9VeD+IiMg8ccwOKjZmp7yKn8YqSiKR6J/GMkEsAMiKjDe5evUqGjZsiFPFxtUYitVqtSjr42Oq2AULFuD333/HoUOHIJVKIfn3HPuj2jU2VvXvmJ06dero5VScra2t7nio1eoyb6RoY2Oja8uY2Ly8vFJv3AjojxczJjY/Px+qMs7Hy+VyWP97Pt6YWI1Gg9wyxuFYW1vrTlMaE6vVapFTxjgcY2KtrKyg+HccjhAC2WWMwzEmViaTlXv8nzGxUqn04fg/I2Ozs7NL/bxLJBLYFRmHY0xsTk4OtGWMwyk6HMCY2Nzc3DK/14yJtbOz0/3dq1Qq5JcxDseYWGP+7mvKd0RV4JgdM1HWj6A5x8pkskeuV7SgepQnGbt//36sWbOmRP5VlYNcLi93ISyXyw1eofa4sdbW1uX+QjEm1srKSvelVpmxMpms3OPejImVSqVVEiuRSKokFij/+L+qjC1aoFRmbNGCqjJjjfkfT2NiFQqFrmitzNiq+ruvbt8RpsTTWDXMkiVL4ODgYHDq2bOnqdOrFJGRkejQoYOp0yAiIjNh/uUYVaqJEydi8ODBBpfZ2tqiTp06ZZ6+ISIiqm5Y7NQwLi4ucHFxMXUaRERETwxPYxEREZFFY7FTTjy1Q8XxM0FEVD2w2HmEopf4ERVVeHlxVV5WSUREj49jdh7BysoKdnZ2uH37NqyLPd6BaqbC+6ikpqbC2dnZqEv7iYjoyWOx8wgSiQReXl6Ij4/H9evXTZ0OmRFnZ2d4enqaOg0iInoEFjvlIJfL0ahRI57KIh1ra2v26BARVRMsdspJKpVW6HERREREZFocgEJEREQWjcUOERERWTQWO0RERGTROGYHD28Ol5GRYeJMiIiIqLwKf7cfdZNXFjsAHjx4AADw8fExcSZERERkrAcPHsDJyanU5RLBe95Dq9Xi1q1bcHR0hEQiqbR2MzIy4OPjgxs3bkCpVFZau/Tk8BhWfzyG1RuPX/VXlcdQCIEHDx7A29u7zJv+smcHBZeV161bt8raVyqV/COt5ngMqz8ew+qNx6/6q6pjWFaPTiEOUCYiIiKLxmKHiIiILBqLnSqkUCgwf/58KBQKU6dCFcRjWP3xGFZvPH7VnzkcQw5QJiIiIovGnh0iIiKyaCx2iIiIyKKx2CEiIiKLxmKHiIiILBqLHQM+//xz+Pr6wsbGBh07dkRkZGSZ8StXrkSTJk1ga2sLHx8fTJs2Dbm5uaXG5+bmYtSoUWjZsiWsrKzQr18/g3FHjhxBmzZtoFAo0LBhQ2zcuPEx9qpmMYdjmJSUhFdffRWNGzeGVCpFWFjYY+5VzWIOx3DXrl14/vnn4ebmBqVSiaCgIOzfv/9xd61GMIfjV9SxY8dgZWWFgICACuxNzWQOx/DIkSOQSCQlpuTkZON2RpCebdu2CblcLr766itx/vx5MX78eOHs7CxSUlIMxm/evFkoFAqxefNmER8fL/bv3y+8vLzEtGnTSt1GZmammDhxotiwYYMICQkRffv2LRFz7do1YWdnJ6ZPny5iY2PF6tWrhUwmE/v27ausXbVY5nIM4+PjxRtvvCE2bdokAgICxJtvvllJe2j5zOUYvvnmm+Kjjz4SkZGR4tKlS2L27NnC2tpa/PXXX5W1qxbJXI5fofv374sGDRqIHj16iNatWz/m3tUM5nIMDx8+LACIuLg4kZSUpJs0Go1R+8Nip5gOHTqIKVOm6F5rNBrh7e0tli5dajB+ypQp4tlnn9WbN336dPH000+Xa3uhoaEGD/A777wjmjdvrjfvlVdeESEhIeVqtyYzl2NYVHBwMIsdI5jjMSzk7+8vFi5cWK7Ymsrcjt8rr7wi5syZI+bPn89ip5zM5RgWFjv3798vd+6G8DRWEWq1GtHR0ejevbtunlQqRffu3REREWFwnc6dOyM6OlrXvXft2jXs2bMHvXr1eqxcIiIi9PIAgJCQkFLzoALmdAypYsz5GGq1Wjx48AAuLi6V2q4lMbfjFx4ejmvXrmH+/PmP3VZNYW7HEAACAgLg5eWF559/HseOHTN6fT4ItIg7d+5Ao9HAw8NDb76HhwcuXrxocJ1XX30Vd+7cQZcuXSCEQH5+PiZOnIh33333sXJJTk42mEdGRgZycnJga2v7WO1bKnM6hlQx5nwMP/nkE2RmZmLw4MGV2q4lMafjd/nyZcyaNQt//PEHrKz4c1de5nQMvby8sH79erRr1w4qlQr//e9/0a1bN5w8eRJt2rQpdzvs2XlMR44cwZIlS7B27Vr89ddf2LVrF3755Re8//77pk6NyonHsPp7Esdwy5YtWLhwIbZv3w53d/dKa5eq5vhpNBq8+uqrWLhwIRo3blyJ2ZIhVfU32KRJE7z22mto27YtOnfujK+++gqdO3fGihUrjGqHpW4Rrq6ukMlkSElJ0ZufkpICT09Pg+vMnTsXI0aMwLhx4wAALVu2RFZWFiZMmID33nsPUmnF6klPT0+DeSiVSvbqlMGcjiFVjDkew23btmHcuHHYsWNHidPLpM9cjt+DBw9w6tQpnD59GlOnTgVQcBpSCAErKyv8+uuvePbZZ41utyYwl2NYmg4dOuDPP/80ah1+ixchl8vRtm1bHDx4UDdPq9Xi4MGDCAoKMrhOdnZ2iYMok8kAAOIxHjsWFBSklwcAHDhwoNQ8qIA5HUOqGHM7hlu3bsXo0aOxdetW9O7d+7HaqgnM5fgplUqcPXsWMTExumnixIlo0qQJYmJi0LFjxwq1WxOYyzEsTUxMDLy8vIxb6bGGN1ugbdu2CYVCITZu3ChiY2PFhAkThLOzs0hOThZCCDFixAgxa9YsXfz8+fOFo6Oj2Lp1q7h27Zr49ddfxVNPPSUGDx6si1m9enWJUernz58Xp0+fFn369BHdunUTp0+fFqdPn9YtL7z0/O233xYXLlwQn3/+OS89LydzOYZCCN28tm3bildffVWcPn1anD9/vup23kKYyzHcvHmzsLKyEp9//rneZa9paWlV+wZUc+Zy/Irj1VjlZy7HcMWKFeKHH34Qly9fFmfPnhVvvvmmkEql4rfffjNqf1jsGLB69WpRr149IZfLRYcOHcSJEyd0y4KDg0VoaKjudV5enliwYIF46qmnhI2NjfDx8RGTJ0/Wu0xu/vz5on79+nrbqF+/vgBQYirq8OHDIiAgQMjlctGgQQMRHh5eBXtrmczlGBpaXrwdMswcjmFwcLDB5UW3TYaZw/ErjsWOcczhGH700Ue6Nl1cXES3bt3EoUOHjN4XiRDspyciIiLLxTE7REREZNFY7BAREZFFY7FDREREFo3FDhEREVk0FjtERERk0VjsEBERkUVjsUNEREQWjcUOEVUpIQQmTJgAFxcXSCQSxMTEoFu3bggLC3vstiUSCX744YfHbqcyJSQk6PaTiMwDix0iqlL79u3Dxo0bsXv3biQlJaFFixYlYnbt2oUePXqgdu3a1b5Q8PHxKXU/icg0WOwQUYWo1epyxV29ehVeXl7o3LkzPD09YWVlVSImKysLXbp0wUcffVTZaVa6vLy8MpfLZLJS95OITIPFDhGVS7du3TB16lSEhYXB1dUVISEhAIBz586hZ8+ecHBwgIeHB0aMGIE7d+4AAEaNGoXXX38diYmJkEgk8PX1Ndj2iBEjMG/ePHTv3r3U7V++fBldu3aFjY0N/P39ceDAgTLz3bBhA7y9vaHVavXm9+3bF2PGjNG9/vHHH9GmTRvY2NigQYMGWLhwIfLz83XLJRIJ1q1bh5deegn29vZYvHgx7t+/j2HDhsHNzQ22trZo1KgRwsPDARg+jXX06FF06NABCoUCXl5emDVrlt42unXrhjfeeAPvvPMOXFxc4OnpiQULFpS5f0RUfix2iKjcNm3aBLlcjmPHjmH9+vVIS0vDs88+i8DAQJw6dQr79u1DSkoKBg8eDABYtWoVFi1ahLp16yIpKQlRUVEV2q5Wq0X//v0hl8tx8uRJrF+/HjNnzixznUGDBuHu3bs4fPiwbt69e/ewb98+DBs2DADwxx9/YOTIkXjzzTcRGxuL//znP9i4cSMWL16s19aCBQvw8ssv4+zZsxgzZgzmzp2L2NhY7N27FxcuXMC6devg6upqMI+bN2+iV69eaN++Pc6cOYN169bhyy+/xAcffKAXt2nTJtjb2+PkyZNYtmwZFi1a9MiCjojKyehHhxJRjRQcHCwCAwP15r3//vuiR48eevNu3LghAIi4uDghhBArVqwo8aTj4OBg8eabb5bYRnx8vAAgTp8+rTd///79wsrKSty8eVM3b+/evQKA+P7770vNuW/fvmLMmDG61//5z3+Et7e30Gg0QgghnnvuObFkyRK9db755hvh5eWlew1AhIWF6cX06dNHjB492uA2i+/Du+++K5o0aSK0Wq0u5vPPPxcODg66PIKDg0WXLl302mnfvr2YOXNmqftGROXHnh0iKre2bdvqvT5z5gwOHz4MBwcH3dS0aVMABWN1KsuFCxfg4+MDb29v3bygoKBHrjds2DB89913UKlUAIDNmzdjyJAhkEqluvwXLVqkl//48eORlJSE7OxsXTvt2rXTa3fSpEnYtm0bAgIC8M477+D48eNl5h4UFASJRKKb9/TTTyMzMxP//POPbl6rVq301vPy8kJqauoj95GIHo0j6Iio3Ozt7fVeZ2Zmok+fPgYHFnt5eT2ptErVp08fCCHwyy+/oH379vjjjz+wYsUK3fLMzEwsXLgQ/fv3L7GujY2N7t/F97tnz564fv069uzZgwMHDuC5557DlClT8Mknn1Q4V2tra73XEomkxHgjIqoYFjtEVGFt2rTBd999B19f3yq9+qhZs2a4ceMGkpKSdEXUiRMnHrmejY0N+vfvj82bN+PKlSto0qQJ2rRpo5d/XFwcGjZsaHRObm5uCA0NRWhoKP7v//4Pb7/9tsFip1mzZvjuu+8ghND17hw7dgyOjo6oW7eu0dslIuPxNBYRVdiUKVNw7949DB06FFFRUbh69Sr279+P0aNHQ6PRlLude/fuISYmBrGxsQCAuLg4xMTEIDk5GQDQvXt3NG7cGKGhoThz5gz++OMPvPfee+Vqe9iwYfjll1/w1Vdf6QYmF5o3bx6+/vprLFy4EOfPn8eFCxewbds2zJkzp8w2582bhx9//BFXrlzB+fPnsXv3bjRr1sxg7OTJk3Hjxg28/vrruHjxIn788UfMnz8f06dP151OI6Kqxb80Iqowb29vHDt2DBqNBj169EDLli0RFhYGZ2dno37If/rpJwQGBqJ3794AgCFDhiAwMBDr168HAEilUnz//ffIyclBhw4dMG7cuBJXTJXm2WefhYuLC+Li4vDqq6/qLQsJCcHu3bvx66+/on379ujUqRNWrFiB+vXrl9mmXC7H7Nmz0apVK3Tt2hUymQzbtm0zGFunTh3s2bMHkZGRaN26NSZOnIixY8c+sqAiosojEUIIUydBREREVFXYs0NEREQWjcUOERERWTQWO0RERGTRWOwQERGRRWOxQ0RERBaNxQ4RERFZNBY7REREZNFY7BAREZFFY7FDREREFo3FDhEREVk0FjtERERk0VjsEBERkUX7f0nqdC5ZSRzWAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(refl1d_version, reflectivity_time, label='refl1d')\n",
"plt.hlines(698, '0.8.10', '0.8.15', 'r', label='python')\n",
"plt.hlines(44.1, '0.8.10', '0.8.15', 'r', label='c, -1', linestyle='dashed')\n",
"plt.hlines(239, '0.8.10', '0.8.15', 'r', label='c, 1', linestyle='dashdot')\n",
"plt.hlines(521, '0.8.10', '0.8.15', 'black', label='py_parratt')\n",
"plt.hlines(36.4, '0.8.10', '0.8.15', 'black', label='c_parratt, -1', linestyle='dashed')\n",
"plt.hlines(169, '0.8.10', '0.8.15', 'black', label='c_parratt, 1', linestyle='dashdot')\n",
"\n",
"plt.title(\"Microslab comparison\") \n",
"plt.legend()\n",
"plt.ylabel(\"time / ms\")\n",
"plt.xlabel(\"refl1d version\");"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1e74dceb",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment