diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 99ce14b..4efb84c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ ci: autoupdate_commit_msg: "chore: update pre-commit hooks" autofix_commit_msg: "style: pre-commit fixes" -exclude: ^.cruft.json|.copier-answers.yml$ +exclude: ^.cruft.json|.copier-answers.yml$|^notebooks/ repos: - repo: https://github.com/adamchainz/blacken-docs diff --git a/diffractometer-geometry.yml b/diffractometer-geometry.yml new file mode 100644 index 0000000..265ab6d --- /dev/null +++ b/diffractometer-geometry.yml @@ -0,0 +1,81 @@ +# CDI 7-circle diffractometer prototype. +# Schema reference: docs/source/reference/declarative_geometry_schema.md +# How-to: docs/source/howto/custom_geometry.md + +ad_hoc_diffractometer_geometry: + schema_revision: 1 + +name: cdi-geometry + +documentation: | + CDI 7-circle diffractometer prototype. + + This is a working first model of the CDI stack from beamline notes. + The top two sample rotations are fixed at zero in the initial mode. + + + The solver has special handling for an Eulerian inner pair named + ``chi`` and ``phi``. These names are solver-facing aliases for the + two lower CDI sample stages noted as omega/chi during beamline + discussion: + + chi -> gon.sam.c_lg.lrx / omega1 in earlier notes + phi -> gon.sam.c_lg.lrz / chi1 in earlier notes + + + Basis used here: vertical=+Y, longitudinal=+Z, transverse=+X. + + + Stack (floor first): + mu : vertical + --> chi : longitudinal + --> phi : transverse + --> omega2 : longitudinal, fixed at 0 in fixed_alpha + --> chi2 : transverse, fixed at 0 in fixed_alpha + gamma : rotation about x-axis (vertical in motion) + --> delta : rotation about y-axis (horizontal in motion) + +# [x, y, z] +basis: + vertical: [0.0, 1.0, 0.0] + longitudinal: [0.0, 0.0, 1.0] + transverse: [1.0, 0.0, 0.0] + +stages: + # TODO - check +/- signs + - { name: mu, axis: +vertical, parent: null, role: sample } # Ry gon.sam.ry + - { name: omega1, axis: +transverse, parent: mu, role: sample } # Rx gon.sam.c_lg.lrx / omega1 + # omega about the transverse axis + # phi is about the vertical when everything else is at 0, but would change as everythhing else moves + # we do not have a phi installed, so it should be zero or not included in the geometry. + # phi is on top of omega and chi and mu + - { name: chi1, axis: +longitudinal, parent: omega1, role: sample } # Rz gon.sam.c_lg.lrz / chi1 + + # do not need to worry about second omega and chi; assume they are fixed + # we have double omega and double chi installed, but do not need to incorporate them right now + - { name: omega2, axis: +transverse, parent: chi1, role: sample } # Rx gon.sam.c_sm.lrx + - { name: chi2, axis: +longitudinal, parent: omega2, role: sample } # Rz gon.sam.c_sm.lrz + - { name: gamma, axis: +transverse, parent: null, role: detector } # Rx tdms.ax + - { name: delta, axis: +vertical, parent: gamma, role: detector } # Ry tdms.ay + +# 7 real axes, so N - 3 = 4 constraints are needed for a unique forward solve. +modes: + fixed_incidence: + constraints: + - { type: sample, stage: chi2, value: 0.0 } + - { type: sample, stage: omega2, value: 0.0 } + - { type: sample, stage: chi1, value: 0.0 } + # - { type: detector, stage: gamma, value: 0.0 } + - { type: reference, name: incidence, value: 5.0 } + computed: [mu, omega1, delta, gamma] + extras: + n_hat: REQUIRED + incidence: REQUIRED + + fixed_chi1_chi2_omega2: + default: true + constraints: + - { type: sample, stage: chi2, value: 0.0 } + - { type: sample, stage: omega2, value: 0.0 } + - { type: sample, stage: chi1, value: 0.0 } + computed: [mu, omega1, delta, gamma] diff --git a/notebooks/CDI_gonio.pptx b/notebooks/CDI_gonio.pptx new file mode 100644 index 0000000..b3f290e Binary files /dev/null and b/notebooks/CDI_gonio.pptx differ diff --git a/notebooks/CDI_gonio_simulator.ipynb b/notebooks/CDI_gonio_simulator.ipynb new file mode 100644 index 0000000..17b0428 --- /dev/null +++ b/notebooks/CDI_gonio_simulator.ipynb @@ -0,0 +1,534 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "b8e26cbf-5c56-4391-bc94-20734085ada3", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize notebook\n", + "\n", + "# %matplotlib notebook\n", + "from __future__ import annotations\n", + "\n", + "%matplotlib widget\n", + "# %matplotlib inline\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from mpl_toolkits.mplot3d.art3d import Poly3DCollection" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b7ac81b-88b9-47f5-a36e-c553ab14bdb3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ed03fa-16b7-41dd-a66d-6000feae09ae", + "metadata": {}, + "outputs": [], + "source": [ + "def Rot_Matrix(axis, theta, IsRadian=True):\n", + " \"\"\">>> Instruction <<<\n", + " Calculate a generic rotation matrix that makes a rotation of 'theta' around a given 'axis'.\n", + "\n", + " Inputs:\n", + " 'axis' Rotation axis, format np.asarray([x, y, z])\n", + " 'theta' Rotation angle\n", + "\n", + " Output:\n", + " a 3-by-3 array\n", + "\n", + " In application, assuming that we need to rotate a vector Vi to a new direction Vf, then\n", + " axis = np.cross(Vi, Vf) / np.linalg.norm(np.cross(Vi, Vf))\n", + " theta = np.arccos( np.dot(Vi, Vf) / (np.linalg.norm(Vi) * np.linalg.norm(Vf)) )\n", + " \"\"\"\n", + " if not IsRadian:\n", + " theta = np.deg2rad(theta)\n", + "\n", + " if np.linalg.norm(axis) == 0:\n", + " x, y, z = axis\n", + " else:\n", + " x, y, z = axis / np.linalg.norm(axis)\n", + " c = np.cos(theta)\n", + " s = np.sin(theta)\n", + " C = 1 - c\n", + " return np.matrix(\n", + " [\n", + " [x * x * C + c, x * y * C - z * s, x * z * C + y * s],\n", + " [y * x * C + z * s, y * y * C + c, y * z * C - x * s],\n", + " [z * x * C - y * s, z * y * C + x * s, z * z * C + c],\n", + " ]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ba749c7b-347e-4e07-b299-3ee0197a70f1", + "metadata": {}, + "outputs": [], + "source": [ + "def get_hBragg(delta, gamma, IsRadian=False):\n", + " rot_mat = Rot_Matrix([-1.0, 0.0, 0.0], gamma, IsRadian=IsRadian)\n", + " rot_mat = Rot_Matrix([0.0, 1.0, 0.0], delta, IsRadian=IsRadian) @ rot_mat\n", + " ki = np.asarray([0.0, 0.0, 1.0])\n", + " kh = np.squeeze(np.asarray(rot_mat @ ki))\n", + " print(ki)\n", + " print(kh)\n", + " return kh - ki" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "61276cfe-b728-480e-8b71-27bc22f8b87c", + "metadata": {}, + "outputs": [], + "source": [ + "def scat_geo_plotter(\n", + " angles,\n", + " beamline=\"cdi-nsls2\",\n", + " samp_ori_norm=[0.0, 1.0, 0.0],\n", + " samp_ori_u=None,\n", + " samp_ori_v=None,\n", + " u_name=None,\n", + " v_name=None,\n", + " flag_inv_norm=False,\n", + " flag_inv_inpl=False,\n", + " flag_plot=True,\n", + " flag_info=True,\n", + "):\n", + " \"\"\"This function draws the scattering geometery based on a set of angles.\n", + "\n", + " Inputs:\n", + " - angles: a dictionary containing angle values, unit [deg]\n", + " - For 'cdi-nsls2' (CDI beamline at NSLS2):\n", + " {# Axes ordered from bottom to top, i.e., motion of a stage affects all ones on top.\n", + " # Goniometer axes (Translation axes are included for completeness but not used in the function.)\n", + " 'Ty_JJ': 0.,\n", + " 'Tz_JJ': 0.,\n", + " 'Tx_JJ': 0.,\n", + " 'Rz_JJ': 0.,\n", + " 'Rx_JJ': 0.,\n", + " 'Ry': 0.,\n", + " 'Tz_L': 0.,\n", + " 'Tx_L': 0.,\n", + " 'Rx_TT_L': 0.,\n", + " 'Rz_TT_L': 0.,\n", + " 'Rx_TT_S': 0.,\n", + " 'Rz_TT_S': 0.,\n", + " 'Ty': 0.,\n", + " 'Tx_S': 0.,\n", + " 'Tz_S': 0.,\n", + " # TDMS axes\n", + " 'AY': 0., # delta\n", + " 'TZ': 0., # tower translation along arm\n", + " 'AZ': 0.,\n", + " 'TY': 0., # detector cage height\n", + " 'TX': 0.,\n", + " 'AX': 0., # gamma\n", + " }\n", + " - beamline: select a predefined gonio setup of a beamline\n", + " - samp_ori_norm: initial normal of a plane at the sample\n", + " - if None, this is calculated based on the scattering geometery (i.e., detector location).\n", + " - samp_ori_u / v: (optional) two in-plane axes at the sample\n", + " - u / v_name: (optional) names of samp_ori_u / v axes.\n", + " - flag_inv_norm: if True, samp_ori_norm is the FINAL normal\n", + " - flag_inv_inpl: if True, samp_ori_u / v are the FINAL in-plane axes\n", + "\n", + " Output:\n", + " - A 3D plot of the sample-detector geometery.\n", + " \"\"\"\n", + " # calculate rotation matrices\n", + " if beamline == \"cdi-nsls2\":\n", + " srot_mat = np.eye(3) # initial matrix\n", + " srot_mat = (\n", + " Rot_Matrix([0.0, 0.0, 1.0], angles[\"Rz_TT_S\"], IsRadian=False) @ srot_mat\n", + " )\n", + " srot_mat = (\n", + " Rot_Matrix([1.0, 0.0, 0.0], angles[\"Rx_TT_S\"], IsRadian=False) @ srot_mat\n", + " )\n", + " srot_mat = (\n", + " Rot_Matrix([0.0, 0.0, 1.0], angles[\"Rz_TT_L\"], IsRadian=False) @ srot_mat\n", + " )\n", + " srot_mat = (\n", + " Rot_Matrix([1.0, 0.0, 0.0], angles[\"Rx_TT_L\"], IsRadian=False) @ srot_mat\n", + " )\n", + " srot_mat = Rot_Matrix([0.0, 1.0, 0.0], angles[\"Ry\"], IsRadian=False) @ srot_mat\n", + " srot_mat = (\n", + " Rot_Matrix([1.0, 0.0, 0.0], angles[\"Rx_JJ\"], IsRadian=False) @ srot_mat\n", + " )\n", + " srot_mat = (\n", + " Rot_Matrix([0.0, 0.0, 1.0], angles[\"Rz_JJ\"], IsRadian=False) @ srot_mat\n", + " )\n", + "\n", + " drot_mat = np.eye(3)\n", + " drot_mat = Rot_Matrix([-1.0, 0.0, 0.0], angles[\"AX\"], IsRadian=False) @ drot_mat\n", + " drot_mat = Rot_Matrix([0.0, 0.0, 1.0], angles[\"AZ\"], IsRadian=False) @ drot_mat\n", + " drot_mat = Rot_Matrix([0.0, 1.0, 0.0], angles[\"AY\"], IsRadian=False) @ drot_mat\n", + " else:\n", + " raise ValueError(\"Undefined beamline.\")\n", + " # get sample vectors\n", + " if samp_ori_norm is None: # if None, using the momentum transfer vector\n", + " samp_ori_norm = get_hBragg(angles[\"AY\"], angles[\"AX\"], IsRadian=False)\n", + " samp_ori_norm /= np.linalg.norm(samp_ori_norm)\n", + " if flag_inv_norm:\n", + " fin_s_norm = samp_ori_norm\n", + " ini_s_norm = np.squeeze(np.asarray(srot_mat.T @ fin_s_norm))\n", + " else:\n", + " ini_s_norm = samp_ori_norm\n", + " fin_s_norm = np.squeeze(np.asarray(srot_mat @ ini_s_norm))\n", + " if (samp_ori_u is None) and (samp_ori_v is None):\n", + " if np.linalg.norm(np.cross([1.0, 0.0, 0.0], ini_s_norm)) == 0:\n", + " samp_ori_u = np.asarray([0.0, 1.0, 0.0])\n", + " else:\n", + " samp_ori_u = np.asarray([1.0, 0.0, 0.0])\n", + " samp_ori_v = np.cross(ini_s_norm, samp_ori_u)\n", + " samp_ori_v /= np.linalg.norm(samp_ori_v)\n", + " samp_ori_u = np.cross(samp_ori_v, ini_s_norm)\n", + " samp_ori_u /= np.linalg.norm(samp_ori_u)\n", + " else:\n", + " if samp_ori_u is None:\n", + " samp_ori_v /= np.linalg.norm(samp_ori_v)\n", + " if flag_inv_inpl:\n", + " samp_ori_u = np.cross(samp_ori_v, fin_s_norm)\n", + " else:\n", + " samp_ori_u = np.cross(samp_ori_v, ini_s_norm)\n", + " if samp_ori_v is None:\n", + " samp_ori_u /= np.linalg.norm(samp_ori_u)\n", + " if flag_inv_inpl:\n", + " samp_ori_v = np.cross(fin_s_norm, samp_ori_u)\n", + " else:\n", + " samp_ori_v = np.cross(ini_s_norm, samp_ori_u)\n", + " if flag_inv_inpl:\n", + " fin_s_u = samp_ori_u\n", + " fin_s_v = samp_ori_v\n", + " ini_s_u = np.squeeze(np.asarray(srot_mat.T @ fin_s_u))\n", + " ini_s_v = np.squeeze(np.asarray(srot_mat.T @ fin_s_v))\n", + " else:\n", + " ini_s_u = samp_ori_u\n", + " ini_s_v = samp_ori_v\n", + " fin_s_u = np.squeeze(np.asarray(srot_mat @ ini_s_u))\n", + " fin_s_v = np.squeeze(np.asarray(srot_mat @ ini_s_v))\n", + " # get detector vectors\n", + " ini_d_norm = [0.0, 0.0, -1.0]\n", + " ini_d_hor = [-1.0, 0.0, 0.0]\n", + " ini_d_ver = [0.0, 1.0, 0.0]\n", + " fin_d_norm = np.squeeze(np.asarray(drot_mat @ ini_d_norm))\n", + " fin_d_hor = np.squeeze(np.asarray(drot_mat @ ini_d_hor))\n", + " fin_d_ver = np.squeeze(np.asarray(drot_mat @ ini_d_ver))\n", + " det_o_point = np.squeeze(np.asarray(drot_mat @ np.asarray([0.0, 0.0, 2.0])))\n", + " # print information\n", + " if flag_info:\n", + " print(\n", + " \"Initial sample plane normal: [%0.3f, %0.3f, %0.3f]\"\n", + " % (ini_s_norm[0], ini_s_norm[1], ini_s_norm[2])\n", + " )\n", + " print(\n", + " \"Final sample plane normal: [%0.3f, %0.3f, %0.3f]\"\n", + " % (fin_s_norm[0], fin_s_norm[1], fin_s_norm[2])\n", + " )\n", + " # plot 3D figure\n", + " if flag_plot:\n", + " fig = plt.figure(figsize=(8, 6))\n", + " ax = fig.add_subplot(111, projection=\"3d\")\n", + "\n", + " # helper function for adding a plane to 3D view\n", + " def create_plane(\n", + " fig_ax,\n", + " o_point=[0.0, 0.0, 0.0],\n", + " label=None,\n", + " vec_u=[1.0, 0.0, 0.0],\n", + " vec_v=[0.0, 1.0, 0.0],\n", + " vec_n=[0.0, 0.0, 1.0],\n", + " face_color=\"teal\",\n", + " edge_color=\"black\",\n", + " ):\n", + " o_point = np.squeeze(np.asarray(o_point))\n", + " vec_u = np.squeeze(np.asarray(vec_u))\n", + " vec_v = np.squeeze(np.asarray(vec_v))\n", + " vec_n = np.squeeze(np.asarray(vec_n))\n", + " vec_u /= np.linalg.norm(vec_u)\n", + " vec_v /= np.linalg.norm(vec_v)\n", + " vec_n /= np.linalg.norm(vec_n)\n", + " corners = [\n", + " (o_point + 0.5 * vec_u + 0.5 * vec_v)[[2, 0, 1]],\n", + " (o_point + 0.5 * vec_u - 0.5 * vec_v)[[2, 0, 1]],\n", + " (o_point - 0.5 * vec_u - 0.5 * vec_v)[[2, 0, 1]],\n", + " (o_point - 0.5 * vec_u + 0.5 * vec_v)[[2, 0, 1]],\n", + " ]\n", + " plane = Poly3DCollection(\n", + " [corners],\n", + " alpha=0.4,\n", + " facecolor=face_color,\n", + " edgecolor=edge_color,\n", + " label=label,\n", + " )\n", + " fig_ax.add_collection3d(plane)\n", + "\n", + " # helper function for adding an arrow to 3D view\n", + " def create_arrow(\n", + " fig_ax,\n", + " s_pt=[0.0, 0.0, 0.0],\n", + " e_pt=[0.0, 0.0, 1.0],\n", + " ratio=0.1,\n", + " label=None,\n", + " color=\"crimson\",\n", + " line_width=2,\n", + " alpha=1.0,\n", + " line_style=None,\n", + " ):\n", + " x0, y0, z0 = np.asarray(s_pt)\n", + " dx, dy, dz = np.asarray(e_pt) - np.asarray(s_pt)\n", + " if line_style is None:\n", + " line_style = \"-\"\n", + " fig_ax.plot(\n", + " [z0, z0 + dz],\n", + " [x0, x0 + dx],\n", + " [y0, y0 + dy],\n", + " color=color,\n", + " alpha=alpha,\n", + " linestyle=line_style,\n", + " linewidth=line_width,\n", + " label=label,\n", + " )\n", + " tip_fraction = 0.05\n", + " fig_ax.quiver(\n", + " z0 + dz * (1 - tip_fraction),\n", + " x0 + dx * (1 - tip_fraction),\n", + " y0 + dy * (1 - tip_fraction),\n", + " dz * tip_fraction,\n", + " dx * tip_fraction,\n", + " dy * tip_fraction,\n", + " color=color,\n", + " alpha=alpha,\n", + " linewidth=line_width,\n", + " arrow_length_ratio=ratio,\n", + " )\n", + "\n", + " # plot origin point and center of detector\n", + " ax.scatter3D(0.0, 0.0, 0.0, s=20, c=\"b\", alpha=0.5)\n", + " ax.text(0.1, -0.1, -0.1, \"O\")\n", + " ax.scatter3D(\n", + " det_o_point[2], det_o_point[0], det_o_point[1], s=20, c=\"b\", alpha=0.5\n", + " )\n", + " ax.text(\n", + " det_o_point[2] + 0.05, det_o_point[0] + 0.05, det_o_point[1] + 0.05, \"D\"\n", + " )\n", + " # plot incident x-ray\n", + " create_arrow(\n", + " ax,\n", + " s_pt=[0.0, 0.0, -2.0],\n", + " e_pt=[0.0, 0.0, -0.1],\n", + " ratio=0.2,\n", + " color=\"black\",\n", + " line_width=2,\n", + " alpha=0.5,\n", + " line_style=\"--\",\n", + " label=\"incident x-ray\",\n", + " )\n", + " # plot scattered x-ray\n", + " create_arrow(\n", + " ax,\n", + " s_pt=[0.0, 0.0, 0.0],\n", + " e_pt=det_o_point * 0.9,\n", + " ratio=0.2,\n", + " color=\"blue\",\n", + " line_width=2,\n", + " alpha=0.5,\n", + " line_style=\"--\",\n", + " label=\"scattered x-ray\",\n", + " )\n", + " # add initial sample plane\n", + " create_plane(\n", + " ax,\n", + " o_point=[0.0, 0.0, 0.0],\n", + " label=\"Ini Sample Plane\",\n", + " vec_u=ini_s_u,\n", + " vec_v=ini_s_v,\n", + " vec_n=ini_s_norm,\n", + " face_color=\"teal\",\n", + " edge_color=\"black\",\n", + " )\n", + " create_arrow(\n", + " ax,\n", + " s_pt=[0.0, 0.0, 0.0],\n", + " e_pt=ini_s_norm,\n", + " ratio=0.2,\n", + " color=\"teal\",\n", + " line_width=2,\n", + " alpha=0.5,\n", + " line_style=\"--\",\n", + " label=\"ini_s_norm\",\n", + " )\n", + " # add final sample plane\n", + " create_plane(\n", + " ax,\n", + " o_point=[0.0, 0.0, 0.0],\n", + " label=\"Fin Sample Plane\",\n", + " vec_u=fin_s_u,\n", + " vec_v=fin_s_v,\n", + " vec_n=fin_s_norm,\n", + " face_color=\"red\",\n", + " edge_color=\"black\",\n", + " )\n", + " create_arrow(\n", + " ax,\n", + " s_pt=[0.0, 0.0, 0.0],\n", + " e_pt=fin_s_norm,\n", + " ratio=0.2,\n", + " color=\"red\",\n", + " line_width=2,\n", + " alpha=0.5,\n", + " line_style=\"--\",\n", + " label=\"fin_s_norm\",\n", + " )\n", + " # add detector plane\n", + " create_plane(\n", + " ax,\n", + " o_point=det_o_point,\n", + " label=\"Detector Plane\",\n", + " vec_u=fin_d_hor,\n", + " vec_v=fin_d_ver,\n", + " vec_n=fin_d_norm,\n", + " face_color=\"black\",\n", + " edge_color=\"black\",\n", + " )\n", + " # Set plot limits so the plane is visible\n", + " ax.set_xlim(-2.2, 2.2)\n", + " ax.set_xlabel(\"Z\")\n", + " ax.set_ylim(-2.2, 2.2)\n", + " ax.set_ylabel(\"X\")\n", + " ax.set_zlim(-2.2, 2.2)\n", + " ax.set_zlabel(\"Y\")\n", + " ax.set_aspect(\"equal\")\n", + " ax.view_init(15.0, -150.0, 0.0)\n", + " plt.legend()\n", + " plt.tight_layout()\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d707ae44-7cea-4a15-b006-d697a0b47063", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "38a5f28e-4556-41bb-9462-09a6af47bf41", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial sample plane normal: [0.095, 0.286, -0.953]\n", + "Final sample plane normal: [0.500, 0.380, -0.778]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c794c576ff64001967273368655233a", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3wb9fnHP9rDkods2ZIdJ46zE8fZkISV0ZAyWiihDRQogZI0rLYEfmFDIIyyU6DMFsIoUBoKFMpqE0JJSAIJJGQ4e9uS5W1rj7vfH+GukizZGifd2Xrer5df0bj7fp87Kbrv554lY1mWBUEQBEEQBEEQRBaQi20AQRAEQRAEQRC5AwkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyBgkQgiAIgiAIgiCyhlJsAwiCIAiCyC6hUAiBQEBsMwiCR6VSQaFQiG0GkSVIgBAEQRBEjsCyLOx2O9rb28U2hSC6UVhYCIvFAplMJrYpRIYhAUIQBEEQOQInPkpLS6HX62mhR0gClmXhdrvhcDgAAFarVWSLiExDAoQgCIIgcoBQKMSLj+LiYrHNIYgIdDodAMDhcKC0tJTCsfo5lIROEARBEDkAl/Oh1+tFtoQgYsN9Nyk/qf9DAoQgCIIgcggKuyKkCn03cwcSIARBEARBEARBZA0SIARBEARBSJoZM2bg97//vWDjLVu2DOPHj+9xmwULFuD8888XbE6CIP4HCRCCIAiCICTNP/7xDyxfvlyw8W666SasXr1asPESJRHhQxC5AFXBIgiCIAhC0phMJkHHMxgMMBgMgo4pNQKBAFQqldhmEERMyANCEARBEISkiQ7BqqqqwgMPPIArr7wSRqMRAwcOxAsvvBCxz/Hjx3HRRRfBZDIhLy8PkydPxqZNmwB090SEQiEsWbIEhYWFKC4uxtKlS8GybMR4LMvi4YcfRnV1NXQ6HcaNG4dVq1bx769duxYymQyrV6/G5MmTodfrMX36dOzZswcAsHLlStxzzz3Ytm0bZDIZZDIZVq5c2e1YvV4vxowZg0WLFvGvHTp0CAUFBXjxxRfjniPumF566SVUV1dDo9GAZVl88sknOPXUU/ljO/fcc3HgwAF+v1mzZuG6666LGKulpQUajQZr1qyJOx9BpAMJEIIgCIIg+hyPPfYYJk+ejO+++w7XXHMNrr76auzevRsA4HQ6ccYZZ6ChoQH//Oc/sW3bNixduhQMw8Qd66WXXsJf/vIXrFu3Dq2trXj33Xcjtrnjjjvw8ssv49lnn8XOnTtxww034NJLL8UXX3wRsd3tt9+Oxx57DJs3b4ZSqcSVV14JAJg/fz5uvPFGjBkzBjabDTabDfPnz+9mi1arxV//+le88soreO+99xAKhXDZZZdh5syZWLhwYY/nZP/+/Xj77bfxzjvvYOvWrQAAl8uFJUuW4JtvvsHq1ashl8vxs5/9jD8XV111Fd544w34fD5+nL/+9a8oLy/HzJkze5yPIFKFQrAIgiAIIsfZsGEDNmzY0Ot2VqsVF198ccRrb775Jmw2W6/7Tps2DdOmTUvZxmjOPvtsXHPNNQCAm2++GU888QTWrl2LkSNH4o033kBTUxO++eYbPnxr6NChccdasWIFbr31VsybNw8A8Nxzz+HTTz/l33e5XHj88cexZs0a/hiqq6uxbt06PP/88zjjjDP4be+//37++S233IJzzjkHXq8XOp0OBoMBSqUSFoulx2MbP3487rvvPixcuBAXX3wxDhw4gPfee6/Xc+L3+/Haa6/BbDbzr3HHxPGXv/wFpaWl2LVrF2pqajBv3jxcf/31eP/99/GLX/wCAPDyyy9jwYIFVBaXyBgkQAiCIAgix/H5fOjs7Ox1u/z8/G6vuVyuhPYNv8MuBLW1tfxjmUwGi8UCh8MBANi6dSsmTJiQUO5IR0cHbDZbhDhSKpWYPHkyH4a1a9cueL1ezJkzJ2Jfv9+PCRMmxLXLarUCONHde+DAgUkd34033oj3338fTz31FD7++GOUlJTw74Xnr1x66aV47rnnAACDBg2KEB8AcODAAdx5553YuHEjmpubec/H0aNHUVNTA41Gg0svvRQvvfQSfvGLX2Dr1q3Ytm1bQoKHIFKFBAhBEARB5DgajSamuIgmLy8v5muJ7KvRaFKyLR7RCdYymYxfXOt0OkHn4sb917/+hYqKioj3oo8r3C7OgxAv9KsnHA4H9uzZA4VCgX379uHHP/4x/x4XXgVEisJYn89PfvITVFZW4sUXX0R5eTkYhkFNTQ38fj+/zVVXXYXx48fj+PHjeOmllzB79mwMGjQoaZsJIlFIgBAEQRBEjpNOeFR0SJYUqK2txZ///Ge0trb26gUpKCiA1WrFxo0bcfrppwMAgsEgtmzZgokTJwIARo8eDY1Gg6NHj0aEWyWLWq1GKBRKaNsrr7wSNTU1WLhwIX79619j9uzZGD16NICew8nCaWlpQV1dHZ5//nmcdtppAIB169Z1227s2LGYPHkyXnzxRbzxxht46qmnEjwigkgNEiAEQRAEQfQrLr74YjzwwAM4//zz8eCDD8JqteK7775DeXl5TKH1u9/9Dn/4wx8wbNgwjBo1Co8//jja29v5941GI2666SbccMMNYBgGp556Kjo7O/HVV1/BYDDg8ssvT8iuqqoqHDp0CFu3bsWAAQNgNBpjeob+9Kc/YcOGDfj+++9RWVmJjz/+GJdccgk2bdoEtVqd8HkoKipCcXExXnjhBVitVhw9ehS33HJLzG2vuuoqXHfdddDr9fjZz36W8BwEkQpUBYsgCIIgiH6FWq3GZ599htLSUpx99tkYO3Ys/vCHP0ChUMTc/sYbb8SvfvUrLFiwANOmTYPRaOy2CF++fDnuuusuPPjggxg1ahTmzp2LDz74AIMHD07Yrnnz5uHHP/4xZs6cCbPZjDfffLPbNrt378b//d//4ZlnnkFlZSWAE4Kkvb0dd955ZxJnAZDL5XjrrbewZcsW1NTU4IYbbsAjjzwSc9uLL74YSqUSv/zlL6HVapOahyCSRcZGF7omCIIgCKLf4fV6cejQIQwePJgWmEQ3jh07hqqqKnzzzTd86Fm2oe9o7kAhWARBEARBEDlKIBCAzWbDLbfcgqlTp4omPojcgkKwCIIgCIIgcpT169dj0KBB2LJlC1/OlyAyDXlACIIgCIIgcpQZM2aAovGJbEMeEIIgCIIgCIIgsgYJEIIgCIIgCIIgsgYJEIIgCIIgCIIgsgYJEIIgCIIgCIIgsgYJEIIgCIIgCIIgsgYJEIIgCIIgCAlSVVWFFStWiG0GQQgOCRCCIAiCIHKWlStXorCwsNvrtPgniMxBAoQgCIIgCCJD+P1+sU3okUAgILYJRA5CAoQgCIIgCEmzatUqjB07FjqdDsXFxfjRj34El8vFv//SSy9hzJgx0Gg0sFqtuO666/j3Hn/8cYwdOxZ5eXmorKzENddcA6fTCQBYu3YtrrjiCnR0dEAmk0Emk2HZsmWYMWMGjhw5ghtuuIF/neOrr77C6aefDp1Oh8rKSvz2t7+NsKWqqgr33XcfFixYgIKCAixcuDCh/RwOB37yk59Ap9Nh8ODB+Otf/9rjOfF6vRgzZgwWLVrEv3bo0CEUFBTgxRdfjLvfsmXLMH78eLz00kuorq6GRqMBy7L45JNPcOqpp6KwsBDFxcU499xzceDAAX6/WbNmRZxXAGhpaYFGo8GaNWt6tJUgoiEBQhAEQRCEZLHZbLj44otx5ZVXoq6uDmvXrsUFF1zAd+9+9tlnce2112LRokXYvn07/vnPf2Lo0KH8/nK5HE8++SR27NiBV155BWvWrMHSpUsBANOnT8eKFSuQn58Pm80Gm82Gm266Cf/4xz8wYMAA3HvvvfzrALB9+3bMnTsXF1xwAb7//nv87W9/w7p167otzB955BHU1NRgy5YtuPPOOxPab8GCBTh8+DDWrFmDVatW4ZlnnoHD4Yh7XrRaLf7617/ilVdewXvvvYdQKITLLrsMM2fO5EVPPPbv34+3334b77zzDrZu3QoAcLlcWLJkCb755husXr0acrkcP/vZz8AwDADgqquuwhtvvAGfz8eP89e//hXl5eWYOXNmbx8jQUTCEgRBEATR7/F4POyuXbtYj8cjtilJsWXLFhYAe/jw4Zjvl5eXs7fffnvC47399ttscXEx//zll19mCwoKum03aNAg9oknnoh47bLLLmMXLVoU8dqXX37JyuVy/rwOGjSIPf/885Pab8+ePSwAduPGjfz7dXV1LIBuNkTz8MMPsyUlJez111/PWiwWtqmpqcft7777blalUrEOh6PH7RwOBwuA3b59O8uyLOv1elmTycT+7W9/47cZP348u2zZsh7HSYa++h0lkkcprvwhCIIgCEJsNmw48dcbVitw8cWRr735JvCDg6BHpk078Zcs48aNw+zZszF27FjMnTsXZ555Ji688EIUFRXB4XCgoaEBs2fPjrv/559/jgceeAC7du1CZ2cngsEgvF4vXC4X8vLykrJly5Yt2L9/f0R4FMuyYBgGhw4dwqhRowAAkydPTmq/vXv3QqlURuw3cuTImMnx0dx44414//338dRTT+Hjjz9GSUkJ/57BYOAfX3rppXjuuecAAIMGDYLZbI4Y58CBA7jzzjuxceNGNDc3856Po0ePoqamBhqNBpdeeileeukl/OIXv8DWrVuxbds2vPfee73aSBDRkAAhCIIgiBzH5wM6O3vfLj+/+2suV2L7hkXuJIVCocC///1vfPXVV/jss8/w1FNP4fbbb8emTZsiFtuxOHLkCM4++2wsXrwYy5cvh8lkwrp16/DrX/86peRrhmHwm9/8Br/97W+7vTdw4ED+cbSw6W2/PXv2AEBErkmiOBwO7NmzBwqFAvv27cOPf/xj/j0uvAoA8sM+vFjC6yc/+QkqKyvx4osvory8HAzDoKamJiKJ/qqrrsL48eNx/PhxvPTSS5g9ezYGDRqUtM0EQQKEIAiCIHIcjSa2uIgmlsMgLy+xfTWa5O3ikMlkOOWUU3DKKafgrrvuwqBBg/Duu+9iyZIlqKqqwurVq2PmIWzevBnBYBCPPfYY5PITaa9vv/12xDZqtRqhUKjbvrFenzhxInbu3BmRY5IIve03atQoBINBbN68GSeddBIAYM+ePWhvb+917CuvvBI1NTVYuHAhfv3rX2P27NkYPXo0ACRsZ0tLC+rq6vD888/jtNNOAwCsW7eu23Zjx47F5MmT8eKLL+KNN97AU089ldD4BBENCRCCIAiCyHFSDY8CuodkCc2mTZuwevVqnHnmmSgtLcWmTZvQ1NTEhzstW7YMixcvRmlpKc466yx0dXVh/fr1uP766zFkyBAEg0E89dRT+MlPfoL169fzYUgcVVVVcDqdWL16NcaNGwe9Xg+9Xo+qqir897//xUUXXQSNRoOSkhLcfPPNmDp1Kq699losXLgQeXl5qKurw7///e8eF+O97TdixAj8+Mc/xsKFC/HCCy9AqVTi97//PXQ6XY/n5k9/+hM2bNiA77//HpWVlfj4449xySWXYNOmTVCr1Qmf46KiIhQXF+OFF16A1WrF0aNHccstt8Tc9qqrrsJ1110HvV6Pn/3sZwnPQRARiJ2EQhAEQRBE5umrCb67du1i586dy5rNZlaj0bDDhw9nn3rqqYhtnnvuOXbEiBGsSqVirVYre/311/PvPf7446zVamV1Oh07d+5c9tVXX2UBsG1tbfw2ixcvZouLi1kA7N13382yLMtu2LCBra2tZTUaDRu+XPr666/ZOXPmsAaDgc3Ly2Nra2vZ+++/n38/VvJ6IvvZbDb2nHPOYTUaDTtw4ED21VdfjTsWy55IUtfpdOwbb7zBv9bR0cFWVVWxS5cujXs+7777bnbcuHHdXv/3v//Njho1itVoNGxtbS27du1aFgD77rvvRmzX1dXF6vV69pprrok7R6r01e8okTwylv2hjh1BEARBEP0Wr9eLQ4cOYfDgwdBqtWKbQ/RRjh07hqqqKnzzzTeYOHGioGPTdzR3oBAsgiAIgiAIokcCgQBsNhtuueUWTJ06VXDxQeQW1IiQIAiCIAiC6JH169dj0KBB2LJlS7c8GoJIFvKAEARBEARBED0yY8YMUNQ+IRTkASEIgiAIgiAIImuQACEIgiAIgiAIImuQACEIgiAIgiAIImuQACEIgiAIgiAIImuQACEIgiAIgiAIImuQACEIgiAIgiAIImuQACEIgiAIot8hk8nw3nvviW1GymTD/hkzZuD3v/99RucgiFhQHxCCIAiCyHGcTie8Xm/W5tNqtTAYDAlvv2DBArS3tye1ILfZbCgqKor7vsPhwJ133omPP/4YjY2NKCoqwrhx47Bs2TJMmzYt4XmkyuHDhzF48GD+eWFhIcaOHYvly5fjjDPOENEygiABQhAEQRA5jdPpxAuvvooWpzNrcxYbDFj0q18lJUKSxWKx9Pj+vHnzEAgE8Morr6C6uhqNjY1YvXo1WltbM2aTGPznP//BmDFj4HA4cNttt+Hss8/Gjh07IsQJQWQbCsEiCIIgiBzG6/WixemEbvhwFE+alPE/3fDhaEnT4zJjxgz89re/xdKlS2EymWCxWLBs2bKIbXoKYWpvb8e6devw0EMPYebMmRg0aBBOOukk3HrrrTjnnHP47R5//HGMHTsWeXl5qKysxDXXXANnmFBbuXIlCgsL8eGHH2LEiBHQ6/W48MIL4XK58Morr6CqqgpFRUW4/vrrEQqF+P2qqqqwfPly/PKXv4TBYEB5eTmeeuqpHo+5vr4e8+fPR1FREYqLi3Heeefh8OHDvZ6r4uJiWCwW1NbW4vnnn4fb7cZnn30Wc9vXX38dkydPhtFohMViwS9/+Us4HA7+/bVr10Imk2H16tWYPHky9Ho9pk+fjj179kSM88EHH2DSpEnQarWorq7GPffcg2Aw2KutRO5AAoQgCIIgCOiNRhgKCzP+pzcaBbH3lVdeQV5eHjZt2oSHH34Y9957L/79738ntK/BYIDBYMB7770Hn88Xdzu5XI4nn3wSO3bswCuvvII1a9Zg6dKlEdu43W48+eSTeOutt/DJJ59g7dq1uOCCC/DRRx/ho48+wmuvvYYXXngBq1atitjvkUceQW1tLb799lvceuutuOGGG+La73a7MXPmTBgMBvz3v//FunXrYDAY8OMf/xh+vz+hYwYAvV4PAAgEAjHf9/v9WL58ObZt24b33nsPhw4dwoIFC7ptd/vtt+Oxxx7D5s2boVQqceWVV/Lvffrpp7j00kvx29/+Frt27cLzzz+PlStX4v7770/YTqL/QyFYBEEQBEH0OWpra3H33XcDAIYNG4ann34aq1evxpw5c3rdV6lUYuXKlVi4cCGee+45TJw4EWeccQYuuugi1NbW8tuFJ2gPHjwYy5cvx9VXX41nnnmGfz0QCODZZ5/FkCFDAAAXXnghXnvtNTQ2NsJgMGD06NGYOXMmPv/8c8yfP5/f75RTTsEtt9wCABg+fDjWr1+PJ554Iqb9b731FuRyOf785z9DJpMBAF5++WUUFhZi7dq1OPPMM3s9ZpfLhVtvvRUKhSJuDki4kKiursaTTz6Jk046CU6nMyJc7v777+fHuOWWW3DOOefA6/VCq9Xi/vvvxy233ILLL7+cH2f58uVYunQp/3kRBHlACIIgCILoc4QLBQCwWq0R4UK9MW/ePDQ0NOCf//wn5s6di7Vr12LixIlYuXIlv83nn3+OOXPmoKKiAkajEb/61a/Q0tICl8vFb6PX63nxAQBlZWWoqqqKWLCXlZV1sy060X3atGmoq6uLaeuWLVuwf/9+GI1G3ntjMpng9Xpx4MCBHo9z+vTpMBgMMBqN+OCDD7By5UqMHTs25rbfffcdzjvvPAwaNAhGoxEzZswAABw9ejRiu/Bzb7VaAYA/vi1btuDee+/l7TQYDFi4cCFsNhvcbnePthK5A3lACIIgCILoc6hUqojnMpkMDMMkNYZWq8WcOXMwZ84c3HXXXbjqqqtw9913Y8GCBThy5AjOPvtsLF68GMuXL4fJZMK6devw61//OiKEKZYdqdrGeTeiYRgGkyZNwl//+tdu75nN5h7H/Nvf/obRo0ejsLAQxcXFcbdzuVw488wzceaZZ+L111+H2WzG0aNHMXfu3G5hXuHHx9nMHR/DMLjnnntwwQUXdJtDq9X2aCuRO5AAIQiCIAiCADB69Gg+cX3z5s0IBoN47LHHIJefCBh5++23BZtr48aN3Z6PHDky5rYTJ07E3/72N5SWliI/Pz+peSorKyM8NPHYvXs3mpub8Yc//AGVlZUATpyDZJk4cSL27NmDoUOHJr0vkTtQCBZBEARBEDlFS0sLZs2ahddffx3ff/89Dh06hL///e94+OGHcd555wEAhgwZgmAwiKeeegoHDx7Ea6+9hueee04wG9avX4+HH34Ye/fuxZ/+9Cf8/e9/x+9+97uY215yySUoKSnBeeedhy+//BKHDh3CF198gd/97nc4fvy4IPYMHDgQarWaP95//vOfWL58edLj3HXXXXj11VexbNky7Ny5E3V1dfjb3/6GO+64QxA7if4BeUAIgiAIgoC7q6tfzdMTBoMBJ598Mp544gkcOHAAgUAAlZWVWLhwIW677TYAwPjx4/H444/joYcewq233orTTz8dDz74IH71q18JYsONN96ILVu24J577oHRaMRjjz2GuXPnxtxWr9fjv//9L26++WZccMEF6OrqQkVFBWbPnp20RyQeZrMZK1euxG233YYnn3wSEydOxKOPPoqf/vSnSY0zd+5cfPjhh7j33nvx8MMPQ6VSYeTIkbjqqqsEsZPoH8hYlmXFNoIgCKI/w7IsQqEQAoEAZDIZlEolHzctk8kiHhNEpvB6vTh06BAGDx4cEYvfXxsRSpmqqir8/ve/j6iyRcT/jhL9D/KAEARBZABOdASDQfj9foRCIYRCISgUCv7CyrJsNyES/Rf+HveYIITE8IMYSKcxYLJotdqcFR8EQZAAIQiCEIxwT0cgEEAoFOJFhlwuB8Mw/GNu+/B9uefhwiSWSAmFQlAqlZDL5SRSCEHgyqUSBEFkAxIgBEEQacCyLILBIO/pYBgmQnSEC4Nowl+PtU24+OCesyyLNWvW4KSTToLBYIBMJkvIkxItTkikEIR4HD58WGwTCEJUSIAQBEEkCSc6AoEAvF4v9u3bh+rqaqhUKigUCsEW99HjhD9XKBRQKBRxRQr3ON44JFIIgiAIsSABQhAEkQAMw0SEV3GeDpZlYbfbMWzYMCgUih7H4LwVQtCTuIi3bfhzIUQKCRSCIAgiFUiAEARBxIFhGN7TEQwG+U6/MpmM93SEQiGRreyddERK+OvHjh2DTqfjOy+HixIur4VECkEQBNEbJEAIgiDCCBcdgUCAX4TL5fIew6uyWdE8E4v6RERKe3s7GIZBaWlphEDhwsBieVPCxUm0SKFQL4IgiNyEBAhBEDkPVy432tPRm+gAcm/xHC0eoolV2Su8GhiJFIIgCIIECEEQOQfLsjHDq7iFcHijQKki1R6yvVX2ApIXKSzLoqurCwUFBZDL5SRSCIIg+jhysQ0gCILIBtwi1+fzweVy4fDhw9i7d29Ed/Lo3hrJjp8txFxoC3Gc0bkj3J9CoYj4l9uGZVls3LgRXq83IjzO5/PB5/PB6/Xyj/1+P/x+P4LBIN/8MbxgANE3mTFjRsJdww8fPgyZTIatW7dm1CaCIFKHPCAEQfRbwruRc54O7i67x+NBV1cXlMr0fgZz6a57No81fK7w8KzwSmOpNnKkbvN9j3/84x9QqVQJbVtZWQmbzYaSkpIMW0UQRKqQACEIol8RLjr8fn+3buTRVZuEnDeb0N381Bs5Rr9HIkX6mEymhLdVKBSwWCwZtCZz+P1+qNVqsc0giIxDIVgEQfR5WJZFIBDgvRpdXV1wu90IhUJ8Tkes8CqhwokIaRItImKFe0ULUy4/iOv54vF4sGHDBrhcrpjhXpxnjQv1onCvzBAeglVVVYUHHngAV155JYxGIwYOHIgXXniB3zaZEKy2tjZccsklMJvN0Ol0GDZsGF5++eVe9+Pm+Mc//oGZM2dCr9dj3Lhx2LBhQ8R277zzDsaMGQONRoOqqio89thjEe9XVVXhvvvuw4IFC1BQUICFCxdi5cqVKCwsxIcffogRI0ZAr9fjwgsvhMvlwiuvvIKqqioUFRXh+uuv7xNlwAkiFiRACILok3Ciw+12o7OzE06nEx6Pp1fRkUl7iMyQyXObiEhpaWmJ2CZapHB5J/FyUkikCM9jjz2GyZMn47vvvsM111yDq6++Grt37056nDvvvBO7du3Cxx9/jLq6Ojz77LNJhW7dfvvtuOmmm7B161YMHz4cF198MYLBIABgy5Yt+MUvfoGLLroI27dvx7Jly3DnnXdi5cqVEWM88sgjqKmpwZYtW3DnnXcCANxuN5588km89dZb+OSTT7B27VpccMEF+Oijj/DRRx/htddewwsvvIBVq1YlfcwEIQUoBIsgiD4Dy7IRScjcQi6RcrnRCClKsu0FyVWvi5jH3Vv4VV/vNr/h2DFsOH681+2sBgMuHjs24rU3t2+Hzensdd9pAwZgWmVlyjaGc/bZZ+Oaa64BANx888144oknsHbtWowcOTKpcY4ePYoJEyZg8uTJAE54JJLhpptuwjnnnAMAuOeeezBmzBjs378fI0eOxOOPP47Zs2fzomL48OHYtWsXHnnkESxYsIAfY9asWbjpppv45+vWrUMgEMCzzz6LIUOGAAAuvPBCvPbaa2hsbITBYMDo0aMxc+ZMfP7555g/f35SNhOEFCABQhCEpOHK5QaDQXR2dqK+vh7V1dUR3chTRYw70HTXu28RTzxEk2y3+ehGjvH2c7vdUKvV0Gg0Ge027wuF0Onz9bpdvkbT7TVXIJDQvj4Bw4Vqa2v5xzKZDBaLBQ6HI+lxrr76asybNw/ffvstzjzzTJx//vmYPn16SnZYrVYAgMPhwMiRI1FXV4fzzjsvYvtTTjkFK1asQCgU4gsqcOInHL1ez4sPACgrK0NVVRUMBkPEa6kcM0FIARIgBEFIjlg9OliWhd/vh8PhwPDhw9OeQ+g7y5SETvRGKj1S6urqUFZWhoqKiow2ctQoFDHFRTR5MSpR5alUCe2rCatgli7RFbFkMhnfQDQZzjrrLBw5cgT/+te/8J///AezZ8/Gtddei0cffTRpO7hzzNkRXQSBey2avLy8HsflxhbqmAlCCpAAIQhCEoSLjkAgwN8ZDg+vUigUgi68hRqLQrAIoYglUhIpP5xIt3m/3x/T6wIAU9MIj4oOyeprmM1mLFiwAAsWLMBpp52G//u//0tYgPTE6NGjsW7duojXvvrqKwwfPjzi8ySIXIQECEEQohCvGzmAuDkd4YurdBFyLIA8Ev0VKX6uqXabD09+5/6vxasKF2/c/iZ+77rrLkyaNAljxoyBz+fDhx9+iFGjRgky9o033ogpU6Zg+fLlmD9/PjZs2ICnn34azzzzjCDjE0RfhgQIQRBZI57o4EJIlEpljwscqS5+ErErGAyisbERHo8HRqMRWq0WWq0WOp2u1+OOhRQXxv0Zsb57scJ4EiGeJyWRkKzw5HmPxwOdThfRMyXWHPHmljpqtRq33norDh8+DJ1Oh9NOOw1vvfWWIGNPnDgRb7/9Nu666y4sX74cVqsV9957b0QCOkHkKjKWrmIEQWSQcNER3hgQQET/hURwOp3YsmULzjjjjLTtstlssNlsmDhxYtpjffHFF5g8eXK3WO5gMIimpiY4HA60trZCr9fDaDQiFArB4/HA6/UiGAxCoVDwYiRcmHCPtVptRMjG559/jvHjx6OoqCht25Nh27ZtMBqNqK6uzuq8wWAQ//nPfzBr1qysN2nz+/1Ys2YN5syZI0rYzKZNmzBgwABUVFSkPZbP58Px48dRVVUFrVbb6/Ysy6KrqwtGozFmLkOsRo7R9AeRQmQPr9eLQ4cOYfDgwQl9R4m+C3lACIIQnPBu5B0dHejs7ERxcXFEn4V07+pKDU5UcaKjqakJLS0tyMvLQ2lpKYYNG8YnkYYLlUAgAK/XC6/Xy4sSt9uNlpYW/nWWZaFWq3lREgwGYbPZ4PP5eLGiVqslfX6I1JHi55pKGFiuh3sRBPE/SIAQBCEI4aIj3NPR0dGB+vp6lJWVCbKgkGoOSHNzMw4ePBghOoYOHQq9Xs9vEwgEuu2nUqmgUqlgNBpjjsuyLN/cjhMpzc3N6OrqQnt7O7xeL/x+P2QyWY9eFC7UK11yzWmeaBneTM/fF0lUpIQnz0eLFO61VEXK4sWL8frrr8d879JLL8Vzzz0X870HHngADzzwQMz3TjvtNHz88cc9zksQRM+QACEIImW4xoBcTkd4JR7Oy8GFrQixgJPSHdFgMIjm5mY4HA6EQiHY7XZYLJZuoiNdOGERHo5w5MgRDB8+nA/BCoVC3bwoXq8XHR0d/ONQKASlUhkhTKIFSniviXi2iInY84tFfz7unkQKFwJmMBjiipDePCn33HNPRJO/cPLz8+PatXjxYvziF7+I+Z5Op4u7H0EQiUEChCCIpOipG3msnA6pVptKxa5w0RHu6Whra8OYMWPiejEyQbjtCoUCeXl5MfsJcNvGCvXq7OyEw+HgXwcAjUYT14sSnr+TK4h9vGLPD4gngBLxoHCEe0vCMZvNMJvNcceJl79iMplgMplSMZsgiAQgAUIQRK/0JDoS6UYu1bCpRAgXHVwieXR41bFjx7JqU7LIZDKo1Wqo1eq4d30ZhuFDvcK9KM3NzfzjQCAAh8OBhoaGuF6U6IT5/oKYXohcDf9KJvwt0d+g3poDUj4KQWQHEiAEQcSEq1zFCY/wvgGJiA4OIS/c2Rorlugwm80YMmRIj16GbJGJxZBcLodOp4NOp4tbXWvr1q3QaDQoKSnhRYnb7UZraysvXFiWhUql6jEXRaPR0IIuQcQWAf2FRL5v4SKF2ycYDEaEkvY0Fn2nCSJxSIAQBMHDiQ6Xy8W/loynIxaZ8Fqk2hsh1jgcqYgODjEWHmIsTOVyOdRqdURISzgsy8Lv90d4UTweD58s7/V64fP5IJPJIkK9YomVVHqj9FfoPGSHWD1SAoFAhACJJVI4yJNCEIlDAoQgcpzwxoCBQAAsy+Kbb77BsGHD+NK56SJkCBY3Xrp2ccLIbrfzokOn06G0tDQh0ZEq/fmONicsNBoNCgoKYm7DMEy3MC+Px4POzk7+cSgUgkKh4MWIRqMBcKJ3S15eHv96TwnzQiF2FSxCfGLloiTayDF6WxIpBHECEiAEkWP01I08PLwqmQaBPSGkB0QIezhPx/Hjx+F0OnHkyBFBREdfD8HKFnK5HHq9Pm6lMC7fKFykcB65hoYG3ovCsiw0Gk1Es8Zoj0p/6I0ilLePyB7JiBTuMYkUItcgAUIQOUBPokMul3cLd5GaaIgmnepVnKfDYDAgGAzi5JNPTtseWgwIh0wm69YbJRAI4MiRI5g8eTKUSiXfGyXaixKeixIIBCCXy2MKlOhQLynTnz1midLb/69Zs2Zh3LhxeOKJJwSfO1PnP5lGjh6PBwaDAe+88w7OP//8bnYJJVJmzJiB8ePHY8WKFUntRxCpIO1fXoIgUia8MSAnOsJ7dPQUYy/0gloMMRNLdIR7Opqbm+F0OgWxKxlIrKRPrN4o0XC9UaJFSnt7O/8awzBQqVQ9ChSu+IKYZOM743Q6+VLMHAzDwOVywe/3Cz6fVquFwWDocZvw340rrrgCr776ardt9uzZg1WrVkGlUqVlj8PhwF133YVPPvkEjY2NKCoqQm1tLW6++WZMnz49rbFThfvcQ6FQ3G0S9aQcOXIE1dXV/PPCwkKMHTsWy5cvxxlnnCGk2QSRECRACKIfEa8beXhjwERLWkq5dG688TjR0dTUhJaWlh5zOqQqsqQ6X18j0d4osXJRHA4HPB4PfD4fv/3GjRvjNnFUqVQZEwnZ+JydTifefuEFBFtbu80d8Puh/iEHR0iUJhN+sWhRryIknLlz5+Kll16KeM1sNgtS9vnnP/85AoEAXn75ZVRXV6OxsRFr1qxBW1ubpG8aJOpJ4YT0p59+irFjx6KpqQm33XYbzj77bOzYsQODBw/Oir0EwUEChCD6OJzo4JLIUxUdscYVgkyEc8WqXhUtOqqrq3vN6RDDM0PCQRqE90bpKWG+vb0dX3/9NQYOHMiLFK43isfjQTAYhEKh6NGLkm5vlEwvgL1eL4KtrZil1aIwLDeHYVn4fb4ePU2p0O52Y80P4XLJCBCNRgOLxdLt9egQrOrqaixcuBD79+/HqlWrUFRUhNtuuw2LFi2KbU97O9atW4c1a9bw3oBBgwbhpJNOgtvt5rd74oknsHLlShw8eBAmkwnnnnsuHnroIf4YVq5ciSVLluDVV1/F//3f/+HYsWM466yzsHLlSqxatQr33HMPOjo6cMkll+CJJ57gvxPV1dW48sorUVdXhw8++AD5+fm45ZZbcN111wGI/ZtRX1+PG2+8Ef/+978hl8txyimnYMWKFaiqquq2bfg1oKSkBBaLBVarFc8//zwGDBiAzz77DL/5zW+67ff6669jxYoV2LNnD/Ly8jBr1iysWLECpaWlAIC1a9di5syZ+M9//oObb74Zu3btwvjx4/Hyyy9jxIgR/DgffPABli1bhp07d6K8vByXX345br/9dsmHPxKZhT59guiDcIm6nKfj4MGDKCwsRGFhYVqig0OqOSDhIQmtra18R/JkREcm7AIoCb0/IpfL+Z4l5eXlMbcJBoPdvChcbxTudZZloVarexQo8XqjZPN7VajXoyRMEDAsC79aDW0GPCCICvcSmscffxz33nsvbr31Vrzzzju49tprcfrpp2PkyJHdtjUYDDAYDHj//fcxdepUvupaNHK5nF/kHzp0CNdddx1uvvlm/OlPf+K3cbvdeOqpp/DGG2+gq6sLF154IebNm4fCwkJ8+OGHOHjwIH7+85/jlFNOwfz58/n9Hn30Udx66624++678dlnn2HJkiUYMWIE5syZ080Ot9uN2bNn49RTT8XatWuhVCpx//334+yzz8bWrVuhVqsTOkdcIYhAIBDzfb/fj+XLl2PEiBFwOBy44YYbsGDBAnz00UcR291+++147LHHYDabsXjxYlx55ZVYv349gBMel0svvRRPPvkkTjvtNBw4cIAXgnfffXdCdhL9ExIgBNFH6KkbeWdnJ/Ly8gS7oyR02JQQYwWDQTQ1NQE4EQ6TiujIhF1A7vQByVV6+nyVSiWMRiOfMB8N1xslVi6K3W6Hx+OB3++PyGsJFyahUIj3tOT6HeN//etfyM/P55//+Mc/xttvvx1z27POOgtXX301AGDp0qVYsWIF1q5dG1OAKJVKvPTSS/jNb36D559/HhMnTsTpp5+O+fPnY8iQIfx2v/vd7/jHgwcPxj333INrr702QoAEAgE888wz/H7z5s3D66+/DpvNBoPBgNGjR2PGjBlYu3ZthACZPn06br75ZgDA8OHDsX79eqxYsSKmAHnrrbcgl8vx4osv8t/Nl156CSaTCWvXrsWZZ57Z43mUyWRwuVy49dZboVAo4uaAXHnllfzj6upqPPnkkzjppJPgdDojPFf3338/P8Ytt9yCc845B16vF1qtFvfffz9uueUWXH755fw4y5cvx9KlS0mA5Di5/WtGEBKHYZiI8Kpw0RHeGFBowSCVHJBgMIiWlhbe08GFgowfPx6FhYWi2RULEgSZoy+f2/DeKPHgEubDBYrX60VnZyf8fj/q6uqwc+dOKJXKHr0o2eqNki2iP/cZM2bgmWee4Z/3dOOhtraWfyyTyWCxWPgbGLGYN28ezjnnHHz55ZfYuHEjPv30UzzyyCN4+umnccUVVwAAPv/8czz44IOoq6tDZ2cnXy7a5XLxtuj1+gjRUlZWhqqqqogFe1lZGRwOR8T806ZN6/b8j3/8Y0xbv/32W+zfv79b6KDX68WBAwfiHiMAnHrqqZDL5XC73bBarVi5ciXGjh0bc9vvvvsOy5Ytw9atW9Ha2srnkRw9ehSjR4/mtws/11arFcCJpP6BAwdiy5Yt+Oabb3D//ffz23Dfd7fbHbccN9H/IQFCEBIjVrlcABE9OqKRy+WCCxCxxooWHTqdDmazGYMHD4Zer8fatWuh0+kEs08Isu0BoRCs7JEN8dNTwvwXX3yBmpoa5Ofnd/OiOJ1ONDc38wnz4b1RYokUIZK1xSQvLw9Dhw5NaNvoqlgymazXimZarRZz5szBnDlzcOedd2LhwoV44IEHcMUVV+DIkSM499xz8Zvf/Ab33nsvTCYT1q1bh4ULF0aEMMWaNxVbuO2A7t9BhmEwadIkvPbaa932MZvNPY755ptvoqamBoWFhSguLo67ncvlwplnnokzzzwTr7/+OsxmM44ePYq5c+d2q4oWfnyczdzxMQyDe+65BxdccEG3OYTOLSL6FiRACEICxOpGHsvT0RPZqjSVLIl4GmJ5OkpLSzF48OCIO4dSFVlE/0bM7wpXUILrjRIeghQOwzDw+XzdvCjRuSgWiwVutxuhUAhyuRxyuRx+vx/sD95VqSHmuR89ejTee+89AMDmzZsRDAbx6KOP8l6mv//974LNtXHjxm7PwxO5w5kwYQLefvttlJaWxv0+xKOysjLCQxOP3bt3o7m5GX/4wx9QWVkJ4MQ5SJaJEydiz549CQtHIncgAUIQIhHdo4O7Y5SM6OCQcggWEFs4JCo6Eh1PKLukMJYU5xN7XiB3RWMixy2Xy6HT6Xr0DrpcLjQ0NECtVkOlUkU2KA0GTwgYlQqQySDj5v0h90wmk0Eml//v9X5ES0sL5s+fjwULFqC2thZGoxGbN2/GI488gnPOOQcAMGTIEASDQTz99NM499xzsX79ejz//POC2fDVV1/hkUcewXnnnYf//Oc/WLVqFT744IOY215yySV47LHH8LOf/QzLli3DgAEDcPToUbz77ru46aabMGDAgLTtGThwINRqNZ566iksXrwYO3bswPLly5Me56677sK5556LyspK/PznP4dcLsf333+P7du347777kvbTqLvQgKEILIEd7EPBAJwOp1QKBT83U2ZTNZjY8DekLIACT+mUCjENwdMVnSEjyWEbWKGmfVVcuU4pYSQ/6+VSiXfhDS8UpJer4darYaXYeAMBsGwLFiGAcOyCAWD/B1/hmUBzh6ZDHKu2l6Mxz3RHlbaVgoYDAacdNJJ+OMf/4gDBw4gEAigsrISV111Fa6//noAJ/LOHnvsMTz88MO47bbbcNppp+H+++/HggULBLFhyZIl2LJlC+69914YjUY8+uijmDt3bsxtuVDUW265BRdeeCG6urpQUVGBWbNmJe0RiYfZbMbKlStx22234cknn8TEiRPx6KOP4qc//WlS48ydOxcffvgh7r33Xjz88MNQqVQYOXIkrrrqKkHsJPouMlaKPleC6CdE3GH8wdMRCATw1Vdf4dRTTxWsgdmOHTtgNBoxaNAgAawGvv/+exQVFfGu93RwOp34+uuvYTabI0RHaWkp8vLykj7+zz//HFOnTk07D6SjowPbt2/HqaeemtY4ALBp0yYMHTq0x5hqAHx4XTK9D2Kxfv16DBs2jK/Hny22b98OnU6X9XAKv9+PNWvWYM6cOVnPY+jq6sKmTZvwox/9KKvzcnz++eeYMGFC2kUXAMDn8+H48eOoqqqKiL+P24iQYRAIBruVdWV/ECJcqCh74sVIgQL8T4yEeVQ4kaIqLu61EWEoFILb7Y5bYSwbOJ1OaLXajFYgq66uxu9+97uIKlvhdHZ2wmAwCFZgQMqFCrxeLw4dOoTBgwdTjkg/hzwgBCEw4d3IOdER3hiQu5Cl26sjnEx4QNIh2tMBnEggHTx4cEqiIxqpeUCAvl2piZAu2fheGQwG/GLRInijenMEfwjLSrbMNXfjhfuXexz+ukajAcuycLlc/G8j18OIe0z/p/73+ZP3kehvkAAhCAEIFx1+vz+hbuRSDZlKdbxQKISWlhY0NjZGeDrKy8uxbds2DB48WJCLqJDHmu0+IIlWvyGIcLKx+OSa8YXDlZlN12MXi1gChcuF48QKh8vliilQhLyJQxBEdiEBQhApwokOrnJVIqIDEDaPIXpMIUnEPk50OBwONDc3R+R0cJ4On88nqF1Ceo2EJFeS0HMN7v+0mPP3R7gwoHghdSzLIhAIwOfzRSTMhwuX8LFiiRPucTpk4/wfPHgw43MQhNQgAUIQScDdpeM8HdzFsDfREU50nXQhyKYHJJ7omDx5cszwqnDBJdRCrq96QDgYhklrYZRrd3376yI8UXLt8wYQ8ZsanYPCESvUi/NEM2FlhcPHiidWerNFbKRgA0EICQkQgugFTnT01o08GaQQMpXMeMmKjliItdjP9DhE9sjFz0xsD4yU4Zqz9kSioV7xBAogrgDOdfFN9F9IgBBEDLjKVcFgEA0NDdDr9dDpdD12I0+GviBAQqEQHA5HWqKDG0topOYBEXosKc6Xq+Tyee4Px55IqFes8K5wgeJ2u3nvdk/hXgRBJA4JEIL4gehyudwF6NixYxgwYICgpSClKkA4T0dbWxt8Ph90Ol1KoiPaNiC7ndUTHUco6A51/4ZyQMQhG8ceLixi0dnZCb1ezxeQ4ARKT6Fe8QQK/U4QxP8gAULkNOGig+vREB1elYlykJkQIKnmlMQKr1KpVCgqKsLIkSMll7ch5EW8r3pAaCGTW4j5eYv9XRN7fs4GhULRY7hXLA8KJ1CylTBPEH0JEiBEThGrMSB3cYiX0yG0WMjEmMmOFy46WlpaoFarUVpaikmTJsFgMGDv3r2ChJpxtgmN1DwgRP+GPCC5TSKff28CIlbCfLhIiZcwzxEKhciLQvQrSIAQ/Z54oiO8MWBPP+qZ8IBkYszexosnOiZOnAiDwRBxDoQUSJkIwRIKqYWF9QVy5Tg5pHC8tOjs+6SaMB8KhQAAbre714R56o1C9CVIgBD9knDREd4YEEBCoiOcvuwBSUZ0ZNI+QHrhTn39Ii3GwliscyYFESAWuXzs4bAsi8WLF+Odd95BW1sbCgoKcPnll+OJJ54Q2zTBiJUwHwqF4Ha7YTQae02Y57z5PSXMU5gXIRVIgBD9hvBu5JynI7xHR6ru674mQFIVHZmyT6pJ6ED2vTIejwft7e0wGo18ZbXe7oqmMx+RPlIQALn6eYef+08++QSvvPIK1qxZg+rqasjlcuh0OhGtyz69JcwDiClKwhPmlUol8vLysmg1QcSGBAjRpwkXHX6/H/v374fVaoVWqxXMHd0XBAjLsvB4PNixY0fKoiNT9kl18SS0XfHOl8/ng8PhgN1uh9PphMFgQH19PbxeLxiGgVqthk6n4/+0Wm3Ec6WSfqbFJldzQKQgvjgOHjwIq9WK6dOni21KxvH7/XzzxWQ/g0QS5glCCtCVjehzhHcjDwQCfHiVTCaD3W5HaWmpoIu2dCpM9TRmuhf3UCiE1tZWvleHXC5HYWFhyqIjGimWCRZ6LCAzjd4CgQCamprQ2NiI9vZ2FBYWoqKiAkVFRZDL5XxJY7/fD4/HA4/HA6/XC4/Hg+bmZv61UCgElUrVTZj4/X64XC74/X6oVCrJijyhyZXjjCZXjxs4cexXXHEFXn31VQAnwpMGDRqEqqoqjBs3jg/Bqq6uxsKFC7F//36sWrUKRUVFuO2227Bo0aJe5/D7/bjxxhvxj3/8A21tbbBYLFi0aBFuvvlm3oZ4KBQKPP/88/joo4/w2WefoaKiAo888gh++tOf8tt88cUXuPnmm7Ft2zaYTCb86le/wvLly/nr1KxZszBmzBio1Wq89tprGDNmDO6++27Mnj0bH3zwAW677Tbs27cP06ZNwxtvvIEtW7bgpptuQn19Pc4++2z8+c9/hl6vT/h8EoQUIAFC9AnidSMPrxiSqWZQUvKAhIuO5uZm3tMxYMAAeDweDBkyRFT7ekJqHhWh+4AwDAOHw4HGxkY0NzfDYDCgrKwMo0ePhkajAQAEg0E+qVQmk0Gj0UCj0aCwsLDbmCzLIhAI8MKE++N6tBw6dAj79++HQqHo0YOiVqtp0dFHCa+MJBZS+O6sWLECQ4YMwYsvvohNmzZBoVBg/vz53bZ7/PHHce+99+LWW2/FO++8g2uvvRann346Ro4c2eP4Tz31FD744AO89dZbGDhwII4dO4Zjx44lbN/y5cvxhz/8AQ8//DCefvppXHbZZTh06BBMJhPq6+tx7rnn4vLLL8fKlSuxe/du/OY3v4FWq8Xdd9/Nj/Hqq69i8eLF+PLLL8GyLOx2OwDgvvvuw6OPPori4mJcdNFFuOiii6BWq/H666/D6XRi3rx5ePrpp7F06dKE7SUIKUAChJAs3IJLq9VGiI545XIB6Xor0hkznugI93QcO3YMHo9HFPvEGE8qHhCGYdDW1gaXy4V9+/ZBo9HAYrFgyJAhCd+RjIdMJoNarYZarUZ+fn7Ee5s2bUJlZSVKS0u7eVA6OzvR2NgIj8cDv98PuVzeTZSECxWtViuJRaZUkVIYUkbZsAHYuDHiJUUwCBnDAD+EAwEALBbg4osj933zTeCHBXOPTJ0KTJuWtGkFBQUwGo1QKBSwWCxxtzvrrLNw9dVXAwCWLl2KFStWYO3atb0KkKNHj2LYsGE49dRTIZPJMGjQIACJf/aXX345Lv7hnNx///14+umn8fXXX+PHP/4xnn32WVRWVuKpp56CTCbDyJEjYbPZcMstt+DOO+/kb5oNHToUDz30ED8mJ0CWLVuGqVOnwmAw4Morr+S9IdXV1QCAefPm4fPPPycBQvQ5SIAQkmXFihXYsmULXnzxRT6utbeFUibEghiNCBMRHdHjZdO+VMYTciwxq2CxLMsv8hsbG3nP28CBAzF48OCsLuaVSiWMRiOMRmPM90OhUDcPisvl4sO8vF4vZDIZtFptTJHCCZRcr5yTE9W/fD7IOjsjXpKFQpAxDGQq1f9sivVdc7m67RsL1udL28yeqK2t5R/LZDJYLBY0NTX1ut/ll1+OuXPnYtSoUZg7dy7OOeccnHnmmQnPO3bsWP5xXl4ejEYjHA4HAKCurg5Tp06N+A5Nnz4dTqcTx48fx8CBAwEAkyZNijl2TU0Nv29paSn0ej0vPgCgrKwM33zzTcK2EoRUIAFCSBa1Wo1QKJRUPkdf6Foeb8xo0aFSqVBWVpZQToeUBQOH1EKwOBK1y+VywW63o7GxEcFgEGazGTU1NSgsLMS2bdug0WiyulBNxG6FQoG8vLy4VW8YhuEFSrhQaWtr45+zLAuNRgOdTgefz8eHjYWLFEp4zSxZ+V5pNGCjPG1sMAiWYcCGe0BifZfy8rrtG2+OZEj2N0MVJpSAxD3iEydOxIEDB/Dxxx9j9erVuOiiizB79my8/fbb/DipzhvLwxortC7e/9HwsWUyWcrHSBBSgwQIIVnUajWCwWBS+/S1EKxYoiOV6lVSD5mSYghWIufW6/Xyng63242SkhIMGzYMxcXFEV6BvhrCJJfLodfr44aLsSwLn8/HC5PDhw/zuS7ca1wlr548KNGLpr5EJooUJDM3kKXv17Rp3cKjQn4/gsEgVL2FE0aHZAlIts59fn4+5s+fj/nz52PevHk4++yz+YqC6TB69Gj84x//iPgebdiwAUajERUVFUKYThB9EhIghGRRqVTw+/1J7ZMpscAlDgtBKBRCIBDA8ePHsWfPHl50TJgwAUajUTK9SqTqUcm0ByQQCPDJ5B0dHSgqKkJlZSXMZrNkSuJma1EWHp5VVFSE1tZWaDQaDBs2DMD/EuXDQ7y4Sl6cByUYDEKpVMZNktfpdDlVyasvkSv5LytWrIDFYsH48eMhl8uxatUqWCwWFBYWwu12pzX21VdfjT/+8Y/47W9/i2uvvRZ79uzBsmXLcMMNNyQU2pgrnwGRe0jjakoQMVCpVAgEAkntI3bCeDyiPR0sy6KwsDAt0SG0jZkcD5B2J/RQKMSXzW1tbYXRaITFYkFNTU3Cd0ATsam/LbLDE+ULCgpibsMJFK/XC7fbDa/Xi/b2dthsNng8HgQCASgUim7CJPx5eIfnXIIWn9khLy8PjzzyCPbt2weFQoEpU6bgww8/FCT3qaKiAh9++CFuvvlmTJgwASaTCVdeeSVuv/32hMfIte89kRuQACEkSyoCRC6XSyYEK1541YQJE3Dw4EGYzeZu1Y2ybWNfHE+osbjvSV1dHVpaWqDT6VBWVobhw4cn3WFZjAVCX1mcqlQqqFSquN/1YDDYLVG+s7OTD/Py+Xz8+f3mm29iCpVMJspL4TznehleAPjd736H3/3ud/zzNWvWRLx/8ODBbvt8++23CY29cOFCLFy4sNvriVxLYnnHW1tbI56fccYZ2BhVYSyc6GMBgBkzZiAUCsH/QxgcACxYsAALFiyI2O7uu++OKOdLEH0FEiCEZFGr1ZLwgCST2N6T6Aj3dAidLC/1JHSphGCxLIuOjg4+rwMANBoNJk+ezDcHJLKLUqmEwWCAwWCI+T7DMGhvb8fXX38Nq9UKj8cDt9uNlpYWXqAA6JYYHy5UtFptWonyOZEDIkHEFn9iz08Q/RkSIIRk6SshWAzDoKWlpVfRET2mkJ4aKXssMjFeMmOxLBtRwSoUCqGsrAw1NTXYunUrqqqq0k40TdamdMmlBalcLuc9UgMGDOj2PsMwEYnynDelvb2df42r5NVTPxSp5PcQwvPggw/iwQcfjPneqaeeio8++ijme2+88QauvfbamO8NGjQI27dvF8zGeJAIIvor9ItLSJZUQ7CyIUAYhkFrayvf9TrZRHKpL/AB4S982S7D6/F4eE+Hx+OB2WzGiBEjYDKZBA/VyyVBIDU4gRIvbI6r5BUd5tXU1MQ/DoVCUKlUMb0nXq8XLMuKUg0r1z0ggDDH/pvf/AY///nPY77XU7jlT37yE9TW1sYskZvNym65/PkT/RcSIIRkUalUkinDyzAMLzocDgeamprSql4ldcEgdYEUbyy/3w+HwwG73Y6uri6YTCYMGjQIZrM5bgiOUHZl+04l3RlNjPBKXoWFhd3ej67kxQmV1tZWPtwrFArhP//5T9wywzqdDmq1mhaKEsVkMsFkMiW9n9FoRHV1ddxGnwRBpA4JEEKyqNVq0cvwMgwDl8uFzs5OfPnll4KUzM2EnX1hPCHHCrctGAzyFaza2tpQUFAAq9WKcePG9XiXUsy8lL4sHvqy7bHorZJXU1MTdu/ejfHjx0d4UDo6OmC32+HxeOD3+3lPTLx+KKk0qhTbA9LfPmuCIKQDCRBCsoiVAxLt6ZDJZFAqlaitrRWkZK5QdubyeAzD8KKjubkZer0eZWVlGDlyJLRabVJj9cVFllgL0lxcCHOhV0ajMe6d8FAo1M2D4nQ60dTUBK/XC6/Xy3ti4vVDyWQlLyI1pPDbIAUbCCITkAAhJEs2y/CGi47m5mYolUre0+F0OtHY2ChYyVzOTikv8DOx0EzXPpZl0d7eDrfbjf3790OtVqOsrAxTpkyJGaPdG5luaEj0H3r7rigUil4reUXnoHi9XrS1tfGPWZblQ8U4UcIlxrvdbuh0urQqeaWKmGFlYnah5xB7fqnYQBBCQwKEkCxqtTqlHJBEF4LRokOhUKCsrAzjx4+P8HS43W5JNjfsa+OlAsuy6Orq4pPJWZaFQqHAgAEDMGTIEEEuzEI3NcwWuSZ4+vIiTC6XQ6/XQ6/Xx3yfS5SP7ijf1tYGAPjqq6/AMAzUanWPHeX7YyWvvvy5EwQRn/73a0X0G1QqleA5ILFER2lpaTfRkcyYqSB1wQCIm9Tudrt50eHz+WA2mzFq1CgUFRVh+/bt0Gq1goXCCQWV4SVSJTxRvqioiH/d4/Hgiy++wJw5c+D3+yNCvDweD5qbm7tV8uqpo3yuidZcY+3atZg9ezZaWlpiFlwgCClBAoSQLEKV4Y0nOsaNG4f8/PyESuZmqrKWkOMJiRiCxufz8aLD6XSipKQE1dXVKC4ujgg9EbOnCJF7SCUMSKPRQKPRxHyfZVkEg8GYHhTucSAQgFqthsVi4XujyOVy/s/lcnW74eP1egEg6byqRNBqtXFD1mJxxRVX4NVXXwVwonmlyWTC2LFjcdFFF2HBggVJ5c/cc889eP/993vtlJ7sb0N1dXW3ju3pEv79iz4HlZWV+NnPfoZly5alFIZKEGJCAoSQLKkmoYdCobRFR/SYueYByVYIViAQ4JPJ29vbUVhYiIqKCpjN5rgVrKTSVT0T4xBEOImKH5lMBpVKBZVKFTdXLRgMorOzk89x434ruddffvlltLW18fNx+XQymQwKhQIymUzQ77nJZMKiRYuSEiFz587FSy+9hFAohMbGRnz66ae44YYb8M477+D999/PSAiaGP+3/X5/RHPUcBu4cxAIBPDll19i0aJFcLlceOaZZ7JuJ0GkA5XcICSLWq1GIBBIKqfD6/WitbUV69atw549e6BSqTBu3DhMnz4dw4YNQ0FBQdIXlFwVIEISbl8oFILD4cD333+PdevWob6+HiUlJZg+fTomTJiA8vLyXpt8SdEDQn1ACCmjVCqRl5cHhULBh2rp9Xrk5eVBpVLB5XIhPz8fpaWlMJvNMJlMKCoqQmFhIYxGI/Ly8vjtDQYDjEYj8vPzUVBQgMLCQhQVFfH9Nnr702q1aG1t5T0s8Yj+jms0GlgsFlRUVGDixIm49dZb8e677+KTTz7BypUr+e06Ojrwm9/8BhaLBYWFhfjRj36Ebdu2AQBWrlyJe++9F9u2bYNCoYBCoeD3jd5v7ty53bqd//Of/8RJJ50EvV6P0tJSzJs3DwAwa9YsHDlyBEuWLOHH5XjnnXcwduxY6HQ6VFdX4/HHH48Ys7q6Gvfffz+uuOIKFBUVYdGiRXHPCXcOKisr8ctf/hK//OUv8f7778fctqWlBb/85S8xcOBAGAwGjBs3Dm+++WbENjNmzMBvf/tbLF26FCaTCRaLBcuWLYvYpqOjA4sWLUJpaSny8/Mxa9Ys/nwSRKqQB4SQLNwiNBgMxl2QRns6uEoyqXg64pGt7ur9eTwumbylpQVNTU3QaDQoKyvD0KFD4ybm9mSbUJAHhOgNKZQAzgYymYwXFxyBQIAvQ87Z09MfN064F4V7Hu1B6U18JMqsWbMwbtw4vPvuu7jqqqvAsix+8pOfoKioCB9++CEKCgrwwgsvYM6cOdi9ezfmz5+PnTt34tNPP8Vnn30GACgoKIi533PPPYef/OQn2LNnD0wmE/71r3/hwgsvxG233YZXXnkFfr8fH330EQBg1apVmDBhAhYuXIirrrqKt2/Lli246KKLcPfdd+MXv/gFvvrqK1x33XUwmUxYsGABv92jjz6KO+64A7fffntSx6/T6eJGCni9XkyaNAlLly5Ffn4+PvroI/zqV7/CkCFDcPLJJ/PbvfLKK1iyZAk2bdqEDRs2YMGCBTjllFMwZ84csCyLc845ByaTCR999BEKCgrw/PPPY/bs2di7d29KDR4JAiABQkgYTnQEAoEIAcIwDNra2vgeEOHhVa2trXC73TEbiqVKLnpAAGHK5nZ2dqKxsRFdXV1wu92wWq1pN3EUwrZMjEVJ6P2XXOx/EovewrA4exmG4UVJ+GNuDJ/Ph0AgAK/XyzdxlMlk/L/Rc/bGiBEjeE/F559/ju3bt8Nut/M5M4888gjef/99rFq1ig/7UiqVsFgs/Bhr1qzptt8f/vCHiP0efPBBzJ8/P8JDMG7cOAAnQsoUCgWMRmPEuE888QRmzZqFO+64AwAwfPhw1NXV4bHHHosQIDNnzsSNN94Y95zG4uuvv8abb76JWbNmxXy/oqIiYszrrrsOn376Kf7+979HCJDa2lrcfffdAIBhw4bh6aefxurVqzFnzhz+fDocDv68PProo3jvvff480IQqUAChJAs4QKEEx1cc8B4OR3t7e2SFwuZGFNK47lcLtjtdjQ2NiIYDMJsNiMvLw8DBgxAeXm5qLbFGquvIrXFaSbJpWONpi99Rzlbe+pXwrIsn4MCnPBwMwwTUZSDS4wPhUL8uD19B8I9Rd9++y2cTifMZnPENh6PBwcPHow7RiL7bd26Fb/+9a/jjhGL3bt346c//WnEa9OnT8cf//hHhEIh/lxNnjw57hjh34F//etfyM/PRzAYRCAQwE9/+lM8+eSTMfcLhUJ46KGH8Pbbb6O+vh4+nw8+n69bwnptbW3Ec6vVCofDAeCEB8fpdKK4uDhiG4/HgwMHDvRy9AQRHxIghGThfnR//etfQ6fTYfHixb0mkmdKLGSiCpZUBIMQ43m9Xr6CldvtRklJCYYNG4bi4mLI5XJ89913gtomJH21DwiRHXJZ/GQCLqldqVTyeSgc4R4ThmH4giI+nw/BYJBPmOcECuc1qaurQ1VVFS9krFYr1qxZ023unkrTxtovEAggGAzCarUCOBHulCyxwuhifacSrWI1Y8YMPPPMM1CpVL3myz3++ONYsWIFHn/8cYwdOxZ5eXlYsmRJt2pn0WOEX/O487J27dpu41OpXyIdSIAQkiIQCGD16tX4+9//jnfffRfAiR/mK6+8EtOnT+91odcX8jUyMSZ3XoSKGU/EPr/fj6amJtjtdnR2dqKoqAiVlZUwm83dqtFItXQu9QEhEkHMEKxc+qw5ccIRDAahVCqhVquhUqmgVCphMBh4ocEwDNasWYMdO3Zg8eLFcDqdGDFiBOx2O/x+PwYPHtxNrAAnCpxw3hWOCRMmwG63Q6lUoqqqCsCJ37hgMMiLpNraWqxZswZXXHFFTPtjjTtq1CisW7cu4rUNGzZg+PDhKXW2z8vLw9ChQxPa9ssvv8RPf/pTXHrppQBOiIl9+/Zh1KhRCc83ceLEbueFIISAqmARkmLv3r1YuHAh8vPz8cEHHwAAli9fjjPOOCPhcpRS91ZkYsxwASLkeNGEQiHY7XZs27YN69evh91uR1lZGU455RSMHz8eVqs1ZilMKYdNkQckOcTyCOTSOSZOEP1d8/l8cDgcaGxsxI4dO/DEE0/goosuwjnnnINFixYhPz8f5557LqZOnYpLLrkEq1evxqFDh/Dll1/i9ttvx5dffonOzk6UlZXh0KFD2LRpE44fP46uri7MmDEDU6dOxQUXXIBPP/0Uhw8fxoYNG3Dvvfdi8+bNAIA777wTb731FpYtW4a6ujps374djzzyCG/foEGD8N///hf19fVobm4GACxZsgRr1qzBfffdh7179+KVV17Bn/70JyxZsiSlc5AMQ4cOxX/+8x989dVXqKurw+LFi2G325Ma40c/+hGmTZuG888/nz8vX331Fe644w7+vBBEKpAHhJAUY8aMwZEjR/g7Vcn2AsmEWOgrXhVAWAESnlDa2tqKxsZGNDU1QafToaysDMOHD084JEGKogGgRW2y5OL5ypUqWADgdrsjnnMJ4kL314ieJ1E+/fRTVFRUQKlUoqioCLW1tVixYgUuv/xy/pqhUCjwr3/9C3fccQeuvvpqNDU1wWKx4LTTTkN1dTUMBgPmz5+Pjz76CGeffTba29vx7LPP4pe//CXefPNN3Hffffj1r3+N5uZmlJWVYfr06SgqKkIwGMRpp52Gv/3tb7j//vvx0EMPIT8/H6eddhpv3z333IOrr74aw4YNg8/nQygUwsSJE3nRct9998FqteKee+6JSEDvjVS/A3fccQcOHTqEs846C3q9HgsXLsT555+Pjo6OpOb+6KOPcPvtt+PKK6/kz+fpp5+OsrKylOwiCIAECBHFgw8+iH/84x/YvXs3dDodpk+fjoceeggjRozocb8vvvgCS5Yswc6dO1FeXo6lS5di8eLFKdkQ3tGW6wWSKH3BW8GNmYlO6EJWdGIYBnv27IHD4YBcLkdZWRkmT56MvLy8lC6ImRBHQtAXq2CJMV8u09+Fl1arhclk6tabI7oMr5Bw/UB6gzv3L7/8Ml5++eWExjYajfjjH/+IP/7xjzHfz8vLw6pVq7q9bjAY8Mwzz+Dpp58GwzB8ARS5XA6v1wuGYfCjH/0Ic+bM4UO65HI5/H4/ZDIZpkyZgm+//bbb92XevHl8v5BY9JQcH05vxz9jxoyIEDCTycSHMnNEVzKLldvx3nvvRTw3Go148skn4ya7E0QqkAAhIvjiiy9w7bXXYsqUKQgGg7j99ttx5plnYteuXXGT5A4dOoSzzz4bCxcuxOuvv47169fjmmuugdls7vFHNxGS9YBw3XuFpC+IGiEECMuycDqdaGxshN1u58/j2LFjU2rgGG2fFL0W1AeEkDLZ8oAYDAYsWrSoW28Ot9vN52AIjVarTaoLerbg8lAUCgXfCT7c08vdnAlPlucqeYWXG+bESXj+SfjzRKEbDUR/hQQIEcEnn3wS8fzll19GaWkptmzZgtNPPz3mPs899xwGDhyIFStWADiRdLd582Y8+uijWRcgmRQLQi4GpCRAPB4PX8HK6/WipKQEgwcPxp49e3r1fCVrn1BI8aJMSeiZQ4qfd3/DYDB0EwSZFCB9lXCBEovoSl5cNa9wkQIgpjCJTpYPn5Mg+hskQIge4WJFe+p2umHDBpx55pkRr82dOxd/+ctfujURTBaphGABwt6NzJQASRS/3w+HwwG73Y6uri6YTCZUVVWhpKQECoUCHo9HsqJBinYlahMtJPoeuZQDIjX6ovCMruQVTXiDxvC/aIHCCZHoUDDuLx37CEIKkAAh4sKyLJYsWYJTTz0VNTU1cbfjKiGFU1ZWhmAwiObmZr6GeiqkEoKViSR0QNiLoRgekGAwiKamJjQ2NqKtrQ0FBQWwWq0YN25czDrwUj5eqeaT9IbX60VTUxPy8vKQl5cHnU4HlUolak4N0TvUCT03ycT553IwehIR0eIk/C9aoMQL8SKhQUgdEiBEXK677jp8//333WqYxyJeo6V0fwRTCcHKRA4I0DcESPSxMwyDlpYWNDY2orm5GXq9HmVlZRg5cmSPCaBi9BURYywhiWcTJ/xsNhs6OjpgNBrR1NQEj8eDQCAAhUIBnU4HvV4PnU7X7XEmEoD7IrkqAnJ9ISn28Ysxf7iXw+fzQaPRRPwORId4hXtQuGsAJ0qixQmF0xFSga5sREyuv/56/POf/8R///tfDBgwoMdtLRZLt9riDocDSqUSxcXFadkhlRwQQNoChBsTOGFnW1sbXzZXqVTCYrFgypQpCXfb5RBSgAiFFMVM9DjcZ2Cz2dDU1AS9Xg+LxYJRo0ZBLpdDr9dDoVAgGAzC4/HA4/HA7XbD4/GgtbUV9fX1cLvdCIVCUKlUEYJEp9PB7/fD7/fzYRlEZhF7ESw0iX7nxRZfxAmiv3/hJYdjES1OWJZFMBgEy7KSFyD0ncsdSIAQEbAsi+uvvx7vvvsu1q5di8GDB/e6z7Rp0/imgRyfffYZJk+enFb+B3BCgASDwYS3z1TPDkDaAoQb69ChQ2htbQXLsigrK8O4ceOQn5+f9AIqE8csxbGE7oTucrlgt9tht9v5z2DSpEkwGo0AwMdzcyiVShiNRv796PECgUA3geJwONDR0YG2tjYcPnwYGo2mm0DhvCharbbfLZ5zCaFzQLi76G63O+EePkTfo7dEeSnD9YhJd+1ASB8SIEQE1157Ld544w28//77MBqNvGejoKCAv2DdeuutqK+vx6uvvgoAWLx4MZ5++mksWbIECxcuxIYNG/CXv/wFb775Ztr2qFQq+P3+hLfPtRAst9vNV7Di7nKNHj0ahYWFgiQqSs3TwI0lJOnaFQgE0NXVBafTCZvNhpKSEowYMQImkyntz0CtVkOtVqOgoCDivW3btiEvLw8DBgzoJlDa2trg8Xj4kqparTauQFGr1SRQJIzQN1MUCgUfAggAer2+x8+f87IJ/ZuaKNxvv1hhiD6fT5R5w+GaQQolJqTqMWVZFm63Gw6HA4WFhX1SPBHJQQKEiODZZ58FcKKhUTgvv/wy37nVZrPh6NGj/HuDBw/GRx99hBtuuAF/+tOfUF5ejieffDLtEryAtEKwhG4cmKqdPp+PFx1OpxMlJSWorq5GXV0d3+lXCPuERGqigSNVu7jcGrvdjubmZqjVauTl5WHs2LEJ3blL134uyVSr1UKr1aKoqCimjV6vN0KgOJ1OPv/E5/NBLpd3yzkJf053IcUPCRH6/47ZbAYAXoT0hM/ng1KpFG0x6PV6oVarRVs0c9ceMf8fCH0OpH7DobCwEBaLRWwziCxAAoSIIJGL7cqVK7u9dsYZZ+Dbb78V3B4pCBBA+NCuZMcLBAJ8Bav29nYUFhaioqICZrOZvzju2bNH8IW5VD0gYoRzsSyLrq4u2O12NDY2QqFQwGKxYMiQIbDZbGmXnBYaLtdEr9fHfD8UCvHihBMo7e3tsNlsfIK8UqmMECRdXV1Qq9VwOp3Q6XQ5c5dS6ou2ZJDJZCgtLUVxcXGv4a3btm2D1WpFaWlplqyL5Ouvv8bw4cNRWFgoyvx79+6FWq3uNQ8yk6xfvx7jx49POn8vHlLOAVGpVDnzm0KQACEkjlqtFj0HBBCnLG0oFOLvsre0tMBgMMBisWD06NHQaDQZtxHo/3kbiYzl8/n4vA6v1wuz2YyamhoUFhby+/fFBapCoYjZfI4jPP8kPMTL6XRiw4YNCIVCUKvVMSt3cfknQt21FdsLIRaZ7AOSSI4AwzBQKpUxf2+yQTAYhFqtFm1+lmVFPX7gxP9DjUYjiA1cWCdBSAESIISkkUIOCDduNgQIwzARFaw0Gg3KysowdOjQuHeyw5GyB0RIMi2MQqEQmpqaYLfb0dbWhsLCQgwaNAhms7nHyjPZJNPzqVQqqFQq5OfnR7yuUCgwfPhw+P3+bgKlo6ODf86yLLRabVyBotFo+oRwE7sRoZhIYX4xvyNiz8/ZINW8DYJIBxIghKRJJQQLEP7CkUkBwrIsOjs7+bwOmUyGsrIyTJw4EQaDIaku21IWIEIJw0x5QFiWRXt7O+x2OxwOBzQaDSwWS689U3IRmUzG35WNFR7Dsmy3/BO3242WlhY+QV4mk8UUJ9zzVBs0ZgIx7RD7HOSyAJDC/ID43wGCyAQkQAhJk0oZXqBvCBCGYXDgwAE0NjYiGAzGDO0Ry8ZcKcMLnAixOnjwIOx2O4LBIMrKyjBhwgQYjcakxF82kfqCJFxcxIJhmG7eE06Eezwe+P1+vkEj14yRZVk0NjbyAoUaNGYesRfgAAkgQLhzIPZnSRDh0C84IWnUanXSIVgABG/QJtQdfK/Xi8bGRthsNn4RNmzYMBQXF6dtb6a6q0txrHSPMxgMwuFwwO12Y9++fSguLk77c+hvIViZnFculyMvLy9uYm14g0aPx4OOjg6wLIv9+/fD4/EgGAxCpVLF9aAImSAvdgiW2Atgml+8+blrDoVgEf0REiCEpFGr1SmHYAlJOotev9/P5xN0dnaiqKgI5eXl2L9/P2pqaiRhY6bHk0IfEC6/xmazobm5GXl5eVCpVKiqqkJ5ebkgtolJMBjEgQMHEAqFMjbHwYMHAQhbkjoRfD4fjh8/jmnTpqGwsBDBYBBerxc+nw9NTU3w+Xx8aWGfzweGYfjkZa5UsUajwcCBA1FeXp50gjzdORYHsQWAFOYH6PtH9E9IgBCSRqlUSkKAJFtdKxgMorm5GY2NjWhtbUV+fj7KysowduxYqNVqeL1e7N+/X9ALXK5UwUp2LKfTyVexAgCLxYLJkyfDYDBg8+bNgtwpz1T5557mi6ahoQFvvfUWOjs7MzZva2srZDJZzL4jmcTv98Nut2PXrl0JbR8KhRAMBiP+/H4/JkyYgNraWgCImyCv0+kkkyAvhQUwzU8ChCAyAQkQQtKkkwMiJIksMBmGQWtrK1/BSqfToaysDMOHD+8WC5+JCwp5QP6H3+/nQ93cbjfMZjNGjRoFk8kUsX+2hUMmYVkWHo8HQ4YMyVipzXARl018Ph80Gg1GjhyZ8hh1dXWora3FnDlzIhLkPR4PXC5XzAaNOp0OwWAQgUAAdrudfy1bCfJifzelML/YAkAKIVgkQIj+CAkQQtKkkwMiJPEWqizLoqOjg6+cxDWn4+6w92an0B4QIZFC2FQ84pUwbm5u5vumFBQUYMCAASgtLc14wrIUFghSsEHKcOVMk23QyBUnOHjwYLcGjbG6x3NJ80KRywtwsQUQwzCSOH76v030R0iAEJJGrVYnHVKSibva0WVznU4nXzaXYRiUlpaitrYWBQUFCV0sMhEqJuUkdCAzXdW5EsZcd3KVSgWLxYJhw4bFrcAUb6x0yZUkdDHI5rFGN2jkcocmTJgA4H8J8lxjRo/Hg5aWFhw/fhwej6dbg8ZYIV59KalYrMWvFBbfUhBgMpmMBAjRLyEBQkiaZEOwgMx0Q5fJZPB6vTh8+DAaGxvh9XpRUlKCESNGwGQyJb2g6CsCRKohWKFQCIcPH4bdbofP50NZWVlSAlBopLBA4BYquSRMxECpVMJoNMJoNHZ7j2VZvoN8uECx2+1xGzRGCxStVpuxfkbJInYFMEB8ASKmWBTbA0MQmYQECCFpkq2CBQjb9I7LJXC5XNi3bx9KSkpQVVWFkpKStJKX+4IAATLjtUiVYDCIpqYmHDt2DG63GwqFAoMHD07rs+irC/ZYixK6U9o7qZyfZESATCaDWq2GWq1GQUFBzLG4il3hAqW1tTVmg0auoaPNZuNfU6vVWfucxRRAUhEgYs8vdDl5gpAKJEAISZNsJ3Qg/UUlt9BtbGxEW1sbCgoKoFarMWDAAFRWVqY8brSNgLQFiBRyQFiWRVtbG+x2O5qamqDVavnyuePGjRPENqEQOwQrUxXg+hNiL8BkMhlfFjhWJTGGYeD1enlx0tTUxHv7YjVojOVBUalUgtssBiRAxJ+fIDIJCRBC0mRLgDAMg5aWFj6BWa/Xw2KxYOTIkdBqtdi6datgjc04G4HcESBAcsfqcrn40rkMw8BisWDixIkwGAyw2WxobGwUxCahjlEKiwQSIL0jhc+pJ6IT5BUKBQKBAE4++WQA/0uQD/eetLe389Xeohs0xhIoyfyOSWEBnMsCQOz5CSKTkAAhJE0qAkQulycUgsXdXefK5iqVSlgsFlRXV3fr0JypBG8hq3VJWYAkMlYgEEBjYyPsdju6urri5thIwTMTi0RtyqTgocVKz6QagiUW0QvQ6AT5aGLlnzQ3N/OvMQwDjUYTV6BEN2gU+9iB3BYgDMP0qYIFBJEMJEAISaNWq5NOQu9pgcqyLLq6uvgKVgBQWlqKcePGIT8/v8eFXbZK+0ppvEyPxfVOsdlsaGlpgcFggNVqxbhx4wQPJckkUlj4S8GG/orYYUiJolKpoFKpkJ+fH3Msv9/fTaB0dHTA7XbD6/UCADQaDS9IQqEQmpubwbJs1hs0kgARf36CyCQkQAhJo1KpkuoDAsReiLvdbr5Uq9/vh9lsxujRo1FYWJjQHaZMl/bNhfGiyxhzoVRyuTyu5ynTdvXVJPRY9OcqWFL0eGULIfsEaTQaaDQaFBYWdnufS3gPFygMw6CxsRHHjh3jGzRqtdqIkK7o/BOh7CUBIv78BJFJSIAQkibVECyu2gzn6XC5XCguLsaQIUNQXFycdD5HXxAggPAhE0KXzj169ChsNhu8Xi/MZjPGjBmDoqKipC6yUr0gJ3OuhDivsZLQpXpupEJfDMHKFuHVt0wmEwDgyJEjqK2thdFoBMMwvNeEEyidnZ1obGyE2+1GIBDgE+TjCZRkGjSSAKEQLKJ/QwKEkDTJCpBAIIBAIIADBw7A7XajsLAQFRUVMJvNaYX0ZKq3iJQ9FkKMx4VwHDt2DC6XC3K5HAMHDoTZbE6rW7RYyfHxyPYiJV4ZXoCS0OORjkATcxEq9gKcQy6XIy8vL66XkmvQGC5QWltbUV9fD7fbjVAoxCfIRzdm5J5LJf8k3Aaxzz/dVCD6KyRACEmTSB+QUCgUUcFKJpOhqKgI48ePh0ajEcSOvuABkcp4LMuio6MDdrsdDocDarUaBoMBCoWC7yYthl3xxiL6BkJ8Vn3t85bCIjzRc5Zog8ZwgeJwOPjXwhPk9Xo9f4OitbUVer0+okFjthC7EaDQAqSvff+J/g0JEELSxPOAMAwTUcFKo9GgrKwMQ4cORV1dHUwmk2DiA8iMABHaqyJ2EjrX8dlutyMQCKCsrIxP7m9sbER9fb0odvWGUOdMCn1A+msOiJiIfT7FXgALQTINGjmB0tXVBQDYsWMHnyAfnX8S7kHJRINGsTuhkweE6M+QACEkTbgAYVmWjzlubGyETCZDWVkZ3x+C+6HOVMWqXKyC1dt4wWAQDocDdrsdHR0dfJ5NSUlJxkrnAtJLSpbCIkEKNkTz2muvYdOmTQD+F8JTXl6OyZMnY+rUqZIIXcvkfukitvjJ1gI4VoNGp9OJpqYmnHHGGXyDxnCBwr3v8Xj4BPlY4V3ca6mE4IotACgHhOjPkAAhJI1KpUJXVxduuOEGDBkyBLW1tSgtLUVNTQ0KCwtjXhz6Qr5GJsbMVlI7y7JobW3lu5Pn5eXBYrGgpqYGarU6rm1CQR6Q2EjVAzJ69GhceumlYBgGXV1d2LVrF1atWoXvvvsOixcvzuoCS4oirTfEtllM8cXNHd2gMRquQWO4QOEaNHo8HgQCASiVyh4FSqzCJGILELHnJ4hMQgKEkCRHjhzBW2+9hRdeeAFHjx7F4cOHcc455+DUU0/tdcHSF8RCJsbM9HhOp5MPsQIAi8WCyZMnx22KlknbpFaGV4w7+X2lCpZSqeT7UhQWFqKyshJVVVV46qmnsHHjRkyfPj1rtlAVrOTn7wsJ+Ik2aAwXKFyDRo/Hg1AoBLVa3S0pnvO8RCfIZwuxzz9BZBISIITkePnll7Fo0SL86Ec/wsUXX4yXX34Z7777bsL7ZypfI9mGiL0hds5GIuMFAgEcO3YMdrsdLpcLZrMZo0aNQlFRUdIXZKmFTQlNtsvwRiPV8xKLESNGoKKiAlu3bpW8AElnPyGg8K/0SbRBY7hA6ejoAABs3rwZLMtCq9XGLC2s1+sz1qCRQrCI/gwJEEJy/PSnP8U555yD0tJSbNq0CX/+85+T2l8ul0s+XyMTYwo1HsMwaGlpgdPpRFtbGwoKClBRUYHS0tKUS+cKHYIlNQ+IGMTygMR6XapYLBbBChP0V6TwWUohBCuTxGvQyLIsPv30U5x++ukAECFO3G43Wlpa4PF44PV6I3qoxBIoqTZoJA8I0Z8hAULE5L///S8eeeQRbNmyBTabDe+++y7OP//8uNuvXbsWM2fO7PZ6XV0dRo4cmdTcxcXF/GO1Wp2056EviIVMjJlOojzLsujq6uK7kyuVSiiVSgwYMACDBw8WxDYphmAJhVSSqfvSYkWMz7AvnR8OsT0g/V2A9DQ/cOKGFlceOBbhDRo5gcIVS/F4PPD7/XyDxngCJd6NHSrDS/RnSIAQMXG5XBg3bhyuuOIKzJs3L+H99uzZE+HmNpvNadmhUqng9/uT2idTYkHqXpVUxvN6vXxeh8/nQ2lpKWpra1FQUIDt27en1bwxGimGYAk5Vm/HxyXv22w2vjcKtwDpaRGSKH3NA2K32yNuNmSaVHNkcjUHhARIYsefTINGTqC0trbyz4PBIN+gMVqccOWHCaI/QgKEiMlZZ52Fs846K+n9SktLI9zY6ZJsJ3Sgb4iFTIyZ6HihUAhNTU2w2Wxob29HUVERqqqqYDabu1WCkaJoAKTXCb0nPB4PbDYbbDYbGIZBSUkJFAoFX6XH7XbzixBOjIQLk0RjzKVaBSsWe/bsQUNDQ0yvaSahHJDEEft7JJX50z3/yTRo5P64Bo1utxssy+Lzzz+PKVB0Oh20Wi3liRB9EhIghKBMmDABXq8Xo0ePxh133JH2AiMVAUJleLvDsiy/4G1qaoJWq4XFYsHo0aPjNmyUaq6F0GMJNU64TQzDoKmpCQ0NDWhvb0dxcTGGDx+O4uJiBAIBaDQavmRx+CKEiy/3eDxob2+H2+2G1+vt1uPA6XRCLpejq6uLLyEq1SpYwWAQnZ2dEWV4P/vsM9TU1GDq1KlZsyPVO+pS8EKISa56QLibWJm0obcGjfv27YPL5cKgQYMiBEpbWxuffwIgboK8TqfLWII8QaQLCRBCEKxWK1544QVMmjQJPp8Pr732GmbPno21a9fySXypoFarEQqFkqoGkqkqWFIXIED3BYvb7eZDrEKhUMzGjdmyT2qigUPIY3Q6nWhoaODzaKxWa48iD+h9EcLFmIeLE6/Xi0AggI0bNyIUCvHjNzY2wmg0QiaTQaVSQa1Wpx3alS67du3CbbfdxvdyqKiowIUXXihKI8JUyWUPSK4KkPAcEDFtUCqVKCoq4hs0hhPdoNHj8cDlcsVs0KjT6VBTUxPzN4YgxIAECCEII0aMwIgRI/jn06ZNw7Fjx/Doo4+mJUC4HATurnEi9AVvRSbG5MYLBAJwOByw2Wzo6upCSUkJhg0bhuLi4qQuplL1WgDSEjPBYBBtbW1wOp3YvHlzr40ykyVWjLlcLkcgEMDo0aPh9/v5vgZczlRrayv8fj+CwSDkcjkvRqL/Uq3OkyiXXXYZLrvssoyNnyx9RfBw5LL3RSoCRGwbevrNTrZBY7xGsQQhBiRAiIwxdepUvP7662mNkYoA6Qs9O4Qek2EYvvvv+vXrYTAYYLFYMG7cOEETyVNFqonjQGoLLZZl0dHRgYaGBjgcDn4xf9JJJ2XtfHMLNK6EqFqtRnFxMTQaDX+3lOtxEP7ndDr5xyzLRoiTaKESqzt0orhcgNstg17PIk5+blLHmi5SDVHrDbFtznUPiJikew6iGzRK4VpAEBwkQIiM8d1338FqtaY1RrgASZRMJaFLMbG9q6uLD7HiFpNTpkyJW5El2/ZlYixAPA+Iz+eD3W6HzWaD3++HxWLBpEmT4PV6cfjwYVEv8LGqYIULlFgEg8EIceLz+dDV1QW/349QKASFQhEhTHw+H2QyGfx+f1zvSSAAfPutHAcOyODzARoNMGQIi4kTGYi9/qEckOTnzsXwM+B/i3+x81AowZzor5AAIWLidDqxf/9+/vmhQ4ewdetWmEwmDBw4ELfeeivq6+vx6quvAgBWrFiBqqoqjBkzBn6/H6+//jreeecdvPPOO2nZwbmMkxUgUvZWhI+Ziqjx+/286HC73SgtLcWYMWPgdDrR3t4uiPjg7JOqaMimXQzDoLW1FQ0NDWhpaUFhYWG3qmHZLpcZa1GUymKJ6/cSK4SDYRhemAQCAV6gMAzD/zZEe0xUKhW+/16PXbvUyM9nYTIBHg+wbZsMgBwnnyysiE+GdO4m5+IiXGwPgBQ8IGJ7n6gPCNGfIQFCxGTz5s0RFayWLFkCALj88suxcuVK2Gw2HD16lH/f7/fjpptuQn19PXQ6HcaMGYN//etfOPvss9OyI1UPSF8RIImOGQqF0NzcDLvdjtbWVhQUFKCyshJms5lPMuZKNophX7bHEoqexnK73Xz5XJlMBqvVimHDhsVtSCb2gk3oPiByuRxarRZarTbiNYZhYLFYeFHC/XuiAVsI338vA+CC3x9CKKSAQqGASqVCXZ0C1dV+FBWllhgvxOfe1xZgYn+ngNwOwRL7+9JbDghB9GVIgBAxmTFjRo8Xv5UrV0Y8X7p0KZYuXSq4HXK5nE+4TWYfocOlxKiCxbIsOjs7YbPZ4HA4oFKpYLVaMXz48JiLYCk0NuxpLCHJlAckFArxCfwdHR0oKSnBqFGjYDKZejwGsRcqHNmyI7xyVzhNTTLodHIUFoYglzMIhUIIhUJQq0Noa2Nw6JADDocrYv9YCfKZOo6+FoIFiO8BIQEiHlKwgSAyBQkQQvIk2wtEbG9FumN6PB4+xCoQCKCsrAzjxo1Dfn5+r4tgoQWIkEhRzHBhcJzQa2xshFqtRnl5OWpqapKqGpPthWr0fEJ7QFJBr2eh0QA+nxxGo5z3dIRCgMkkw5gxOuj1LO814f5cLhfa2toQCATAMAyUSmWEIGFZFizLIhgMplxWuC8u5MRcgIq9+M31+YETYZBi20AQmYIECCF51Gp1vxcgwWAQDocDdrsdHR0dMJlMGDJkCIqLixOuRCR1D4jU8kkCgQC6urrgdDpht9tRWlqakNCTAkLlgAhNXt6JhPMTOR8sdLoTOSCdnTKMG8dVw4rtPeEIT4znhIrH40EwGMSePXvSKivcF3NAxEJsz48U5hf7c6cQLKI/QwKEkDzJekAyEYKVKQHidruxc+dONDU1Qa/Xw2q1Jn3nPXw8oZGq1yJVWJZFW1sb3xFepVIhLy8PtbW1aTXsE3uhEm6D2Au3iRMZACeqYLW1AWo1MG4c+8PrvRMrMd7tduP48eMYOnRoN+9JomWFg8FgyiFYYodBiUUueyCk4H0Q+xwQRCYhAUJIHqmEYAklalwuF+x2OxobG8GyLCoqKjB58mS+Vns6NgrtARFSyInpTfF6vXxCeSgUgsViwZQpU/gwNyG6hUslBEtsVCrg5JMZ1NQI1weEQy6X91hWOBAIRAiU8LLCx44dw6ZNm9DV1QW9Xg+dTsc3cdPpdNBqtXHvNudqFaxcFiBizw9IQwQRRKYgAUJIHu7uZaJIMQQrEAigsbERNpsNLpcLJSUlKCoqglarxbBhwyRhYybHEyMEi2EYNDc3o6GhAW1tbTCZTBg6dChKSkr4haZQF3daJHQnLw/Iy8uuKFOpVFCpVDHLCgeDQYwdOxaDBg2C2+3mc63cbjdfRlmn00UIE71eD7/fn3ATVKGRQh8QMecXW4CIHf4kBRsIIlOQACEkj0qlgt/vT3j7TFSsSmVMhmHQ0tICu92O5uZm5Ofno7y8HKWlpVCpVNi/f7+gHgapCxBAmEVFb/u7XC40NDTAbrdDoVDAarVi5MiREeVkwxF7oZUKPeWACB1+2F/gukJbLJZu7zEMA6/XC7fbzYuT9vZ22Gw2dHV1gWVZ2Gy2bl4T7rFGo5FU5a7+MLcUBIjYNxaoDwjRnyEBQkieVEKwxMoBYVmW707e2NgIhUIBi8WCIUOGdLsrK2XBIDSZuIiGX5y5JP6GhgY4nU6YzWaMGTMGRUVFWSufK/a55wSI2HZImXift1wu58VENDt27IBcLkd5eTk8Hg8vUlpbW+HxeOD1eiGXy+OKE51Ol3AhiWjEzj/JZQEg9vwAhWAR/RsSIITkUSqVksgB6WlMn8/Hl871er0oLS1FTU0NCgsL415ApC5AMnEehbyoMwwDp9OJhoYGOBwO6HQ6lJeXo6ysjG9gmahN6SKFRYIUbAhn/Xo5fD5AowFOOSX9GwJiNSKUyWRQKpUoLCxEYWFht/cZhuG9JuHi5Pjx4/B4PAiFQtBoNN2ECfe8t74nuZoAD+S2B4azgUKwiP4KCRBC8kg1ByQUCqGpqQl2ux1tbW0oKirCoEGDYDabE7rjmakFvlBkKgQrXTgx+s0338Dv96OsrAwTJ06E0WhM2S4hkEoSuhQWjgDQ0AB4vTJotdKwB8jMglYul8NgMMQsIsGyLN8lPvyvubkZHo8HPp8PCoUiptdEr9eDYZiUvSdCkMsCQOz5pWIDQWQKEiCE5EklByQTIVgMw4BlWbS3t8Nut8PhcECj0cBqtWLUqFFJJ6pK3WORCQGSKizLoqWlBTabDc3NzQCAgQMHoqysLO0FmlQW7MnQk1dNKhQXAx7PiV4gUiDVxVw63w+ZTMZX7SoqKur2fjAY5D0n3L8Oh4N/zLIslEolOjo6YoZ3JePpSxaxF7+5Pr/QNoh9LAQRDQkQQvJIoQyvz+cDy7LYsGEDQqEQysrKMGHCBBiNxrSam0lVMGRiPCD5xZzH4+HL57IsC6vVikmTJmHz5s2CiA8hL+5SEDJSWmQMHswiGAQEqHAsCOmcm0ydV6VSCaPRGNN7x7Istm3bBrlcDpPJBLfbjc7OTjQ2NsLtdiMQCEClUvGCJNqDotPp0u6Zk8sCQOz5AcoBIfo3Erk0EER8VCqVKCFYwWAQjY2NsNvt6OzsBIBuZVzTQeqCIVOJ473BhbbZbDa0t7ejuLgYI0aMgMlkglwu58WoUMcqBeGQCrHszkQFuGQJBAJQKBRwOpUIBE70BQHEL+kKSEug9QaXe6LRaDBgwIBu7wcCgYi8E7fbHbOscLzck95634j9PZLC/GJ/XygHhOjPkAAhJI9arU66E3qqFy+GYfhO2c3NzcjLy+PLuG7atEkw8QH0DQGSzRCsrq4u2Gw22O12qNVqWK1WjB49ultom5C5DmKFN6Rru5RDsHZu24bCkhI0NVXD44EgIVjpni9uMZntEKx06WlurudJfn5+t/filRVuaGiA2+1GKBSCWq3usawwkNs5IFLwPoh9Dggik5AAISRPsjkgqZThdTqdsNlsaGxshEwmQ1lZGaZMmYK8H1o4C33XnbNTyuMBwnYvjzVedIPG0tJS1NbWoqCgIGuL7P7kSRHbAxIKhRBqbsYJf2G1aHbEI51wSbFIZe6eygqzLItAIBAhTmKVFVar1fD7/airqxOsrHAyiL34Fnt+QBoiiCAyBQkQQvJkKgfE7/fzi1+32w2z2YzRo0fH7B2RiQpDUhcgmRI0XCJ/Q0MDmpqaYDAY+PK5vYWFRI+VLpTgKSxutxtKvx+BlhYwiiCkdonpa59TJhbBMpkMarUaarU6ZlnhUCjEd4k/cuQIAPBlhd1uNxiG4csKxwrvUqlUgtgstgCQQviTFGwgiEwhrasDQcRAyBwQhmHQ3NwMu92OlpYWFBQUYMCAASgtLe1x8ctdCIXuXC70eEKSiRCs48ePw+FwIBAIwGq1YvLkyTHLlyYyllBIwXORCrHsTuUz6+zsTLiYQm/buFwuqPx+yBkGXmUnZDJTUrZkinQWs331+5EqXMf4goICqNVqjBo1in+PZVn4fL5uuSfNzc1wu93w+/18WeFwcRL+b6ILaikIELEFqxRsIIhMQQKEkDwajSbpMrzcnXZuQdbZ2cl3J1epVLBYLBg2bBh0CQaokwckNRiGQUtLCxoaGgAAHR0dqK6uhtlsTvvOnpQ8IIA0FqrJnlOPx4PN27ahurISVVVVac/vdrtRwLIIBgLwBjug00lDgKRLrjYDjOUJ1mq10Gq1vZYV5sK7HA4H/5hlWb5CV3RSfHRZYbEX32LPLxUbCCJTkAAhJE8qndAB8Bc/u90Ov9+P0tJSjBs3Dvn5+Un/qOeiAEkHl8vFJ5TLZDKUl5ejpaUFo0aNSlj0xUOKHpBsLxJ6yo9J5nhYloWbZbHz6FEYDAaUlJSkZZfH6YRFJoMcQMDdCp1ucFrjCUU6Sehi05fET29lhbnEeE6k9FRW2O12Q6VSoaWlBXq9HlqtNqvnQgqLf4ZhBC16QhBSggQIIXmSCcEKBoNwOBwAgE2bNsFkMmHw4MEoKSlJK3GSW7xIWTCIPV4oFILD4UBDQwM6OzthNpsxatQomEwmyGQyHD58WNDFvtSEgxTEX6qLlU61Gt/v3YupcRKXE8Xf1gajWg2NQgFFUzOYohAA8Tp5h9MXBYjYi2ChS3Fz3o9YcInxnDhxOp1wuVzYsWNHt7LCsfqeJJM/lghin3up2EAQmYIECCF5ektCZ1kWbW1tsNvtaGpqglarBQCcfPLJaS2mohF7gS/F8ViWRVdXFxoaGtDY2AitVovy8nKMHTsWarW623hCIqXqVX19kVBcVYWWI0fw/a5dmDx+fEqLOb/fD8bthlGthlGthi7ghM/Xiby87qE62SadPiC5ugjM9nGrVCoUFBSgoKAAwAkPtkqlwvDhwxMuKxxLmHBlhVMplS325y4FGwgiU5AAISSPRqPh74CF43K5YLfbYbfbwTAMLBYLJk6cCL1ejy+++ELwO2J9QTAAwl20erKPqyDW0NAAr9ebUGf4bPcVyeY4YiBUEjoAyORylIwYgWPbt8O4dy9GjxqV9Llxu91Q+f3INxphUKuRH/Sj3t8JQHwB0lcRcwEq9uI3fH4hygrHSorvqaywFI6fqmAR/RkSIITkUalU6OrqAvC/vhF2ux1OpxMlJSURXbKB/1WqEjokJhNVq/qSAGFZFq2trbDZbGhqakJ+fj4GDhyI0tLShMPbhBQgUvKACDlOIsT7fNNZrKi0WuQPHYq9e/ci32hEZWVlUvu73W5oAgHof0gkHmKQwZnXCqt1YMo2ceRqI0IxEfu4E50/0bLC4cnxLS0tccsKc6LE4/GAYRjRhEg6XjuC6AuQACEkj0wmw549e3DeeefhsssuQ1VVFaxWK0pLSyOqpoRvD2RGgPQVD4iQ43k8HthsNthsNrAsC4vFgpNOOolv0pjMeEIer5RCp6SySEj3HOcVFcFXUYHthw4hLy8PJlPiVazcbjcKWRbyH87FsHINGjUODB8ehJTyQLK5X7qILQLE9gAIMT9XVjhWue9YZYVdLheamprQ1dXF57XFyztJpqxwspAAIfo7JEAIScKyLL777ju8+uqrePHFF8EwDC677DJMmTIFgwYN6nFf7k6nkN4KbtxcESAMw6C9vR0ejwcbN26EyWTC8OHDUVxcnPIFV+iEVqHI9iIvGAxCLpdDo9GkNU4su4XohF5UUYFGlwvf79mDk8ePT7hqmbuzE5Vh3w2TTgeV0wmn08nH9adDOp85VcFKHimEIGV6/p7KCu/evRvBYBCDBg3qtaxwvNyTWDfIEoX7f0whWER/hQQIIUmuvvpqvP7667jwwgtx8cUXo7OzE4899ljC+2eiJK0Qi7twMlU2N50xnU4nn1Auk8kgl8sxderUtBfLQtiWibGyJWS4XjT19fVwOBxgGIZPmtXr9cjLy+vWTVosZDIZzEOGoHHHDmyvq8OkceMSCrELtLcjP6zwQL5aDb3fj87OTkEEiBD0NQEidg6ImEhBACkUiqTLCtvtdng8nm5lhaNFSm9lhbkbaH3tO0sQiUIChJAkN998Mx599FEYDAY8+uij+Oqrr5LaPxOLe6HHzISgAZJfOASDQTQ2NsJms8HpdMJsNqOmpgYMw2Dv3r2CiQ8pJqEDmRUywWAQdrsdDQ0N8Hg8sFqtqK2thcFgQDAYjAj74O6scguXcEESLlBUKpVgif7xxlEolSgZPhxHdu6Ece/eiG7YsfD5fJB7PDCECRCZTAaLTIYjbW1AkvkkmSDV74zYC3GxkIIAEHv+noR3smWF3W43Ojo6+Ne4/eOFdwkdgkVChpAaJECImPz3v//FI488gi1btsBms+Hdd9/F+eef3+M+X3zxBZYsWYKdO3eivLwcS5cuxeLFi1Oaf/Dg/zUw660MbyyEXtwDfSsJvTdYlkVHRwcaGhrgcDiQl5cHq9WKsrIy/u57W1tbRuwTCil7QLq6ulBfX4/Gxkbo9XoMGDAAZWVlUCgU8Pl8UKlUMBgMMZNmwyv6cOKkpaUFbrcbfr8fSqUSSqUSLMti3759EUJFyONR6/UwVldjz/79yM/PR0VFRbfj5HC5XFD6/cgPq1K0d58cHZ067Gxtxqga4RqqpUK6i7lc9UKIvWgVW4CkM390WeFwossKu93ubmWFud/h7du3d0uQT6WsMEFIDRIgRExcLhfGjRuHK664AvPmzet1+0OHDuHss8/GwoUL8frrr2P9+vW45pprYDabE9q/J9RqdcKNCDkoByQ2Pp8PdrsdNpsNfr8fFosFkyZNihlikAkvUn/2gLAsi4aGBtTX18PtdvOlifPz85Maq6eFC+c1OXr0KNra2uDz+dDa2gq32w2fz4fdu3fz4XNcZSDuL1ZZ6lAodKLSzw9/0eQVFcFbVoZt+/dDq9WCYRgwDINQKBSxXVdXF7SBADRKJZgfzmcoxCBPpoHG40RHR0fS5yGWndHzJrM/5YAkh9jiRwoekEzNn0hZ4dbWVmzduhUGg4EvK8z9P48uKxxdYjidprsEkS1IgBAxOeuss3DWWWclvP1zzz2HgQMHYsWKFQCAUaNGYfPmzXj00UfTFiAqlQp+vz+pffpCCFa2BAjDMGhtbUVDQwNaWlpQWFiIqqoqmM3mXkMMhEToECypeECcTieOHj0KADh+/DjKy8thsVgE70MDAEqlEvn5+cjPz4fX60VNTQ3/XigUQkNDA1wuFxobGxEMBhEIBBAMBhEMBiGTyaBUKqFSqfh/GYZBS0sLNM3N0MTotQMArEaDplAIa9atg/WHIgQulytim2PHjqGqvR1NYd8np1MGBFgo/a3YuXMnzGZzysft8XjQ2tqa1mduMplSWpiJuRAXOwekvwoAKc/P3TwwGo2Qy+UYMmRIxPtcWeHw8K7m5mb+McMw0Gq13cSJyWSSTC4WQQAkQAiB2LBhA84888yI1+bOnYu//OUvfEx7qqQSgpWLAiR6TLfbzZfPlclksFqtGDZsWMJVjaR+vGL27wiFQmhqakJ9fT26urpQXFwMAJgyZUpWFi2x5lAoFDj//PNxxhlnxLTX6/XC6/XyPRG4RX2TzwedxYL84mKoVCqoVCqo1Wr+sVKpRGj6dBz8+msMlMsxZdKkbjkhn33wAQYVFuLksAp1GzbI4fUBzq79qDptKk6bMSPl421pacHBgwcxZcqUlMdQKBQoLS1Nad++6DkRglwUAFKfP9mywk6nE01NTQgEAiRACElBAoQQBLvdjrKysojXysrKEAwG0dzcDKvVmvLYKpUq6RAsuVwueAhWX6mC1dTUhJaWFnR0dKCkpASjRo2CyWQSvQmbFMvwJjuO2+1GfX09bDYb1Go1KioqUFtbywsSsReqJpMpqd4dnZ2dONbRAc2IEdDl58Pv9/N/Pp+P93SoVCqYhgzBvu++Q9nRozj55JP5O6sAoAmFMLiiIsLLYTDIoVAAlQovZC4XBg8enHIeSP4PtkXfDe7v5Kr3RQrzMwwj+vzJ/n/pqawwhWURUoMECCEY0T/WQlXxUKvVFILVAyzLoquri28UWF9fjwEDBqCmpgbqsKpEYtkXTl/0gDAMg+bmZtTX16O9vR1msxljx45FYWEh/93mchOyuWgSMpxNpVbDEKvUKMMgEAzyosTd1YVNe/Yg/9NPUVpaCoZhEAwGUb93L/wFBWhWq6H5IeeEYbUAZCjS5qOtpQUtLS1phWGJhdi5ELmcAyI2uSzACCLTkAAhBMFiscBut0e85nA4oFQq+fCUVJFSCFYmqmCleqEJBAJ8QrnH40FpaSkUCgXGjh0bM6k8VfuEoq/lgHg8HjQ0NMBms0Eul6OiogJjxoyJKeqS+fyEWFQI6k3q6T25nE9iB4Dg0KE47PWioaMDs2fPRmFhIerq6rBfoYApLw8etxvtbW3w+/1wNJYgGFRBq2PRfuQINm/ejIkTJ/Kek0zkyGSKXM3DyOUFeK7PTxCZpu9cAQhJM23aNHzwwQcRr3322WeYPHly2k3VpFSGV+yQJJZl0dbWBpvNhqamJhgMBgwYMAClpaVQKpVobm4W1b5sjZepKlhcUnZDQwNaW1uTDmHLhUVDxfDhsB89ig8/+wyX/PznYFkWZTodBv1Qppejvp6Fy8VAqQyiXC7HkUOHUFBQAJfLhVAoBI1GE7fXSV8SJ/0Vsb/LYs8vhRAsqf5mEoQQ0K88EROn04n9+/fzzw8dOoStW7fCZDJh4MCBuPXWW1FfX49XX30VALB48WI8/fTTWLJkCRYuXIgNGzbgL3/5C9588820bUklB6SvlOEFErvQer1ePqE8FArBYrFgypQpyMvLy6iN/T0EizvvPp8PDQ0NaGhoAACUl5dj5MiRgjVh7E/I5HIMnTQJO9evx6f//jfytFoUxfgsFAoFVCoFdDoVygcMwHaWxbRp0wDgRDhXWA8Ep9MJh8MBl8uFYDAY0SVer9cjFAohFAqlXdCiryF2FSwxEVuASGF+MXvnEESmIQFCxGTz5s2YOXMm/3zJkiUAgMsvvxwrV66EzWbjS48CJxoHfvTRR7jhhhvwpz/9CeXl5XjyySfTLsELSCcHJNudy7ncA5vNhtbWVphMJgwdOhQlJSVxL0xSDHPKxHhCLAxYlkVnZye8Xi+++uormEwmjBgxAiaTKaXkz2wjZhlitVaLQRMmYP3mzTB1dOBHWm2P21vy87GluRltbW0wmUzQaDTQaDTdEmWB7uKE6yDt8XiwevXqbl3iwz0oPXWJTxWxE8HFROwFuNjzi908k7wWRH+GBAgRkxkzZvR48Vu5cmW318444wx8++23gtsipRyQbAgQl8uFhoYG2O12KBQKWK1WjBgxAtpeFnlC2yiFkLOeSNU2v9/Pezu4/hhTp05NuDxxJmwSE5lMBqRgt9FkQv6QIdi+ciVmDRvW7f2aGhahEKBQACajEfIf8pV6q9LF5ZyEd4lvamrCnj17cPLJJ3cTJ+EN2pRKZUxhotfroVar+1wndDHnlsICWGwB0p9CsAhCapAAISSPVMrwZlKABINBOBwONDQ0wOl0wmw2Y8yYMSgqKkr6IiS0l0GoC7GY4ohlWbS3t6O+vh5NTU0oLCzE0KFDoVAosG/fvrTFR7Y/I6ksTIw/NPdrOH4czoEDI3oTlJaGH6MCpQwDu92OMWPGJD0Pd74S6RIf/tfe3g632w2v1wuFQhHXc6LRaOKe074oKoVA7OMWWwBIYX4KwSL6MyRACMmjVqsl4wERWtQAwN69e9Hc3AydTofy8nKUlZWlHOcuZJiY0AKEG0sIErUnEAjAZrOhoaEBgUAAVquV72EBAG1tbaIvtPoy7s5OmI1GBAIBfL9zJ6ZMnBj3u2vNy0Pdvn3A7NkZsSW8S3w0oVComzix2+18N2m5XB5TnOj1etHzMHJxbppf/PkJItOQACEkj0qlkkQOiFBj+v1+2O12PuFZJpNhwoQJMBqNguU2CEEmqmBlIwmdy+2or6+Hw+GA0WhEVVUVzGZzzGZcUkuMz+Zc6X7G7q4uFMhksFZX4/iBAzDs3o2xNTUxx7Xk5+M7hwPt7e0R4VXZsFWhUMBoNMYsT80wTDdx4nA4eHHCsiycTicaGxu7eU60Wm2/vkst9gJcTMQWAGLPTxCZhgQIIXlSLcMrpRAslmXR2tqKhoYGNDc3o6CgAFVVVdi1axcGDx4sSP5BujbGGguQpqCJNVYwGITdbkd9fT18Pl/cSmGZsCnbCwXB82lS3M/d1oYqmQxKtRpFlZXYd/QojAYDBg8ejI4OgGEAuRwoKADK8vMha2yE3W5PSYBkCrlcDoPBEBE+xsEwDL7++msUFBRAr9fD7XajubmZFyoAoNPp4npP0hUnYntAxETsECSxBQCV4SX6OyRACMkjlST0VMKbPB4PXz6XZdluIUB1dXWSrTTFIVUPATcW5+1obGyEwWDAwIED+aaMYtmUK/gdDhh/KI6gMxjgN5ux8+BBGAwGbN9eBo8H0OmAWbMYqBQKmFkWNpsNI0eOFNnyxJDL5ZDL5TAajRgwYEDEeyzLwuPxdEuIP378ONxuNxiG6VGcJPr9FAuxF+Bi/18SOwlcbAFGEJmGBAghedRqNViWRSgUSviiLWYIVigUQlNTE2w2G9rb21FcXBy3vGtfKHUr1apara2tOHLkCNxuN8rKyjBp0qSkO8DTXcHUCfh8YDo6eAECAAVmMxpdLnxfV4eA3wAg0vtk1emw78ABIKzEd18g1vdEJpPxYiIalmXh9Xq7JcQ3NDTA7XYjFApBq9XGTIgP7xIvtggQewEu9v/PXD9+gsgkJEAIycMltfr9/oRDlTLVCb2nsK6uri7YbDbY7Xao1WpYrVaMHj26x2Z2uSZA0sXpdKK+vh5dXV0IBAIYNGgQysrK0uqcne1cCqHOp1h3iLlZ3V1dUHk8yC8ujnjfXFkJ+4EDcDbuhNk0EeGXGUt+PrbZbOjs7IyZLN5fkMlk0Ol00Ol0KI46PyzLwufzRYiTzs5O2O32bl3iuQakwWCQFyjZ6hIv9gJY7PnF9oCIPT9BZBoSIITk4QRIIBBIWIBkqxN6IBBAY2MjbDYbXC4XSktLUVtbi4KCgoQuHn1BgAhFqraFQiG+RHFXVxfKysqQl5eHgQMHwmq1pm2TkIgdNpJpws+Xu7MTap8PeVECW65QwDxoEI4fPghZy27o9TX8e5b8fGD/ftjt9j4jQDJxI0Or1UKr1XbricKyLAKBAFwuF9xuN3bv3g2v14vDhw/D7XYjEAh06xIf/qdWqwWzUwrf5VwWQBSCRfR3SIAQkidcgCRKJsvwcj0lGhoa0NTUBIPBwJfPTfbuZCa6q/eXHBCuIaPNZoNarUZFRQVqa2uhUqnw7bffSqo0cF9NQk9nHHdnJwpZFvIYY6g0GuhKKtDSUA9jmwHAQACAWqlEcSgEm82G4cOHpzx3tsnW5yuTyfhGjEVFRTh48CCqq6tRUlIC4IQX2OPx8AIlPCne7/cL3iU+lz0AYgsAsQUQQWQaEiCE5OHu6iUrQIT2gIRCIXR1dWHjxo0IBAKwWCyYPHlyzOo5idIXPCDZzAFhGAZNTU2or69HZ2cnzGYzxo4di8LCwm4X474oHKSIDEipE7qnrQ0VPeRkqXX58BZ6YG/fj5aWPD4UyarT4fDBg8AZZyQ8V64uxqKPmxMnsRoxBgKBpLvEc3+xGjGKvQAHctsDIrYAI4hMQwKEkDycVyEZASKXy5OunBULhmHQ0tKChoYGtLS0QK1WY9iwYTCbzYJcnDPVXV3IsbIR0uXxeNDQ0ICGhgYolUqUl5ejpqYmbkiJkOdNDA+PEHOKHSLjb2yMSECPhTa/DF7Gg227dmHa5MnQ6XSwFhRgR309nE5nWuI9W4h9nhOlty7x0Z6T3rrEezweaLVa0RbiYgsAKcwvtgAkiExCAoSQPDKZDEqlMqshWG63Gw0NDbDb7ZDJZLBarTAYDPB4PCgrK0t5XKHt7GvjhY/Fibv6+nq0tbWhpKQEY8aMQVFRUVZDXqQ0jlTni8bn8UDmdMKYQE6WoWQgmv37sH3nTkyaMOFEHsjBg7Db7Rg6dGgWrE2fvt6NXKlUxm3EGAqF+HLCnECx2+1ob29HKBRCfX19XM+JTqfL2LmRggDoT/OL/ZtBENGQACH6BCqVCsFgMOHtU1k4hyc7c+E/o0aNgslkgkwmw7Fjx/jmY0IhdcEgdEgXV56Uy+0AgIqKCowaNarHamGZtEtIpGhTT6S6KHF3dkLp8SA/gbLHcpkcJYMG4cjBgzDs3YvRo0ah6Ic8kL4iQMQiG98nhUIRsxHjjh07oFarUV5eHrdLPHCiEWNeXl5McZLOHXyx/y+JLUAoBIvo75AAIfoEarUafr8/4e0TTe5mWRZdXV1oaGhAY2MjtFotysvLMXbs2G7hP2L2FhFzPCFgWRZ+vx9dXV04dOgQTCYTRowYgeLi4pTmENJzQbkkyS/2XJ2d0AYC0CVYdUmt1SK/ogJ7jh2D0WiEVaPB8UOHgNNOS8XcrCL2Qlhs70tPXeK9Xm/MhHghusSLHYIktgARe36CyDQkQIg+QbLd0HtLQg8EArDb7WhoaIDX60VZWRkmTJgAo9EY90c/VwVIOuP5fD7YbDY0NDTA7/cjPz8f48ePh7aX3IFEEHthGIts2iTm8bs7O2FCz4vjYVFFrvIKCuBzu7Fj715YBg1C5w8dw2M18pMaubgQ7G0BLJfLE2rEyAmU6C7xWq02pueE6xIv9v9vsT0QYgswgsg0JECIPkEqAiT6AsayLFpbW2Gz2dDc3Ayj0YiBAweitLQ0oQ7r2eotki5ij8eyLNra2vgyxUVFRRg2bBiampr4/gfpIqTnQuyFTiqIvSD2tbSgoJeS0/IY/6VMFgvsHg8cx4/DX1ICu92O6urqDFnZ9xH7LniqcyfSiDE6IT68SzwXjrl3717k5+dHiJNsNWLkjkMsSIAQ/R0SIESfQK1Wp5wDwnUTbmhoAMMwsFqtmDJlCvLy8pKygTwgPRMIBGCz2VBfX49gMAir1YqTTz6Zv0Pa0tIi2SaJQiBFmzIBy7LwOxzIT7ApaAQyGcwDB6Jx/36079+P+vr6hARIXxSJfZ1MiZ/wRoyxxInf74fT6cQ333wDtVrNd4l3u90IBoN8l/hYf1zPqHRhWVZ08ccwTFbFFkFkG/p2E30ClUqVVA4IcEJ4bN26FW1tbTCZTBg+fDiKi4tTvqtEAqQ7LMuio6MD9fX1aGpqQn5+Pqqrq2OWKZZq13GxGi32VXxuNxQuFwwphk4plEqUDBqEPZs344vPPsNpEs8DEfMzFXMRLMZxy2QyaDQaXkgMGTKE94ZwXeI5r4nL5YLT6eST4gOBAN+IMVZoVzKNGLljJw8IQWQOEiBEnyDRECyn08l7O1iWhcViSbrCUjyE7loO9A0BEotgMAi73Y76+nr4fL6EvUpS84DkeplL3uYkPhev0wmlz4d8k6nH7ZqbAIYB5HKgxBz5nlqnQ0VlJT759lts2bIFkyZNStb0rNIXP1shEFv8hM8f3iW+sLCw2z69dYkPb8QYLVDUanXEXNz8uZwETxCZhgQI0SdQKpVxQ7CCwSAaGxths9ngdDphNptRWVmJlpYWVFVVCWZDLnpAgP9djLmKYfX19WhsbITBYEg6h0aK3gYx7vSmO2cmOt4niqerC6ZAAJpewl1amgF/AFCrugsQAKgsL4e2tRVvf/ghrFYrysvLBbWzPyC2B0RKAqQ3euoSHwwGIzwn0V3iFQpFhCjhblj5/f6kPCdCInQSfC7+/yGkDQkQok+gVqsjPCBc6E9DQwMcDgfy8vJgtVpRVlYGlUoFh8OBlpYWQW3oC0nomRgvGAyivr6eTxK1WCyYNGlSzKZmvY0lpF1Cls8VarHVm01OpxNHjx7lK4Jxd2Pz8vKg0Wikv0iQyeDt6oJJADt1ajUq8/NxwOnEB59+ikt+/nNJdkbP1TvRYoeeAcL9ZiiVSuTn5yM/P7/be1yX+HCB0tbWBgBYt24dFApF3F4nWq02o40YKQSL6M+QACH6BFwOSGdnJ9ra2mCz2eD3++MuhuVyueTFQibGFHK8rq4uBAIB7NixA3q9HhUVFSgrK0srMTIXQ7C4ju/Hjx9HR0cHSkpKUFRUhEAgAIfDAZfLBY/HA7lczi9ywv/Ny8sT7S5sLIJtbchPsP9Hb1hVKrQWFaGutRWffPYZfnbeeQl503IFsb0QfckDkiqxusT7/X6sWbMGs2bNgt/v79YlnmvEKJfLI3qdhIsUrVabdiNGqfyfJ4hMQAKEkDzBYBAdHR146KGHcOONN2LVqlWoqqqC2WyOu1jpC2IhE2OmOx7XDb6+vh5OpxMymQxDhgzBgAED0r4YCu1BEjqcS2gPiN/vR0NDA+rr61G4dStKzjgDY6ZPB/C/HgocDMNE3IF1uVxob2+Hy+WCz+eDUqmMECXBYBDBYJBPvE2VcA9QIjChEJi2NuQnWUEuHiaDAYzDgQHnnION332Hsq++knxSejYRu6hBLgiQnuZXKpVQq9VxGzFynhNOnAjZJZ4ECNHfIQFCSJYDBw7gpZdewsqVK9Hc3IypU6fi1VdfxahRo3rdNxNiIVNJ6EIuylM9bpfLhYaGBthsNmg0Gt7b8e2330Kn0wlyIZRiPHMmLvCdnZ04fvw4HA4HCgoKMHz4cAy87Tbg3XfBjB0L7+mnIzRzJhAmQORyedyO01z8OrfIcblc6OjogMfjwerVq6FWq2N6TriGbkLidTqh9nphjCqfmirFBgPUDgeYUAhFI0fi319/DbPZjJEjRwoyvhDkuggQc26xj723Roych9Jsjkxy4rrEh99UiO4Sr9VqYybE63Q6KBQKMAwjWAgWCRlCipAAISQJy7I499xzMWbMGPz5z3/GH//4R5x11lkJiQ+gb+RrZGLMZMZjGAZNTU2or69HZ2cnzGYzamtrUVBQwF+wpJi3wSH2wjAchmHAsix27twJr9cLi8XCVwWT7d4NeXMzmIEDId+9G2q/H+yuXZDX1oKZN6/XsWPFrzc1NWHPnj046aSTIsQJ1zPB5XIhFApFdJsO/zeRO7Cx8DidUPl8MAjQTBIA8jQa5Pv96GxuRlVNDQ60tuKD1av/n70/j5Mkr+v88VfkfVXWXZl1n93V3dXndE8fM4MwIpeO6MiXha8//a37Q9BF1kVwEVFxUIHHKsvOroIwig7Irjs4uIqAwIAMMMzV03N1M9PddWTlfWflFXlEZkT8/qiJIPKszKzIjMiuz/PxqEd1Z2V9IjIqMuP9ivf79X5jeHgYDodDlm3IwUEM4NRQgqUUwrWj09cvx5T4crksth6unhJPINwKEAFCUCUUReHFF18Uy0v+8i//sq05IP3QMrcba7ayXj6fh9/vRzAYhE6nw/T0NI4fPw5Dg7p+NYqGbpjQO6FQKIhlVhzHYXR0FAsLC5U+mWIRpTe+ERq/H1QqBW5kBBTPA/UM19EoMDYGtBj4NGpLKkybrhfk0DQNYLc8RKfTIRaNwjQxAaPdDqPBsPuea7D9fDaLAY6DXsYgyKHV4mY4DBw/jsWTJ3H98cfxL9/4Bn7xrW+tG8AdJJQuw1FagNyK/pdWpsTncjlcu3YNWq227pT4RrNOyOBCQj9BzlbCnnz605/Gn/3ZnyEYDGJtbQ33339/wzrtRx99FHfffXfN4y+//HLbZRXS2na9Xt/xJHS56IesSqP1BCO03+/Hzs4OxsfHsba2huHh4aYXWrnbvarNhN4JPM8jmUzC5/MhFothdHQUa2truHbtWl2TPn/qFJj/9t8AjgP18stgg0HoNzfBHT5cuXAmA+1nPgPY7eBXV3d/Pj8PNAj2mx1L6bTpkap5HTzPi7XriUQCAEBnMggGAmAYBpRGA4PBAOMr4sZoNIpCp5BKYVLmYz9is6Hk84Etl6HV6bBy7hyuPfYYvvXtb+PN99zTlZsJ7XCQt30rCgA1b1/6vtXr9ZiamsLk5KS4T4IhXviqnhJvMBjqGuKtVmvDG0wEglIQAUJoykMPPYT3vve9+PSnP40777wTn/3sZ/GmN70JL730Eubm5hr+3o0bNypKRqprZNul1UGEAv2QrejGmtXrCXfoA4EANBoNpqam2hrMqGbR0OsMCMuyCIVC8Pl8KBaLmJqawsWLF2E2myvWaohGA35tDeVDh8C95jWwvPJ74r7cvLn7j3Qa1OXL0F6+DJhM4A8dAr+6Cn55GZAhiKAoSgxMbDbbbjOHmRmMTk2B5zgwDFPxlUwmwTAMSqUSdra3sQpgJ5GATqcTv7Q6Xcf16qM2G/TxONKJBIYnJmAwmTB35gweu3IFE2NjuOMV476SHOQshFLbPogCpHofpO8pYUq80WjE8PBwzXObTYk3Go147Wtf2+uXQCA0hQgQQlM++clP4h3veAd+9Vd/FQBw//3345vf/Cb+8i//Eh//+Mcb/t7ExETdabWdYjQa2y7BUnu2AuhOqRjHcYjFYggEAojH4xgdHcXRo0cxMjLS9kVVrb6NXgYHuVxOLFkzmUyYnZ2Fw+GoW4vd1uureg380BD4lRVQLhfAsrsPFgqgrl4FdfUqoNOBX1wEf/QoqOnp/bwkyS5QAEVB2GtKo4HRZIKxjseDKRQQ/c53MPRKW+ByuYxisYhyuQyO46DVaqHVan8sSrRGGDVaGAzNy7UGTCYMFApIx+MYnpgAANhHR0EfOoRvPfkkxsfHYbPZFA8IDyIHUXgB6pjB0Y4I2mtKvNzXQgJBDogAITSEYRhcuXIFH/zgBysef/3rX4/HH3+86e+eOXMGhUIBx44dw+///u/XLctqB51Op3gGRO2+kmKxiGQyKX5NTU3h8OHDMO3DMKzWEiygu94UnudFz0Qikahr0K9m3wHT8jK45WWgWAS1uQnqxg1Q6+tAsbj783J59/+lEiCTAGmHAk3DVCph0GqFrWruDsdxYF9pDSy0Bx4aLqBcKoHjeYRD2sqMiSBUtFpAo4FDo8FWKARImkxMLi5iPZHAv3z723jDT/xEr1+uyEHNBBzUbath+3LvAzGuE9QIESCEhsRiMbAsW9ONxuFwIBQK1f2dyclJPPDAAzh79iyKxSL+7u/+Dq997Wvx6KOP4if2EUR06gGR80O8m2t2Cs/z2NnZgd/vRywWg9lshs1mw2233ab4Hbxq1FjOVb1OqVQSy6xYlsXU1BSOHDnScsmaLK/PaAR/7Bj4Y8d2MyHb29DcuLFbopXJgF9drdwWx0Hzv/4X+NnZ3Z85nS2b2NuBTqdhKBZhqSr/AHbFucZggL66RIznwXEcyuUy2HIZpXIZDMOIQgXYDY50pRKiL7+M6NoazBbL7t1cvR7Lp0/j5ccewyOPPoozx4/L/ppaRYlgVOlOUESAKCtASBtewq0OESCEPan+8Gr24by6uorVVwIkALh06RK8Xi8+8YlP7FuAtJMBET645RYLctOpsZ1hGIRCIfj9fpTLZdGPEIvFsLOzI+uFS22iQVhLzrKCbDaLcDiMUCiEgYEBLC0tYXx8vK3j2JWLvFb748zIm94E+P3A8DCoQuHHz/H5QG1vg9reBn7wA2BoCNzqKvjDh4G5OaDJa2hnn3PpNIZ4Htp2zi2KgkarhUGrBYxGVLheeB4sy+6KE60WxkQC0UAAeotl973+SlmJcXISly9fRiGbxdraGgYGBmAwGA5MUEU8IAdv+2rZBwKhmxABQmjI2NgYtFptTbYjEom01aP/4sWL+OIXv7ivfTEajchmsy0/f7/tVZutKdS7y7Vmq/vI8zxSqRT8fj+i0SjsdntNoKy2yerVqGktwSsDAC+88AIcDgfOnj2LgaryItVAUcDMzO6/JQKECgYrn5dMQvPUU8BTTwFmM/jDh3dN7EtLQKOp6S0cy/zODqbkzKpRFLSvGNidRiMmUikYTSbMHj4MnuNQKpVQLBbBMAyKR4/i+WefxcMPP4yFhQVotdqKuSbSf+9nMryaUDoDAtyabXD7Yftq2QcCoZsQAUJoiMFgwNmzZ/HII4/g3nvvFR9/5JFH8HM/93Mtr/Pcc8+JrQQ7pZMSLKA7AqTXAb5QFuT3+8EwDCYnJ8Uhd52sJ/f+KbVWpzAMI87uENY5d+5c3Snk7dLq65MzsOAvXAB77NiuZ+TGjd1MiJAdyudBvfACqBdeAIaHwf7Gb3RcnsVEIhhow0/k3gbKZUCnA+YXmj+Xoig4NRq4IxHgyJHdVsBGIwyvlL7pdDrQ6TQi+Tx+amUFDoejYjJ8PB5HLpcDwzDQ6/V1xUmncxKUFgIHUQQoHXwrvX1A3hIsAkGNEAFCaMr73vc+/PIv/zLOnTuHS5cu4YEHHoDH48Gv//qvAwB+93d/F36/H1/4whcA7HbJWlhYwNraGhiGwRe/+EV8+ctfxpe//OV97UcnbXiB/hUgPM8jnU4jEAggHA5jYGAA8/PzmJiYaJp9UbsAkZN29yudTsPn8yESiWBwcBCHDx/G6OgoHn30UVnumvc6YKl4/QMD4M+dA3/u3G7nrI2NXTGysQG80j2OX1ysER/U9eug8vk9t8UUCkA6DVuLXhgAKOQBpgQYWjy0o1Yrbni9DQOv8bk5ZBMJfPXb38b/99/9OzidzprnCK1IaZoWW5GGw2FxToLRaGwoTpoFe0oHo0qgdAmWknAcp/jfXA0iiEDoJkSAEJrytre9DfF4HH/0R3+EYDCI48eP4+tf/zrm5+cBAMFgEB6PR3w+wzD47d/+bfj9fpjNZqytreFrX/safvqnf3pf+2EwGDr2gMhFN9asDvDL5TLC4TD8fj/y+TycTmdbd+e7IUDkpNfZFI7jEA6H4fP5kMvlarJHwhpy7VevAqemfxeTCfzx4+CPH9/tnLW9DerGDXDHjlU+L5eD5p/+CdRzz0GTz4OiafBOJzAwUCNU6HQa+kIBA1WzS+Rk1GaDLpVCdmcH9qoJ0QAAisLy6dO4/thj+No3voG3/T//T81wNb1ej8HBQQwODlY8Lh3iJoiTZDIJv9+PXC4HjuNgNpsrxInwXakWpkpPA1dy20oH30pvXy37QCB0EyJACHvy7ne/G+9+97vr/uzBBx+s+P8HPvABfOADH5B9HzrNgMgZPHQzA5LJZBAIBBAKhWCxWDAzM4OJiYm2S0a60X64H0uwCoUC/H4/AoEA9Ho9ZmZm4HQ6a46nUtOO93Mcvrq+DlckAlM2i6M0jSLLYthkglWvr309Oh34lRXwKyu1+7G+/uNSrUwG1M2bu522rFbwDgd4hwMYHgY0GuRSKRgZBma7va1SyHawm82whEJIx+P1BQgArU6Hpdtvx3OPP46VK1dw6dKlltbea4hboVCoECexWAw0TSOfz4Pnebz44ouw2+01mROj0di1c0jpLAApwVK+BEvpfSAQugkRIIS+4FYswWJZFplMBolEAtFoFA6HA2fOnKmYIN/JPqq5BKvbszuSySR8Ph9isRhGR0extraG4eHhphdyufarG+KvHo97vaBzOQwVCrgcCODZV5pEGLRaDJtMGDKZar4PmUzQVZUY8XNz4F/9avAuV+UGaBrU1haorS3AaAQcDtAMg2F0V7BpKAoOAL5IBDh8uOHzzFYrKIsF+RZKx1qBoiiYzWaYzWaMVgkfjuPw6KOPYn5+HhRFIZfLIRQKgaZpFAoFaLXaukZ4yyuthOXaPyVQugTroAsQNQxDJBC6CREghL6gXRM60L3BgfvNqtA0Db/fj1AoBI1GA5PJhNtuu60jg2y9/ZOTXgXV7SJ9nULZms/nQ7FYFFsSm7tYLqQUuVIJlEYDDoBNq8WOpBsWw7II0zTCNF3zeycmJvDzkvbYAHCdZWE8eRLM6dMwzMyA1+tBhUJAIvHjzEixCGQyKOZyGJR6jziuaXvfThmzWrHexAci0KszUqPRQKPRYGhoqCZzwrIscrlcReYkkUiApmnRDN9InMjxXu8FB7H8C1BegHRj3hSBoDb641OQcOBp1wMCyD8rQlizk4Cc4zhEIhEEAgGk02lMTEzg1KlTSKfT2NnZkS0gOUgZkFKphPX1dQSDQZhMJszOzsLhcLTdIlnODEi3sej1+PBdd8EdDuPGyy9jdnwcYxYLEvk8koUCksUi2Drn/FBV96oyx+Hh69dRLpXwhNcLndGI8ZkZmOfnYZ2fx2AqhYGdHZjicWgnJsA8/XSF/4NaX99t6Wu3g7fbgTp3+0vlXf97O4dlxGqFNpUCnUphoM7AQym9CqoanRtarRYDAwN12zaXy2VRlORyOWSzWUQiEdA0LZrhG4mTaq/ZQSyDUoMAUDL7oPTfnkDoBUSAEPoCvV4P5pVuPq3Sjbv37a6Zy+UQCAQQDAah1+sxNTWFEydOiF2XstmsagWD3OvJsRbP84jH4wgGg8jn89DpdDh16hTsdrsqLta9yBYZdTqMWywI6HQ4XdUJiuN5ZIpF7BQKSBYKSLzyfaYqSE4VixX7WuI4pIpFpIrF3Qe0WmBsDJqREZweGIAml4P9FRHD5vMo0jS0Gg20mQyoQACwWEQxwuqM8HgoBAMUSmVArwOsVh5zc4B2jyvOkNUKjceDv//85+GORJDNZmG323HkyBGcue22/R+8Dmn33NLpdA3N8KVSqUKcJJNJBAIB0DQtmuEtFouYwYvFYrDb7TCZTD0Nig+6AFF6+wBICRbhloYIEEJf0K4HBOiOAGmlrEsYcOf3+5FMJjE+Po7jx49jaGio5qImd5ZGrSVTwP7u5pVKJQSDQfj9frAsC5vNBovFgrW1NVn2q18yIHuhoSgMmkwY3GNeh1GrxWsXFxHPZnHdbEZBp4OGosBVHQdOowFKJejyeQwMDaFcKKDIMEhwHLSviBWKoqAtFKDd2YFWo4GPdiKUHwXF6WDQ68ED8PkoADwWl5rvfy6bhffKFUQXF/Er73oXRsfGEAoG8fDDD+Pll1/Ghz70IVjqzL/pF6hXprsbDIa6ZvhisSiKk0wmAwC4efOm6HcRWgZXtxLuhhmeeECUFyBq+EwhELoFESCEvkBNHpBGa+bzeQSDQQQCAWg0GkxNTWFtba2pGVXNGQtA/mPY7lrZbBY+nw+hUAgDAwPi5Hefz4dUKiXbfvUj+/m72AwG3DEzg3K5jGsOBzA9jbGZGRTKZeRKJdClEnKlEgrlMsrJJCzlMkx6PbKFAnImEwqzs9AzDIy5HIw0DX2xiDKAEqdHOGWABmmYeBZF/SS0GgomE49olML0FA9DE2105ZlnMKjX4w233YaVQ4dAURRGRkbw/7Pb8YlPfAJf+cpX8Pb/9//FrRiWURQFk8kEk8mE0dFRFItFeL1e3HXXXQB2O7tJMyfCfJN8Pi+a4RtNhu80kD2IBnhh+0SAEAjdhQgQQl9gMBg6KsHqtgdEKAny+/1IJBIYHR3F0aNHMTIy0tLFQ+0CBFBmdkcsFoPP50M6nYbD4cDZs2crau3VerdXFXNA9rGmWa+HWa+HtBfUTb8fQ5LXZdPpMGSxgGFZMDYbsiyLcqGAUiQCS8kEltfCpC2AMxhhtVLQULsWkRy96wlpJECYYhGBYBDHV1exnckgl07D+koJk81mw9GjR/Hss8/i7W9/u+yvvRlKB6PA7o0AQWCMj49X/IxlWeTz+YrJ8Ds7O8jlcigWi9DpdHW9Jlartan3jJRgKbd94bpFSrAItzJEgBD6ArWUYAmiplgsIhAIIBAIAACmpqawuroK0x6lL73YR7UKmr0u6AzDiLM7KIrCzMxMhV+mGrVNaFc6SO0WFrsdSUl5lkmrxfArZVAlhoHb7UbQ7UahWMSFO38SoZIe5ZIRZqsWRtPu7xQKu/6PZp1phZKjEbsdbo4Dx7IVPx8dHcXVq1eRyWR61gVLSVo9v7VaLWw2W91hpeVyuaJLVy6XQzQaRS6XQ6lUqjDDS79bLJYDXYKl9AwOkgEhHASIACH0BWooweJ5HhzHYWtrC+l0GiMjIzh8+DBGR0c7vlOl9pKpXszuSKfT8Pl8iEajGBoawurqKkZHR/ec3SEn/ZYB6SWDo6OIWyxI5XIQpGCJYRCLxXDzxg2UWXbXXM0wSIQ9mJlahc+nBw8eHLeb9SgUKMzMNC+/EsgyDMomEywN5uEIf3ulu2D1iv28Tp1OB7vdXne2EMMwFVmTdDqNYDCIXC4H9hXx99JLL2FwcLBCnJjN5q7fmVdagKhh+wARIIRbGyJACH1BpxkQOUqwGIYRDdAMw2BoaEi2ORNqL8HqVhcslmURiUTg8/mQy+UwOTmJ22+/HdYWDca9zMyokV42G7AODaFstyORycBhsWBnZwd+vx88z8NgMKCcz4OiKDgcDpgtFkxNAsCu5yNH72Y+ZmZ2u2A1Y+CVO/jhRALaEyegrSoPSiQSsFgssNlsPfeAKHGOdPvvu5cZ/vvf/z7GxsbAsiwSiQS8Xi9yuRwAwGw21xjhLRYLTCaTLMdKDQLgVsrA9ONnHOHWhwgQQl/QqQek04u4MFXb7/cjFothcHAQKysrcLlccDqdsg25U3sJlpzrCYJwc3MTgUAABoMB09PTcDqdHc1BUdIcX492LvJK31UXaGWfNRoNTDMziD3zDBwWC4wGA+hXhh1aXyn9WVhcxIDkLvviEjA9xe96PgyNfR9SDCYTnE4nnvN4MD0yUvGzbDaLl156CRcvXmxvsMgtQK+DR8EMT1EUnE5nhfeK4zjRDC9kToT5Jvl8XvSq1BMnBoOh5deitABQw/aJ/4Nwq0MECKEv6JUHpFQqIRQKidmOyclJnD9/HhaLBQDgdrtVm2FQ63o8z2NnZwculwuFQgG5XA5ra2sYHh5WRXceOddSi7BoB6pO+11gN0vl83phs9lgn5hAmOdxjOdhsVrBMAysNhtGR0agbeDRMZhaEx5Sbj93Dt/+p3/Cc9/4BswOB0ZHRxEMhfDwP/wDbDYb3vzmNwPoz+PcLmp4jdXvDakZvhqO42omwwvzTQQzfKPhi/V8XkoLgIO8fQKhFxABQugLOvWAtFKCJfgQ/H4/IpEIBgYGsLCwgPHx8Zqp2moM8NW6XrlcrhBzIyMjKBQKOHHihCz71s8ZEDVTLBSw7XbD43aDYRiMjY1hdXkZOyYTssUiTFotFpeXu7Jtg8WC1QsXkLNY8Dd/8zegaRoDAwM4cuQIzp49WzEDpJceEKX+tv0UBGs0mpbM8ML3WCwGmqZRKpVgMBgqREk2mwXLsmBZtuYzuBconYFQ2gRPIPQCIkAIfYHBYJA9AyIEyIFAAPl8HpOTkzh37lzdC6h0TTUPDlTDerlcDj6fD8FgEBaLBXNzc5iYmEAmk0EymVRsv5qt1Y/IJZooAOVSCZl0Gi6XC36/v+Icj8ViOHr0KEp2O3YSCUxWTVWXk3Q+D93QEP4/v/iLsEi2k9zZke3c6ReUzoDIKbz2MsNLxUk6ncbOzg4YhsEjjzwCk8lUt4VwN83wSmcglBZABEIvIAKE0Bfo9XrZPCCZTAZ+vx/hcBgWiwUzMzNwOBwt3Wnrh65VctLq6xXmofh8PnH6++nTp2G327vSteigd8GSs3Ww027HQ1//OjRTU9AbjeLPhGGaC4uLsA8Owjgzg4TP11UBkikUwFqtMNVpRtCvQnE/KB0E9wLBDD80NCQ+5nK5kEwmcfTo0Qpxkkgk4PP5RA9StRle+L5fM7waBMhBPN8JBwsiQAh9QSceEGlwz7IswuEw/H4/crkcHA4Hzpw5U/eOXDPUkGHo5Xp7USqVEAwG4fP5wHEcpqencezYsYbT39VWNgUc3DkgxWIRDz74IILBIKy5HIJbWxhdXYXRaMTc3BwWFhZgkjRbsE1MIMyyWOviPqXzeRjm5/e8+9vLI61UJkINQajSgwiFyfAjVU0JeJ5HPp+vECeRSET0oNQzwwvfWzHDK33sSQkW4SBABAihLxA8IO1cGCiKQj6fx82bNxEKhWAymTA1NdVx1yVA/XM2hPXkuoA2yyL5fD6Ew2HY7XasrKxgbGysaeCo5rKpXmVAOI5DNBpFNpvF4OCgaMhtp0OQXBiNRlitVmi1WhxaXAS8XlgoCne89rU1LXABYHBsDBGjETTDYLjOenKQLJdhHB3d+4k95qAFg0rPodjr84uiKNEMPzY2VvGzajN8LpdDIBBALpdDoVCAVqttOBleMMMrLUCU3j6B0AuIACH0BcId9XK53HAytgDLsohGo0gmkyiXy3A4HDh16lRFOVCnqD1j0c0SLCF49vl8yGQycDqde3pmGq0l537JsVa3ETJFXq8XADA8PIxQKASaplEoFKDT6cSgSPplsVjqlga2+/rj8TiuXr2KV7/61RWv9+LFiyiVSrh48SIMBgO++JWvILS9jemVlZo1BkZGULRasZPLYaaDY7AXPM9jB4C1zazkrYrSk8iVZD8BeCtmeKk4icfjFWZ4i8Ui/jsUCjV9H3YLuT0gRMwQ1AgRIIS+QBAdDMM0FCC5XA5+vx+hUAh6vR5GoxFTU1NYlrFjT78IEDkzICzLiuZkjUaDmZkZnDx5ck8h2Gjf5EJt5Vz1/pZSQ77NZsOhQ4cwNDQEiqLEoYvlcllsW0rTNDKZDMLhMGiaBsuyYp279EvIcu31mjweD5588kmsr6+D53lMT0/j0KFD4nOWl5exIhEbb7rzTjz86KNIDQ1hsOrOsk6vh9bhQPLll/d7qOpCF4soGgwYHxxs6fkHYRK60oGjWjMgndLMDF8qlURR4nK5wDAMtra2xPehyWSqW9ZlsVhkN4yTDAjhIEAECKEvEILdah8Ix3GIxWLw+/2i+fn48eMYGhrC9evXFTNlK7kesP+gSWhNHAqFkMlkAABHjhzB6Ojovs2dcqB2Q3symYTX60U8HsfExESF36j6HNbpdBgcHMRgVeDN87w49E34EoRJoVAAADz++OM14sRkMmF9fR1PPPEEgsFgxZrPPPNMhQCpfu3nzp1DOBLBvz3/PEx33glj1cBNy8QEIteu7e8ANSBTKKBkMqkyA6LUJHQlBQBw6wmQZuj1egwNDWFoaAjxeBwmkwmHDh0Cz/NgGKaihbAwpDaXy4HneZjN5rrixGw2d/Q6iAeEcBAgAoTQFwgCRJgFks/nEQgEEAwGodFoMD09jbW1tQrzczcM2f3QhhfoPNCvNuvb7XYMDQ3h9OnTsuyb2rIWcq8lCI9CoYDp6WkcPnwYJlOb0/hegaIomM1mmM3mmjr3ZDKJy5cvY3FxURQnPp8PL774Iq5fv45isQiDwQC9Xg+DwYCRkRFcunRpd5J4EzQaDV73Uz+FWDKJFy9fxtE774RGUnpiGxlBVKdDnmFgbtBooFMyhQKo0VEYOjxeBPno5xIsubdPURSMRiOMRmNdM3z1ZPhYLAa32418Pl/hVakWJ0ajseFrJG14CQcBIkD6GJ7n8brXvQ5arRbf/OY3K3726U9/Gr/7u7+Lq1evYm5uTqE9lA9BWHzpS18CTdM4d+4cxsbGcPToUYyMjNT9IO+WAFG7aRxoP4DI5/Pw+/0IBoMwGAxia+JwOIxoNLrv/ZLu2622FsMw8Pv9SKVSyOVyWFxchNPp7GrNuLD25OQkAOBHP/oRnn76aRSLRYyPj6NUKoFhGAwODuLQoUOYmJhAsVjEY489VhEISb+Exgwmkwn3vOENiH/pS9i6ehUrEvFpGx6G12JBgqYxLbMASefz0E9M1P1ZzfncwwBZyS5YSqOkCFCLAGmG9CZBNRzHIZ/PV4gTqe9LMMPXEydKCzACoRcQAdLHUBSFv/3bv8WJEyfw2c9+Fr/2a78GYLeH+u/8zu/gz//8z28J8eH3+/HXf/3XAIA//dM/xbve9S7ccccdMEpmFtRD7o5VQH+YxoHWghee57GzswOfz4d4PI6xsTGxfE1690+NmQY1rJXNZuH1ehEOh8WOVtPT05ienu7K9qRUnzejo6MoFosAdku6jh49igsXLmBhYUF8LsuyYiAkfAnTqMvlsjjwTQiC7rztNnzl+99HyOWCc3ERAKA3GICxMcSTSUwPy9sLa4fnYWljzV4GaAdtEvpBLMGq3v5+MxAajUZ8P1UjfS8K3+PxOHK5HBiGgVarBUVRePHFF2vESacdHAkEtUHO5D5ndnYW/+N//A+85z3vwetf/3osLCzgHe94B1772tfiV37lV5TevX0RCoXwH//jf8TXvvY1vO51r4NOp8O//uu/4ujRoy39vmCglpNuDQ6U+4LbygR4n8+HUqmEqamphqVCB6FzVTtrCQMXvV4vUqkUHA6H2Ans+eef73rQxHEc1tfXkcvlKh53Op04fPgwbDYbzp8/j/Hx8Zrf1Wq1GBgYwEDVIEFpjbvwFY/HUSqVMK7X44lvfxvRs2cxPD4OlmWhHRlBIBDACY4DJVOZCMtxSFEURlTo/1AK4gFRfwakUxq9F4Fdj5jL5UIkEoHZbEY2m0U4HEYul0O5XBbbZ0uzmN0ywxMI3YQIkFuAf//v/z3+7//9v/gP/+E/4C1veQuuXbuGa10yivaSkZERnDlzBv/9v/93LCwswGaztXVR6JcSLEB+c3a99WiaFsusLBYL5ufnMTEx0bRUqBuiQY6Le68zMyzLIhQKwev1olwu1/UctbJOpzAMgxdffBFPPfUUEokEbDYb1tYqRwL+u3/37zo6rs1q3C9dugTHww/j+xsb0DocYBgGBqsVbpqG2+uF2WiETqer+dJqtUAb+5IpFFAym1s3oJPylFsapT0QSgogvV4Pk8kEs9lc0TBCuFEgzWJKzfAcxzWcDN/uwF0CoRcQAXKL8MADD+D48eP4wQ9+gIcffhgTDWqpO+HTn/40/uzP/gzBYBBra2u4//778apXvarh87/3ve/hfe97H370ox9hamoKH/jAB/Drv/7rbW/XYDDgwx/+cMX/GYZp+feJANn9HovF4PP5kEqlajoytbKeGrMWQG86ahWLRfh8Pvj9fphMJszPz8PhcNQNjroRsGQyGVy+fBnPPvss8vm8+HgikajpcNWN7ev1evz8m9+M7Je+hBvb2xg/dAiYmkJybg56isKwzQa2XEapXEaRYZCjaZRfyTpWiBKtdreNr05X99il83mUTCZYVBgoHcRJ6GrIgCiJ0hmYel2wpDcKhqtKFQUzvFScCOWV+XweP/mTP9nyvCYCoVcQAXKLMDExgXe96134p3/6J9x7772yrfvQQw/hve99Lz796U/jzjvvxGc/+1m86U1vwksvvVTXX+JyufDTP/3TeOc734kvfvGL+OEPf4h3v/vdGB8fx1ve8pZ97Yter69pYdoMjUYja8cqQP6yLrkFiLAmwzCIRCLw+/3i/Id6d+xb3T85kSsDIifVxz+dTsPr9SISiWB0dBQnTpyo8Ma0uk4j9lonHA7jqaeewrVr12rOt4WFBZw6dapGgHQLq9WKn33DG7Dz5S/Dv76O0bk5aMbHseP1Ynp0FDAaUWHB5TiwLItSuQyWZVEulUAzDNhMZreES6uFVqeDXhAlWi1S2Sx0Cwt1J7CrgYNmCFaDALmVS7Ba2X47GSCpGX50dLTiZxzH7emXJBCUQJ2f9oSOEO42ysknP/lJvOMd78Cv/uqvAgDuv/9+fPOb38Rf/uVf4uMf/3jN8z/zmc9gbm4O999/PwDg6NGjeOaZZ/CJT3xCFgEitOFthYOYAclkMuB5Hs899xzsdjtWVlYwNja2r3KGXpSHdUI39isajcLr9SKbzWJychIXLlyAxWKRZTutwPM8HnroIayvr1c8rtFocPz4cVy4cAFOp1PsqNMrpqamcM/dd+MvH3oISaMRlpkZxDY36z9Zo4FWo4G2zqBKjuPAlssol0oosywYhkG5XIYnEkHI6cTG+joMRiOMBgOMRiMMr3yvQQUdoroNmYR+sAWIXNvXaDQHTkAT+gMiQAgNYRgGV65cwQc/+MGKx1//+tfj8ccfr/s7TzzxBF7/+tdXPPaGN7wBn/vc51Aqldqeni2l3QzIQREgHMchGo3C5/Mhk8mAoigcO3ZMljI8tZZgyblfgvDY2NgAz/OYnZ3t+qT3RvsuzA0QMJlMuO2223D77bfXlM31Okg8fvw47njhBXzj+ecxf+oUYhSFEstC30a7YY1GA43BsNtNSwKfyeDQsWNwOJ0oFotgGAbJZBJFhkG5VBKDKL/fD6PBgFwuh0KhAI7juuoVUDoToHTgeFAzIEoPAlT69RMIvYAIEEJDYrEYWJaFw+GoeNzhcDS8+xoKheo+v1wuIxaLiXMLOqFdD0g32vB2qwtWJ6VixWIRfr8fgUAAWq0WMzMzOHnyJJ544om6fek73T+5j6Ec68lxcc7lcqJoK5fLPc8W5XI5PPfcczh//nyF2Llw4QI8Hg/Onz+P06dP1y2bUyo4uXDhAryBANxeL2A2Y4emMbFP30axVEJOr4dzdBS2gQHYqjoDsSyLWDSKTDYLvU6HQqGAZDKJa9euVRhvq78MBkNfB3FKe0AOcgCu9PaVFkAEQi8gAoSwJ9UfhHt9ONd7fr3H26WTDEg3PCBKZlV4nkcqlYLP50M0GsXIyEjNMEY1Demrt5aSJVg8z4vTyuPxOMbHx2G1WsWOYPuh1WOVSCRw+fJl3Lx5E6VSCSaTCWfPnhV/7nA48Bu/8RuqDEB0Oh3uunQJAy+/jH976SXEWXbfAiRdKKBkMjXsgKXVaqE3GGDQ6zHxys2NzNQUzp0+jbNnz4qm21wuh1AohGw2i2KxCJ1OV1eYWK1W0q50D0gJlvLbJ+co4VaHCJBbiPvuuw/33XefbOuNjY1Bq9XWZDsikUhNlkPA6XTWfb5Op6sxx7WLTqdThQdECVHDsizC4TB8Ph8KhUJTfwKZ3VELx3Hi8cvn8xWzT5599lnZ9qvRseJ5Hl6vF08//TRu3LgBjuPEzMbly5dx2223VbwmNYoPAcGUfuX557HtduNoC4MXm5HO58FZrTDVGdjWkFcCRGH+QfXck3K5XDHXJJPJIBQKIZfLgWXZhlkTo9FYcewPqg9D6QAc6I9J6Lfq9gmEXkAECKEhBoMBZ8+exSOPPFLRWeuRRx7Bz/3cz9X9nUuXLuFf/uVfKh771re+hXPnzu3L/yHsz63mAdlrzXw+L5ZZGY1GzMzMwOl09mx2ByB/ICRXCVYr6zAMg0AgAJ/PB61Wi9nZWTidzppmDd0K9liWxY0bN/DUU0+JXauEbRkMBpw+fRrnz5/vu2Bjbm4OP3333fjXv/gLZJJJDAwNdbxWJp+HYXGx7WPQ7Pk6nQ6Dg4MYHByseFxoVyoVJ+FwGDRNo1AoQKvVVggSQeDLfdOhVZQ8Lw5yAK50BoKUYBEOAkSAEJryvve9D7/8y7+Mc+fO4dKlS3jggQfg8XjEuR6/+7u/C7/fjy984QsAgF//9V/HX/zFX+B973sf3vnOd+KJJ57A5z73Ofz93//9vvdFr9e37QHpxxIsnuexs7MDn8+HeDyOsbGxltvAyr2P3RpEKAfN1qFpGl6vF6FQCIODgzhy5AhGR0frHj+5LvTV63i9XvzzP/8z0ul0xeMDAwO47bbbcOedd9adPt8qSpfJ3H333Xj2n/8Znq0tHF5bg77DVp9JloVpn9nRVpG2Kx0bG6v4GcuyFcKEpmlEIhEAwPe//32YTKaajInNZqvJmsgF8YAc7O03u8nULkTMENQIESCEprztbW9DPB7HH/3RHyEYDOL48eP4+te/jvn5eQBAMBiEx+MRn7+4uIivf/3r+K3f+i186lOfwtTUFP7n//yf+27BC9yaXbCAHxvby+UygsEg/H4/SqUSpqenxTIhpfaxn0qweJ5HIpGA1+tFMpmEw+HAuXPnWhrA1Q1RNDw8DJqmxf87HA5cuHABKysr0Gg0+xIfaggoRkZGcOjsWeh+8ANE3W44l5ehaTNo4nkeOwBs7fpIuvD6tVot7HZ7RbcxlmXxyCOP4I477kCpVBKFSTQaxfb2NvL5vJg1EaZOC8LEYrHI3hb9oKAGAXCQt08g9ALy6UjYk3e/+91497vfXfdnDz74YM1jr371q2WtqxdQwxyQbnTW4nkebrcbiUQCVqsVCwsLmJiY6LgEQK0CREDuYJ9lWYRCIXi9XpRKJczMzODYsWMtD12U40IfDAbhcrlw8uRJ8TGbzYYTJ04gm83i/PnzmJ+fB0VRKJVKimcv5ICiKMwcPQp6fR2DmQyiXi8cCwttrUEXiygajXCocAK6FJPJBLvdXuNjY1m2Yvq0dAJ1uVyuyJoIAsVms8FkMrU01PIgZ0CURA2vnwgQwq0OESCEvqFdD0g3xIJcATnP84jFYvD5fCiVSmBZFmfOnKmZ9aDkPnZjLUBeD8jm5iYCgQAMBgPm5ubgcDg6Kl3otKPW+vo6nn76aXg8HmQyGRw5cqTiOW984xtv6W42zqkpPGcy4c7paVy+ehWpaBSDVYbwZqQLBZRNJlhULkAaodVqMTAwgIGq1sE8z4NhmAphEo/H4fF4kM/nQVFUww5dasiaKB0AH/Ttd3u+DYGgBpT/pCMQWqRdD0i3OlbtZ02GYcQyK57nMT09jXw+j/n5eVnEh7CPaiybEtbb776l02m4XC5wHIdsNou1tTUMDw93vK/t/l6pVMKLL76Iy5cvI5FIiI8XCgWsr6/j0KFD4mPdCiKkYk7JQMnhcKBktYIym7G2tIRn19dhNJthaqHsDdg1oFPj4zDsVY5Wfc706A55p+cqRVEwGo0wGo0YGRmp+BnHcTVZk3g8DpqmUSqVYDQaYbVaQVEUGIZBNBqF1WqF2Wzu2d+aZCBune2TTApBrRABQugb1FCC1emamUwGPp8P4XAYdru9YuhdKBRSbZmT3Gt1ejEUMkZCpmF8fBwUReHUqVOy7FcrrzGbzeLKlSt49tlnkc/nK342OjqKI0eOVIiPRnRDGCvF2NgYtCMjCCaTOLmwgHQmgxteLxwrK9C20PUuXSjA0OH8lV4GVnJuS6PRwGaz1fUmSbMmkUgELMvi+vXryOVyYtvhelmT/XYYrMetEoCT7RMI6oQIEELf0K4JXekSLI7jEIlE4PP5QNM0nE5nXVO03EJJrSVYAu2sJxjzvV4veJ4Xp72Xy2WxQ9F+aeVC/53vfAfPPPMMWJateHx+fh4XLlzA8vIyXn755bbKZ26FIEOj0cCxsoLQd7+LUxSFY0ePIpvLIbC9DefyMqg9MkA7HAfz8HBrG+vzY9UKBoMBBoMBw8PD0Ol0KBaLuHTpEjiOQz6fr8ia7OzsgKZpMAwDg8FQV5iYzeaOsnBKn5tKb1/pNrhKb59A6AVEgBD6BqPRqHgJViuiplgsirM7tFqtOLuj0V3KgyRAWl0vn8/D5/MhEAjAarVieXkZ4+PjYjBVLpd7muXR6XSi+NBoNDh27BjOnz8Pp9O5r23eCkGGc3oaP+J58DwPvV6Pk2troK9cQczvx/jsbMPfK7MsUhoNxqpmdRBq0Wg0oqioRtqdK5vNIplMwu/3ix3YGmVNmjVpICVYym+feEAItzpEgBD6Bp1Op9o2vDzPI5VKwefzIRqNYmRkBEePHsXIyMieFzK1CxA5abZvwjH0er2IxWIYHx/H6dOna4bJyb1frax19uxZvPDCCzhx4gTOnj1b16/TjfNtL5QOlADA6XTiWasVCZrGqM2GgYEBnDxyBE9fvYp0IgF7lQdCIFMooGQ2w9qJ96nHHhAljnGr55Jer8fQ0BCGqoZB8jxfkTXJZrPw+/3I5XIoFovQ6/V1hYnFYlHFeaW0ADjI2ycQegERIIS+QY0eEJZlEQ6H4fP5UCgUMDk5iQsXLogTlJXYT7VnQKoRStW8Xi/y+TympqZw8eJFmM3mPdeR60K912u02Wz4jd/4DVmHg+0HNQUn4+PjoAYHEUynMfpKeaHT6cSxbBbPb23BaDLBWOf9kCkUwJrNMLdoWK9GTcegW+znNQqeEYvFgvGqzmSlUkk0wmezWaRSKQQCAeRyOfA8L3YcvH79ek3WpBfHXekAXOntkxIswkGACBBC36AWD4hQjy2UWZlMJkxPT8PpdHYUoKpZgADyl2MI65VKJfj9fvh8Pmi1WszOzsLpdPbcR9Hq7+/1tz2oAYNOp8PEygrCP/whjkseX1peRjqTwYbbXdeUns7noV1YgFYFbWcboWQpUjeDYL1ej8HBwZrsopA1CQaD2N7eBsuyCAaDoGkaxWIROp2uYftgOUuGlBYASpdAKb19AqEXqPeTn0Cowmg0IplMtvx8uT0gPM8jnU6DYRg8+eSTGB8fx8mTJzE4OLjvO5VqFSByZxooikI+n0cgEEAoFILdbsfq6irGxsbaWl/u4KQbk9APEo7paaxXGfQ1FIW1Y8eQvXIFkVcmpUuN5GmGganFDljVx/Wgir1uI2RN7HY7DAYD1tbWxJ+Vy+UKE3wmk0EoFEIulwPLsjCbzXWFidFobPvvpQYBcqtsn7xXCGqFCBBC39BJCRaw/w9zoROT3+8HwzCgKAqXLl2C0WjseM3q/bzVBQjP89jZ2UG5XMZLL70Eh8OBs2fP1gxw62Td/dKPF3o5hzrKgdPpxIsmE1L5PAYlpXNGoxGn1tbwxLPPIh4MYnRqSvxZAujM/6EASnlAlAweq7et0+kaZk0KhUKFOAmHw6BpGoVCAVqttkKQ2Gw20WvSKKuodOYJONgeFAKhFxABQugbOinBAjr/MBdMm6FQCFarFQsLC7BYLHj++edlEx9Ab3wW+12r0/0TPDJer1cUb2trazU16Z3ul1yoJZBXO43OVYfDAQwOIphKVQgQABgcHMSJw4dx+aWXkLVYYBsaQqFUAq3TYaoNAULCsd7RzmcmRVEwm80wm80YGxur+BnLshXCRJhvQtM0WJaFyWSqESZWq1VRD4QaBAiZhE44CBABQugbDAZDRxmQdj7MOY5DPB6Hz+dDKpXCxMQEzpw5I3Y9omlaNcMNe7FepxdhoRWx3++HwWDA7OwsHA4HnnrqqbY8HnuhpgwIcHCFjMFgwOjiIkLPPIMjdVoTT09PI53J4JrHA4PJhAzDoGw2w9JpC94D0gVL6SB8v2i1Wtjt9pqucTzPo1gs1hUmwpDPl156CXa7vSZrIufnRz3UIEBIBoRwECAChNA36PX6tueAAK1dTBmGQSAQgN/vBwDMzMxgbW2tple+mqar92K9djMgmUwGXq8XkUgEw8PDWFtbw/DwsLiOXPumxgyImlu19gLn3BzcTz7Z8OeHDx1Chqax7XYjZ7eDGxyEqY1ucdWQAK27dPP4UhQFk8kEk8mE0dHRip+xLIvvfe97mJqaAkVRoGkasVgMNE2jXC5XZE2kXyaTSdaOeESAEAjdhQgQQt/QbglWK8FzOp2Gz+dDJBLB4OAgDh8+jNHR0YYZk24JEDnN8r2eXs7zPGKxGLxeL9LpNCYnJ3H77bfXHZomt99CbcJhr/0RvDDxeBx2ux02mw02m61to64agxOn04kfGQzIFouw1SlR1Gq1OHHsGOgrV/ADjweG175Wla9DLSidAVFq21qtFhRFYXR0FMPDwxX7xDBMRdYkFovB7XYjl8tVDGus/monayJ8FitdgkXeG4RbHSJACH1DuyZ0qQdEijB3wufzgaZpOJ3OhgFzNUJwL3eXkn7MgAjmfJ/PB47jMD09jRMnTjSc+C6gxhbB3c4kCOecx+NBoVDA6OioGDzl83lotdqKGnhpyUm/1II7nU5gcBChdBorDTw+ZrMZJ48exTc9HmRyuR7vYfuoKcPUS9Twuqs/XymKgtFohNFoxEjVcEuO48S5JsJXPB4HTdMolUowGo11hYnZbK7ZjloyIP3yvicQOoUIEELfIAzHahWpBwQACoWCWGal1+sxPT2NycnJtu6Oyd2WVlizlxmLdqgnQPL5PHw+H4LBIMxmMxYXFzExMdHSBVONJVjd7IIliDSv1wsAmJubEw34wuwElmWRy+WQzWaRzWbF9qaC38hisYiCRPheXRqoBkwmE4bm5hC6erWhAAGA4eFhDE1PI5xOYycSwXCLrXil9DpAPogeEKUD8Ha2r9FoxGxiNdVZk0QiAa/Xi1wuJ7YdlooS4QZKP71+AqEfIQKE0De06wERSKVS2NzcRDQaxejoKI4dO4aRkZGOPuAbZVX2Q79kQFKpFDweD2KxGMbGxjqagaJG70Y31mEYBl6vF36/H2azGcvLyxgfH4dGo0G5XAYrmZmh1WoxMDBQ05JYGAqXzWbFidWJREK8qwsAzz77LAYGBmrEiVLBi3NhAcErV5o+J10oYGRuDncfO4YrL7wA8x13wNRC9rEaEqB1l1slADcYDDAYDBXlXADEgbJScbKzs4NsNgsAePTRRxtmTbqdnZCzBIu8TwhqhQgQQt/QTgkWy7IIhUIAgBs3bmB6ehoXL16EuapFaLt0Y/6C3AJEzgnwwjovvvgi8vk8pqam9n0cb+UMCMMwuH79OkKhEIaHh3HixAkMDQ11tA3h7qylyqjN8zxyuRx+8IMfYHx8HIVCAeFwGFtbWygUCtDr9TVtTW02W91yE7lxOp24rtMhzzAwN8jSxGkalNWKn73nHrBf/Sqef+YZHLnzzrYmovcqqFJ6HkW/d8Haz/a7/dqlnhEpuVwO3//+93HmzBlRmCSTSfj9ftA0DQA1WRPhS67MJCnBIhwEiAAh9A2tmNBzuRz8fj+CwSBMJhM0Gg1OnTqFoaEhWfahGwJETsEgsN/1SqUSAoEAfD4fAGBsbAxzc3P7boEpdwmWWjIgyWQS0WgU+XweTqcT586dq1sOIgdCLTyw261N6rmRTqvOZrNIJpPw+XxiuUm1x8RmszUdCNcuUh/IYtVMCIGdXA7mmRkMDg7inje+EYl/+AdsvfACDp09K8s+dIOD1uFM6RIgpcWXRqPB8PBw3axJoVAQs5I0TcPv9yOXy6FYLIriv/qrXS+X0sefQOgFRIAQ+gaDwVC3BIvneSQSCfh8PiQSCYyPj4vlQY899pisd5L6IQOyn/Vomhb9HXa7HYcPH8bVq1fhdDpl6b+vxhKsTvdJ6P7l8XiQzWZhsVjgdDpx7Nixfe9TpzSaVi016QrBk3QgnPSOrlSc7NVQoBqr1Qrb1BRC6+sNBUgil8PIzAwAYHR0FD/7Uz+FL37lKwi6XJhcXGy49kEMyNQ0Cb2XqFV8aTSaullJYPemjbScK5VKIRAIIJfLged5mM3mhlmT6u2RLliEgwARIIS+oToDUiqVEAqF4PP5wLIspqamcOTIkYop5d2aMq7mtrntrie0hvV6vdjZ2cHExATOnj0rehLkztAoPSRxvwjlfV6vF+VyGbOzszh16hTcbndbXdrkoNVjKTXpOhyOit8vFosVPpNAIACaplEsFmEwGCpEiSBYmgVpzqUlhK5ebbgvCZ7HvEScrKys4A2XLuHLP/gBrHY77FVzIZRE6VIkpVD6DrzSGZBOtq3X6zE0NFSTbRe8XFJxEgwGxfeYTqerESVCp0UC4VaGCBBC3yB4QC5fvozcKy08bTZb0y5M3ZixAcifAZF7H1tZj2VZhMNheL1eMAxTV8AJ68kpGtS2VqvrlEol+P1+eL1eGAwGzM/Pw+FwVJx3rawjR2Alp29FGAg3VpWxKJVKFaUm8XgcyWQSpVIJ3/72t2uyJUKpyeTkJDY0GjDlMgxVWbMSyyKj0dS0Ub1w4QLC0Sgefe45HL7rLhhMpuY73sPgrN8CYbm2rSRKv3a5PWZC1mS8qjuctGSSpmmxAx4APPbYYw2zJu3ODSIQ1AgRIIS+oFwu44knnsD29jbe9KY34fd///fxjne8o6ZzUDXd8FfIvWavMyAMw8Dn88Hv98NgMGBmZgZOp7OhD0Dui7EasynNyOfz8Hq9CAaDGBgYwNGjRzE6OnrLBwB6vb6mDt7tdiMajWJ1dVUUJ9Vtg3meRzCXwzWXC0vj4+LsBo1GgwRNA1ZrTW29RqPB63/qpxDb2cFLzzyDI3fcsWfp5K1+/JVGafFzqwiQZtQrmeQ4Dt/61rdw6dKlirKucDgMmqZRKBSg0+kq2nNLvSZy+bkIhG5DBAhB1USjUTzwwAP4zGc+A5ZlYTKZcOXKlYoykmZ0a3J5PwqQTCYDr9eLSCSCoaGhltsRd+MYyoGcWYB6GaNMJiMG3OPj4zhz5gzsdnvTddR4nOSEoihQFNW0bTBN07j57LMIeTwY1ulQLBbBsiz0ej082SyiVisymQwoioLNZhNr4C0WC372jW9E4uGHsX3tGpZOnlToVaqDWykL0O62AeUEiNL+C+GzyGw2Y3BwsCYzWS6XK4YuZrNZUZwI10hpVnJ8fFy2JiwEgpwQAUJQNU8//TS+973v4VOf+hTGx8fx8z//8y2LD4AIEJ7nEY/H4fF4kE6n25r6LkVtZVMC3egelkgk4PF4kEqlZGk73A3UePdfWmqyduEC8rEYFl8xlbMsi0KxiK0bN2AZG0M8Hofb7Rbv5kpLue44dQpffewxRIaGMDE3p+hrutUFZSOU9oAAByMD0mj7ABpmAHU6Hex2e83NEMHPJS3pikQiMBgMRIAQVAkRIARV8zM/8zP4mZ/5GQDAc88917bJV6PRyOqvAPpDgHAcB5/PB6/XC5ZlMTMzg+PHj3fUp16Nvg1hLbnW4ThOnFheLBYxMzODtbW1to7XQWvV2ozJyUk8pdGgzLLQabXQarWwWiwoG41YO3cO586dA1C/bTAAjGq1ePqb38TUuXMYHhsDy7K7Iiafh9Fo7OnrPoiBsNJdqICDedyF7QPtv36pn2tU0shBju6FBEI3IGcmoSN2dnbwm7/5m/jKV74CAHjzm9+MP//zP296p+VXfuVX8PnPf77isQsXLuDJJ59saZsGg2HPOSDVdCsDotYuWIVCAYlEAqlUCvl8vqlBX4n9U1sb3nK5jHQ6jXQ6jZ2dHczNzTX1w3R7f24VnE4nuIEBRDIZTEk+ExIAjlcFR/XaBp8/fx4PPfwwfrC5iXGHAwzDgGEYuFwucByHgN+PGzduwG63V9TByzUITuAg/z2VFj8HVYAI1xalM1AEQrchAoTQEb/4i78In8+Hb3zjGwCAd73rXfjlX/5l/Mu//EvT33vjG9+Iv/3bvxX/307AoNfr684BacZBKcFKpVLwer2IRqOwWCwYHBzEmTNnZOu4pMayqf28tmKxCK/Xi0AgAI1GA7vdjtOnT/f0on8rB7fDw8MwjI0hFA6LAoQuFlE0GGoM6PUwGAz4+Z/9WWS/9CVsbG9jbGVFzEyVy2UwXi+GhoZ2xUiTtsHCv00mU8d/24MYCB/0DIiSU8iVfv0EQq8gAoTQNi+//DK+8Y1v4Mknn8SFCxcAAH/1V3+FS5cu4caNG1hdXW34u0ajcXdacge0Mgm9GrmzFcKaahAgHMchGo3C6/WCpmnRrxCLxZBMJmUtUVJrCVa7a9E0DY/Hg3A4jJGREZw8eRLxeBwMw+z7eJESrB9DURScKysIbW2JjyVyOcBqrWnB24iBgQH87BvegL/7v/8XgY0NjM7OAhQFnV4Ps9lcM/RR6BgkdOcSvE+5XG63BKzBFHglg81mKC0ClBY/B1H4SbdPBAjhVocIEELbPPHEExgcHBTFBwBcvHgRg4ODePzxx5sKkEcffRQTExMYGhrCq1/9anz0ox/FxMRES9vV6/XgOA4cx7UcNNyKbXhLpRICgQB8Ph8oisLMzAympqbEWt9uDV+Ua61eZ1N4nkcymYTH48HOzg4cDkeFEX9nZ6en+yMH/RCcOKem8Bwgvl8TNA3dyAhsNlvLa8zMzOCnf+In8JkvfQlJoxEzs7MNn9toEBzHcRU+k2w2W9E2uHoKvCBQ1FA7fxAnoR90AaJ0Fy4CoVco/wlL6DtCoVBd0TAxMSEOUarHm970Jrz1rW/F/Pw8XC4X/uAP/gA/+ZM/iStXrtQMv6uHUK5VKpVaej5wa5Vg5XI5eL1ehEIh2Gw2HDp0COPj4zUXq268ZjWUTbW7Fs/ziEaj4l3w6enpuoMWhecS5MXhcKBktSJG05gYGECCpjFy8mTb58CpU6dw8YUX8O1r15A7fBiWPWb/VKPRaPZsGyyIE5/Ph2w2K37GmEwmcBwHj8dzoIbAqSEDohRKCxClS8AIhF5BBAhB5L777sNHPvKRps+5fPkygPrB314f3G9729vEfx8/fhznzp3D/Pw8vva1r+EXfuEX9tw/vV4PYHeQ3q0mQBqViQl3771eL+LxOCYmJvacRyH8npz7p0YPSKO1WJYVO1pxHIfZ2dmKDFG3OAhzQNphbGwM2pERBJPJXQHCshhvMdtZzYXz5xEIh7F15QqO3nWXLJPQm02oZhgG2WwW8Xgc6XQakUgE2WxWbBvcaAq8nIHrQRUBBz0D0o1J7ASCGiEChCDynve8B29/+9ubPmdhYQEvvvgiwuFwzc+i0WhbMzomJycxPz+P9fX1lp4vCJB2fCDdasPb7S5YHMchHA7D6/WiUChgenoaq6urLQkvtXhUer0WwzDw+/3w+XwwGo0tdwDrxwu0sM9qFjwajQbOQ4cQ+rd/wwmOQ4qisNqi/6Mag8GAV126hGdfegmbzz0HoLt/N4PBgJGREej1erjdbrFtMMuyFT6TVColmuAB1DXAW63WjrqqKf23VVr8EAFCINzaEAFCEBkbG6uZulqPS5cuIZVK4emnn8b58+cBAE899RRSqRTuuOOOlrcXj8fh9XoxOTnZ0vMFAdLOLJB+yYAI6wlBtN/vh06nw+zsbNttYQ+KB0TYL6E0LRgMYnBwsOUJ71Lk2CcSNNTimJrCj3geyXwerNncUgesRgwMDOBnX/c6fPGf/xmhVwL+XqPVausOgeM4TiznEsRJLBYDTdMol8swm811syZ7dQE8iEG40gG40h4MpbdPIPQKIkAIbXP06FG88Y1vxDvf+U589rOfBbDbhveee+6pMKAfOXIEH//4x3Hvvfcim83ivvvuw1ve8hZMTk5ie3sbH/rQhzA2NoZ77723pe12kgHpFwFSLpfx8ssvIxwOY2hoCEePHm07iO7m/il9N7YeHMfB5XIhlUphYmICZ8+eranzbwW5y2YIP8bpdOJZqxWb0WhbHbCqEY7r4uIi3njnnfj6Y4/JuZtNt9vK+aHRaMSsh9QfJ51OLQiTUCiEbDaLYrEIvV5fI0qEtsFKcpAFiBq2TzwghIMAESCEjvhf/+t/4Td/8zfx+te/HsDuIMK/+Iu/qHjOjRs3kEqlAOzeObx69Sq+8IUvIJlMYnJyEnfffTceeuihloNGjUYDrVbb1iyQbrThlasLFs/ziMfj2N7eBk3TsNvtOHfuXFtdguqhdhP6ftYSjpnH40GxWMTAwAAuXrwIs9ms2D5J1yFUMj4+DmpwENdv3IDlwoWWvVv1EI7vuXPnwDBMy5lTJWk0nRr4cdtgQZwkEgl4PB7k83nxs06n02Fzc1MUN1artSfBqdJCWmkBcJC3TyD0CiJACB0xMjKCL37xi02fI72Imc1mfPOb39z3dvV6fVslWN1ow7vfgFUwSft8PpTLZbEs5ejRo6rYv26ut5+ZJ6FQCF6vF6VSCTMzM2AYBtPT0/sSH3LT68BN6UBxL3Q6HSZWVhB56SVMT0/LsiZFUbjzzjtlWWsvunl892obfOPGDZRKJWSzWYTDYdA0DY7jYDaba7ImVqtVzBDLBcmAKAMpwSIcFIgAIfQV7Q4jVFMJVqFQgM/nQyAQgMlkwvz8PBwOBxKJBLLZrOL714v12r2wlstl+P1+eL3eGk9MOByWLXOh9kC+Hv0SpDhnZhAeG8NwVQagX+j1cRbaBlutVlAUhSNHjgDYDYwLhYJYyiW0DaZpWuwMWM9n0knbYKW7YCktQJSehE5KsAgHASJACH2FwWBouwSrGwKknbKudDoNj8eDaDSK0dFRnDhxAkNDQ+JFVs2mcWG9XrfhLRQK8Hq9CAQCsNlsWF1dxdjYWMVrU1sArrb9UQtOpxPPT0527P84qFQH4hRFwWw2w2w2120bLPWZRKNRbG9vI5/Pi22Dqwctms3mhoGukkGwGgTIQd4+gdAriAAh9BXtZkA0Gk1bJVut0EpAznEcYrEYvF4vstksJicnceHCBVgslo7Wk3v/2l1PzrWa7Vs2m4XH40EkEsHo6ChOnz6NwcHBhs9XWwakHzMp7dLua3Q6nTh6/jxmZma6tEe3Lq2+9wwGAwwGQ02Xseq2wel0uqZtcHXWRPiMIiVYt8b2iZghqBUiQAh9RbsekG6Y0JsFrOVyGYFAAD6fDzzPY3Z2FidPnmxan90PAqSbJVg8z2NnZwcejwfJZBJOpxPnz5+vK9b2Wuug0WvB08kx1+l0PfNsyI3Sweh+adQ2mOd55HK5ChO8tG2wVquFwWAAx3EV4mSvtsFyoLSIV/pvznEcKcEiHAiIACH0FWrwgNQztudyOfh8PgSDQdhsNqysrGBsbKylC4ncRnk1d8GSrsVxHKLRqNj5Z2ZmBseOHWsryFFTBqTXQUs/B8aEvelmIExRlJj9qN4mwzC4evUqeJ4Hz/MN2wZLMydms1m2fVVaABz07RMIvYIIEEJfoRYPiHBxTiaT8Hq9iMfjmJiYwJkzZ2ruNvZ6H9W8njDzxOv1wuv1AgBmZ2cxNTXV9rRoNV6klb57S7h1UOJcoigKRqMRJpMJRqMRhw4dEn9WLpfFbEk2m8XOzg58Ph9yuZwoaOp152r3br7SAfhB3z6B0CuIACH0FTqdrm0PiNwlWACQyWRw+fJlFAoFTE1N4fDhwx0PD1OzYJBzPYZhkEqlkE6nYbPZsLy8jPHx8Y7LDdTm3SBBQ/dQStgpLSjV5MPQ6XQYHBys8WRxHIdcLif6TGiaRiQSAU3TYFkWFoulrjhpVJaqdACudBtcUoJFOCgQAULoKzrxgMgVRDAMA7/fj3A4DI1Gg6WlJUxOTrZ9576b+9it9fZDLpeDx+NBKBSCwWDAyMgITp48KctFXm3CoZcBa7+2D+43DqKwbEcEaDQasbtW9RqFQqHCBO/3+xu2DRb+rbQAUFoAKb19AqFXEAFC6CsMBkPPPSDZbBZerxfhcBiDg4MYHh6G2WyWratPPwiQTrJIqVQKHo8HsVgMDocD586dQyQSQbFYlOUC28/CgdA+B+24KRmIyiXshbbBY2NjFT8T2gZLDfBC22Dh7v+LL75YIU4sFkvPpsATAUIgdB8iQAh9hV6vb8sD0mkJFs/zSCQS8Hg8SKVSYgBts9mwvr6uasEAKFuyEovF4PF4kM1mMTU1hUuXLonladFotOczRfZCrot9q+2Zg8EgQqEQzGazOHBOaH9KSi/UhdID+ZSkm0Fws7bBXq8X29vbMJvNSKfTCAaDoGkaPM+LYqQ6c6LTyRfKKD0IUOkMEIHQK4gAIfQV3S7BYlkWoVAIXq8XpVIJMzMzWFtbq+jMJPdskX7IgOy1HsuyCIfD8Hg8KJfLLbUf7sV+tUq3gz2WZREIBODxeKDRaMRp7tlsFqFQqCLAEspZhC8iTJRFyWBQTR6QXqDVamE2m2EwGCoM8DzPI5/PV0yBTyQSyGazKJfLMJlMdX0mBoOhoynwSmdA5Hy/EzFDUCtEgBD6im614S0Wi/D5fPD7/TCZTJifn4fD4ah7IehWgC/Xha+XAqRUKsHv98Pn80Gv12Nubg5Op7PhBbTbM0XUto5wfLxer9hVaHR0FOVyGRaLRfQPSQMs4Usw8nIcB4vFUiNMhHOGcGtyULMv9T4HKYqCxWKpmQ0ktA2WGuDD4TC2trZQKBSg1+vrCpNmbYOVzoAoLYAIhF5BBAihr2jXA7LXjI10Og2v1ytO3j5x4gSGhoaaXgDkHm4o98WmFwIkn8/D5/MhEAhgYGAAR44cwejo6J6vRe59U1sGRFiHYRh4vV74fD4MDAzg2LFjGBkZaXjuSAOsiYmJivWq7/zGYjFks1lwHIdnn30Wdru9InNitVr33RiBsIvSAu+gZl9aRWgbbDQaMTo6WvEzadtgmqaRTCZr2gbXmwKvtABQevsEQq8gAoTQV7TrAakX8PE8j2g0Cq/Xi2w2C6fTiQsXLuw5eVu6Zje6TKk5AyKQyWTg8XgQiUQwNjbW9twTOS+sasuAALv12zdv3kQgEMDw8DBOnTqFoaGhus9t5W/U7M7vt7/9bSwuLoJlWWSzWcTjcXGSdXXGRAiw+lWYKCkE+iEQ78a2+738a6+2wVJxIm0brNVqYTKZUC6XK9473Swnrd4/UnJJOAgQAULoK/bjASmXywgEAvD5fOB5HjMzMx35FLopQOReT64gIpfL4bnnnkMqlcLk5GRbgq0aOV+nWiah0zSNQCCATCYDs9mMs2fPYmBgYN/71giKokBRFIaHhyu2w/M8isViRSmX0BCgXC7DbDbXlHLJbeIlyAcRP/IjbRvscDgqtlssFvHiiy9Cq9WKvq1sNguGYWAwGGpaBttsNhiNRtk78qnx5gqBIDfkqkPoKzppw8uyLNbX1xEIBGC1Wvc9AG+vsq52UasA4TgOkUgEkUgELMtibm6uxpDfyb4pXdYiJ+l0Gm63G/F4XCyFOn78eE+2Xe9vS1EUTCYTTCZTRetTIbiSTrL2+XzIZrMolUowmUw1wsRms9UVJkr9/ZQIppQOxJWk3zMg7SK8dwwGAwYHB7G4uCj+rFQqVZRBxuNxeDwe5HI5aLXauj6TTptHkBIswkGBCBBCX9FqCRbP80ilUtje3kahUECxWMTp06dr0vGd0E8ZkE4QMkVer1eslbZYLFhaWpJl3/o9A8LzPJLJJLa3t5FKpTA9PY2LFy8inU7D4/Hse3/aodX9lgoTaa281MQrBFjSu76CMBECq3w+L6v/idCcgyYClN52o+3r9XoMDw/XbRssnQKfyWQqutoJpZDVfpNmGUeO40hGknAgIGc5oa/YqwRLuGvv9XqRz+cxMjICg8Eg613pfhEg7SLtBGY2m3Ho0CGMj49jc3MTLMvKsm9y08u7xDzPIx6PY3t7G7lcrqZFczqdVvyudbs0M/FKhUk2m0UwGEQ6nUa5XMZ3v/vduqVc+8mOqZWDeDf6IAuQduZwaLVaDAwM1JRbCs0jpD6TRCIBmqbFjGO9KfAGg0HxLlwEQq8gAoTQVzRqw8swjOjv0Gq1mJ2dhdPpFLufyEm3umAplQGhaRoejwfhcBjDw8M1ncDkNo4rLbTq0WyfBFHrdrtRKpUwOzuL6enpW/4upcFgwMjICEZGRsTHBIF6+PBhUZiEQiFks1kUi0WxTr76q1+FidIlWAdR/ADKij45jru0ecT4+HjF2sIUeKkBPpvNim2DhZsCOp1OFCbN2gYTCP3KrX0FJdxyGAwGFAoF8f80TcPr9SIUCsFut9e0g5XbrwF0LwMil6hpRYAIJWoejweJRAIOhwO33347rFZr3fXUVjYl0M1J6MLUcrfbDQCYn58XBwi2s043USJA1mg0dctRquvkI5GIOI/BYDDUHbLYyaC4XkOM4Adn293evjTjKBX2wI/bBr/88sugKArJZBJ+vx80TVe0DZa+j6SzhAiEfoMIEEJfYTAYkEql8NWvfhWTk5PIZDKYmJho2HVI7myFsKaaRU0zASK0IPZ4PKBpGtPT01hdXYXRaGy6phoFiJxrSdcRPDAejwd6vR5LS0uYmJhoqSyil0Gj2gL3RnXy5XK5opQrFothe3sb+Xweer2+plVwNzoL9SsHUQTcygKkGULbYJPJVGGCl7YNrp4FxLKs2NmuuqSrX7OOhIMDESCEviGfz+Pq1av4/ve/jy9/+cv4whe+gDvuuKNp8NwNsaD2rEo9AcKyLEKhEDweDziOw+zsLKamploqI1Jr5yq5W1WWSiVxeKDFYsHq6irGxsZa3g4JmOuj0+kwNDRUMw9FOiiuurOQTqeryJTkcjlx8vtBOc5KZ0CU3LbSAkRNk9ClbYOrnye03BbESSAQAE3TYjmkcHOOQFAjRIAQVE8wGMSnP/1pfOYzn4FGo8Hq6iq++tWv1i0Xqkbt2YpursnzPEqlEnw+H3w+HwwGAxYWFuBwONq6wKo1awHIEyiVSiUUi0U8/vjjsNvtOH78OIaHhw9MoKsUjQbFsSxbIUwSiQR2dnZQKpUQjUbrekxMJlNX/l5KC28yCV2Z7feDCb5Ry21g9zNN6MRFIKgVIkAIqufjH/84tra28Pd///e4fPkynn/++ZbEB/DjbIXcw53ULECE17m1tYVIJILBwUEcO3YMIyMjHR0DtQqQ/f49c7kcPB4PgsEgNBpN21Pd69HrEqxbMcDQarWw2+0Vf4ubN2+iWCxiYWEBmUxGbC7h8/mQy+XEu8TVPhM5zLsHMRAnJVj9vX29Xo+hoSHSTYugaogAIaie+++/X/wgfeGFF1qaAyLQjangai7rks6iKJVKskzklrsLlpx0csyy2Szcbjei0SgmJiZw+PBheDyefYsPkjHpLhqNpm7LU47jKjImqVRKLEWhKKpuu2CLxdIXfy8ifg7m9olwIBwEiAAhdMxHP/pRfO1rX8Pzzz8Pg8HQUrtbnufxkY98BA888AB2dnZw4cIFfOpTn8La2lrD35F+GO81B6QauVvcCmuqKQPC8zwSiQTcbjfS6TSmpqZAURRWVlZazhR1a9/qoVQ2RRhMubOzg8nJSVy4cAFmsxk7Ozuy7A+gfPnIQaSZMBGGxGWzWaTT6QphUp0tqTe9WulAXElIBkQZ2plDQiD0M0SAEDqGYRi89a1vxaVLl/C5z32upd/50z/9U3zyk5/Egw8+iMOHD+NP/uRP8LrXvQ43btxo6U59ozkgjRCCCbkFiBo6a3Ech3A4DI/HA4ZhMDMzgxMnTkCv1yMYDN4SomGvtfZCKs4ymQymp6dx5MiRmsYFSgd7BPlpZN6VdhWSzjIRaualwoRlWXAcB47jFLkrfVBFwEEWIEpvn0DoFUSAEDrmIx/5CADgwQcfbOn5PM/j/vvvx+/93u/hF37hFwAAn//85+FwOPC///f/xq/92q/tuYbBYGhLgMg9YwNQvgtWuVyG3++vGboo7Qd/q/o2qmm0X0K7YbfbjUKhUCHOurVPvQ4ablUPSLeRChOHwyE+zvN8jTDZ2dlBPp/HI488UtHmVJo16ZYwOag+DKUzAEpvn5RgEQ4KRIAQeobL5UIoFMLrX/968TGj0YhXv/rVePzxx1sSIHq9vmMPiFwoVYJVLBbh9Xrh9/thtVpx+PDhhm1i1SpAAPknvksRskJutxssy2Jubg5TU1NNh3V1a55IPTiOA8uyAHY9OsLzNRoNKIoigYeCSIe9TUxMAABCoRA2Nzdx5syZmlkm2WwWHMfBYrFUCJKBgQEyIG6fKC0ADvL2CYReQQQIoWeEQiEAqLjrKPxfmDa9FwfRA5LNZuHxeBCJRDAyMoJTp07VzFTo5j72w1osy4rDAzUajTi1vJcBfbOgQSjjEe6uCsEpy7IVx0NYQ/g5ESa7KJnp0Wg0sFgssFgsojAR9qlQKNQVJizLVggTqUBpVZgo7T85iNkXYftKvt+UzsAQCL2CCBBCBffdd59YWtWIy5cv49y5cx1vo/rDtZ0LTrseEIqiZPds9EKA8DyPZDIJj8eDnZ0dOBwO3H777S2bytXauUruCyvHcdje3obX64XRaMShQ4cwPj7e9na6lQGpJzx0Ol1FgCOcm8J3nudrRLZwHgu/d9AFiRqgKApmsxlmsxnj4+Pi49IBccKXx+NBNptFuVyGxWKpa4CvNxT0IIoApcsK1bB9ud7fRMgQ1AwRIIQK3vOe9+Dtb3970+csLCx0tLbT6QSwmwmZnJwUH49EIjVZkUYYDIa2SrAA+QVDNwUIx3GIRqPweDzI5/MNTdOtrCen6FJbCRbDMEilUshkMrDb7fuecyI3QqmVEMjVEx4CjURFtTARhAzP84hEImAYRhyiKGRKqoXKrUS/BFONBsRVCxOapuHz+ZDNZlEqlWA2mys8JqVSSfZmF62idPZFyfI1pTMgSmeACIReQQQIoYKxsbGaqapysbi4CKfTiUceeQRnzpwBsBtIfu9738N//a//taU12i3BArojQLoRGMRiMayvr4PneczNzWFycrLuXdFW6IeyqU7I5/Pwer0IBAIwGAwYHR3FyZMn971fcrw+4bUJ3o69hMdeVAsTjuMQDAbhcrkAAIcPH4bdbheFSfW+CEJEbmGi9B3iXiL350YjYcIwTEXGxO/3I5fL4erVq1hfX6/JlthstroNFeTkIGdADrIJnkDoFUSAEDrG4/EgkUjA4/GAZVk8//zzAICVlRWx9eWRI0fw8Y9/HPfeey8oisJ73/tefOxjH8OhQ4dw6NAhfOxjH4PFYsEv/uIvtrTNdkuwAPm7VskZkDMMU3EXdGlpCRMTE/sOFOUum1JagNA0DbfbjUgkgrGxMZw9exaRSKRtMdpon/aLkPEolUrY2NiAzWbDwMAA7Hb7vv+WHMchEAjA5XJBo9FgaWmprr+lWcZEeI37FSYHMTDq9mumKApGoxFGoxGjo6Pi448//jjm5uZgsVhEYRIIBJDNZsEwDIxGY43HRC5honQJltIeEKW3fytmMAmEaogAIXTMhz/8YXz+858X/y9kNb773e/iNa95DQDgxo0bSKVS4nM+8IEPIJ/P493vfrc4iPBb3/pWy9O6OxEgcmcspLNFOr1Q5XI5eL1eBINBDA0NwWKxYG5uTixT2y9qEA2N1mqHdDoNt9uNeDwOh8OB8+fPw2KxANgt3etV96pGcBwniiCbzYZDhw4hl8uJwrxYLMJgMNTcvbbZbHtmtwRj/fb2NrRaLVZWVuB0Ohsew05KuQQBAqBrGZN+Rum78Xq9HiMjIxgZGal4nGGYmjkm2WwWxWIRRqOxxmNis9lgMBha3q7SJVhKC4CDvH0CoVcQAULomAcffHDPGSDVFzKKonDffffhvvvu62ibavGAAJ1dKFKpFDweD2KxGCYmJnD27FkMDAzgueeek23/hH3st9kd0p8nk0m43W4kk0lMT0/j4sWLMJlMNfslV+lUu0iFh1BqpdVqMTc3V/G8Uqkk1vtLB94xDAOTyVQzU0LIHPr9frhcLhgMBhw+fBgTExMd/x32I0yEbQrCRClPgpKoMRNgMBhgMBgwPDxc8bhwvglfkUgEW1tbKBQKDYWwwWBo2MpbCZQOwA/69gmEXkEECKGvUIsHBGj9LiHP84jH43C73chms5iamsKlS5cqAmo1G+V7tZZwnLa3t5HL5TAzM4Njx441vHMr50W61dfHsqw4x0MqPBplCvR6PYaHh2sCRWnNP03T8Pv9yGQy4to6nQ7Dw8OYmJiAxWIBx3GyG3PbFSa5XA7BYBDA7kwa4XdJdy710Oh8K5fLNe2CXS4XCoUC9Hp9TbZEaaF5kAUA8YAQDgpEgBD6ik49IHK34QWwZ1DIcRxCoRA8Hg/K5TJmZmZw8uTJhtO41SpAgO4PD4xEInC73SiVSpidncX09HRLBvxeZUDaFR57YTAYxNKacrkMr9cLmqbFWRMajaaiS1L1XAnhDrbFYpE96K8WEzRNw+VyIRwOw+l0Yn5+HjzPi13bqjMm1T4T6VqE1pEzENbpdBgaGqqZH1QulytKuWKxGLa3t1EqlXD58mUMDAzUiBOj0djVAFnJAFw4r5UWQOT9QjgIEAFC6CsMBkNHHpBeZkBKpRL8fj98Ph90Op3o7Wh2UelGa181ZkCAH++X0NXJ4/FUdP5q9U5/LzIgcgsPKaVSCV6vF263G1arFcePH8fo6GjN6xIG3kkDxWg0CpqmwfO8OL1bKk4sFsu+j08ul8PW1pYoPC5duiT6b6QIIkQqSoT97ndhorQHpNvodDoMDg5icHCw4vFvf/vbOHbsGIDdQaiCpymXy0Gn09X1mJhMJtnek0p34FJagPT7cSQQWoEIEEJfodfrVeUBkVIoFMQWsTabDUeOHKkbUDZaU63DEuVei+M4eDweeDwe6PV6LC4udtz5qxsZECGg7qbwcLvd8Hq9GBgYwKlTpzA8PNzwPKGoHw+8q27fms/nKzwm4XAYNE2DoigxSJQGi60EiblcDi6XC6FQqKnwEKh3TKQiRA5hoqQQUDoYVoqBgYGa5iAsy4rnGk3TSCaT8Pl8yOVy0Gg0ddsFm83mto6h0h24AOWEsRoyMARCryAChNBXCCVY7XxId6MNL/Dji1Umk4HH4xFbxJ4+fbrmjmIra6q1BEuutYTMkFBytbq6irGxsY4vtnK+Rmk5kSA8NBqNKDrkCEgYhhGFx+DgIE6fPl1Tq98OFEXBYrHUiAOO40Rhks1mkclkEAwGxSCxnjAxGo3I5/NtCY9mNDpezYSJ9HVVCxOlg3GlUJsRXKvVwm63w263VzzOcVxFhi6ZTMLv94Om6YpzTvrVSJgo3YFLSZQWQARCLyEChNBXCP4JlmVbHtLXjewCAOzs7CAcDiOZTGJychIXLlzoOGBTuwDZD8ViER6PB4FAAFarFRRF4ezZs/teV67gTDhOQnMDjUYDnU4nWxvaYrEIt9sNn8+HoaEh3HbbbTW1+HIiBHxWqxUOh0N8XDCSC0FiKpUSB94J54vFYsH8/DyGh4eh1WplvxvbiTDJZDKIx+MYHh5GoVCoML53u5RL6WBY6UxAq2g0mroZk+pzLp1OIxAI1GTpqg3wSmYgAGUzIAApnSIcDIgAIfQVQkekUqnUlgCRK5AQ7t4DwPr6+p6dmlpF7QKkk7VyuRw8Hg9CoRBGRkZw5swZ6HQ6PPXUU7KLh06oniD+1FNP1R3s1uk0+kKhIAqPkZERnD17tu3MmJxIS2SAH5daFQoFjIyMYHh4GKVSCZlMBqFQCPl8Hnq9vm6r4P2e7/X2rZpsNouNjQ3E43FMT09jfn4ewI9L5ASqWwXLLUwOajAox+uuPucEBGFSPcuEpmlwHIdMJoNEIlHxPuxGw4VqlBYASm+fQOglRIAQ+gohA8IwDMxmc0u/I0cwXi6XEQwG4fV6xTVPnTolW0CpZgECtBfoZ7NZuN1uRKNRjI+P49y5c2IAks/nFc/MCMJDEB9GoxGvetWrKsqWwuEwNjc3xXkd1QG41WptaJYvFArY3t6G3+/H2NgYbr/99pqSFSXJ5/PY2tpCKBSCw+HAxYsXYbVaa54ndEgSgsRoNAqXy1UxXLFanMgxhZumaWxtbSESiWB6ehp33nlnzQyYRhmTenOHepkxkZNbOfsiFSbSLB3P83jqqacwMDAAk8kEmqYRiUSQzWbFhgvVPhOr1Srb31NpASCc1/1wfhII+4UIEEJfIQQ47cwC2U8b3mKxCJ/PB7/fD7PZjOXlZYyPj+Oxxx6T9SLRDZ9KrzMgqVQKbrcbiURCLEmrFolS/4wcF/l2XqNUeAgBqU6nE4WE0WisKY2SzuvIZrPw+XygaRrlcrmiLa7NZoNWq0UkEkEwGMT4+DjOnz9fU5KiJILHIxgMNhUeAo06JJVKpQojslSsGY3GusPuWulsJu26NTk5iTvuuKPhTYa9SrmkAqVRxkTYp+pZJlKU9gQofSe+1wh/h8HBQczMzFTsj/QGgTBkUciYVL8XhfOv3c9opQWI0tsnEHoJESCEvkIQIO204u0kGKdpGh6PB+FwGMPDwzhx4gSGhobEC4PaMxa9EiA8zyORSMDtdiOTyWB6ehqrq6swGo2ybHuv/WqFauEhdLRqJSiWzusQ4HkexWKxwnDr9XrFc1JogRuLxVAoFGRvUdou7QqPvdDr9XVnSjAMU1FSI9T6l0olmM3mmmyJkEUqFArY2toS908O8/tewxWFZgN7CROlfRhKbFvpILje65Y2XJiYmKh4bqFQqBmyWG92jvTca/TeV8Nrl3P7RMgQ1AwRIIS+QqjH75YASSaT8Hg8SCQSmJiYqCgfkqLmjIWwXjfX4nke0WgUbrcbhUIBMzMzOHHixJ4lOHJmQPY6ZvWEh06n23fmiqIomEwmsCyLUCiEeDwOh8OBhYUFaDSaPbtPSb8MBkPXggS5hcdeGAwGGAyGis5ePM+LWSRBnAhDF8vlMnQ6HcrlMqxWK5aXlzE2NlZTbiUH7Ux9F7KrpVIJ0WhUFJxCpkTanetWRsngtdVtS1tUj4+Pi49LhYlw3nk8HmSz2YrsZbUoVroFrvBZRYQD4SBABAihr6Aoqu1ZIHuVYPE8j1gsBrfbDZqmW7qL3w3BIHenLrnWk75WjuMQDofhdrvBsizm5uYwNTXV9vBAOdvnVsNxnHh3W07hIZDNZuFyuRCJRDA5OVlzx776Lm11J6CdnR14vd66Jm/haz9eCqnwmJiY6LrwaAZFUTAajTAajRgdHQWwmylxuVzw+XywWq0YHBxEuVxGOBzG1tZWRUmN9NiYzeauT30Hdss73W433G43BgcHsbKyUtOwQHhtUm+J3MJE6QyIUsgxCb2ZMJFmL4Wyymw2i1KpBKPRCJ7ncePGDVitVgwMDMBqtXbciKJdlBZABEIvIQKE0Hfo9fq2PCCNxIJwB9vr9YJlWczMzOD06dMtXWzUXDIlrCcnHMfB5/PB7XZDo9Fgfn5+z+nu3d6v6rW6LTwymQy2trYQi8UwNTXV1KMgpVEnIJZlK+7QSk3egpeiWpw0E3pqEh71KJVK2N7ehtfrxfDwcF1zfnVJDU3T/avNwgAAi75JREFUNVPf9zvorhEsy8Ln88HlcsFiseD06dMVpXdA/YxJr4VJr+iHDEgn65pMJphMppqhngzDIBKJ4KWXXkK5XIbf7xeFibQRhdxNF6QQAUI4SBABQug7hGGErVId3JdKJfh8Pvh8PhgMBszPz8PhcLQVIHQjY6FGQVMulxEIBMDzPAKBAFZWVjAxMbHvi6TcAwS7KTzS6TS2trbEdrD1ujJ1glarbWjylgbgwWBQDITMZnNNAK7VarG9va1q4eHx7E6+t9vtTeegNLtzLW3bKrQKbjRPwmq1tuy74TgOgUAAW1tb0Ov1WFtbazggs51SLsH8LvWNtSNMlM6AqMkD0m2ETN3g4CB0Oh3W1tbEn1U3oggEAshms2KHPDkzmErOQCEQeg0RIIS+w2AwtF2CJXRR8Xq9CAQCsNvtOHbsGEZGRjq62KlVMMi1HsMw8Hq98Pl8YnnR7bffLktpBCCfACmXyygWi2I3KzmFRyqVwtbWFhKJBGZmZnDXXXf1xFyv1+sxPDzc0EtRbbbleR5arRbDw8OwWq2gaRrAj83wSlEul+H1erG9vQ2bzbavye+CyLBarXXL2wRhIgxXzOfzYuapOkAUfDc8z4sdvADg8OHDcDgcHR2zToWJVJxUCxOlOIgCpNm26zWiAH7cdCGTyYCmaYRCIWSz2aYZzL3m55AMCOEgQQQIoe9oNwNSKpWws7MDj8eD8fFx3Hbbbfuey6A2wSDXeoVCQZxaPjw8jFOnTsFkMuHxxx+Xbb/2i2AU1uv1yOfzeOKJJ+p2u+k0AE8mk9ja2kIymcTs7CzW1tZkH7zXLlIvhdVqFYPuiYkJTE9Pg+O4ihkmzSZNG43GrgY5LMuKwsNiseDkyZMdC/29aDRPgmVZ0XdD03SF70ar1cJkMoFhGPA8Lw457Ia47FSY5HI5lMtllEollEqlikxJr4bxKYXaBEgj6jVdACozmML7cWtrC4VCQZyfI83UDQwMiJ8vRIAQDhJEgBD6jlY8IEJ7WI/Hg2QyCYvFgosXL7Y8vHAv+qELVjvr0TQNt9uNSCSCsbExnD17VpxhUSwWZdsvgU5eK8uyYFkWwO7rGx0dxU/8xE/UXPAFzwCAtgLwRCIBl8uFVCqFubk5HD9+XHHhIaVQKMDlciEQCGB8fBwXLlyo8JVIS5Y4jquYmyBkBnK5HHQ6XcOOXPtB8Am5XC4YjcampUzdRqvVYmBgoGYOSywWw/r6OvL5POx2OyiKEpsqGAyGuh4Tuev8gcbCRJhOHwqF4HQ6YbFYUC6XKzImwvGsnl8itzBRuhWtUtve7+uul8EEdjOC1XNMstksCoUC9Hq9eK6xLIt4PN71LnkEgtIQAULoO5plQIQuTV6vF8ViETMzM2IJkVziA1BeMLRCK+ul02m43W6xlez58+drZjDI3Tq31X0TqBYewgwPIeAS7mhLTaV7BeDVrTeFrMHc3BxOnjzZlaCzU6ST1esJj3oIbX+tVmvDzEA2m0U8HhdbKdebbm6z2fZsyiB4KFwuF3Q6HY4ePYrx8XFVBU6pVAobGxtIp9OYn5/H3NxcxesSgkOhlCscDot1/vXKaeTujFQqleByueD1ejE+Pl7TWU2aKame/C4VJtU+E6B9YUJKsLqzbZ1OV3d+TrlcrmhEwXEcrl271rRLXqtZTDW9BwmEaogAIfQd9Twgglna6/VCo9Fgbm4OTqcTWq0WW1tbst/FV7sAabYez/NIJpNwu91IJpOYmprCxYsX9zRWy7F/7VwQ9xIezWgWgAt127FYDKFQSMymGQwGpFIpuFyuloaWdZtOhMdeNMoMSO/OVk83l3YAEoIhq9UKiqIQCoWwtbUFiqJw6NChjj0U3SKbzWJzcxOxWKypuGwUHDZrCNDouLRzvrAsC4/Hg+3tbdjt9rqdwYDmpVyCIBFECYB9CRMiQHq7bZ1OJzajMBqNyGQyeNWrXiUKE+HzSsjo17uJIvxbyYGnBEK7EAFC6DuE4WXAbnmQYCy3WCw4dOhQzd3XbmQX+qELVvX+8Twv3vGmaRozMzM4duzYnqU3chvHm60lBFSdCo+90Gg0KBaL8Pl8yOfzWFxcxMzMDDiOq5jiLbTglA4tk8Nf0grdEB570SgArza++/1+ZDIZsCwrBrWjo6NwOp2w2WyqqWHP5/PY3NxEOBzG1NRUxw0EGpXT1DsuwvlSr1OZ1WqtOH+lnbcMBgNOnjwpzklph3rvCakI6USYEA+Isg0AhO1LhYkU4SaKcO4lk0n4fD5x4Kn0c2ppaUlVZaQEghQiQAh9h8FgwI0bN/DMM8/gJ37iJzAyMoKTJ09icHCw7sWjWwKkXzIgHMchEonA4/GAYRjMzs7i1KlTLZeQyBmYNFqrWnhoNBpRdMghPHieRyQSEedsLCwsYGZmpuJudb0p3sViUexyI5RIZLPZrhi8pcJjbGwM58+fr8lU9BppByDhGG5ubqJcLmNiYgJGoxE0TWN7e7vurI5e35ktFovY2tpCIBCAw+GoKWWSi3qdkYTzRRocJhIJZLNZcbiixWKBRqNBMpkUs0ZOp1PWY9Po/dJMmAgIBnhgNyum1Wo7LuXaDwdVgLTShler1cJut9dkyqpvogjnGIGgVogAIfQNPM/jBz/4AdbX1/FHf/RHuOeee/Bbv/VbewZp/SJAujEJ3e/3w+PxgOd5zM3NYXJysu2SIrkvYtXiqFp46HS6CnPtfhD8HS6XC6VSCQsLC5ienm7pGFDUj4eWNTJ4ZzIZpFIpMaNSXbMtTFJu5ilRo/CQwvM8YrEYNjc3USwWsbS0hOnp6Zq/j9DqWgiAMpkMgsGgeGe2kfFdjvOLYRi43W54PB6MjY31JGtUjfR8kWYzhOGKwWAQfr8fDMNAr9ejWCziRz/6Eba3t2uOjVzDFaXsJUxKpRLcbje8Xi8cDgfK5XJFJlJYY78ek70gGZDOtq/RaGrKK3s1wZ1A6ARydhJUD8/z+PKXv4w/+7M/w82bN2G32/GBD3wA/+k//aeWfl+j0cga3AtrqjUDUi6XkU6nkUwmkclksLi4iImJiY4DBblLMwRxVC6Xxb+L3MJDaEbgcrnAsiwWFhYwNTUli5+jmb9E8ApkMhlEo1FsbW1VDCwTBMnAwAC0Wq04a0WtwiORSGBzcxO5XE4sV2t0DCmKEu/y15vVIQgTaUvcRibbVpsAlMtleDweuN1uDA4O4ty5czUlK0qTzWaxvr6OVCqF+fl5zM/PQ6vVVgg2qfm9uoVyL2r8A4EANjc3YTabxUGRjTIm0s+BbggTJUUAx3F9K0AIhH6DCBCC6qEoCg8//DDe/va341d/9Vdx7733thVk9EsGZL/rCRPevV6vaDa+7bbbZLugyfF6haCmWCzCYDCIwkMuozfHcQiFQnC5XOB5XhQevSgfaTTZvNov4PF4KgYIDg0NwWazicPzlB4gCEAUHjRNY35+HrOzsx3fTZXWpUuRCjahvE0okWs0yE04T1iWFVv+WiwWnDp1qmZQnNLk83lsbGwgEolgZmampq2zVLBJqe7gtlcmyWq1dlT6J2S21tfXwfM8jhw5gomJiT0FRCvCRHh9wt+rHWFykDMgSgsgAqGXEAFC6Av+z//5P+K/2x1EeKub0AUjvt/vh91ux/Hjx5FOp0Wvghz7BuxPgAiD1jiOg9VqxQsvvACDwYCBgYGaYKoTMSKYere3twEAS0tLcDqdPa1bb4TgF7Barcjn86BpGmNjY5iengaAirkA0rvf1cemFzMBkskkNjc3kU6nMTc3hzNnznStjKORYNur85ROpxOzJ0I5mFKdyurBMAy2trbg9/vhdDpxxx13tNUCvFGGTajxFwSbNJMkdEVqdfJ2KpXCzZs3QdM0lpeX65bUNdu/elQPVxRKK+tlTKqFiXRNpQWIkp8ZSm+fQOglRIAQ9sVHP/pRfO1rX8Pzzz8Pg8GAZDK55+/8yq/8Cj7/+c9XPHbhwgU8+eSTLW3TYDC0LUDkLsFSQwYkn8/D7XYjFAphZGQEp0+fFoO5bDYr674BnQkQqfAQ7ojefvvtFZO7pV2EWJat23WqUU284HPZ3t6GVqvF8vIyHA6Hqi7ixWIR29vb8Pl8GB0drSm1qvaXNCtXqj4ue/lLWiWdTmNjYwPJZFLxWSj1Ok8Jf2chQ2K328GyLDY2NnDz5s2ac8ZqtfY8k1Qul+F2u+F2uzE8PCy7D6VejT9Q2RWJpumK2S7Sc0Y4V0KhEOLxOObn52UVmK1OfW8kTAQhImRUWjFky82t1gGMZFMIaoYIEMK+YBgGb33rW3Hp0iV87nOfa/n33vjGN+Jv//Zvxf+30yqw3QyI3H4NQFkBks1mxanlExMTOHfuXE2go7RAqic8dDpdxfDA6iBT2nVKCMCFmvjq9pIWiwXpdBo+nw96vV6VMyiqhUejGQ9S9ipXkh6XenM6pMFmK8FbJpPB5uYm4vE4ZmdnVTf9XSgT2tjYQKlUwtLSUkVJnWDwrj421T4KaXZAbh+FMAF+a2sLVqsVZ86cqWnb200adUWSDrhLpVLY3t5GoVAAsPsZmkqlsLm5WXGMupHtalWYZDIZcaYMRVEoFos1bYKl/+8GSmcgSAkW4SBBBAhhX3zkIx8BADz44INt/Z7RaITT6exom2opwep1gJ9KpeB2u5FIJDA5OYmLFy82LO3oxv61Asdx4t3NesJjr2006jqVy+WQyWRE0UHTNIDdLi9WqxXpdBocxyk+PBDoTHjsRav+Eq/XW9H2tVEmKZvNYmtrC9FoFNPT0x3PyegmiUQCGxsbTQ3wFEXBbDbDbDY37FQmBOCBQAA0TYvnTL2OXO3A8zxCoRA2Nzeh0WiwtraGsbEx1QSQQllWIpFAOBzG0NAQTp8+DZPJVNGutVrM1hNt3Xg/CZ8J5XIZm5ubCAQCmJ6extraGgwGQ4VAqdcuuBvCRGkPiNICiEDoJUSAEBTh0UcfxcTEBIaGhvDqV78aH/3oRys65zSjkxIsuQVIr7pg8TyPnZ0dbG9vI5PJYHp6Gqurq3sGi70WSPsRHnuh0WhgMpkQjUYRDAZhNpvFcjNBmOynjEsuGIbB9vY2vF6vbMJjLxrNo2iUFQB2A9NSqYTBwUEcO3YMIyMjqsp6CHfmha5Rc3Nzbd+Zb9apTFriJi1XMhgMdQ3e1aVowkDP9fV1lMtlLC8vY3JyUjXCA9jdx2AwiM3NTej1+hqTfrOhk4I48fv9oGkapVJJHK4oPT4Wi2VfwoTjOHg8HrhcLgwNDeHixYuwWq3iz/fKmHRDmKhBgKjpPCIQugkRIISe86Y3vQlvfetbMT8/D5fLhT/4gz/AT/7kT+LKlSst3YXV6/VgGKbl7XWjDW+3A3ye5xGNRsXgaGZmBidOnGi5Lr8boqveet0UHsCuIdnr9cLj8cBiseD48eMYHR0VL9IGg6EikNqrjKuRuXs/SIXHyMhIT4RHM+plBfL5PLa2thAMBsVAslgsYnNzE9euXavrL+lWSU4jstksNjc3EYvFMDc315VyMKE7XLWPQlqu1CwroNFoEIvFkM/nsbS01LQtsVLE43HcvHkT5XIZKysrLQ86bCRmq4WJkGWrFvrCMRKGLTZCGGi5vr4OrVbb8hT4Vku5BGEinfoOoCVhorQAkLMEiwgZgtohAoRQw3333SeWVjXi8uXLOHfuXEfrv+1tbxP/ffz4cZw7dw7z8/P42te+hl/4hV/Y8/f1ej3K5XLL2+unLljC/Aq32w2WZTE3N9fx/IpuCiRhjofws24ID4/HA4/HA5vNhhMnTmBkZGTPi2orZVz17nxLBwe2WsYlCA+fz4fh4WHFhUc9CoUCXC4XAoEAJiYmcOnSpYq7zED3/CWtks/nsbm5iXA4jKmpKdx5550wmUyyrd8KOp2uaYlbIpFAKBRCPp8X3ws+nw/JZLImK6BUCU0mkxHnjSwuLmJ2dnbf4oiiKBiNRhiNxprhisVisaJbWSwWE9tLN2oKkE6ncePGDeTzeaysrGBqamrfgbKcwkQYvKgUSgsgAqGXEAFCqOE973kP3v72tzd9zsLCgmzbm5ycxPz8PNbX11t6/q3oAQF278I++eSToCgK8/Pz+2oj260MTT3hodVqZQu6GIYRhcfg4KBs8x0ambvL5XLFvAWhjKtcLlcEUYIwMZvNFROjh4eHcfbsWdUNv5P6UPaaDC63v6SdfXS5XPD7/XA4HLh06VLNTAylEebKBINBTE1NYWlpCQaDoSb4jsfjYvBdz0PRzfK/QqGAjY0NhMNhzM7OtpUp7RSp0B8bGxMfF4YrVmeTaJoWP49sNhtmZmZgMBhQKBS6NlyxXWGSy+UQDodhNptRLBbF35VmSrotLokHhHCQIAKEUMPY2FjFRaXbxONxeL1eTE5OtvR8g8HQVpvZbrXhlWPNcrkMn88Hj8cDlmWxurpaMQxsP/sntwAplUool8tdEx5CUD80NCROY+42Op2uph6++u6uMKNDmKvC8zyMRiOmp6cxPj7e1oyHbiMcR4/HU7flbzu06y+hKKpuGVf1/JJSqYTt7W14PJ49xZFSSPdxfHy8xp/QLPiWCtpQKNTw2HQ6QLDePk5MTLQ9b6QbSIcrjo+Po1wuw+VyIZfLYWxsDKOjo+Kcl3A4XDNcUSre9nNsmlEtJoR99Hg8cDgcWFpaqhmwKC3bEn5Xjqnv1ZAuWISDBBEghH3h8XiQSCTEAPr5558HAKysrIhBxZEjR/Dxj38c9957L7LZLO677z685S1vweTkJLa3t/GhD30IY2NjuPfee1vaZrsmdDW24WUYRhweaLVasbi4CJfLVWGYVXL/BFiWBcuy0Gq1eOmll8T6eWmp0n4uvtI79SMjI6rIJlTf3RWC+nw+j4GBAYyOjoLjOGQyGfzoRz/aVxmXXAhZGY/Hg6GhIZw7d64rx7FZ16m95pdYLBYwDINEIgG73d61fdwPLMvC6/XC5XK1vY/S4FvaUKPZsRE6VVV/NctgSNv+2mw2VZb+CYNBNzY2mu5j9bFJpVLw+/3I5XI13cqEf8s1kFMw6q+vr8NisTTdR+F7M2FSbYAH2hcmpASLcJAgAoSwLz784Q9XDBU8c+YMAOC73/0uXvOa1wAAbty4gVQqBWC33OPq1av4whe+gGQyicnJSdx999146KGHWr5T288lWIVCAR6PB4FAAENDQzh58iSGhoaQzWbhcrkU3z8BQXgIa509exa5XE70UUjLcaRBghB873X3slAoYHt7G36/v2cdo9qlOivTSBxJy7ik3bialXHJFWSUy2V4PB643W4MDAz0LHNUTbMSN+F8CQaDYpC2s7ODF198sev+klbhOE7sGmUwGFo2RrdCs9ku0lKlaDQqDlqUClqpvySRSGB9fV2VbX8FYrEYbt68CY7jcOzYMYyPjzfcx2bHprpbmcfjEQVtI2HSKslkEjdu3ADDMFhdXW06Q6hZKZcgSARRAmBfwoSUYBEOEkSAEPbFgw8+uOcMEGkgbDab8c1vfnNf21SDCb3drApN0/B4PAiHwxgbG8PZs2crBJcSc0WqES6oUuEhLbUym801RlRpyUk6nUYgEBDvXkq7TQn/FozbgUAAY2Nj+yoR6hatCg+Bdsq4GpXjDAwMtBVACXfqt7e3YbFYZPPKyInQUGFraws6nQ4nT54UA+Zu+0taReg2t7GxAY7jcPjw4Z4NtGw0QLBUKlUIk2AwiHQ6Lb4vbTYbRkdHReGrlGirJpvN4ubNm0ilUlheXsbMzEzH+9WoW5nQMEE4PtFoVBywKIi2anEizSYVCgWsr68jGo1iYWEB8/PzHWcp6702qQjpRJgQAUI4SBABQug7OinBUqoNbyaTwfb2NuLxOBwOB26//faaLkTtrCf3/gG1wkOj0Yiio9nFsFHJSXVXpVAoJM5MAHaHUE5NTWFkZARarVY1ZQdSA/x+fSiNTLrVJSdC+WJ1GZf0SxogsSwLv98Pl8sFk8lU05ZYDfA8L3bS4nm+bivYdv0lUp+A9Gs/wxOFQYdCS93p6WlVBH96vV4UtDRNi8055ufnMTQ0JB6jeqKtuiNXL84LoZ1zMBhsu114uzRqmCAVbTRNV3RyMxqNsFqtYFkW6XQaIyMjOH/+fFd8R43On2bCREoul4PVakWpVNq3x0RNnwkEQj2IACH0He3OAel1CRbP80gmk3C73Ugmk5iamsLFixebthZVQoB0Kjz2Qhok0DQNl8uFVCqFiYmJiju3W1tbFRmB6oxJtzv5CFT7J7pZxtRKNy7hrncmkxHLuKxWK3ieRyqVgl6vx9GjR5uWtigBz/OIxWLY2NhAqVTC0tISpqamWj6X9vKXZDIZ0DSNRCJR4y9pZ35JJpPBxsYGdnZ2sLCw0NGgw25TLBaxtbWFQCCAqakp3HXXXXUzZNWijaZpRKNRcehkvVIlubpOsSwrDhIcHR2tMer3Eqlok1IsFsUmH8J7L51O44knnqhpMS0Mruzm1PdqBBGSTCZx8+ZNlEolzM3NVWT4pSJkvx4TAkFNqOtTl0BogU5LsOS8016vC5YwIdntdoOmaczMzODYsWMtldbIvY/N1hDaTgr7r9FooNPp6g7m6hTB0xKJROB0Ohu2WG02n8NoNNYIEznLTXopPPaiURmX1DMkPC+Xy+Hq1av7LuOSk52dHWxsbICmaSwuLso6oK+ZaKNpWhQm4XBYFD/15pdoNBq4XC6Ew2HMzMxgbW1NVRPggd3X5Ha74Xa7Wwrqm4k2aXlkKpUSyyOlx7O6W1kr8DyPUCiEjY0N6PV6nD59WnXlfwDEmSO5XA6rq6vitHphuKK0zM3r9YKm6QrfVi/mu5RKJWxsbCAUCmFhYQELCwvQarUNMybVN5WkgoQIE0K/QQQIoe9o14QufBjLLUCEi4Ew2dftdqNYLGJubg6nTp1q666q3Hey6wmkRsJDzjt+mUwGLpcL0WgUk5OTe7YGbRRcCq06BWFSz/QuFSbttOyUCo/BwUFFhUcjhCBvc3MTwG4nOaGMqVlXpVbKuOQknU5jY2MDyWQS8/PzOHPmTM+yCc2GBwqiJJPJwO12izM6dDodRkZGoNfrkUwmMTAw0LU5FO0gdI3a3NyE2Wze9zkplKxZrdaKznr1zN2C4K+XTar2UAh36guFAlZWVsSgXk0Ui0UxqK93TkqHK1aXAAq+LUGcxONx0DTdsMzNbDZ3FOxzHAev14utrS2MjIzUfE62W8pVLUx4nsc//MM/4O1vf7vqmnsQCAJEgBD6jnY9IFKDn1wIgWAgEIDb7QbP85ibm8Pk5GRHwZ50H+XKgAivtxfCI51Ow+VyIRaLYXp6et/TrPV6PYaHhzE8PCw+JjW9ZzKZipad1cGTIE6kr1E6QNBut6tWeEQiEWxuboJlWSwtLWFycrIiIGmnjCubzaJUKtU1du/HI5DNZrG5uYlYLIbZ2VkcP35cNdkEg8GA0dFRDA4Owu12IxwOY3R0FLOzs+A4rsKbJM0IWK1WDAwMiN978XqEsrX19XXwPI8jR47IMgeoEY3M3UI2Seq9ETwUgpeJYRgUCgVMTU3h9OnTqvl7C3AcB7fbLZaEtTsXpdlwxUZlbp0MnozH47hx4wYAtN1tbS9hwnEcnnvuOfz2b/82IpEIzp8/j9OnT7e8PoHQS4gAIfQdnXhAAPkESLlcRiKRQDqdRqlUwsLCAhwOx77S3nLvoyBAyuWyONxK6Gglp/BIpVLY2tpCIpHAzMzMvoVHM9oxvQulOGazGVarFeVyGel0GgMDAzh9+nSFsFEDQjemzc1NlEolLC4utm2KbrUbVzQaFYcq1suWNDN25/N5bG5uIhwOY2pqqqt/704R5mS4XC6YzWacOXOm4u9dPaNDGnhXZwSkM10EcSJXhieVSmF9fR3ZbBbLy8uKmuAbZZNyuRw2NjYQiURgNpths9kQCoXg8/l6WqrUDOG9c/PmTeh0OtlLwhqVufE8j1wuJ54/1YMnq4WJTqcT52YtLS1hdnZWtmOl0WgQj8dx33334e///u/x3ve+Fx/60Ie6YrQnEOSCCBBC39GJBwTYf3BfKpXg8/ng9Xqh1+thMplw4cIFWT0bcggQIdshzIiw2WwYGhqCXq+X7c5qMpnE1tYWksmk6HXZT0ei/VCvMw7P86IBPhKJQKfTwWg0Ip1O47nnnqvrn+iV6V2K4Bva3NxEoVAQhYdcIrHVblx7lXHp9Xp4PB74/X44HI6Gnh4lkZataTSaloz6Go2mYUZgL1ErLQFsJ/AWgvpoNIr5+XmcPn1adSZ4juPg9/uxubmJgYEBXLhwQTxG1aKWpmnE43GxzK3djMB+yGQyuHHjBrLZLFZWVjA9Pd2zkjBBZFit1rqDJwVhkkwmsb29jVKpJIp+oaxUOEb7mfrOsiwefPBB3Hfffbj99tvx3HPPYXV1Va6XSSB0DXV96hEILdCpB6TTVrzFYlGcWm6323H8+HHRLCqnpwTYnwDhOA4sy4LneVgsFszPz4OmaUQikYoyJSFwEu7othPs7uzsYGtrC6lUSnWlNwKlUklspyuUWgl3wOuZ3re3t1EsFrtueq9GaAOby+WwsLCA2dnZnk1Ob7WMy+/3I5PJgOM4aDQaDA0NwWw2I5PJiOeZ0h4AQcRtbGyAYRgsLy9jampqX/tVL5sEoCab1CjwFr6k/hKGYeByueDz+eB0OlWZPaouCas37LBZqZLU+F6dEajnL+k08GYYBpubmwgEApidncWpU6cUuYFQD2lJH0VRCAQCMJlMoi9QEG1S0a/T6WpE216NAXiex5UrV/C+970PsVgMf/VXf4Wf//mfJwZ0Qt9ABAih7zAYDD0pwcrn83C73QiFQhgZGcHp06fFu+yxWEzW2SL7ESBS4SGUWul0OqysrIjPEcqUhMA7GAzi5s2bYFlWLKWQChNpYMDzvCg8MpkM5ubmcPLkSdVc8AWkwqNRqVWnpnepKGnX9F7Nzs4ONjc3kclkMD8/r6o2sELgbbPZ4PF4QNM0hoaGMDc3B4qiKsq4pK1e6x2fXpBKpbCxsYF0Oo3FxcWuizjBvNxsIGcmk0EwGBT9JUIXq2w2C5vNhjNnzqiya1Qmk8HNmzeRyWSwtLTU9iDBRiWS1dm2ZDIJn88nDiytVwbY6LNFat4eGhpStPVvM2iaxo0bN5BOp2syM/WGK0pnmEjLAA0GgyhIEokEMpkMbrvtNlAUhT/8wz/EQw89hN/6rd/Chz70IVUeBwKhGeq46hEIbdDtEqxsNgu3241oNIrx8XGcO3euJmDtxtyOdvYRaCw86gUNjcqUisWiGHQLgRNN02JgoNPpQNM0GIYRu3upXXh0MhV8P6Z3afDdLPhNpVLY3NxEMplU7bGs9k9UH8vqMq58Pi+eP9I7ulL/RDe6cdE0jY2NDcRiMcUFcTNvktBtTcgAMAyDK1eu1C1zk9Nf0g7SrlGzs7OyH8tGol8aeDeaai79KhQK2NjYAEVRbZu3e0W5XMbW1ha8Xi+mp6dbGsqo1Wpht9trulVVNwb47ne/i8985jNIJBKgKAojIyN429vehqWlJVy7dg3Hjh2rETcEgpohAoTQd7RbggXsXgT3Cu5TqRTcbjcSiQQmJydx4cKFhl1UuiVAWsmqtCM89tqmUEohNVeWy2X4/X54PB5xkjBFUeIMBWmmpLrMpJfIITya0YrpXRBt9bpNCcenXC5jc3MTiUQCc3Nzqixb4zgOwWAQW1tb0Ol0OHbsWE3pTTXSVq9SpPM5qrtxmc3mGmHSThlXoVDA1tYWgsEgJicnVVnGBOx2OlpfX0epVMLq6mrFJPhm3coEo3f18elGWY0gkLa3tzE6OtpzX0+jwFs61TybzcLn84klf3q9Hna7HYlEAgzDdL1MslV4nkcwGMT6+josFgvOnz+/bzEgbQzA8zxe97rX4V//9V9hsVjwzne+E+Pj4/jRj36EL37xi7h27RoWFxfx9NNPy/SKCITuQwQIoe/oRIDUm4sB/Li8aHt7G5lMBtPT01hdXd2zhKQVQdMue4kawVguPFdopSvXxVfoJrO1tYVisYj5+XmxpEVqPBUCS6GNqVarrSnh6ubsiVKpBK/XC7fbDZvNJrvw2Itm2aTqwDKfzwPYLRucmJiA0WgUa+LVkP3geV5sucrzPFZWViqC5U6o11FJGP4mPX/2KuMyGAzifpRKJWxvb8Pj8WBsbEy1pTeZTAbr6+tIpVINS8IadSsTjk8n/pJ2EILljY0NGI3Gmi5hSiNMNbdaraIQmZmZwezsbMV7TFom2agjVy9ujKTTaVy/fh2FQgGrq6twOByybjcajeIP//AP8Q//8A943/vehw9+8IN1z33hvUQg9AtEgBD6jnY9IEBtcC+YLbe3t5HP5zE7O9tSurzRenLQaE2WZcGyrPgcoZWunMIjEolga2tLbCtc3YmpkfFUWkaRyWQqplFXZwP2O/RN6OolFR7Dw8OKm6CByuMjmLSLxSKmp6fhcDjE4FI45wTTuzToHhgY6FkbU+H8F2Y9LC0tYWpqqmvblg5/k5bOSCd2ZzKZmjIuIdBKp9OwWq0VDQXURKFQwObmJkKhEGZmZtr6LAEaH5+9/CX1/BPNsms7Ozu4ceMGSqUSDh06tG+x2Q2kHbjsdjsuXLgglm9Zrdaa4YHCjA7hc6ha2Fabu+XK2DIMg42NDQSDQczNzWFxcVHWErpyuYy/+Zu/wUc+8hHccccdeP7553Ho0KGGz1ejICcQmkEECKHvaNcDAvw4uOc4DuFwGG63GyzLYnZ2FlNTU21fOBplVPZDtQDphfAIhUJwuVwol8tYXFzE1NRUW5mLemUUwt1cqbckEomApmmx7Wl1mVKz469m4SEln89ja2sLoVBozynwpVJJPD7C3VyhzKQ6GyAMxZPr9e7s7GBjYwM0TWNxcREzMzM9675VTaOJ3dKhkUIpXD6fxzPPPFNRpiQcJ6W6cUkzMxMTE20Pv9uLZsbuRvNL6vknNBoNtra2EI/Hsbi4iLm5OcX+5s2Ix+O4efMmOI6r24GrmkYzOqTCNpvNIp1OIxAIdCzcpPA8D5/Ph42NDQwNDcleusbzPJ5++mm8//3vRzKZxIMPPog3v/nNqvu8IxD2CxEghL6j0xKscDiMa9eugaIozM/Pw+l0dhzMdyMDIpR1dVt4cBwnCg+O40ThIdf60ru51aZlqTdAyLowDFPhDRC+6/V6+Hw+uN1uWK1W1QoPqS+h1RkZer0eIyMjNXdz9zK9V5cptRNEptNpbGxsIJlMYn5+HmfOnFFN9y0BoQxwY2MDHMfhyJEj4l36emVcsVis7t1u4TjJKdykCGb9ra0t2Gw2nDt3rmaIXzdpNL+k2j8hbaOs1WoxNDQElmURjUa76i9pl1wuh5s3b2JnZ0cUSPvZr0bCtp5w83g8YsatXmMAaSZrZ2cH169fB8uyOH78eIXokYNIJII//MM/xMMPP4z3v//9+OAHP6i6eTsEglyo6+pDILSAwWBoWYAIhmqGYRCNRrG8vIyJiYl9ByVyCxAhmyI1fXdDeASDQbhcLgDA4uIiJicnexaANAqaqr0l4XBYDCqFoGlsbAwajQYsy6omaC4Wi3C5XPD7/RgfH9+3L2Ev03s9U3c903v10LdsNovNzU3EYjHVzm4BdoO79fV15PN5LC0t1UwGb1amVK/Na72gcr/TzIVyxfX1dWg0mpbu0vcSwT9ht9vh8/kQCoUwNDSExcVF8DzfdX9Ju5TLZbhcLng8HrGpQDfPzWaDJ6XCRPBFMQwjllYyDINCoYCpqSmsrKzI6uEql8v467/+a/zxH/8x7rrrLrzwwgsVbdQJhFsRipf7Ni6B0GW2trZw+PBh7OzsNHwOwzDi8ECr1Yp8Po+jR4/K1rqRpmlcvnwZr3nNa/a1DsdxYtbj2WefRaFQEIMAu93eUolSK9sIBAJwuVzQaDRYWlqCw+FQxZ1PKeVyWTSXWywWMSsjZE0ymYwYEFRnS3pZgsMwDLa3t+H1ejE2NoalpaWet7+sNr0L4kQocxOCyEKhgHQ6jcnJSSwvL6uyY1Qmk8HGxgZ2dnYwPz+P+fl5WUSmtFuZ9DhVd5uSCrdm7wmpQFpZWempeG8VIYO0vr4OiqJw+PBhjI6O1n1vVPtLhC85ypRa2c9AIICNjQ1YrVasrq6qsoWsNLtpNBqh1+uRy+VQLpcbGt/bOSd4nseTTz6J97///chkMrj//vtxzz33qEbQEgjdhAgQQt/h9XoxNzeHVCpV80FdKBTg8XgQCAQwNDSEhYUFDA0N4amnnsLKyopsAiSfz+PJJ5/E3Xff3dHvS4UHsHtnjqIoFAqFClO3EHTXK1GqvtNdDcuy8Pv92N7ehk6nE4WH2i5u1cJjeXkZIyMjdfdT6i2RBt7CnIV6ZVxyIfgSPB4PhoeHsby8XNNCVGk4jhO7uu3s7IivXxBu1dkAJUtw8vk8Njc3EQ6HMTMzg8XFxa5nZup1m8pkMk3LuEqlEjY2NpBIJLCwsID5+XlV+ifS6TRu3ryJbDaL5eXlmgxSq7AsW5FREr4a+UvaLQWUGuEPHz4sS0a6G8RiMdy4cQMajQarq6tiuaQg/qUZE+GrOqMk/LveZ3U4HMaHP/xh/OM//iP+y3/5L/id3/kdWf1DBILaIQKE0HcIJt9YLCYGLDRNw+PxIBwOY2xsDPPz8xV31J5++mksLi7KVrNbKBTw+OOP4+67727r4slxnPgF7AoPnU4HiqIaBgtC0C01dVcbuoWyAqFbjM/nw/b2NgwGA5aWllR5kW9HeDRDmLRcLUyKxaIYdEuPU7vZEum8EbvdjuXl5YoWqmpBMER7vV6MjIxgZWVFPB+qTe/Cv3theq+GYRi4XC74fD44HA4sLy8rHnhVl3EJxuVCoQAAYtnX4OCgeJzUUgooDOgLh8OYm5vDwsJCV1o8V/tLhK9W55fk83msr68jFoup2gify+Vw48YNJJNJLC8vtzwRXppRkh4noe32E088gatXr2J1dRXxeBz/+I//iFe/+tW4//77sbS01INXRiCoCyJACH1HIpHA6OgogsEgGIaB3+9HLBaDw+HA3Nxc3Tr8y5cvY35+vqK2fj8Ui0X88Ic/xGte85qWLk6NhEenF2CpoVsIJtPptNgdTKfTYWxsDA6HA3a7XfSVqAG5hMdeSO90C8dJuNNdfZd7YGCgJmgT9nN7exs2m03cT7Uh3U+73Y6VlZWWDNFCwFQtTLo1yVwYfOd2uzE0NISVlRVVlt2wLIvt7W243W6MjIzA6XTWDJ/s9dDAvfZzbGwMhw4d6rmQk2YDhPeX8F0QtxaLBaVSCalUCmNjY1hdXVVlKSDLsnC5XHC73ZicnMTKyoosGTnhBsljjz2Gz3/+8/jOd76DYrEIlmUxODiI48eP4/jx47jzzjvxS7/0SzK8EgKhP1DHLRwCoQ2EQPGee+7B6OgoPvaxj+HixYtNL2rdmly+15pyCw8BqZlSCEAzmQwGBgYwPj4OiqKQzWbFdqvVXZQEM24v70CyLCsGyhaLBcePH29Yny4HBoOhptOU0J5TCLql7UuFuRwWiwUMwyAWi8FiseDkyZNdEUj7RejE5HK5YDab2x7IKDW9SzsF1TO9ZzKZirp3qTjZqxRQmOuwtbUFs9mM06dPq3KWh+CV2tzchNlsbjqgr3roZKNuXMKXnDcApIMETSYTbrvtNsUyctL5N9WNAWiaht/vh9/vB0VRMBgMiEQiSCQSdY+RUo0RhGGc6+vrMBqNsnc002g0yGaz+PKXv4zvfOc7+MAHPoAPfOAD4DgO169fx7Vr13Dt2jWsr6/Ltk0CoR8gAoTQN/A8j3/913/Fn/zJnwAAjhw5gj/4gz/A1NTUnr+r0WhknduxlwCRCg9pRys5A35paZDNZsOJEyfqBsrVd28DgQCy2SxYloXFYqko3xoYGNhzCny79Fp4NEPanlNKqVRCOp2Gz+eDz+cDsPu3FSZbV3tLlOwiJXQz29ragk6nw9GjR0XRKQd7TXqv7lYmNSxLhYlOpxMHU2o0Gtn3Uy6EoYzr6+ti69+9ShZb6caVSqUaduPqtIwrkUjg5s2bon9CjZ4uYNePcuPGDRQKBRw9elRspSz4S4QsiXQwpxz+knbJZrO4fv06aJrGoUOHMDk5KevxLJVKeOCBB/DRj34Ud999N65evYrFxUXx57fddhtuu+022bZHIPQTpASL0Bf4fD7cc889CIVC+M//+T/jQx/6EK5fv96S+ACA5557Dg6Ho+Xn7wXLsvje976HV73qVRWlO9XCQ6PRyC48GIaBx+OB1+vFwMAAlpaW2p6PIUwQlvpKhPIbIRCQChOr1dp2aYlUeJjNZiwvLysmPJoh7RKm0+mwvLwseoWEgFJ6nIRsST1vSTfLb4QWsBsbG+B5HsvLy4pPsq6eqyAcp2KxCIqiQFEUhoeHMTk5qbjpvR6pVArr6+vIZrNYWlpqud6/Hep148pms2JziVbKuGiaxvr6ujgnY3Z2VpX+CakfZWFhAQsLCy3tZ6lUqnuMyuWy2IBD8CoJZV37+TuVSiVsbm7C7/djZmYGS0tLsvpmeJ7HD3/4Q7z//e9HsVjE/fffjze96U2q++wjEJSECBBCX8CyLP7u7/4Ob3vb22A2m6HVavHCCy9gfn6+pd9//vnnMT4+junpaVn2h+M4PProo7jrrrtgMBjqCg+dTidrMMMwjDgdenBwUBQeclIul2sC7mw2C47jKu5yN8sECMLD7XbDZDKpWniEQiFsbW2BoigsLy+3dEdZGixJ/RPVx0hq6N4PPM8jHo9jY2MDDMNgaWlJ1sGRcpJKpbCxsYF0Og2HwwGLxVLRIIDn+ZpOXN0cGNgIwRAdjUbF1r/dMG43o7qMS/gCUNE9KZPJIB6PY2pqCsvLy6qc4cKyLDweD1wul2x+lOpW01JTt7R5gnCshOxts/NIaP8rZDVXV1fFRg1yEQqF8Pu///v4yle+gg9+8IP47d/+bVV6XggEpSEChLAvtre38cd//Mf4t3/7N4RCIUxNTeGXfumX8Hu/93tNL5Q8z+MjH/kIHnjgAezs7ODChQv41Kc+hbW1tZa2azKZ8Pjjj+PQoUMtPf/FF1/EyMgIZmZmWnr+XvA8j+9+97u4dOkSdDodeJ7vmvAoFoui8BgZGcHi4mJPa76lZuVmmQCr1Sp6BkwmE5aWllQ1pE2A53lRePA8j6WlJTidzn39zaoN3cJ3IaNUXcLVakZpZ2dH9PEsLCyo9s43TdPY3NxENBpt2ImpXqepbpre61EqlbC1tQWfzwen06m62SjCMUqn0wgEAtjZ2QFFUeA4TrYyLrn3NxKJ4ObNm9Dr9VhdXe26v6feeSTML9HpdOL7S5o10ev1SKVSuH79OhiG6Ur731KphM985jP42Mc+hte+9rX4b//tv1WUWxEIhEqIB4SwL65fvw6O4/DZz34WKysruHbtGt75zneCpml84hOfaPh7f/qnf4pPfvKTePDBB3H48GH8yZ/8CV73utfhxo0bLXXG0ev1YsenVhAu4nIh6PZUKoWhoSHo9XrZhUehUMD29jb8fj9GR0dlN0e2SiOzspAJSKVSCIfDcLvdohAzGo2IRCLI5/NdmcnRCUKwtLW1hXK5jMXFRdkyCY2OUXVGyev1itkSaftb4bvgv0mn09jY2EAymcT8/DzOnDmjmravUorFIra2thAIBMRJ1o0CeoqiRP9N9TESuif9/9u78/Cm6nx/4O90T1co3UuXtE1b2tJaYIDCyKIjgqMXHC/i4x2GOg7CMKKI/EAREZVFFh0GkE25oOI2c5EBB0WYe20ZpVwRWtY2aZbuTfctbfac3x8859yTNN2TNIXP63nyAIeEnB66fD/n+1lsFb1btwgezJRudldOqVQiKCgIkydPdskOXMD/Ta53d3dHdnY2xowZ0y2Ny3pSt3Xw5oxUt46ODkgkEnR2diIpKQlRUVFOudnQ0+eRyWSySAdsaGiAUqmETqfjagCDgoIgEokgFAphNpvtEuAyDIMffvgBL7/8MvR6Pb744gvMnTvX5W68EOJqaAeE2N3OnTtx4MABKBQKm3/PMAyioqKwatUqrFu3DsCdhUx4eDi2b9+OZcuW9fkewcHB+Prrr5GZmdmvc7p58yYCAgL6nbLVE7PZDJPJBIZhUFJSgtbWVhiNRm4xaY9ibo1Gg7KyMtTU1AzbpO3+MJlM3LwRb29vrk0t2wufv2PCzuSwnlvSVwcle2CLjOVyOXQ6HRISEgY9pM1e58O/RtY7AQKBAAaDAcHBwdwgTVdLt2KHMrItYJOSkmy2vx4sW0Xv1pPerYvebQW47G6XTCaDp6cnxGKx3YaR2ltbWxukUim6urq4QYJ9fW1YD+a0HohnHZjYoxuXXq+HTCZDbW0tYmNjIRKJXDI4ZrvEyWQyBAQEIDg42KI1N7+rG/8hFAr7/fVWW1uL1157Df/4xz+wfv16vPzyy3Zv4kHI3cr1vmuQEa+tra3XdqBKpRIqlQpz5szhjnl7e2PmzJm4ePFivwIQLy8v6PX6fp/TUNvwms1mbseF7WqVlZUFgUAAnU7HLbb5nW/Y1BvrYu6eFgAajQZKpRK1tbUIDQ3FlClT7J6fbA/WgUdaWppFqhX7gzwiIoJ7DX+h1NHRgYaGBovFpPVOgD0WNAzDoLm5GXK5HF1dXRCJRBg7duywpzDxd0vYuTQajYYr3g0KCoJQKIRGo8G1a9dgMplsTugejtku7P+9UqmEv7+/w3bl+O1dQ0JCuOP8onf284i9y82f9B4QEMDtehgMBiQlJQ17wX5P+IXbA93t8vLywpgxY/rsxlVdXW2RomQdmPTn/cxmM1fnMXr0aOTk5MDX13fQH7cjNTc3o6SkBACQlZXVLei0VV/Cfk8C+m6lbDAYcODAAWzbtg0PPfQQbt26NeSbW4TcaygAIXYll8uxd+9evPvuuz0+R6VSAYDF9jn75/Ly8n69z0BTsAbbhtdW4OHu7m5xh4xdKPGnrPNTbzo6OlBeXs4VmPJ3AAICAuDm5obKykqoVCqEh4e7dOBRXV0NpVJpM/Doja2FkvVikk2PYrsDWe8oDST1hg081Go1VzvhindpdTodlEolqqurERYWhmnTplks6qy7lbG1AV1dXd3qJhw524WdPSGXy+Hh4TFsrZT5828iIyO54/w7283NzaisrITJZOLSdZqamqDT6Yat6N0Wo9HIDRJk/+/tMUiwrxQlfhtlfhqXdWDCpnGxO4hSqRRubm4DnjfjTPxp6wkJCYiNjbW5m9FTgNtb8LZq1SoEBARg9OjRkEgk8PT0xJEjR/DEE08M++cSISOR6/1EJi5h06ZNePPNN3t9zuXLlzFp0iTuzzU1NZg7dy4WLlyIP/zhD32+h/U3bbZ+oD88PT1hMBj69Vz2vQayA2IymWAymbjX2go8euPh4YFRo0ZZFIuzE3HZBYBKpYJUKuVykUeNGgVfX19oNBp4eHi4zPRy68DDXvMcelpMsjtKbGCiUqnQ1dUFd3f3bl24rAuVW1tbIZfL0d7ejtjYWJetnWBTmCoqKhAcHNxjTYJAIIBQKIRQKOR2S4DuwwKtZ7tY7yoN9nPJekaGq+4keHl5wdfXF7W1tWhqasLYsWMRHx/P3QiwNZfDWcGbNYZhUF1dDblcDl9fX6fVdrm7uyMwMBCBgYEWx9ngjT+ck03jEgqFMBqNMBqNiIqKQnx8vEsV7bNMJhPKy8tRVlaGsLAwTJ8+fVCpUL0Fb1u2bMHOnTtx8eJFiEQidHV1YeHChYiKisL48eOxatUqzJ07154fFiF3Ndf7yUxcwvPPP4+nnnqq1+fEx8dzv6+pqcHs2bORk5ODw4cP9/o6NjVHpVJZLDzr6+u77Yr0xFEByFADj96w6UYA0NDQgPb2dkRGRiIqKspix0SlUqGzsxMeHh4WOyXsIslZ9QCOCjz6wg5549+ZtL57yy9U9vPzg7e3N7RaLbRaLaKjozF+/HiXbldaVlaGwMBATJw4cVCLz96GBfKDt9raWovPJeu73L0tuFtbW1FaWorOzk6Hzciwh952Ery9vW0WvfNTb9jgzZ5F7z1pamqCVCqFyWTq18BDZ/Dy8kJwcLDFroZer4dUKoVKpeJaSTc3N6OqqopL47I1eNLZGIZBQ0MDpFIpPDw8HDIVXq/Xc+lWc+fOxalTpxAbGwvgzk7rrVu3cOPGDYvvV8Nl27Zt+Oqrr1BSUgKhUIhp06Zh+/btSElJ6fV1+fn5WL16NW7duoWoqCisXbsWy5cvd9JZk3sVFaGTIauursbs2bMxceJEHD9+vM+7iGwR+ksvvYS1a9cCuPNNPiwsrN9F6BkZGXjjjTf6fceptLQUAHps2+vIwIPV0dEBhUKBxsZG7m5iTykX1ne42VQufvck/sOeHab4gYeXlxc3mG+4F0rW+DUe7e3tEAqFXIE3/w73cARv1tiCWKVSCR8fHyQlJTmtGNo6eGN/NRgMFgtu9lej0QiZTIaWlhZuRoYr7iKx11ShUMDf3x9isXjQOwnWwZutonfruomBfM2p1WqUlpaitbUVIpGox9Sg4ca/poGBgUhJSbFoLsDvNMW/Vvw0Lv61cmQ3rs7OTkgkErS3tyMpKalfRfsDwTAMLly4gJdffhlmsxn79u3Dgw8+6HLfB/nmzp2Lp556Cr/4xS9gNBrx2muv4caNG7h9+3aPTSKUSiUyMjKwdOlSLFu2DD/++CNWrFiBzz//HE888YSTPwJyL6EAhAxJTU0NZs6cidjYWHz88ccWwQe/CDk1NRXbtm3D448/DgDYvn07tm3bhqNHj0IsFmPr1q3Iy8vrdxve7OxsrF27Fo8++mi/zlMmk8FkMlncCTKbzWAYxuGBR1tbG5RKJZqamhAdHT3oNAbreRzsAkCr1VrkcA+2wxQbeJSVlcHT09NlAw/Acu5EdHQ0RCIRl3LBD974i25brW/tMSiwN+ywQ7Z2wlWuqa0Fd1tbGzQaDYA7d8VDQkIQFBTEXa/hLt5nse2US0tL4ebmBrFY7LB5M9Z1SuyvfdVNsPR6PeRyOWpqahAdHY2EhASX3JkD7uzOSCQSMAyD5ORki5q2vvBrcPifU2w3Luvhk0NJLzUajVAqlaioqEB0dDQSExPt3uK7pqYGr776Ks6ePYsNGzbgpZdectn/t940NDQgLCwM+fn5mDFjhs3nrFu3DqdPn0ZxcTF3bPny5bh27RoKCgqcdarkHuR6t7XIiHLu3DnIZDLIZLJuQ/74sa1EIkFbWxv357Vr10Kj0WDFihXcIMJz5871u93sUFKwrAMPNzc3LuiwZ+DR2toKpVKJ5uZmxMTEYNy4cUNq0djbPA5+UNLY2Ai1Wm1RY8FfKFkvJK0Dj9TUVJdYJNvS1dUFhUKBurq6HudO9JSexG9929raarNbGXudhnrnll0ky+Vyl6yd4BfhBgUFcZ2kwsPDERERAaPRiI6ODtTV1UEmk3G7Jda1JfZMT+qP1tZWSKVSaDQaJCYmOnwifH+K3tlJ5fwp5n5+fjAajWhubsaoUaMwdepUu7YptqfOzk5IpVK0trYiISEBMTExA76mttK4rL/m+A0U+Glc/Bqc3gIJtqWyVCqFr6+vQ2a56PV6vP/++9i+fTvmzZuH27dvIyYmxq7v4Uzsz9zemgYUFBRYdKQEgIcffhhHjhyBwWAY9vlN5O5FOyBkRPrlL3+JZ555Bk8++WS/nq9QKKDVapGSkmIReHh4eHATzO2lpaUFCoUCbW1tiImJQVxcnNPvnrF3bq13AQwGg8WUYJ1Oh/r6enh5eSEhIcElctJt0Wg0UCgUUKlUiIiIQEJCgl06BrELbesdEwA2Z7v09cOYYRg0NTVBJpNBr9cjISHB4YvkweLXowQFBUEsFttc0DEM062NMj89yVZtib1Ttjo7OyGTydDU1IT4+HjExcW5zI4Mi2EYdHZ2orq6GjU1NQDufI/R6/Xw8vLqlp7krKL3nhgMBiiVSlRWViIqKgqJiYlO+T7V3zQu/s2Azs5OlJSUQKPRQCwW2z2YZxgGeXl5ePnll+Hm5oa9e/figQcecMnvhf3FMAzmz5+PlpYW/Otf/+rxecnJycjNzcX69eu5YxcvXsT06dO5AaOEOALtgJARaSA7IGz7XY1Gg/b2di5/256BB8MwXODR0dGBmJiYYS2E5t+55Z+jTqdDW1sbampqoFQqwTAM96iuruauDxugDPcPYK1WC6VSiZqaGoSFhdn9TrKHhwdGjx6N0aNHc8fYVpz8rkDl5eU2U93YtBuBQICWlhbIZDJ0dnZyrX9dbZEM3Pl6qK6uhkKhgI+PT59tVdnJ9taNAfhBrnVbV7aNMn/BPZihk/xJ61FRUYPubuQM7e3tkEgk0Gg0SE5O5iaDWxe9V1dXc0XvttKTHL2rxH6tswP6nD0Vvq9uXOyjoqICHR0d3M61n58foqOj4eHhAZ1OZ7cugVVVVXj11Vdx/vx5bNiwAatWrRqR6VbWnn/+eVy/fh0//PBDn8+11ZHS1nFC7IkCEDIi9ScAMZvN3CMgIADNzc24fv06GIbpVi8x2Lu2bCG0QqGAWq1GbGwssrKyXHLbmu0Yo1Qq4enpiYyMDISFhXWrmaioqOhxZomzut3odDqUlZWhqqoKISEhTp2Nwm/FycemurHXqrGxEZ2dnWAYBu7u7jCZTAgODsb48eMRFBTkcsEHwzBckABgyF2YbAW5ALpNMK+vr7c5wby3zyd+W9Xg4GCXTmFih0jW19dzuzP8j8lWS25bNTjW7aYHkp7UX83NzZBKpTAajUhLS3OpVEt+GhfDMKiqqoJcLoe/vz/Cw8NhMBi4QJft7DaU66TT6bBv3z7s2LEDjz76KG7fvt0tjXikWrlyJU6fPo0LFy70+TFFRERws7lY9fX18PDwcFqjDHJvogCEjEi9BSD8wAO4s1AKDQ1FRESExd1tdpIyO/yO7QjEf/Q0sIydj6BUKtHV1TXgCcbOxN7xLisrg7u7O1JSUiwWnr3NLOFPnLY1JJBdRNrrrq1er+fmY4wZM8bpd2d74+npaZHnzqYFNTY2IigoCL6+vujq6sLNmzdt7gIMR80Ei00L0+l0Dk8LY3dLehs6af35xF9IdnV1obKyEkKhENnZ2Ra7U66EXwwdHh5usx6pJ/waHH6xt/WuEv869afovScajQZSqRRNTU0QiUSIi4tzybRA4E6dT0lJCYxGI9LT020Ww/PTuHq6TvwHvwMewzD4/vvv8fLLL8PDwwOnTp3C7NmzXSYQGwqGYbBy5UqcPHkSeXl5EIlEfb4mJycHX3/9tcWxc+fOYdKkSS55I43cPagGhIxIjz/+OKZOnYoVK1Zwx/iBB5texXa16gt7N5L/6OrqsihQZn/wd3Z2QqlUQqvVIj4+HmPHjh0RgUdiYuKQazz4d7fZhz1mlvAH840aNQqJiYlOGc42GPx6lMjISCQkJHRbeLI1E/wdE1s1E47uMNXe3o7S0lK0t7cjPj4esbGxLrUzw79OjY2NaGtr475+bTVQcIUFkdlsRk1NDWQyGfz9/ZGcnNwtncjeeuoyBYBL4+JfKzaFiD8jJSIiAklJSS6bwqbT6VBaWor6+nquVfFAP1et07jYx4EDB3D79m3Exsairq4OFRUVeOmll7Bx40aXvR6DsWLFCnz22Wc4deqURcfHoKAgrmbu1VdfRXV1NT7++GMA/9eGd9myZVi6dCkKCgqwfPlyasNLHI4CEDIiPfnkk8jMzMSLL75oM/Dw8PAY8h0+/nDA9vZ2tLS0cG1KfXx8EBwc7JJtStkFklKphLu7OxISEhAeHu6wO3xDmVliNBpRUVGB8vJyBAQEICkpye6DxOyFnxYWFhaGxMRE+Pr69vv1vTUGsJ7HMdRWpV1dXZDJZGhoaEBsbCzi4+NdYvFuS1tbG0pLS6FWq7ndGa1W263oXafTddsFYIuUnXX3urGxEVKpFAzDQCwWD2sKE7ubax2UsHNwvLy8oNVq4e3tzTWYcJXvUXxmsxkVFRVQKBQICQlBcnKyXaetMwyD27dvY9u2bfjHP/6B8PBwCIVCbn5MRkYG5syZg40bN9rtPYdLT5+LR48eRW5uLgAgNzcXZWVlyMvL4/4+Pz8fL730EjeIcN26dTSIkDgcBSBkRPqP//gPJCYmYtWqVWAYxq6BBx+bN69QKGA0GhEXF4dRo0ZZpHFZd5eyTuFyFmcHHr2xnlnCLpLYQm4/Pz+YzWa0t7fD19cXYrHYZfON+bszwcHBSExMtFtamK3p5WyHKU9Pz26L7b46J/GLtnvanXEV/NqJ/gRJ1rsA7K4SgG4dpuw9nFOtVkMqlaKtrQ2JiYkuOxUe+L95HjqdDkFBQTAajejs7ITJZOJaKfOv1XClBQJ3AjqJRAI3NzekpKT02gxhMBiGwX//939jzZo18PLywr59+zBz5kwIBAJotVqUlJTgxo0bMJvNWLJkiV3fe7AuXLiAnTt34sqVK6itrcXJkyexYMGCHp+fl5eH2bNndzteXFyM1NRUB54pIUNDAQgZkWbNmgU3Nze8+OKLyMrKQkhIiF0XBGazmQs8zGYzRCJRj3nz/EUk/6HRaODt7d0tKBlMN6C+ztVVAo++sF2tamtruYBRo9HA3d3dqalJ/cFvU+vs3Rlbu0pqtZpbRFqnJ7m7u6OsrIyrnUlMTHRa0f5AGQwGKBQKVFVVISIiAomJiYMOkvi1SvzrxN75t07hGuh8F51OB7lcjtraWowdOxYJCQkuu5Ok1WpRWlqKhoYGxMXFIT4+nvv6sVX0zqaZ2ip6d3Szia6uLkilUrS0tDgsoKuoqMArr7yC77//Hm+88QZWrlzpsv93fN9++y1+/PFHTJgwAU888US/AxCJRGKRChgaGuqSO16EsCgAISPSihUr8PPPP3P5vHFxccjMzERWVhaysrKQmZmJ6OjoAS/CzWYzamtroVQqAQAikQiRkZGD+uHIdm2xnlzO7x7EX0gO9D1GUuDB1qOwHbj4E8H7mlli3YnL0TnbZrMZVVVVUCqV8PHxQVJSkkvszjAMw6Umsdepvb0dWq0WwJ1mAiEhIQgJCelWeOsKTCYTKisroVQqe507Yg/8jmX8wAT4v/ku/MW29U4lG3wqlUqMGTMGSUlJLtuFi98xLDQ0FGKxuN8BnXXRu/Wkd37BO3vzZCifUyaTCUqlEuXl5YiMjERSUpLdd4m1Wi327NmDXbt2YcGCBdixYweioqLs+h7OIhAI+h2AtLS0uGz6KiG2UABCRrympiZcu3YNhYWFKCwsRFFREYqLizF69GhkZWVh/PjxXGAiFott3hUymUxc4OHm5gaRSISIiAi7L+CsF9vsw2Qy9Vkvwf83+IEHe66uGnjU1tZCoVAMqBC+t10lR0wuZ9+ztrYWcrkc7u7uSEpKcqk2pXzW58ruzvEXk2az2WbbW2fPOGAnWMtkMnh6eg5bup2tmgk2LdDb25u7ViaTCfX19fD29kZycrLd04LshU0PLS0thZeXF1JSUuy2AGXT3fiBia0Azrrovbdzra+vh1Qqhbe3N1JSUuzeZIJhGJw/fx5r1qyBr68v9u7dixkzZrjk129/DSQAiY+Ph1arRVpaGjZs2GAzLYsQV0IBCLkraTQa3LhxA0VFRbh69SoKCwtx48YNAEBGRga3S5KSkoLvv/8ex48fx3vvvYcJEyY4fTFvfWebfbD1EvzFY1dXF6qqquDm5oaEhASXDTzYRSc7cyIxMdEu58pvDGA9uXywM0vYxZFcLofZbLbbuToC2/5ZJpPBaDQiKSnJ5rn2VoNjnZrkyEJudu6EwWBAYmIiIiMjXe66sjuV9fX1qK2thdFoBHDnGlrvlDi7rqsn7NDDrq4uiMVip1zX3oree5v0rlarIZFIoFarHXau5eXlWLduHS5cuIBNmzbhT3/604hIt+pLfwIQiUSCCxcuYOLEidDpdPjkk09w8OBB5OXlYcaMGc47WUIGiAIQcs8wmUyQSqUoLCzETz/9hG+++QYymQwMwyAiIgIzZszAfffdx6VyDfedT/YuZFtbGxoaGtDe3g6GYeDm5sZNEh5My1tH4i/mTSYTEhISBp3CNpD3tG4KwKaR9DazhGGYbvMxoqOjXeI62tLa2orS0lJ0dnYiISFhUHnz1mmB/DvbtnZLBruI4xdti0Qil50KD/xfx7DGxkZukKCbmxsXwPEX3PwdOOvFtjM+b3Q6HWQyGVQqFVfnMdwtwPmT3vmfU0ajER4eHjAajQgKCkJsbCyCgoLsWvSu1Wrxl7/8Be+++y4ef/xx7NixA5GRkXb5t11BfwIQWx577DEIBAKcPn3aMSdGiB243vACQhzE3d0d48aNw6VLl/DFF18gKioKJ06cwIQJE3D9+nUuMDl8+DDKysoQExPTra4kJibGaXdw2QLt6upqCAQCbigXP82murqaa3lrvQMQEBDgtMUJO2VdLpfDYDBAJBI5bTHPn1weERHBHbeeWcKfNC0UCqHX62E0GhEdHe3SxcVqtRoymQzNzc1DHnjp6emJ0aNHWwz3sx462djYiLKyMq7trfVuSW9NFLRaLeRyOVQqFcaOHYuMjAyX2DGwxWAwQKlUorKyEhEREZg2bZpF7YSvry98fX0RHh7OHePvwKnValRWVnLpbrZqS+xVr8RvVTtmzBhMmzaNm+sw3KwHmTIMg5qaGpSWlsLb2xvBwcFcdzZ7Fb0zDIPvvvsOa9euhZ+fH7755hvcf//9Lre7NlymTp2K48ePD/dpENIr2gEh95y///3v8PT0xCOPPNLjD6yWlhYUFRWhqKiIqy0pLi5GUFAQMjMzuUdWVhaSk5PtutDnF8ILBAKuuLynxTw/NaK9vb3XHYChzpew9d5NTU2Qy+XQarVc4OGqd7tbW1shlUrR0dEBf39/CASCbgvI4ayX4OMv5qOjoyESiZw6NI0dEmjd9tbNza1bWpKPjw+qqqpQXl6O0NBQJCUlDWhGijOxDRHkcjkCAgKQnJw8pGJ4Nt3NurbEVmrSQHcr2cBeKpXC3d3dIa1q7amtrY1rAZycnNyt3stkMnG7lb0VvfO7lll/r1IqlXjllVfwww8/cOlWw70L5CiD3QH593//dzQ3N+N//ud/HHNihNgBBSCE9JNWq8XNmze5gKSwsBDXr1+H2WxGenq6xU5JRkbGgBdgZrMZKpUKCoUCALgaj8HuIvQ03d3T0xMBAQEIDAy0mC8x0KCkubkZMpkMXV1diI+Pd+k0m87OTsjlcjQ0NGDs2LEQiURccMGvl+AvttkaHOudJXu3UbbGvzM/mIGHjmTdNam9vZ2bXu7m5oagoCAEBwdbBCauclearZ8pLS0FwzBITk5GSEiIw86vp9QktuGE9Q6A9Y2Bjo4OLlhOSkoaVFc/Z9Hr9SgtLYVKpUJ8fLxFC+D+vt46KGFnvJw4cQJNTU1ITk5GdXU1Tp8+jSeffBLvvPOOxY7n3YLd8QSA7OxsvPfee5g9ezaCg4MRGxvbbZL57t27ER8fj/T0dOj1ehw/fhzvvPMOTpw4gd/85jfD+aEQ0isKQAgZApPJBJlMhsLCQly9epXbNWF/YPJ3SjIzMxESEtLt39Dr9WhoaOBa/w418OjrfK2DErYGgF0IsbUlPc3haG1thUwmQ0dHB+Li4hAbG+uydyA1Gg0UCgVUKtWAB/PxW7lat1G2VfA+1OCLP3ckKCgISUlJFn39XQlb6yOTySAQCLghgvwOb/x0G/51Go75LvzFfGJi4rDV+vAbTvADE/6NAaFQiK6uLrS2tmLs2LFITEx02fRAtmW1XC7H6NGjkZKSYrfUMHZn9+zZs/jss8+Ql5cHk8kEg8GA8PBwZGZmYvz48Zg2bRqeeOIJu7ynK+hpsOCSJUtw7NixbpPMd+zYgcOHD6O6uhpCoRDp6el49dVX8cgjjzj5zAkZGApACLEzNgeaTd+6evUqrl27BoVCgejoaC4YSU9Px61bt/Dxxx9jxYoVWLRokcMCj96wNQDWgYn1dHc3NzfU19ejvb0dsbGxiIuLc9mFkV6vh1KpRFVVlV13ERwxs4Rtq6xQKODt7Q2xWOzSaTZsGptGo0FiYmKPAzpNJpPFbgl7zYxGY7drZWsHwB74RdsxMTEQiUQu+TlrMpnQ3t6OyspK1NfXw93dHQzDwGw2c9PL+elJjrhWA9Xc3AyJRAKz2YzU1FSHtFZWKpVYt24dLl68iDfffBN//OMfodFocPPmTVy/fh03btyAUCjEzp077f7egzHQKeYAkJ+fj9WrV+PWrVuIiorC2rVrsXz5cuecMCHDiAIQQpyktbUV165dw5UrV3Dy5En89NNPXO7zL37xCy4wycrKQkpKyrAulPhzOBobG1FfXw+9Xg8A8PLysujA5Yy0pP4yGAwoLy9HRUUFRo8ejaSkJIcNu2PZmlnC3tXubWYJfxcBAJKSkvo1I2W4dHZ2QiaToampCXFxcYiLixvwzpf1teJP5GZ3AAZbL8HHH843ZswYiMVil0ljs6WxsRFSqRQAkJKSgjFjxnC7JdZpXJ2dnfD09OyWwuWsnSWtVgupVIrGxkYkJCQgNjbW7jdNNBoN3nvvPezevRuLFi3Ctm3bLJoBuKqBTjFXKpXIyMjA0qVLsWzZMvz4449YsWIFPv/887tqV4cQWygAIcSJfvzxRzzzzDMwmUzYsGEDFi5cyLUGZocoXrt2DQaDAenp6RbpW+PHj3fqNGa1Wg25XI7GxkaMHTuWy+u2lcJlr+nug8VPXwoICEBSUtKwTwXubWaJj48PDAYDGIZBdHQ04uPjXbZblF6vh1wuR01NDaKiopCQkGD3YniTydQt1Y3t7mbdXaq3WRzsgEaZTMYNEuR3/HI1nZ2dkEqlaG1tRWJiYr9aK7PXyrro3Wg0wtfXt1sht73qcPhBXVhYGMRisd0/DxiGwZkzZ7Bu3TqMHj0ae/fuxbRp01w2KO9NfwrI161bh9OnT6O4uJg7tnz5cly7dg0FBQVOOEtChg8FIIQ4kVwuR35+PhYvXtzjDofZbIZMJrMYolhUVISGhgaIxeJu091DQ0Pteo6dnZ1QKBSor69HVFQURCJRr3UT9pjuPlhsRyOFQgEfHx8kJSUhODjYZRcsbW1tkEqlaG9vR2BgINzc3KBWq7t1LHOFIm7+gjM4OBhisdipAbB1dylbszj410qn06G0tBQGg6HHAY2uwmAwQKFQoKqqimsDPZQAlL+zZF1bwq/D4f/a390StnhfIpHAw8MDqampDgnu5XI51q1bh0uXLuHtt9/GsmXLXLa2rD/6E4DMmDED2dnZ+Mtf/sIdO3nyJJ588kluV5CQu9XI/eomZARKTExEYmJir89xc3NDcnIykpOT8eSTT3LHa2truWCksLAQH330EeRyOaKioix2SrKyshAfHz/gxZd1wXZ/Zw3wdz9Y1tPdW1paUFFR0W26O/sY6EKbvdMtl8u5+S6hoaEuu+Ds6uqCXC5HfX09YmJicN9991ksLtguQLZmllhfK0cPvWNrmORyOXx8fJCdnT0suwgCgYCbxREWFsYdNxqNFgvtsrIybmfJy8sLY8aMgcFgQEtLi90D3qFiGIYr2g4ICMCUKVPg7+8/5H9XIBDAx8cHPj4+Fjck2Doc9lrV1dVBJpPBYDDYrC2x/jrs7OyERCJBe3u7wzpxdXV14d1338WePXvw1FNPoaSkxOL/+26mUqm6pZaFh4fDaDSisbHxrhqqSIg1CkAIGSEiIyMRGRlp0d2kvb0d165d41K4du7ciVu3bkEoFHbrwDVu3Dibi7GOjg5UVlaitrYW4eHhyMnJGXK+vEAggFAohFAotFhMsJ2l2Ed9fT06Ozv7vdDmT1o3m81ITExEZGSkywYeOp0OSqUS1dXViIiIwPTp023uJrELZ34hr3WqDX/opCNmlvDb1JrNZqSkpLhkTYqHhwdGjx4Nf39/dHV1oaurC9HR0YiMjOSGTzY1NaG8vNxmK+We5ks4Glu0bTKZkJaW5pSA2d3dHYGBgRbd1BiG6Tbjpa6ujvs6ZK+PTqdDS0sLIiMjMX78eLsHcmy61dq1azFmzBicP38eOTk5Lvf55mjWHy+blHKvXQdy76EAhJARLDAwEPfffz/uv/9+7pher8ft27e5DlzHjx9HUVERdDod0tPTufStiIgInDhxApcvX8YXX3yBqVOnOjzFxtPTE8HBwRZdnvjdkqwX2vw7tAzDQKVSQafTISEhYdhaqfaH0WhEeXk5ysvLERwcPKg73e7u7ggKCkJQUBB3zDotib+z5O3t3S2I629zgPb2dkilUqjVaiQkJPSrFmG4sK1fFQoFAgICMHny5B4bDVi3Um5sbOTmS1jXlQx0Gnd/dXV1obS0FM3NzRCJRA4p2h4IgUAAb29veHt7W7QFN5vNUKvVqKqqgkqlgkAggJubG6qrq9Hc3NwthWsojSdkMhnWrl2Ln376CZs3b8Zzzz03otOtBisiIgIqlcriWH19PTw8PBzSVYwQV0I1IITcA8xmMxQKBYqKivDDDz/g1KlTKCsrAwCMHTsWU6ZMsagrGe6OM/zhgA0NDWhoaIDRaARwp4DbuguXK7QlBSwXx35+fhCLxU4phh/szBKNRgOZTIb6+nrExsZy8zxcETsVvLS0FAKBAMnJyRgzZsyA/9/5baf514tfh8O/ZoOtwzEajVAqlaioqEBkZCQSExOdOsl+oDo6OlBSUgKNRgOxWMzV0LC7Svzr1dnZafG5xf+1t0Cis7MTu3btwt69e/Ef//Ef2Lp1q91r2FxFf4vQv/76a9y+fZs79sc//hFFRUVUhE7uehSAEHIP2bZtG7Zs2YJZs2bhrbfeQlRUFFdTwv5aWlqKiIiIbnUlIpHIqXduOzo6IJPJ0NLSwg08ZBimW7E725bUVgqXs4ISdndGJpPBw8MDSUlJDp2y3R+9zSxhU+w0Gg3Xrpi/0+Jq+Ds0jhokyK/D4S+0B1rEzdbQyGQy+Pr6IiUlxWUHSgJ3gleZTIaamhrExsZCJBL1uRvBfm5ZByZsEOfv7w8/Pz/88MMPmDhxIlJTU3H27FmsW7cOYWFh2Lt3L6ZMmeISNw3saaBTzNk2vMuWLcPSpUtRUFCA5cuXUxteck+gAISQe8inn36KhIQE5OTk9Picjo4OXL9+3WKI4s2bN+Ht7c3VlbBBybhx4+zePrazsxNyuRwNDQ0YO3YsRCJRr+/Bb+Ha3t7O/R5At7v/AQEBdp2VwNZNyGQyGI1Gl69JMRqNKCsrQ0VFBby8vCAUCqHVai1mlvCvGTuzZLhotVrIZDLU1dUNyw5NX0GcdScujUYDiUQCg8GA5ORkl6yhYTEMg+rqashkMgQGBiIlJWXIKZj82pLKykr86U9/QllZGcxmMwQCAXJycrBw4ULcd999yMzMHPZW2fY20CnmwJ1BhC+99BI3iHDdunU0iJDcEygAIYT0Sa/Xo7i4mGsNXFRUhKKiImg0GqSlpVkEJePHjx/UHV+tVguFQoHa2lpERkYiISGh1/a/vWEYptsU7vb29m4Lx4FMLLfW2toKmUwGtVoNkUiEmJgYl62bsN6hYdOXWNYzS2wFcfzAxNH5+iaTCWVlZSgvL0dISAjEYnG/OrI5g62Wt+3t7dBoNADupAiGhIRwaYJ+fn5OGRA4EK2trSgpKYHRaERKSopDdus6Ozuxc+dO7N27F3PnzsW8efOgVCpx7do1XL9+HdXV1Th06BCee+45u77vUO3fvx87d+5EbW0t0tPTsXv3bosaO76eAo7i4mKkpqY6+lQJGdEoACGEDArDMFAqlVwHLjaNq6amBgkJCVw9CVtb0lNLSZ1Oh7KyMlRVVSEsLAwJCQkOKYa3NbG8o6Oj21yJwMDAXjsl8SeCs3flXbmAtrm5GVKpFAaDYUA7NAzDcLUS/Ie9ayWs37O2thalpaUQCoVITk526bvkbKDEDueLiIjoVjNhMpls7pYMRz0IOyulrq4OIpEIcXFxdg+OzGYzvv76a7zyyisIDw/H3r17MXny5G6fG01NTXBzc3OpQZFffvklFi9ejP3792P69Ok4dOgQPvzwQ9y+fRuxsbHdns8GIBKJxOKmS2hoqMsFnYS4GgpACCF2VV9f362uRCqVIiwszKLQPSYmBp9++ikKCgpw8OBBiMXiHrsZORI7V8LWdHd/f38uIPH29kZdXR3q6uocNhHcntRqNUpLS9Ha2srt0NhjUWQ9s6Sjo8MuM0v4gZJYLEZ4eLhLpy+pVCqUlpbCx8cHKSkpNmtorOfhsIEJG/Rad+Fy1IwXs9mMiooKKBQKh+4oSaVS/L//9/9QWFiIrVu34tlnnx1RC/EpU6ZgwoQJOHDgAHds3LhxWLBgAbZt29bt+WwA0tLS4tKBMiGuiAIQQojDqdVq3LhxA4WFhfjpp5/wz3/+E9XV1XBzc0NKSgpmzJjBFbynpaUN+8Ken/vf1taGhoYG6HQ6AICvry+CgoIsghN718EMhVarhVwuh0ql6lcNjT1Yt1Lm3/3va2ZJZ2cnSktL0dLSYtdAyVHa2togkUig1WotukUNBD/ljf8r23raOjAZyv9fU1MTSkpKIBAIkJqaatEC217UajV27NiB/fv343e/+x02b95s0eJ3JNDr9fD19cXf/vY3PP7449zxF198EUVFRcjPz+/2GjYAiY+Ph1arRVpaGjZs2GAzLYsQYsl18wYIIXcNf39/5OTk4NatW/juu+8QExODDz/80KIL11//+lesX78earUa48aNs0jfyszMdGqXJjc3N/j6+qKxsREqlQpBQUHIysqCl5cXt8BubW1FZWWl3aa7DxVbYF5eXo7Q0FC7DJTsr54G3vHv/lvPLPHz8+N2n8LCwjBt2rRhDzx7w09fiouLg0gkGnSg5OHhgVGjRlncNee3nu5pxot1g4DePr/YgviWlhYkJiY6ZLaL2WzGqVOn8OqrryIqKgr5+fmYNGmSy+5c9aaxsREmk8nmZHLrWR2syMhIHD58GBMnToROp8Mnn3yCBx98EHl5eZgxY4YzTpuQEYt2QAghTvOXv/wFcXFxmD9/vs1FCsMwKC8v71ZXUlVVBZFIxBW6s0GJIzpOmc1m1NTUQKFQwNvbG0lJSb0OBbOe7s5v3zqUlKSBnG91dTXkcjn8/PyQnJzs0i11dTodFAoFampq4OnpCXd3d2g0mj5nlgwXk8mEiooKKJXKYSmINxgM3RoEqNVqAN0bBPj7+8PNzY2rS4mIiIBYLHbIDphEIsGaNWtw/fp1bN26Fb///e+H/f9qKGpqahAdHY2LFy9adAncsmULPvnkE5SUlPTr33nssccgEAhw+vRpR50qIXcFCkAIIS6vsbGR2ylhgxKJRIIxY8ZY7JRkZWUhMTFxUAshhmFQX1/P9fFPSkoadBtVdqq0dWDCn+7OX2QPprUs/3wFAgHEYvGwzx7pDXu+paWlcHd3t+jExU954183g8EAPz+/btfMy8vL4R8n/3w9PDyQkpLiMgXT7DBF688xvV4P4M4OS1hYGEJCQhAQEDCkqeXW1Go1tm/fjgMHDmDJkiXYvHnzXTG1ezApWLZs2bIFx48fR3FxsaNOlZC7AgUghJARqbOzEzdu3OBaAxcWFuLmzZtwd3dHRkaGxRDFtLS0Xlv6Njc3QyaTQaPRIDExEVFRUXbfqbBOsWEfOp2O6yrV3+nura2tkEqlDj1fe2pra4NUKkVXVxc3SLCvBbGtdrdswbt1Abe9Z5Z0dHRAIpGgs7MTSUlJiIqKctnADrgTFEgkEnR0dCAyMhLe3t5DnlpuzWw24+TJk1i/fj3Gjh2LvXv3YuLEiS59XQZqypQpmDhxIvbv388dS0tLw/z5820Wodvy7//+72hubsb//M//OOo0CbkrUABCCLlrGI1GSCQSi52SwsJCtLe3IzU1lQtK2EdJSQk2bdqE3//+95g8eTJiY2OdnkZiq6tUT9PdAUAul6OpqQlxcXGIi4tz6RbA/EGCcXFxdmlZ3NfMEusC7oHsLun1eshkMtTW1vZ7KvhwMhgMUCgUqKqqwtixY5GQkNDt4+1td4kf+LLXzVbtUnFxMdasWYNbt25h27ZtyM3NHdHpVj1h2/AePHgQOTk5OHz4MD744APcunULcXFx3SaZ7969G/Hx8UhPT4der8fx48fxzjvv4MSJE/jNb34zzB8NIa7Ndb+zEtKDbdu24auvvkJJSQmEQiGmTZuG7du3IyUlpdfX5efnY/Xq1dzE2bVr19LE2buMh4cH0tPTkZ6ejt/+9rcA7txJr6ys5IKSixcvYs+ePaipqQEAxMTE4Pr16wgICICnp2e/7s7bk5eXF8aMGWORxsKf7t7R0YHy8nJuke3p6YnQ0FB4eXlBrVYP+E62M/AL4tkCc3vVTfRUwM2fWdLY2IiysjKL3aXeZpaYzWZUVlZCoVBg9OjRTi3gHwz+vBQ/Pz9MmTIF/v7+Np/r5uZmEcCyr+cHvmq1GiqVimunfOjQIfj6+iIlJQUSiQSnTp3C73//e5w4ccIhXbRcxaJFi9DU1IS33noLtbW1yMjIwDfffIO4uDgAQG1tLSoqKrjn6/V6rFmzBtXV1RAKhUhPT8eZM2fwyCOPDNeHQMiIQTsgZMSZO3cunnrqKfziF7+A0WjEa6+9hhs3buD27ds9DrBTKpXIyMjA0qVLsWzZMvz4449YsWIFPv/8czzxxBNO/gjIcKmvr8fmzZvxwQcfYMGCBXj00UehUqm43ZLi4mKMHj26W12JWCwelju+JpMJ5eXlKCsrQ3BwMKKjo2EymbiFo72nuw8VwzBcQbyvr++wF8T3NbPE398fAoEA9fX1cHd3R0pKisvXM7BtgHU6HZKTkwddp2QL2075008/xVdffYXLly/DbDaDYRikpKRwO4i//OUve5wOTggh/UEBCBnxGhoaEBYWhvz8/B5bH65btw6nT5+2KAxcvnw5rl27hoKCAmedKhlmFy5cwM6dO7Ft2zZkZGR0+3uNRsPNK2EfN27cAACuroRdhKWnpzusGxLDMKipqYFcLoe3tzeSk5NtFkBb38m2rpOwDkr6at06FE1NTZBKpTCZTBCLxXZdGNsTu8hubGxEdXU1dDodBAJBtwYB7O9dZcYLPz1sqG2Ae3P79m2sWbMGxcXFeOedd/C73/0ONTU1uHbtGveIiYnBu+++a/f3Hqr9+/dj586dqK2tRXp6Onbv3t1roES74oQMHwpAyIgnk8kgFotx48YNm4tKAJgxYways7Pxl7/8hTt28uRJPPnkk+jq6hpUFyJybzCZTJBKpSgsLMTVq1dRVFSEoqIitLa2IiUlhasnYQOToaSoMAyDpqYmlJaWwmQyISkpaVATwa3rJNrb29HZ2QmBQGD3Vrf8iesJCQmIiYlx6YJ4g8EAuVyO6upqrm7Cw8PDYmYJ++DP4OBfL0cGctbMZjOqqqogl8sxevRoJCcnOyQ9rL29Hdu2bcPhw4fx7LPP4u2333aZrl/9wdZv7N+/H9OnT8ehQ4fw4Ycf4vbt24iNje32fNoVJ2R4UQBCRjSGYTB//ny0tLTgX//6V4/PS05ORm5uLtavX88du3jxIqZPn46amhpERkY643TJXYJhGFRVVXFF7levXsW1a9dQVlaGmJgYiw5cWVlZGDt2bJ8L1vb2dpSWlqKjowMJCQl2HxzHtm5lAxK1Wo329naYTCabKVx93fnX6/WQy+Xc/ISEhASX2S2whT8vJTAwEMnJyT3WTbDYGS/WRe/OmlnS3NwMiUQCs9mMlJQUh0wXN5vN+Nvf/obXXnsNCQkJ2LNnD7Kzs11y96o3U6ZMwYQJE3DgwAHu2Lhx47BgwQKbHaxoV5yQ4eValYuEDNDzzz+P69ev44cffujzudY/UNnYe6T9oCXDTyAQICYmBjExMXjssce44y0tLdwOSWFhIbfACQoKsui+lZWVheTkZHh4eEAikeCjjz7Cgw8+iNjYWGRmZjpkR45dNPv7+3MBt/W08ra2Nm66u/Wdf3aeBFuwrVQqMWrUKEydOrXH2itX0dTUBIlEAoZhkJ6e3u95KZ6enggODrbY1WK7SrFBSV1dHWQyWY+1OIOZWaLVaiGVStHY2IiEhATExsY6ZFfp9u3bWL16NaRSKbZv347Fixe79O5VT/R6Pa5cuYJXXnnF4vicOXNw8eJFm68pKCjAnDlzLI49/PDDOHLkCAwGA+2KE+JgFICQEWvlypU4ffo0Lly4gLFjx/b63IiICKhUKotj9fX18PDwGHDRKVtHcOXKFdTW1uLkyZNYsGBBj8/Py8vD7Nmzux0vLi5GamrqgN6buLbRo0dj9uzZFv/fWq0WN2/e5GpKPvzwQ1y/fh0mkwlBQUFobGxEWloaHnroIURHRzt14SMQCCAUCiEUChEWFsYdt57u3tDQwN35BwB3d3dER0cjMjLSqVPBB6qrqwtSqRQtLS12Sw/jd5XiB3LWM0tqamq49E5btTi2zsNsNqO8vBxKpRKhoaGYNm1ar/NrBqu9vR1btmzBhx9+iKVLl+L06dMWXcVGmsbGRphMJoSHh1scDw8P7/Z9n6VSqWw+32g0orGxkXbFCXEwCkDIiMMwDFauXImTJ08iLy8PIpGoz9fk5OTg66+/tjh27tw5TJo0acALvs7OTmRlZeGZZ54ZUK6wRCJBYGAg9+fQ0NABvS8ZmXx8fDBp0iRMmjQJAKDT6bBnzx5s2bIF4eHh+NWvfoWGhgY888wzaGpqQnJyssVOSVZWltM7M1nf+Wc7L3V1dSE0NBRubm5oa2tDVVUVzGYz/Pz8EBgYaFG8PZx3kI1GIxQKBSorKxEZGYnp06c7ND1MIBDAx8cHPj4+Fl/X1rU4lZWVXDtlPz8/i6BEq9VCLpfDw8MD2dnZDqm/MJvN+Otf/4oNGzYgMTERBQUFyMrKumt2gW3tcvf2sdGuOCHDhwIQMuL86U9/wmeffYZTp04hICCAu8MVFBTE3Y21Hhi1fPly7Nu3D6tXr8bSpUtRUFCAI0eO4PPPPx/w+8+bNw/z5s0b8OvCwsJG9F1GYh9vvPEGzp49i7/+9a8WKSBs5yu2JfCVK1dw5MgRKJVKREdHW3TgysrKQmxsrMMXShqNBjKZDPX19YiPj8eECRMsZo5YT3dvamrqcf5GYGBgr9Pd7YHfBtjPzw+TJ0+2mH/hbP2ZWVJfX4/S0lKYzWZ4enrC398fzc3NMBgMPQ4GHCiGYXD79m28/PLLKC0txfbt2/Hb3/52RKZb2RISEgJ3d3ebu9zWuxwse+6KE0IGjgIQMuKwRYazZs2yOH706FHk5uYC6D4wSiQS4ZtvvsFLL72E999/H1FRUdizZ49Tu51kZ2dDq9UiLS0NGzZssJmWRe5+r7/+OrZs2dKtYFkgECA6OhrR0dF49NFHueOtra24du0aF5icOXMGt2/fhr+/f7cOXCkpKXbZeTAajVAqlaioqEB4eDimT59uMxVIIBDA19cXvr6+Fgs969bAdXV1PU537ykdaaBaWlogkUhgNBqRmprqsm2ABQIB/Pz84O3tzdXdREVFITY21qIep76+Hp2dndzMEn4w5+/v3+9r1tbWhq1bt+LDDz/Ec889N+LTrWzx8vLCxIkTcf78eTz++OPc8fPnz2P+/Pk2X2PPXXFCyMBRFyxChkAgEPRZAyKRSHDhwgVMnDgROp0On3zyCQ4ePIi8vLwe55YQ0hudTodbt25ZdOC6du0aDAYD0tPTLdK3MjIy+l0kbjabUVNTA5lMBn9/fyQnJ1ukDQ6F9XR39gHAZkep/k5312g0KC0tRWNjI0QiEWJjY4dlaGR/MQwDlUqF0tJSCIVCpKSk9HiN2Zkl/OulVqthMpm4FC7+teOnmZnNZnzxxRfYsGEDUlJSsHfvXowfP94lgzJ7YNvwHjx4EDk5OTh8+DA++OAD3Lp1C3Fxcd12xdk2vMuWLeN2xZcvX05teAlxEgpACBmC/gQgtjz22GMQCAQ4ffq0Y06M3HPMZjNkMhmKiopw9epVbsekoaEBYrG423R36xqk/Px8eHp6gmEYiMVihIaGOnyxap2OxD70en2f091NJhOUSiXKy8sRERGBpKSkYZn+PhAdHR0oKSlBV1cXkpOTERERMeBrbN25jD988oUXXkBsbCzCw8Nx69YttLS0YNeuXXdVulVv9u/fjx07dqC2thYZGRn485//zN3kyc3NRVlZGfLy8rjn5+fn46WXXuIGEa5bt44GERLiJBSAEDIEgw1AtmzZguPHj1v0oO+PgXbgAmja772utraWC0bYTlxyuRxRUVHIzMxEREQEfvjhB9TW1uLcuXPIzMwc9sUq21HK1nR3Nv2otbUVQqEQ48aNQ1BQ0LCeb1/4ww9jYmK44Yf2pNVq8Y9//AN79+7F1atXERISgtbWVnh6eiIzMxP33Xcffv3rX+PXv/61Xd/XUVpaWvDCCy9wN2n+7d/+DXv37u01fSw3NxcfffSRxbEpU6bg0qVLjjxVQsggUA0IIcOgsLBwUG0eB9qBS6lU4pFHHsHSpUtx/PhxbtpvaGgopRncIyIjIxEZGYlHHnmEO9be3o7vv/8eO3bswPnz5xEUFASdTod58+Z168CVmprq9Jx4b29veHt7WwzeMxqNUKlUUCqVMBgM8PLyglqtxs8//9xtp8QRQwEHgy2Kl8lkCAwMdNjMFLPZjBMnTmDDhg0YN24cioqKkJGRAaPRCIlEws2mqa6utvt7O8rTTz+NqqoqnD17FgDw3HPPYfHixd3qNqzNnTsXR48e5f7sysMxCbmXUQBCyACp1WrIZDLuz0qlEkVFRQgODkZsbGy3XOPdu3cjPj4e6enp0Ov1OH78OE6cOIETJ04M+L0H2oHr4MGDiI2Nxe7duwHcmQz8888/Y9euXRSA3MMuXryIxYsX41e/+hWKi4shFouh1+tx69YtLoXrk08+wZo1a6DT6bi6EjYwycjIcGp3Ka1WC5lMhrq6OsTHxyM+Ph7u7u4W092thwJat7ntz3R3e2ptbUVJSQmMRiPS0tIcktLGMAxu3LiBl19+GWVlZfjzn/+Mp556itvB8vT0REZGBjIyMvDb3/7Wru/tSMXFxTh79iwuXbqEKVOmAAA++OAD5OTkQCKRICUlpcfXent7IyIiwlmnSggZJApACBmgn3/+2aKD1erVqwEAS5YswbFjx7p14NLr9VizZg2qq6shFAqRnp6OM2fOWNyRdhSa9ktsyc7Oxtdff42ZM2dyx7y8vJCdnY3s7Gw888wzAO7cWVcoFFzq1vnz57Fz507U1dUhMTGR677FBiY9tTwdLJPJhPLycpSVlSE0NLRbN66eprvzU7jYeSUajabH6e72DAx0Oh1KS0tRV1cHkUiEuLg4h+zGtLa24u2338axY8ewYsUKfPvtt3ZrGDDcCgoKEBQUxAUfADB16lQEBQXh4sWLvQYgeXl5XMvzmTNnYsuWLRZDNgkhroECEEIGaNasWeitdOrYsWMWf167di3Wrl3r4LOyjab9ElvCw8P7FSy4ubkhKSkJSUlJWLhwIXdcpVJxNSVFRUU4fvw4SktLERkZaVHonpmZCZFINOCaEoZhUF9fD6lUCk9PT0yYMKHfrWN7GgpoMBgsunA1NjZCrVbD3d3dZheugZ6z2WxGZWUlFAoFgoODMW3aNIdMiTebzfj000+xceNGpKen4+eff0Z6errd32c4qVQqm0FDWFhYj5PNgTs7xAsXLkRcXByUSiVef/11PPDAA7hy5YrLNygg5F5DAQghdzma9kvsLSIiAnPnzsXcuXO5Yx0dHbh+/TrXGvi9997DzZs34e3tze2SsDsl48aN6zEdqq2tDVKpFF1dXRCLxYiMjLTL56qnpydGjx5tMWHcbDZbtLmtra2FVCq1aHPLf/S0Y9jU1ASJRAIAyMzMdMggO4ZhcP36daxevRqVlZXYvXs3Fi1aNOwNAwZi06ZNePPNN3t9zuXLlwHY/v7U12TzRYsWcb/PyMjApEmTEBcXhzNnzuA3v/nNIM+aEOIIFIAQchejab/EWQICAjB9+nRMnz6dO6bX61FcXMzVlXz++edYt24dNBoN0tLSLIKS0aNH4+2334anpydef/11ZGdn271TlDU3NzcuuGDx29y2t7ejubkZFRUV0Gq18PHx6RaQlJeXo6WlBQkJCYiJiXFIQNDS0oK3334bH3/8Mf70pz/h9ddfH5HpVs8//zyeeuqpXp8THx+P69evo66urtvfNTQ0DCjNLzIyEnFxcSgtLR3wuRJCHIsCEELuYo6a9rt//37s3LkTtbW1SE9Px+7du3H//ffbfG5eXp7Nqe/FxcVITU0d9DkQ1+fl5cWlYy1ZsgTAnQW+Uqnk6kr++c9/4u2330Z7ezt8fHwwffp0/P3vf+eCE2enCQoEAgiFQgiFQos0IOvp7pWVlTAYDBAIBAgMDIRWq4VKpUJAQAD8/PzsEoiYTCYu3Wr8+PH4+eefkZaWNuR/d7iEhIRYdDbrSU5ODtra2vDTTz9h8uTJAID//d//RVtbG6ZNm9bv92tqakJlZaXdPod6+l7GmjVrFr7//nu7vBchdzsKQAgZQQbagWv58uXYt28fVq9ezU37PXLkCD7//PNBn8OXX36JVatWYf/+/Zg+fToOHTqEefPm4fbt24iNje3xdRKJxOKurfUgPHJvEAgESEhIQEJCAjw9PfHFF18gPj4eGzduREBAABeYfP7555BKpQgLC7PYKcnMzERiYqLTU4+8vLwQHBwMk8mEyspKCIVCZGZmwt3dnQtKqqqqoFarwTCMzRSu/u7oMAyDoqIirF69GjU1Ndi7dy8WLlw4otKthmLcuHGYO3culi5dikOHDgG404b30UcftShAT01NxbZt2/D4449DrVZj06ZNeOKJJxAZGYmysjKsX78eISEhePzxx+1yXtOmTUNtbW2346dPn8by5cuxYsUKu7wPIfcCGkRIyAjS0x04tgOXM6b9TpkyBRMmTMCBAwe4Y+PGjcOCBQuwbdu2Hs+5paWl34XE5N6wfPlyZGdn4w9/+IPNTlFqtRrXr1/nUriKiopw8+ZNeHp6csXubHCSlpbm0ELjzs5OlJSUoKOjA2KxGFFRUT3WKfQ03V0oFCIgIACBgYFc4bu3t7fFv9Pc3Iy33noLx48fx8qVK7Fhwwantjx2Fc3Nzd0GEe7bt8/ie4hAIMDRo0eRm5sLjUaDBQsWoLCwEK2trYiMjMTs2bPx9ttvIyYmxmHnWVxcjKlTp2LlypXYvHmzw96HkLsNBSCEkH7T6/Xw9fXF3/72N4u7ii+++CKKioqQn5/f7TVsABIfHw+tVou0tDRs2LCh11QGQnpiMBhQUlLC7ZSwQ/bUajXGjRtnEZRkZmYOeUq60WiEQqFAZWUloqOjkZiYOKj0xZ6mu587dw6XL19GWloa9Ho9vv32W0ycOBF79+7FuHHjhnTuxLFaW1sxZcoUpKSk4NSpU9TYg5ABoBQsQki/NTY2wmQy2Wzt21N7zMjISBw+fBgTJ06ETqfDJ598ggcffBB5eXmYMWOGM06b3EXY3Y/x48fjd7/7HYA7uw7l5eVcUHLhwgXs2bMHVVVVEIlEFpPd2bqSvhaLDMOgtrYWpaWl8PPzw+TJk4e0E2FrurvJZMLo0aNhMBjwX//1X1Cr1QDuDIp85plncN999+G+++7DokWLLLp3ubItW7bgzJkzKCoqgpeXF1pbW/t8DcMwePPNN3H48GG0tLRgypQpeP/99126vbDZbMbTTz8Nd3d3HD9+nIIPQgaIAhBCyIDZau3b0w/glJQUi7ztnJwcVFZWYteuXRSAELsQCATchHT+zlxDQwOuXbvGBSZ/+9vfIJFIMGbMGGRlZVnMLElMTOTSwP71r3+hvLwcsbGxSElJQXh4uEMWmK2trfj444/x2Wef4YUXXsCGDRvg4+MDqVTK7eycOHEC8+fPt/t7O4per8fChQuRk5ODI0eO9Os1O3bswHvvvYdjx44hOTkZmzdvxkMPPQSJROKy6Wfr169HQUEBfvrppxHZkYyQYccQQkg/6XQ6xt3dnfnqq68sjr/wwgvMjBkz+v3vbN68mUlNTR30ebz//vtMfHw84+3tzUyYMIG5cOFCr8/Py8tjJkyYwHh7ezMikYg5cODAoN+bjGxqtZopKChgDhw4wCxdupSZNGkS4+Pjw/j5+TETJkxgEhMTGQ8PD+bZZ59l6uvrmc7OTrs/2tvbmX379jFjxoxh5syZwxQXFw/3ZbG7o0ePMkFBQX0+z2w2MxEREcw777zDHdNqtUxQUBBz8OBBB57h4H3xxReMu7s7c/bs2eE+FUJGrHujpQYhxC68vLwwceJEnD9/3uL4+fPnB9Qes7CwcNCtMdkuXK+99hoKCwtx//33Y968eaioqLD5fKVSiUceeQT3338/CgsLsX79erzwwgs4ceLEoN6fjGx+fn6YOnUqli9fjsOHD+Py5ctoaWnBiy++iJKSEphMJkyYMAFfffUVIiMjMWXKFCxduhR79+7FhQsX0NLSMuj3ZhgGV65cwQMPPIAdO3bg0KFD+Pbbb+/pdtRKpRIqlQpz5szhjnl7e2PmzJm4ePHiMJ6ZbUVFRfj973+Pd955Bw8//PBwnw4hIxalYBFCBmT16tVYvHgxJk2ahJycHBw+fBgVFRVcZy3rVsC7d+9GfHw80tPTodfrcfz4cZw4cWLQAcB7772HZ599Fn/4wx+4f/+7777DgQMHbHbhOnjwIGJjY7F7924Adzp2/fzzz9i1axeeeOKJQZ0DubssWLAACoUC//Vf/4V58+YBuBMsVFRUoKioCIWFhfjxxx+xf/9+VFRUIC4ujqsnYVO4euqKxWpsbMSmTZvwxRdfYNWqVVi/fj38/f2d9SG6LLZ2zFZdWXl5+XCcUo8aGxuxYMECzJo1C7/97W+71b25u7tTe3FC+okCEELIgCxatAhNTU146623UFtbi4yMDHzzzTeIi4sDANTW1lrsRuj1eqxZswbV1dUQCoVIT0/HmTNn8Mgjjwz4vfV6Pa5cuYJXXnnF4vicOXN6vFtaUFBgcXcVAB5++GEcOXIEBoNhSAMZyd1h165dEIvFFm18BQIB4uLiEBcXZ1GD0dTUxNVnFBYW4quvvkJJSQmCg4Mtum9lZWVBLBYDAI4dO4ZNmzbhF7/4BQoLCy1qokaCTZs24c033+z1OZcvX8akSZMG/R4DqSsbLmfOnEF5eTnKy8tt7uDGxcWhrKzM+SdGyAhEbXgJISNGTU0NoqOj8eOPP1qkfG3duhUfffQRJBJJt9ckJycjNzcX69ev545dvHgR06dPR01NjdMnbZO7j0ajwY0bN7hi98LCQty4cQMA4ObmhlGjRmHPnj1YsGDBiBwm2NjYiMbGxl6fEx8fDx8fH+7Px44dw6pVq/rsgqVQKJCYmIirV68iOzubOz5//nyMGjUKH3300ZDOnRDimmgHhBAy4gz0bqmt59s6TshgCIVCTJ48GZMnT+aOGY1GlJaW4sCBA9i4caNF+92RJiQkxGHnLxKJEBERgfPnz3MBiF6vR35+PrZv3+6Q9ySEDL+RdyuGEHLPCgkJgbu7e7fc6/r6+m455KyIiAibz/fw8MCYMWPsdm4tLS1YvHgxgoKCEBQUhMWLF/d59zc3NxcCgcDiMXXqVLudExk+Hh4eGDduHPbs2TOig4+BYutmKioqYDKZLAZFslJTU3Hy5EkAd24CrFq1Clu3bsXJkydx8+ZN5ObmwtfXF08//fRwfRiEEAejHRBCyIjB78LFn/dw/vz5Hmcl5OTk4Ouvv7Y4du7cOUyaNMmu9R9PP/00qqqqcPbsWQDAc889h8WLF3d7b2tz587F0aNHuT97eXnZ7ZwIcbaNGzdapE2xuxrff/89Zs2aBQCQSCRoa2vjnrN27VpoNBqsWLGCG0R47tw5l50BQggZOqoBIYSMKF9++SUWL16MgwcPcl24PvjgA9y6dQtxcXHdunAplUpkZGRg2bJlWLp0KQoKCrB8+XJ8/vnnduuCVVxcjLS0NFy6dAlTpkwBAFy6dAk5OTkoKSnpseg4NzcXra2t+Pvf/26X8yCEEEJGAkrBIoSMKIsWLcLu3bvx1ltv4b777sOFCxd67cIlEonwzTffIC8vD/fddx/efvtt7Nmzx64teAsKChAUFMQFHwAwdepUBAUF9TnLIC8vD2FhYUhOTsbSpUtRX19vt/MipL+2bNmCadOmwdfXF6NGjerXayiFkBAyWLQDQgghQ7R161YcO3YMUqnU4nhycjKeeeYZvPrqqzZf9+WXX8Lf3x9xcXFQKpV4/fXXYTQaceXKFYuWsIQ42htvvIFRo0ahqqoKR44c6bN+CbgTgNTV1XVLIQwODnbgmRJC7gZUA0IIIT3o7/wDwHZHrb66cy1atIj7fUZGBiZNmoS4uDicOXMGv/nNbwZ51oQMHPt5fuzYsQG9ztvbGxEREQ44I0LI3YwCEEII6cHzzz+Pp556qtfnxMfH4/r166irq+v2dw0NDT1257IlMjIScXFxKC0tHfC5EjIc2BTCUaNGYebMmdiyZQvCwsKG+7QIIS6OAhBCCOlBf+cf5OTkoK2tDT/99BM3C+J///d/0dbWZjEwsS9NTU2orKwc9HDELVu24MyZMygqKoKXl1e/0mgYhsGbb76Jw4cPcx2I3n//faSnpw/qHMi9Y968eVi4cKFFCuEDDzxAKYSEkD5RETohhAzRuHHjMHfuXCxduhSXLl3CpUuXsHTpUjz66KMWHbD48w/UajXWrFmDgoIClJWVIS8vD4899hhCQkIsWgwPhF6vx8KFC/HHP/6x36/ZsWMH3nvvPezbtw+XL19GREQEHnroIXR0dAzqHIjr2LRpU7cicevHzz//POh/f9GiRfj1r3+NjIwMPPbYY/j2228hlUpx5swZO34UhJC7Ee2AEEKIHXz66ad44YUXMGfOHADAv/3bv2Hfvn0Wz+HPP3B3d8eNGzfw8ccfo7W1FZGRkZg9eza+/PLLQc8/GGgeP8Mw2L17N1577TWu5uSjjz5CeHg4PvvsMyxbtmxQ50FcQ39TCO2FUggJIf1FAQghhNhBcHAwjh8/3utz+E0HhUIhvvvuO0efVq+USiVUKhUXNAF3iopnzpyJixcvUgAywvU3hdBehppCSAi5d1AKFiGE3KNUKhUAdCuUDw8P5/6O3BsqKipQVFSEiooKmEwmFBUVoaioCGq1mnuOo1MICSH3DgpACCHEhTk6jx/o3kK4r/bB5O6zceNGZGdn44033oBarUZ2djays7MtPrdspRDOnz8fycnJWLJkCZKTk1FQUDDoFEJCyL2DUrAIIcSFOTKPn53foFKpLNJm6uvrB9Q+2NpgunHl5ubio48+sjg2ZcoUXLp0adDnQfrv2LFjfdYOuVoKISFk5KIAhBDikkwmE+6//35ERkbixIkT3PG2tjZkZGRgyZIl2Lx58zCeoXM4Mo9fJBIhIiIC58+fR3Z2NoA7nbTy8/Oxffv2Qf+7bDeunJwcHDlypN+vmzt3brep2oQQQu4+lIJFCHFJ7u7u+Oijj3D27Fl8+umn3PGVK1ciODgYGzduHMazc00DzeMXCARYtWoVtm7dipMnT+LmzZvIzc2Fr68vnn766UGfx5tvvomXXnoJ48ePH9Dr2Kna7CM4OHjQ53AvKCsrw7PPPguRSAShUIjExES88cYb0Ov1vb6OYRhs2rQJUVFREAqFmDVrFm7duuWksyaEENoBIYS4MLFYjG3btmHlypWYPXs2Ll++jC+++AI//fQT3R23YePGjRZpTOyuxvfff49Zs2YBsMzjB4C1a9dCo9FgxYoV3CDCc+fODUseP03VHpiSkhKYzWYcOnQISUlJuHnzJpYuXYrOzk7s2rWrx9exs1+OHTuG5ORkbN68GQ899BAkEgnVbxBCnELA8JM6CSHExTAMgwceeIArel25ciU2bNgw3KdF+uHYsWNYtWpVv2pAvvzyS/j7+1tM1TYajTRVe4B27tyJAwcOQKFQ2Px7hmEQFRWFVatWYd26dQAAnU6H8PBwbN++nVovE0KcglKwCCEuTSAQ4MCBA/jv//5vhIeH45VXXhnuU7on0VTtkaGtra3X1LW+Zr8QQogzUAoWIcTl/ed//id8fX2hVCpRVVVl1+nNpH9oqrbrk8vl2Lt3L959990en9Pb7Jfy8nKHnh8hhLBoB4QQ4tIKCgrw5z//GadOnUJOTg6effZZUOao84WEhCA1NbXXh4+Pj93eb6hTtUdygfZgdptqamowd+5cLFy4EH/4wx/6fA+a/UIIGU60A0IIcVkajQZLlizBsmXL8Ktf/QrJycnIyMjAoUOHsHz58uE+PdKDiooKNDc3W3TjAoCkpCT4+/sDuNONa9u2bXj88cehVquxadMmPPHEE4iMjERZWRnWr18/pKnaI7lAe6C7TTU1NZg9ezZycnJw+PDhXl/nqNkvhBAyIAwhhLioF154gUlMTGTUajV37PDhw4y/vz+jVCqH78RIr5YsWcIA6Pb4/vvvuecAYI4ePcowDMN0dXUxc+bMYUJDQxlPT08mNjaWWbJkCVNRUWHX89qxYwcjEol6/Huz2cxEREQw77zzDndMq9UyQUFBzMGDB+16LvZSVVXFiMVi5qmnnmKMRmOfz2c/xu3bt3PHdDqdS3+MhJC7D3XBIoS4pPz8fDz44IPIy8vDL3/5S4u/e/jhh2E0GvHPf/6T0kZIv23YsAFnz57tsVheoVAgMTERV69e5VoYA8D8+fMxatSobpPah1tNTQ1mzpyJ2NhYfPzxx3B3d+f+jt3pACx3mwBg+/bt2LZtG44ePQqxWIytW7ciLy+P2vASQpyGUrAIIS5p5syZMBqNNv/uu+++c/LZkJHubizQPnfuHGQyGWQyGcaOHWvxd/x7i648+4UQcm+iInRCCCEjBhVo/5/c3FwwDGPzwccwDHJzc7k/CwQCbNq0CbW1tdBqtcjPz0dGRoaTz54Qci+jHRBCCCEjBhVoE0LIyEcBCCGEkBEjJCQEISEh/XpudXU1Zs+ejYkTJ+Lo0aNwc+t9018kEiEiIgLnz5/nakD0ej3y8/Oxffv2IZ87IYSQOygFixBCyF2npqYGs2bNQkxMDHbt2oWGhgaoVCquzoOVmpqKkydPAriTmrRq1Sps3boVJ0+exM2bN5GbmwtfX188/fTTw/FhEELIXYl2QAghhNx1qECbEEJcF7XhJYQQQgghhDgNpWARQgghhBBCnIYCEEIIIYQQQojTUABCCCGEEEIIcRoKQAghhBBCCCFOQwEIIYQQQgghxGkoACGEEEIIIYQ4DQUghBBCCCGEEKehAIQQQgghhBDiNBSAEEIIIYQQQpyGAhBCCCGEEEKI01AAQgghhBBCCHEaCkAIIYQQQgghTkMBCCGEEEIIIcRpKAAhhBBCCCGEOA0FIIQQQgghhBCnoQCEEEIIIYQQ4jQUgBBCCCGEEEKchgIQQgghhBBCiNNQAEIIIYQQQghxGgpACCGEEEIIIU5DAQghhBBCCCHEaSgAIYQQQgghhDgNBSCEEEIIIYQQp6EAhBBCCCGEEOI0FIAQQgghhBBCnIYCEEIIIYQQQojTUABCCCGEEEIIcRoKQAghhBBCCCFOQwEIIYQQQgghxGkoACGEEEIIIYQ4DQUghBBCCCGEEKehAIQQQgghhBDiNBSAEEIIIYQQQpyGAhBCCCGEEEKI01AAQgghhBBCCHEaCkAIIYQQQgghTkMBCCGEEEIIIcRpKAAhhBBCCCGEOM3/ByYDOTLc+YgDAAAAAElFTkSuQmCC", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "scat_geo_plotter(\n", + " angles={ # Axes ordered from bottom to top, i.e., rotation of a stage affects all ones on top.\n", + " # Goniometer axes\n", + " \"Rz_JJ\": 0.0,\n", + " \"Rx_JJ\": 0.0,\n", + " \"Ry\": -30.0,\n", + " \"Rx_TT_L\": 0.0,\n", + " \"Rz_TT_L\": 0.0,\n", + " \"Rx_TT_S\": 5.0,\n", + " \"Rz_TT_S\": 10.0,\n", + " # TDMS axes\n", + " \"AY\": 30.0, # delta\n", + " \"AZ\": 0.0,\n", + " \"AX\": 20.0, # gamma\n", + " },\n", + " beamline=\"cdi-nsls2\",\n", + " samp_ori_norm=[0.1, 0.3, -1.0],\n", + " samp_ori_u=[1.0, 1.0, 0.0],\n", + " samp_ori_v=[0.0, 1.0, 0.0],\n", + " u_name=None,\n", + " v_name=None,\n", + " flag_inv_norm=False,\n", + " flag_inv_inpl=False,\n", + " flag_plot=True,\n", + " flag_info=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d1594f0-55c4-48eb-9ed7-c57cca4bd71d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d16dfd03-527c-434f-a83c-06bb5df8e1ed", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Diff", + "language": "python", + "name": "diff" + }, + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/ad-hoc-diff-scratch.ipynb b/notebooks/ad-hoc-diff-scratch.ipynb new file mode 100644 index 0000000..badbafb --- /dev/null +++ b/notebooks/ad-hoc-diff-scratch.ipynb @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "9dbd1969-c8a5-4baa-a2c3-6cd753ccf8e7", + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import annotations\n", + "\n", + "import ad_hoc_diffractometer as ahd\n", + "from ad_hoc_diffractometer.stage import Stage" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "693a1652-9aa8-4ab5-b10d-5f1b845ebbbf", + "metadata": {}, + "outputs": [], + "source": [ + "BASIS = ahd.factories.BASIS_BL\n", + "TRANSVERSE = BASIS[\"transverse\"] # +x\n", + "LONGITUDINAL = BASIS[\"longitudinal\"] # +y\n", + "VERTICAL = BASIS[\"vertical\"] # +z" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "bc2bf64c-d2f9-422a-bdf7-9f7c0cc161ac", + "metadata": {}, + "outputs": [], + "source": [ + "stages = [\n", + " Stage(\"omega\", -TRANSVERSE, parent=None, role=\"sample\"),\n", + " Stage(\"chi\", +LONGITUDINAL, parent=\"omega\", role=\"sample\"),\n", + " Stage(\"phi\", -TRANSVERSE, parent=\"chi\", role=\"sample\"),\n", + " Stage(\"ttheta\", -TRANSVERSE, parent=None, role=\"detector\"),\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4519f095-0712-49bc-bf01-a73807339574", + "metadata": {}, + "outputs": [], + "source": [ + "modes = {\n", + " \"bisecting\": ahd.ConstraintSet(\n", + " [ahd.BisectConstraint(\"omega\", \"ttheta\")],\n", + " computed=[\"omega\", \"chi\", \"phi\", \"ttheta\"],\n", + " ),\n", + " \"fixed_chi\": ahd.ConstraintSet(\n", + " [ahd.SampleConstraint(\"chi\", 90.0)],\n", + " computed=[\"omega\", \"phi\", \"ttheta\"],\n", + " ),\n", + " \"fixed_phi\": ahd.ConstraintSet(\n", + " [ahd.SampleConstraint(\"phi\", 0.0)],\n", + " computed=[\"omega\", \"chi\", \"ttheta\"],\n", + " ),\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b0c33d75-4738-4d96-ac60-3de078d0c1e2", + "metadata": {}, + "outputs": [], + "source": [ + "@ahd.register_geometry\n", + "def my_fourcv(**kwargs):\n", + " g = ahd.AdHocDiffractometer(\n", + " name=\"my_fourcv\",\n", + " stages=stages,\n", + " basis=BASIS,\n", + " description=\"Four-circle Eulerian, vertical scattering plane\",\n", + " modes=modes,\n", + " default_mode=\"bisecting\",\n", + " )\n", + " return g" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "eac0b0a8-5692-4bee-abd2-9ce3b93bac12", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'g' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[14]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m g.wavelength = \u001b[32m1.5406\u001b[39m\n\u001b[32m 2\u001b[39m g.sample.lattice = ahd.Lattice(a=\u001b[32m5.431\u001b[39m)\n", + "\u001b[31mNameError\u001b[39m: name 'g' is not defined" + ] + } + ], + "source": [ + "g.wavelength = 1.5406\n", + "g.sample.lattice = ahd.Lattice(a=5.431)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dde8d8e8-f75d-4810-999f-ca0f5352150a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AdHocDiffractometer: my_fourcv\n", + " Four-circle Eulerian, vertical scattering plane\n", + " λ = 1.540600 Å (E = 8.047786 keV)\n", + "\n", + " Basis vectors:\n", + " vertical -> +z\n", + " longitudinal -> +y\n", + " transverse -> +x\n", + "\n", + " Sample stages (floor first):\n", + " omega axis=-x parent=None angle=0.0 deg\n", + " chi axis=+y parent=omega angle=0.0 deg\n", + " phi axis=-x parent=chi angle=0.0 deg\n", + "\n", + " Detector stages (floor first):\n", + " ttheta axis=-x parent=None angle=0.0 deg\n", + "None\n" + ] + } + ], + "source": [ + "print(g.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d63a61ad-e20c-4be6-a666-32a4862d32de", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.00000000e+00, 0.00000000e+00, 1.15691131e+00],\n", + " [ 1.15691131e+00, -7.08403864e-17, -7.08403864e-17],\n", + " [ 0.00000000e+00, 1.15691131e+00, -7.08403864e-17]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ahd.ub_identity(g.sample)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "320e0bae-7a48-4188-96d2-80c125e0b791", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'omega': 34.564641808171025, 'chi': 90.0, 'phi': 9.532985381462646e-11, 'ttheta': 69.12928361634205}\n", + "{'omega': 34.564641808171025, 'chi': 90.0, 'phi': 179.9999999967004, 'ttheta': 69.12928361634205}\n", + "{'omega': 34.564641808171025, 'chi': 90.0, 'phi': 90.00000000009534, 'ttheta': 69.12928361634205}\n" + ] + } + ], + "source": [ + "solutions = g.forward(0, 0, 4)\n", + "for sol in solutions:\n", + " print(sol)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c92267fd-debc-4bf9-abc9-1e719487d6b3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AdHocDiffractometer: fourcv\n", + " Eulerian Four-Circle (vertical).\n", + "\n", + "Busing & Levy (1967) four-circle Eulerian diffractometer; vertical\n", + "scattering plane, transverse ttheta, synchrotron convention.\n", + "\n", + "\n", + "Walko (2016) designation: S3D1.\n", + "\n", + "\n", + "Synchrotron configuration: omega and ttheta both rotate about the\n", + "transverse axis, so the scattering plane is vertical. This exploits\n", + "the s-polarization and tighter vertical collimation of synchrotron\n", + "radiation (Walko 2016).\n", + "\n", + "\n", + "Default basis: Busing & Levy (1967) — transverse=+x, longitudinal=+y,\n", + "vertical=+z.\n", + "\n", + "\n", + "Sample stack (floor first):\n", + " omega : transverse, left-handed\n", + " chi : longitudinal, right-handed\n", + " phi : transverse, left-handed\n", + "\n", + "\n", + "Detector (floor, mechanically independent of sample stack):\n", + " ttheta : transverse, left-handed\n", + "\n", + "\n", + "omega and ttheta share the same transverse axis; they are\n", + "mechanically independent.\n", + "\n", + "\n", + "References\n", + "\n", + "- W.R. Busing & H.A. Levy, Acta Cryst. 22, 457-464 (1967).\n", + "\n", + "- D.A. Walko, Ref. Module Mater. Sci. Mater. Eng. (2016).\n", + "\n", + " λ = 1.540600 Å (E = 8.047786 keV)\n", + "\n", + " Basis vectors:\n", + " vertical -> +z\n", + " longitudinal -> +y\n", + " transverse -> +x\n", + "\n", + " Sample stages (floor first):\n", + " omega axis=-x parent=None angle=0.0 deg\n", + " chi axis=+y parent=omega angle=0.0 deg\n", + " phi axis=-x parent=chi angle=0.0 deg\n", + "\n", + " Detector stages (floor first):\n", + " ttheta axis=-x parent=None angle=0.0 deg\n", + "None\n" + ] + } + ], + "source": [ + "## Concise form\n", + "g2 = ahd.make_geometry(\"fourcv\")\n", + "g2.wavelength = 1.5406\n", + "g2.sample.lattice = ahd.Lattice(a=5.431)\n", + "print(g2.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32ae4f8e-9cd2-4c0c-9657-8b218031b124", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'fivec': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fourch': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fourcv': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa4ch': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa4cv': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa6c': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'psic': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 's2d2': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'sixc': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'zaxis': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ahd.factories.list_geometries()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d709938a-f64e-438e-974b-807313f54f09", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AdHocDiffractometer: my_fourcv\n", + " Four-circle Eulerian, vertical scattering plane\n", + " λ = 1.540600 Å (E = 8.047786 keV)\n", + "\n", + " Basis vectors:\n", + " vertical -> +z\n", + " longitudinal -> +y\n", + " transverse -> +x\n", + "\n", + " Sample stages (floor first):\n", + " omega axis=-x parent=None angle=0.0 deg\n", + " chi axis=+y parent=omega angle=0.0 deg\n", + " phi axis=-x parent=chi angle=0.0 deg\n", + "\n", + " Detector stages (floor first):\n", + " ttheta axis=-x parent=None angle=0.0 deg\n", + "{'omega': 14.221050819020343, 'chi': 144.73561031724535, 'phi': -45.0, 'ttheta': 28.442101638040686} -> (0.9999999999999998, 0.9999999999999998, 1.0000000000000002)\n", + "{'omega': 14.221050819020343, 'chi': 35.264389682754654, 'phi': 135.0, 'ttheta': 28.442101638040686} -> (1.0, 0.9999999999999998, 1.0000000000000002)\n" + ] + } + ], + "source": [ + "ahd.ub_identity(g.sample)\n", + "\n", + "g.summary()\n", + "solutions = g.forward(1, 1, 1)\n", + "for sol in solutions:\n", + " hkl = g.inverse(sol)\n", + " print(sol, \"->\", hkl)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2561df95-7dae-4b5e-8065-6d488bdd07ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AdHocDiffractometer: my_fourcv\n", + " Four-circle Eulerian, vertical scattering plane\n", + " λ = 1.540600 Å (E = 8.047786 keV)\n", + "\n", + " Basis vectors:\n", + " vertical -> +z\n", + " longitudinal -> +y\n", + " transverse -> +x\n", + "\n", + " Sample stages (floor first):\n", + " omega axis=-x parent=None angle=0.0 deg\n", + " chi axis=+y parent=omega angle=0.0 deg\n", + " phi axis=-x parent=chi angle=0.0 deg\n", + "\n", + " Detector stages (floor first):\n", + " ttheta axis=-x parent=None angle=0.0 deg\n", + "Solutions:\n", + "{'omega': 14.221050819020343, 'chi': 144.73561031724535, 'phi': -45.0, 'ttheta': 28.442101638040686}\n", + "{'omega': 14.221050819020343, 'chi': 35.264389682754654, 'phi': 135.0, 'ttheta': 28.442101638040686}\n", + " -> hkl = (1.0000, 1.0000, 1.0000)\n", + " -> hkl = (1.0000, 1.0000, 1.0000)\n" + ] + } + ], + "source": [ + "g.wavelength\n", + "g.sample\n", + "g.sample.lattice\n", + "ahd.ub_identity(g.sample)\n", + "\n", + "# Inspect\n", + "g.summary()\n", + "\n", + "print(\"Solutions:\")\n", + "solutions = g.forward(1, 1, 1)\n", + "for sol in solutions:\n", + " print(sol)\n", + "\n", + "for sol in solutions:\n", + " hkl = g.inverse(sol)\n", + " print(f\" -> hkl = ({hkl[0]:.4f}, {hkl[1]:.4f}, {hkl[2]:.4f})\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbb76bd9-da32-4b56-943a-038e51620dc3", + "metadata": {}, + "outputs": [], + "source": [ + "del g" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2533e7fa-2ec2-4345-bb34-c184c2eed1ed", + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " ahd.register_geometry_file(\"./cdi-geometry.yml\")\n", + "except ValueError:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89e6189d-67a8-43e5-afe1-8661212b043d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'fivec': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fourch': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fourcv': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa4ch': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa4cv': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa6c': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'psic': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 's2d2': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'sixc': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'zaxis': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'cdi-geometry': ._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ahd.list_geometries()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f80892f8-1c33-40c9-afff-9dba150c31f6", + "metadata": {}, + "outputs": [], + "source": [ + "g = ahd.make_geometry(\"cdi-geometry\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69186cef-717e-44d3-af43-b6c7ffe00010", + "metadata": {}, + "outputs": [], + "source": [ + "g.mode_name = \"fixed_alpha\"\n", + "g.wavelength = 1.5406\n", + "g.sample.lattice = ahd.Lattice(a=5.431)\n", + "ahd.ub_identity(g.sample)\n", + "g.surface_normal = (0, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a0445ab-f533-4226-808c-d4216cfdf2d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AdHocDiffractometer: cdi-geometry\n", + " CDI 7-circle diffractometer prototype.\n", + "\n", + "This is a working first model of the CDI stack from beamline notes.\n", + "The top two sample rotations are fixed at zero in the initial mode.\n", + "\n", + "\n", + "The solver has special handling for an Eulerian inner pair named\n", + "``chi`` and ``phi``. These names are solver-facing aliases for the\n", + "two lower CDI sample stages noted as omega/chi during beamline\n", + "discussion:\n", + "\n", + " chi -> gon.sam.c_lg.lrx / omega1 in earlier notes\n", + " phi -> gon.sam.c_lg.lrz / chi1 in earlier notes\n", + "\n", + "\n", + "Basis used here: vertical=+Y, longitudinal=+Z, transverse=+X.\n", + "\n", + "\n", + "Stack (floor first):\n", + " mu : vertical\n", + " --> chi : longitudinal\n", + " --> phi : transverse\n", + " --> omega2 : longitudinal, fixed at 0 in fixed_alpha\n", + " --> chi2 : transverse, fixed at 0 in fixed_alpha\n", + " gamma1 : transverse detector axis, fixed at 0 in fixed_alpha\n", + " --> delta1 : vertical detector axis\n", + "\n", + " λ = 1.540600 Å (E = 8.047786 keV)\n", + "\n", + " Basis vectors:\n", + " vertical -> +y\n", + " longitudinal -> +z\n", + " transverse -> +x\n", + "\n", + " Sample stages (floor first):\n", + " mu axis=+y parent=None angle=0.0 deg\n", + " chi axis=+z parent=mu angle=0.0 deg\n", + " phi axis=+x parent=chi angle=0.0 deg\n", + " omega2 axis=+z parent=phi angle=0.0 deg\n", + " chi2 axis=+x parent=omega2 angle=0.0 deg\n", + "\n", + " Detector stages (floor first):\n", + " gamma1 axis=+x parent=None angle=0.0 deg\n", + " delta1 axis=+y parent=gamma1 angle=0.0 deg\n", + "{'mu': np.float64(-171.35900075314566), 'chi': 125.45751849761865, 'phi': -38.16042647520294, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(-171.35900075314566), 'chi': -125.45751849761866, 'phi': 128.16042647520294, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(-8.031382486224174), 'chi': 51.405190942516356, 'phi': 162.63233503021684, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(-8.031382486224174), 'chi': -51.405190942516356, 'phi': -72.63233503021681, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(8.640999246854335), 'chi': 54.54248150238135, 'phi': 141.83957352479706, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(8.640999246854335), 'chi': -54.54248150238135, 'phi': -51.83957352479706, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(171.96861751377583), 'chi': 128.59480905748364, 'phi': -17.367664969783192, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n", + "{'mu': np.float64(171.96861751377583), 'chi': -128.59480905748364, 'phi': 107.36766496978316, 'omega2': 0.0, 'chi2': 0.0, 'gamma1': 0.0, 'delta1': 28.442101638040686}\n" + ] + } + ], + "source": [ + "g.summary()\n", + "solutions = g.forward(1, 1, 1)\n", + "for sol in solutions:\n", + " print(sol)\n", + " # hkl = g.inverse(sol)\n", + " # print(sol, \"->\", hkl)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26e7592c-e215-4b92-a0a1-a45b9151a8b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1.0000000000000002, 0.9999999999999997, 1.0)\n", + "(0.9999999999999998, 1.0, 1.0)\n", + "(0.9999999999999997, 1.0000000000000002, 1.0)\n", + "(0.9999999999999998, 1.0000000000000002, 1.0)\n", + "(1.0000000000000002, 0.9999999999999998, 0.9999999999999998)\n", + "(0.9999999999999998, 1.0000000000000002, 0.9999999999999998)\n", + "(1.0, 1.0, 0.9999999999999998)\n", + "(1.0000000000000004, 0.9999999999999994, 0.9999999999999998)\n" + ] + } + ], + "source": [ + "for sol in solutions:\n", + " hkl = g.inverse(sol)\n", + " print(hkl)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e652768b-e5a8-4126-8d10-27e4d83633cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ConstraintSet([SampleConstraint('chi2', 0.0), SampleConstraint('omega2', 0.0), ReferenceConstraint('incidence', 5.0), DetectorConstraint('gamma1', 0.0)])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7974bb12-d58e-47b6-875a-6d8a6e520cf7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8.047786474957826\n", + "1.5405999999999997\n" + ] + } + ], + "source": [ + "g.wavelength\n", + "E = ahd.radiation.wavelength_to_energy(g.wavelength)\n", + "print(E)\n", + "\n", + "lam = ahd.radiation.energy_to_wavelength(E)\n", + "print(lam)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad624b17-bfba-4fff-8fa7-303c70fd7144", + "metadata": {}, + "outputs": [], + "source": [ + "### hklpy2\n", + "import hklpy2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a00ab0b-f35e-4ccc-891d-ee3c1af4fe1c", + "metadata": {}, + "outputs": [], + "source": [ + "fourc = hklpy2.creator(solver=\"ad_hoc\", geometry=\"fourcv\", name=\"fourc\")\n", + "fourc.add_sample(name=\"silicon\", a=hklpy2.SI_LATTICE_PARAMETER)\n", + "fourc.beam.wavelength.put(1.0)\n", + "\n", + "import math\n", + "\n", + "theta = math.degrees(math.asin(1.0 / (2 * 5.431)))\n", + "tth = 2 * theta\n", + "\n", + "r1 = fourc.add_reflection(\n", + " pseudos={\"h\": 1, \"k\": 0, \"l\": 0},\n", + " reals={\"omega\": theta, \"chi\": 0, \"phi\": 0, \"ttheta\": tth},\n", + " wavelength=1.0,\n", + " name=\"r1\",\n", + ")\n", + "\n", + "r2 = fourc.add_reflection(\n", + " pseudos={\"h\": 0, \"k\": 1, \"l\": 0},\n", + " reals={\"omega\": theta, \"chi\": 0, \"phi\": 90, \"ttheta\": tth},\n", + " wavelength=1.0,\n", + " name=\"r2\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1fda7a9-98a9-430e-b97f-4e61cf3dfdfd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[0.0, 0.0, 1.156906937555034],\n", + " [1.4876207926076293e-16, 1.156906937555034, -7.084011889940698e-17],\n", + " [-1.156906937555034, 2.196021981601699e-16, 7.084011889940695e-17]]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fourc.core.calc_UB(r1, r2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c506caf2-25d7-4f47-8b86-7d94392b62b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'cdi'" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# ahd.register_geometry_file(\"./cdi-geometry.yml\", name=\"cdi\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4cf1a00-a470-4de5-8486-e2db1bc5b176", + "metadata": {}, + "outputs": [], + "source": [ + "cdi_diff = hklpy2.creator(name=\"cdi-geometry\", geometry=\"cdi-geometry\", solver=\"ad_hoc\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab9f0cfc-ea9d-4afb-b4a8-dc40b436882d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Hklpy2Diffractometer(prefix='', name='cdi-geometry', settle_time=0.0, timeout=None, egu='', limits=(0, 0), source='computed', read_attrs=['beam', 'beam.wavelength', 'beam.energy', 'h', 'h.readback', 'h.setpoint', 'k', 'k.readback', 'k.setpoint', 'l', 'l.readback', 'l.setpoint', 'mu', 'chi', 'phi', 'omega2', 'chi2', 'gamma1', 'delta1'], configuration_attrs=['beam', 'beam.source_type', 'beam.wavelength_units', 'beam.wavelength_deadband', 'beam.energy_units', 'h', 'k', 'l'], concurrent=True)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cdi_diff" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a94437af-d943-4c89-a0d3-6140108feb8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7.3\n" + ] + } + ], + "source": [ + "print(hklpy2.__version__)\n", + "from hklpy2.user import *\n", + "\n", + "hklpy2.user.set_diffractometer(cdi_diff)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1af82cb8-732a-44f6-868b-d23b9d44db46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "diffractometer='cdi-geometry'\n", + "AdHocSolver(name='ad_hoc', version='0.11.4', geometry='cdi-geometry')\n", + "Sample(name='sample', lattice=Lattice(a=1, system='cubic'))\n", + "Orienting reflections: []\n", + "U=[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]\n", + "UB=[[6.2832, 0.0, 0.0], [0.0, 6.2832, 0.0], [0.0, 0.0, 6.2832]]\n", + "constraint: -180.0 <= mu <= 180.0 [cut=-180.0]\n", + "constraint: -180.0 <= chi <= 180.0 [cut=-180.0]\n", + "constraint: -180.0 <= phi <= 180.0 [cut=-180.0]\n", + "constraint: -180.0 <= omega2 <= 180.0 [cut=-180.0]\n", + "constraint: -180.0 <= chi2 <= 180.0 [cut=-180.0]\n", + "constraint: -180.0 <= gamma1 <= 180.0 [cut=-180.0]\n", + "constraint: -180.0 <= delta1 <= 180.0 [cut=-180.0]\n", + "Mode: fixed_alpha\n", + "beam={'class': 'WavelengthXray', 'source_type': 'Synchrotron X-ray Source', 'energy': 12.3984, 'wavelength': 1.0, 'energy_units': 'keV', 'wavelength_units': 'angstrom'}\n", + "pseudos: h=0, k=0, l=0\n", + "reals: mu=0, chi=0, phi=0, omega2=0, chi2=0, gamma1=0, delta1=0\n", + "extras: incidence=0\n", + "None\n", + "wavelength=1.0\n", + "pseudos: h=0, k=0, l=0\n", + "reals: mu=0, chi=0, phi=0, omega2=0, chi2=0, gamma1=0, delta1=0\n", + "extras: incidence=0\n", + "None\n" + ] + } + ], + "source": [ + "print(hklpy2.user.pa())\n", + "print(hklpy2.user.wh())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c83372e1-55cf-4ab4-9918-33d216df0d6a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sample(name='silicon', lattice=Lattice(a=5.431, system='cubic'))" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hklpy2.user.add_sample(\"silicon\", a=hklpy2.SI_LATTICE_PARAMETER)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34436fb2-b735-4f26-bc74-0b31da543642", + "metadata": {}, + "outputs": [], + "source": [ + "cdi_diff.beam.wavelength.put(1.54)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd809aed-ee56-44dd-bd7f-6ec3ccb70641", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Reflection(name='r_a43b', h=4, k=0, l=0)" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# r1 = hklpy2.user.setor(4,0,0, mu=69.0966, omega1=-145.451, chi1=0, omega2=0)\n", + "r1 = hklpy2.user.setor(4, 0, 0)\n", + "r1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83bca796-17f7-4aa9-8488-cd93f638adca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Reflection(name='r_e286', h=1, k=1, l=1)" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# r2 = hklpy2.user.setor(0,4,0, mu=69.0966, omega1=-145.451, chi1=90, phi=0)\n", + "# hklpy2.user.setor?\n", + "try:\n", + " r2 = hklpy2.user.setor(1, 1, 1)\n", + "except hklpy2.blocks.reflection.ReflectionError:\n", + " pass\n", + "r2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bffd551c-a8bc-43b5-9491-49e4b7d87be6", + "metadata": {}, + "outputs": [ + { + "ename": "SolverError", + "evalue": "The two reflections are parallel in the phi frame (Q_phi vectors for 'r_a43b' and 'r_e286' are collinear). Choose two reflections that are not parallel.", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/ad_hoc_diffractometer/orientation.py:721\u001b[39m, in \u001b[36mub_from_two_reflections_bl1967\u001b[39m\u001b[34m(sample, r1, r2)\u001b[39m\n\u001b[32m 720\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m721\u001b[39m Tphi = \u001b[30;43m_gram_schmidt_triple\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mu1_phi\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mu2_phi\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 722\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/ad_hoc_diffractometer/orientation.py:540\u001b[39m, in \u001b[36m_gram_schmidt_triple\u001b[39m\u001b[34m(v1, v2)\u001b[39m\n\u001b[32m 539\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m n1 < \u001b[32m1e-14\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m540\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 541\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m_gram_schmidt_triple: v1 is the zero vector; cannot build an \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 542\u001b[39m \u001b[33m\"\u001b[39m\u001b[33morthonormal basis.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 543\u001b[39m )\n\u001b[32m 544\u001b[39m t1 = v1 / n1\n", + "\u001b[31mValueError\u001b[39m: _gram_schmidt_triple: v1 is the zero vector; cannot build an orthonormal basis.", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/hklpy2_solvers/ad_hoc_solver.py:296\u001b[39m, in \u001b[36mAdHocSolver.calculate_UB\u001b[39m\u001b[34m(self, r1, r2)\u001b[39m\n\u001b[32m 295\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m296\u001b[39m \u001b[30;43mahd\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mub_from_two_reflections_bl1967\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_geom\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msample\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 297\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/ad_hoc_diffractometer/orientation.py:723\u001b[39m, in \u001b[36mub_from_two_reflections_bl1967\u001b[39m\u001b[34m(sample, r1, r2)\u001b[39m\n\u001b[32m 722\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[32m--> \u001b[39m\u001b[32m723\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 724\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mThe two reflections are parallel in the phi frame \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 725\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m(Q_phi vectors for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mr1.name\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m and \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mr2.name\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m are collinear). \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 726\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mChoose two reflections that are not parallel.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 727\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mexc\u001b[39;00m\n\u001b[32m 729\u001b[39m \u001b[38;5;66;03m# --- BL1967 eq. 27: U = Tφ @ Tc.T (Tc orthogonal → Tc⁻¹ = Tc.T) ------\u001b[39;00m\n", + "\u001b[31mValueError\u001b[39m: The two reflections are parallel in the phi frame (Q_phi vectors for 'r_a43b' and 'r_e286' are collinear). Choose two reflections that are not parallel.", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mSolverError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[61]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m hklpy2.user.calc_UB(r1, r2)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/hklpy2/user.py:284\u001b[39m, in \u001b[36mcalc_UB\u001b[39m\u001b[34m(r1, r2, wavelength)\u001b[39m\n\u001b[32m 265\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcalc_UB\u001b[39m(\n\u001b[32m 266\u001b[39m r1: Reflection | \u001b[38;5;28mstr\u001b[39m, r2: Reflection | \u001b[38;5;28mstr\u001b[39m, wavelength: \u001b[38;5;28mfloat\u001b[39m | \u001b[38;5;28;01mNone\u001b[39;00m = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 267\u001b[39m ) -> Matrix3x3:\n\u001b[32m 268\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 269\u001b[39m \u001b[33;03m Compute the UB matrix with two reflections.\u001b[39;00m\n\u001b[32m 270\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 282\u001b[39m \n\u001b[32m 283\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m284\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mget_diffractometer\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcore\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcalc_UB\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mr1\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mr2\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/hklpy2/ops.py:602\u001b[39m, in \u001b[36mCore.calc_UB\u001b[39m\u001b[34m(self, r1, r2)\u001b[39m\n\u001b[32m 599\u001b[39m \u001b[38;5;28mself\u001b[39m.update_solver()\n\u001b[32m 601\u001b[39m solver_reflections = \u001b[38;5;28mself\u001b[39m._reflections_to_solver(two_reflections)\n\u001b[32m--> \u001b[39m\u001b[32m602\u001b[39m ub = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msolver\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcalculate_UB\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43msolver_reflections\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 603\u001b[39m \u001b[38;5;66;03m# The solver has now computed U / UB and holds them internally.\u001b[39;00m\n\u001b[32m 604\u001b[39m \u001b[38;5;66;03m# Mirror them into the Python Sample (the U / UB setters\u001b[39;00m\n\u001b[32m 605\u001b[39m \u001b[38;5;66;03m# legitimately flag _SolverDirty.UB), then immediately re-push to\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 609\u001b[39m \u001b[38;5;66;03m# pending sample switch -- the latent contributor to\u001b[39;00m\n\u001b[32m 610\u001b[39m \u001b[38;5;66;03m# :issue:`384`.)\u001b[39;00m\n\u001b[32m 611\u001b[39m \u001b[38;5;28mself\u001b[39m.sample.U = \u001b[38;5;28mself\u001b[39m.solver.U\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/src/cditools/.pixi/envs/dev/lib/python3.13/site-packages/hklpy2_solvers/ad_hoc_solver.py:298\u001b[39m, in \u001b[36mAdHocSolver.calculate_UB\u001b[39m\u001b[34m(self, r1, r2)\u001b[39m\n\u001b[32m 296\u001b[39m ahd.ub_from_two_reflections_bl1967(\u001b[38;5;28mself\u001b[39m._geom.sample)\n\u001b[32m 297\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[32m--> \u001b[39m\u001b[32m298\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m SolverError(\u001b[38;5;28mstr\u001b[39m(exc)) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mexc\u001b[39;00m\n\u001b[32m 299\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._geom.sample.UB.tolist()\n", + "\u001b[31mSolverError\u001b[39m: The two reflections are parallel in the phi frame (Q_phi vectors for 'r_a43b' and 'r_e286' are collinear). Choose two reflections that are not parallel." + ] + } + ], + "source": [ + "hklpy2.user.calc_UB(r1, r2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c2e8ee1-8c84-4ef4-8a70-c2261184f783", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dev", + "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.13.15" + }, + "pixi-kernel": { + "environment": "dev" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/demo_hkl.ipynb b/notebooks/demo_hkl.ipynb new file mode 100644 index 0000000..07aceef --- /dev/null +++ b/notebooks/demo_hkl.ipynb @@ -0,0 +1,395 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e3c7c4e5", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "import ad_hoc_diffractometer as ahd\n", + "import hklpy2\n", + "import hklpy2.user" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "06c91ac7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'cdi-geometry': ._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fivec': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fourch': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'fourcv': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa4ch': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa4cv': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'kappa6c': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'psic': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 's2d2': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'sixc': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>,\n", + " 'zaxis': ._make_factory.._factory(**kwargs: 'Any') -> 'AdHocDiffractometer'>}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = ahd.register_geometry_file(\"./diffractometer-geometry.yml\", name=\"cdi-geometry\")\n", + "ahd.list_geometries()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c36a4c74", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.431020511" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hklpy2.SI_LATTICE_PARAMETER" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efa354e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta: 27.166505478303982, 2theta: 54.333010956607964, incidence: 0\n" + ] + }, + { + "data": { + "text/plain": [ + "[[1.156906937555034, -7.084011889940696e-17, -1.513954608807481e-16],\n", + " [0.0, 1.156906937555034, -1.513954608807481e-16],\n", + " [8.055534198134115e-17, 8.055534198134113e-17, 1.156906937555034]]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reals = [\"mu\", \"chi1\", \"omega1\", \"omega2\", \"chi2\", \"gamma\", \"delta\"]\n", + "diff = hklpy2.creator(\n", + " name=\"cdi-diff\",\n", + " geometry=\"cdi-geometry\",\n", + " solver=\"ad_hoc\",\n", + ")\n", + "diff.core.mode = \"fixed_incidence\"\n", + "diff.beam.energy.put(10)\n", + "diff.core.extras = {\"n_hat\": (1, 0, 0), \"incidence\": 21.1665}\n", + "hklpy2.user.set_diffractometer(diff)\n", + "\n", + "hklpy2.user.add_sample(\"silicon\", a=hklpy2.SI_LATTICE_PARAMETER)\n", + "theta = math.degrees(math.asin((4*1.2398419844)/(2*hklpy2.SI_LATTICE_PARAMETER)))\n", + "tth = 2 * theta\n", + "\n", + "print(f\"theta: {theta}, 2theta: {tth}, incidence: {diff.core.extras['incidence']}\")\n", + "\n", + "r1 = hklpy2.user.setor(\n", + " 4,\n", + " 0,\n", + " 0,\n", + " mu=theta,\n", + " chi1=0,\n", + " omega1=0,\n", + " omega2=0,\n", + " chi2=0,\n", + " gamma=0,\n", + " delta=tth,\n", + ")\n", + "\n", + "r2 = hklpy2.user.setor(\n", + " 0,\n", + " 4,\n", + " 0,\n", + " mu=theta,\n", + " chi1=-90,\n", + " omega1=0,\n", + " omega2=0,\n", + " chi2=0,\n", + " gamma=0,\n", + " delta=tth,\n", + ")\n", + "\n", + "hklpy2.user.calc_UB(r1, r2)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d87d5f36", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hklpy2DiffractometerRealPos(mu=-180.0, omega1=0.0, chi1=0.0, omega2=0.0, chi2=0.0, gamma=0.0, delta=54.333)\n" + ] + } + ], + "source": [ + "real_pos = diff.forward((4, 0, 0))\n", + "print(real_pos)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ba43722a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['mu', 'omega1', 'chi1', 'omega2', 'chi2', 'gamma', 'delta']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diff.real_axis_names" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "23b16bf4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hklpy2DiffractometerPseudoPos(h=-3.5587, k=0.0, l=1.8263)\n" + ] + } + ], + "source": [ + "print(diff.inverse(diff.forward((4, 0, 0))))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3326b7c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "======= = ==== ====== ==== ====== ==== ===== ======\n", + "(hkl) # mu omega1 chi1 omega2 chi2 gamma delta \n", + "======= = ==== ====== ==== ====== ==== ===== ======\n", + "(4 0 0) 1 -180 0 0 0 0 0 54.333\n", + "(4 0 0) 2 0 0 0 0 0 0 54.333\n", + "(4 0 0) 3 -180 0 0 0 0 0 54.333\n", + "======= = ==== ====== ==== ====== ==== ===== ======\n", + "\n" + ] + } + ], + "source": [ + "hklpy2.user.cahkl_table((4, 0, 0))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "626e2429", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'incidence': 0, 'n_hat': (1, 0, 0)}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# dir(diff.core)\n", + "diff.core.all_extras" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1a20ced6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Sample',\n", + " '__class__',\n", + " '__delattr__',\n", + " '__dict__',\n", + " '__dir__',\n", + " '__doc__',\n", + " '__eq__',\n", + " '__firstlineno__',\n", + " '__format__',\n", + " '__ge__',\n", + " '__getattribute__',\n", + " '__getstate__',\n", + " '__gt__',\n", + " '__hash__',\n", + " '__init__',\n", + " '__init_subclass__',\n", + " '__le__',\n", + " '__lt__',\n", + " '__module__',\n", + " '__ne__',\n", + " '__new__',\n", + " '__reduce__',\n", + " '__reduce_ex__',\n", + " '__repr__',\n", + " '__setattr__',\n", + " '__sizeof__',\n", + " '__static_attributes__',\n", + " '__str__',\n", + " '__subclasshook__',\n", + " '__weakref__',\n", + " '_asdict',\n", + " '_axes_names_d2s',\n", + " '_axes_names_s2d',\n", + " '_axes_xref_reversed',\n", + " '_constant_axis_names',\n", + " '_extras',\n", + " '_fromdict',\n", + " '_mode',\n", + " '_mode_presets',\n", + " '_reflections_to_solver',\n", + " '_sample_name',\n", + " '_samples',\n", + " '_solver',\n", + " '_solver_dirty',\n", + " '_solver_needs_update',\n", + " '_validate_extras',\n", + " '_validate_pseudos',\n", + " '_warn_if_ub_stale',\n", + " 'add_reflection',\n", + " 'add_sample',\n", + " 'all_extras',\n", + " 'assign_axes',\n", + " 'axes_xref',\n", + " 'axes_xref_reversed',\n", + " 'calc_UB',\n", + " 'configuration',\n", + " 'constant_axis_names',\n", + " 'constraints',\n", + " 'diffractometer',\n", + " 'extras',\n", + " 'forward',\n", + " 'geometries',\n", + " 'geometry',\n", + " 'inverse',\n", + " 'local_pseudo_axes',\n", + " 'local_real_axes',\n", + " 'mode',\n", + " 'modes',\n", + " 'presets',\n", + " 'refine_lattice',\n", + " 'remove_sample',\n", + " 'request_solver_update',\n", + " 'reset_constraints',\n", + " 'reset_samples',\n", + " 'sample',\n", + " 'samples',\n", + " 'set_solver',\n", + " 'solver',\n", + " 'solver_constant_axis_names',\n", + " 'solver_extra_axis_names',\n", + " 'solver_name',\n", + " 'solver_pseudo_axis_names',\n", + " 'solver_real_axis_names',\n", + " 'solver_signature',\n", + " 'solver_summary',\n", + " 'solver_written_axis_names',\n", + " 'standardize_pseudos',\n", + " 'standardize_reals',\n", + " 'to_solver_units',\n", + " 'update_solver']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dir(diff.core)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23713761", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "810a9f20", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.13.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/diffractometer.ipynb b/notebooks/diffractometer.ipynb new file mode 100644 index 0000000..04edffc --- /dev/null +++ b/notebooks/diffractometer.ipynb @@ -0,0 +1,293 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "e7163bb0", + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import annotations\n", + "\n", + "import contextlib\n", + "import math\n", + "\n", + "import ad_hoc_diffractometer as ahd\n", + "import bluesky.plans as bp\n", + "import hklpy2\n", + "import hklpy2.blocks.reflection\n", + "import hklpy2.user\n", + "from ophyd import Component as Cpt, FormattedComponent as FCpt\n", + "from ophyd import EpicsMotor\n", + "from bluesky import RunEngine\n", + "from bluesky.callbacks.best_effort import BestEffortCallback\n", + "from hklpy2.user import cahkl_table\n", + "from hklpy2.utils import pick_closest_solution\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45796dfd", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "1. Export diffractometer ophyd object to profile collection\n", + "2. Create two ophyd objects, one for each arm\n", + "3. Connect ophyd objects to PVs for arm\n", + "4. Verify simulated movement\n", + "5. Verify real movement\n", + "\n", + "Extras\n", + "- figure out how to adjust tolerance of incidence\n", + "- set energy/wavelength with ophyd object\n", + "\"\"\"\n", + "\n", + "# Register geometry\n", + "try:\n", + " ahd.register_geometry_file(\"../diffractometer-geometry.yml\", name=\"cdi-geometry\")\n", + "except ValueError: # geometry already registered\n", + " contextlib.suppress(ValueError)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1922260a", + "metadata": {}, + "outputs": [], + "source": [ + "# Define Epics PVs for angles\n", + "# mu = Cpt(EpicsMotor, \"Gon:1-Ax:Ry}Mtr\")\n", + "# chi = Cpt(EpicsMotor, \"Gon:1-Ax:Rx2}Mtr\")\n", + "# phi = Cpt(EpicsMotor, \"Gon:1-Ax:Rz2}Mtr\")\n", + "# omega2 = Cpt(EpicsMotor, \"Gon:1-Ax:Rx1}Mtr\")\n", + "# chi2 = Cpt(EpicsMotor, \"Gon:1-Ax:Rz1}Mtr\")\n", + "# prefix = \"XF:09IDC-\"\n", + "# prefix_gon = \"OP:1{Gon:1-Ax:\"\n", + "# prefix_tdms = \"ES:1{TDMS:\"\n", + "mu = Cpt(EpicsMotor, \"OP:1{Gon:1-Ax:Ry}Mtr\")\n", + "chi = Cpt(EpicsMotor, \"OP:1{Gon:1-Ax:Rx2}Mtr\")\n", + "phi = Cpt(EpicsMotor, \"OP:1{Gon:1-Ax:Rz2}Mtr\")\n", + "omega2 = Cpt(EpicsMotor, \"OP:1{Gon:1-Ax:Rx1}Mtr\")\n", + "chi2 = Cpt(EpicsMotor, \"OP:1{Gon:1-Ax:Rz1}Mtr\")\n", + "gamma1 = FCpt(EpicsMotor, \"ES:1{{TDMS:T{self._num}-Ax:AX}}MTR:RBV-RB0\")\n", + "delta1 = FCpt(EpicsMotor, \"ES:1{{TDMS:A{self._num}-Ax:AY}}MTR:RBV-RB0\")\n", + "\n", + "# TODO - check these angle <-> PV names\n", + "real_gon_angles = {\n", + " \"mu\": \"OP:1{Gon:1-Ax:Ry}Mtr\",\n", + " \"omega1\": \"OP:1{Gon:1-Ax:Rz2}Mtr\",\n", + " \"chi1\": \"OP:1{Gon:1-Ax:Rx2}Mtr\",\n", + " \"omega2\": \"OP:1{Gon:1-Ax:Rx1}Mtr\",\n", + " \"chi2\": \"OP:1{Gon:1-Ax:Rz1}Mtr\"\n", + "}\n", + "real_tdms1_angles = {\n", + " \"gamma\": \"ES:1{TDMS:T1-Ax:AX}MTR:RBV-RB0\",\n", + " \"delta\": \"ES:1{TDMS:A1-Ax:AY}MTR:RBV-RB0\"\n", + "}\n", + "real_tdms2_angles = {\n", + " \"gamma\": \"ES:1{TDMS:T2-Ax:AX}MTR:RBV-RB0\",\n", + " \"delta\": \"ES:1{TDMS:A2-Ax:AY}MTR:RBV-RB0\"\n", + "}\n", + "_real_seq = [\"mu\", \"omega1\", \"chi1\", \"omega2\", \"chi2\", \"gamma\", \"delta\"]\n", + "\n", + "#\n", + "# Create diffractometer\n", + "diffr1 = hklpy2.creator(\n", + " # name=\"cdi-geometry\", geometry=\"cdi-geometry\", solver=\"ad_hoc\", prefix=\"Gon:1-Ax:\"\n", + " name=\"cdi-geometry\", geometry=\"cdi-geometry\", solver=\"ad_hoc\", prefix=\"XF:09IDC-\",\n", + " reals=real_gon_angles | real_tdms1_angles, _real=_real_seq\n", + ")\n", + "\n", + "diffr2 = hklpy2.creator(\n", + " # name=\"cdi-geometry\", geometry=\"cdi-geometry\", solver=\"ad_hoc\", prefix=\"Gon:1-Ax:\"\n", + " name=\"cdi-geometry\", geometry=\"cdi-geometry\", solver=\"ad_hoc\", prefix=\"XF:09IDC-\",\n", + " reals=real_gon_angles | real_tdms2_angles, _real=_real_seq\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9503f17e", + "metadata": {}, + "outputs": [], + "source": [ + "# Add Sample\n", + "hklpy2.user.set_diffractometer(diffr1)\n", + "hklpy2.user.add_sample(\"silicon\", a=hklpy2.SI_LATTICE_PARAMETER)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96548c03", + "metadata": {}, + "outputs": [], + "source": [ + "# Add beam\n", + "# TODO - add conversion between our energy and beam energy\n", + "diffr1.beam.wavelength.put(1.54) # Angstroms\n", + "diffr2.beam.wavelength.put(1.54)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48651e05", + "metadata": {}, + "outputs": [], + "source": [ + "# Add orientation reflections\n", + "theta = math.degrees(math.asin(1.54 / (2 * 5.431 / 4))) # ≈ 34.55° for (400)\n", + "tth = 2 * theta\n", + "\n", + "# Have to specify all seven angles for an orientation reflection\n", + "try:\n", + " r1 = hklpy2.user.setor(\n", + " 4,\n", + " 0,\n", + " 0,\n", + " mu=0,\n", + " chi=0,\n", + " phi=0,\n", + " omega2=theta,\n", + " chi2=0,\n", + " gamma1=tth,\n", + " delta1=0,\n", + " )\n", + " r2 = hklpy2.user.setor(\n", + " 0,\n", + " 4,\n", + " 0,\n", + " mu=0,\n", + " chi=0,\n", + " phi=90,\n", + " omega2=theta,\n", + " chi2=0,\n", + " gamma1=tth,\n", + " delta1=0,\n", + " )\n", + "except hklpy2.blocks.reflection.ReflectionError:\n", + " pass\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e2999dd", + "metadata": {}, + "outputs": [], + "source": [ + "# To check on status of things, run pa() and wh()\n", + "# pa()\n", + "# wh()\n", + "\n", + "# Calculate UB matrix\n", + "ub_mat = hklpy2.user.calc_UB(r1, r2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd3ef4f2", + "metadata": {}, + "outputs": [], + "source": [ + "# Add constraints\n", + "# TODO - add constraints based on TDMS location\n", + "diffr1.core.constraints[\"chi\"].limits = (0, 180)\n", + "diffr1.core.constraints[\"omega2\"].limits = (180, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "542aea3d", + "metadata": {}, + "outputs": [], + "source": [ + "# Set surface normal\n", + "diffr1.core.extras = {\"n_hat\": (1, 1, 1)} # pyright: ignore[reportAttributeAccessIssue]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b760a6e4", + "metadata": {}, + "outputs": [], + "source": [ + "# Get solutions\n", + "hkl_or = (4, 0, 0)\n", + "# diffr1.core.forward gives a list of solutions\n", + "# diffr1.forward gives the first solution\n", + "solutions = diffr1.core.forward(hkl_or)\n", + "# print table of solutions:\n", + "cahkl_table(hkl_or)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2bcdc7f6", + "metadata": {}, + "outputs": [], + "source": [ + "# optionally change solution picker before moving:\n", + "diffr1._forward_solution = pick_closest_solution\n", + "diffr1.move((4, 0, 0))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4beabbd8", + "metadata": {}, + "outputs": [], + "source": [ + "# see full state of diffractometer:\n", + "diffr1.wh(full=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc6c94bd", + "metadata": {}, + "outputs": [], + "source": [ + "# Scan in reciprocal space\n", + "bec = BestEffortCallback()\n", + "bec.disable_plots()\n", + "\n", + "RE = RunEngine({})\n", + "RE.subscribe(bec)\n", + "RE(bp.scan([diffr1], diffr1.h, 3.9, 4.1, 5))\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dev", + "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.13.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pixi.lock b/pixi.lock index 8afd651..1e7179c 100644 --- a/pixi.lock +++ b/pixi.lock @@ -20,17 +20,30 @@ environments: - https://pypi.org/simple packages: osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asteval-1.0.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/awkward-2.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/caproto-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dpkt-1.9.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -39,51 +52,116 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json-merge-patch-0.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lmfit-1.3.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ndindex-1.8-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ophyd-1.11.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotext-5.3.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.11.0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ragged-0.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sparse-0.19.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stamina-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-plotext-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-base-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uncertainties-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/awkward-cpp-56-py313hcb059c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-blosc2-3.3.2-hf9886e1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py313h056b358_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py313h2af2deb_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py313h0997733_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epics-base-7.0.10.0-pl5321hbd962b0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py313h65a2061_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py313h5be338d_103.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_110.conda @@ -92,17 +170,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h2062a1b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-9_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-9_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-hf618e03_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda @@ -111,6 +197,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-ha531971_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.3.1-hcda0f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda @@ -120,81 +209,171 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h8daa630_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.49.0-py313h466ddcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py313hd065f0a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h65a2061_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py313h43b7ab6_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.2.1-py313h80c1790_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netifaces-0.11.0-py313hcdf3177_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.67.0-py313hac9060f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numexpr-2.14.2-py313h23850d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.5.2-py313hce9b930_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orjson-3.12.0-py313h09c9b15_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py313h1188861_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py313h45e5a15_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py313h6688731_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h84a0fba_1003.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py313h39782a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py313ha5d34ea_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.4-py313h212e517_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyepics-3.5.10-py313h8f79df9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.15-hf1cfe1e_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-blosc2-4.11.0-py313h87b4ceb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-2026.6.3-py313hb9d2816_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py313h52f5312_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.8-py313h0997733_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.3.0-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xrayutilities-1.7.12-py313hc577518_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - pypi: ./ - pypi: https://files.pythonhosted.org/packages/0e/fd/aad3337b0d14352589af31719112d25f0f27958547c81ed0dc01301a1b3a/ophyd_async-0.21.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/ea/2e9b5cbf171142bc6e575d14d7e1e727a729663922a5ad46d21b801be4c9/bluesky_tiled_plugins-2.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/1e/8672439c13bf17946667db07d06b3f764f17bb6bcda032eb262cbcedc00a/pyresttable-2020.0.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/6b/3feec8016ab2263946c4480510d2d1a7924a5400c455974a7a0344bb4304/setuptools_dso-2.12.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/89/da0f32b679b8769dd472eb2927308d328bf75c296629fd9f95135afacd0a/aioca-2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/05/3ef45db776baea068044c799bbba68f3ca00a440c0e930a17c572f3d9639/lxml-6.1.3-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/68/b9/f44b139096467996b4d85589d9880fd55f0c80a204d298a1b73d0adc2654/scanspec-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/72/89/0265b2b79424ed05b8d1e9c8fca71e1b150478e5b0c19aa50b0ae397326e/velocity_profile-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/99/cc217b2a727fdf730d0c0064bc8c03473dfe5d0528f2bd0c4f59fdab4179/bluesky-1.15.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/eb/461d5f167b6f5c7d97696f397c82f82e3480e003fce3f0a1cd1dd26e2eb2/typeguard-4.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/cb/c13d8a74419dde9590ed6fab293b516f68316ac87d06569b79b5f446d519/pydantic_numpy-8.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9b/5d/f25ac7d4fb77cbd53ddc6d05d833c6bf52b12770a44fa9a447eed470ca9a/msgpack_numpy-0.4.8-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/9e/d410b0ff08a2519d197928afdc1aa36eb47e197f5ba683389b00e216f83c/event_model-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/2b/2367065b64d6a55f92d4236325bb3e0c4196e5182002c880a5d49da0f029/hklpy2-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/33/7ce3f09d91a0ca5db7cca67671d865b7c8310b8b59eff287a711919641f0/mongoquery-1.4.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/19/0b6647bf5e331521e55d2b63bfbdc210bd9cd605189273f03614a05f702d/colorlog-6.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f3/4f/f94ac1b84d2169cf2ebf64353ce98fd743f85d30678059c514d9b3d6644c/compress_pickle-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/0f/0643fffd4852c4af6d40415c0689e45947a5fc51e6093a15543ca375ae43/epicscorelibs-7.0.10.99.0.1-cp313-cp313-macosx_11_0_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fe/47/deb64c73aec25af7699247e021153a6bfe9a08452f7f7337dcee4aa07a2b/historydict-1.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl p1: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/adbc-driver-manager-1.12.0-py313h7033f15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.14.1-pl5321h57e6904_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/asyncpg-0.31.0-py313h54dd161_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/awkward-cpp-56-py313h8debf8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.7.0-py313h8f72f4d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h2fc2bef_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-hd1e3526_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.3.2-hc31b594_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py313ha52865f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cpptango-10.3.3-h7ad94e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-50.0.0-py313heb322e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/epics-base-7.0.9.0-pl5321h2669dad_13.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/epicscorelibs-7.0.7.99.1.1-py313h949518f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fastar-0.11.0-py313hcf592b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-build-tools-1.86.0-py313h46534f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-host-tools-1.86.0-h5297791_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-ha257d8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gobject-introspection-1.86.0-py313hd2b4340_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py313h74173ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py313h5d5ffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.82.1-py313hc3642a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-h3cd6761_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py313hf402d47_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5plugin-7.0.0-py313hf57f36c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hkl-5.1.9.3843-h92e0786_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.8.0-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.8.16-py313h259dfeb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda @@ -202,12 +381,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h7b12aa8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libadbc-driver-postgresql-1.12.0-hedb09cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libadbc-driver-sqlite-1.12.0-hcea63bf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.2-h0ed3d04_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-heca4667_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda @@ -221,17 +409,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgirepository-1.86.0-h6d5faa7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h57c4cff_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.12.0-heb2dce7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.34-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.6-h9d76c99_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda @@ -240,91 +438,202 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.49.0-py313h6b4ec16_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.1.2-py313h8b16a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py313h28739b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py313h683a580_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.2.1-py313hc8edb43_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ndindex-1.10.1-py313h7033f15_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/netifaces-0.11.0-py313h07c4f96_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.67.0-py313h901f96d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py313h08cd8bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.2-py313h24ae7f9_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/obstore-0.11.0-py313h5c7d99a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/odrpack-0.6.1-py313he0a4196_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/omniorb-libs-4.3.4-h0273d15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.31.0-h8d634f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.12.0-py313hc6c575f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/p4p-4.2.2-np2py313pl5321haaeed4a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py313hbfd7664_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h80991f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1013.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-7.35.1-py313h098d647_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py313h54dd161_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pvxs-1.5.1-pl5321h579f993_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py313h98bfbea_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.29.1-py313h0e1c009_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycryptodome-3.23.0-py313h6123c0d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py313h843e2db_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyepics-3.5.10-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pygobject-3.58.0-py313hf91e55e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pytango-10.3.1-np2py313h41bc45f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hb101c97_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-blosc2-4.11.0-py313h4eaca89_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-duckdb-1.3.2-py313h7033f15_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py313hafbe609_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.17-py313h54dd161_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py313h54dd161_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py313h4b8bb8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py313h54dd161_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.2.0-hd2095e1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.2.0-py313hafbe609_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-17.0.1-py313hc25a8b5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.3.0-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xrayutilities-1.8.0-py313h29aa505_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_x86_64-microarch-level-1-4_level1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adbc-driver-postgresql-1.12.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adbc-driver-sqlite-1.12.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aioca-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiofiles-25.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.22.1-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alembic-1.19.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asgi-correlation-id-5.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asteval-1.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/awkward-2.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-base-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-tiled-plugins-2.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/canonicaljson-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/caproto-1.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorlog-6.11.0-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/compress-pickle-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dpkt-1.9.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecdsa-0.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/event-model-1.24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.141.1-h76d476e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.32-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.141.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/historydict-1.2.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hklpy2-0.7.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json-merge-patch-0.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lmfit-1.3.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mako-1.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minio-7.2.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mongoquery-1.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/msgpack-numpy-0.4.8-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-grpc-1.44.0-pyhd8ed1ab_0.conda @@ -335,40 +644,84 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ophyd-1.11.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ophyd-async-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotext-5.3.2-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-numpy-8.0.1-pyhfbfe010_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.11.0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyresttable-2020.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.5.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.32-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.3.post1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ragged-0.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/redis-py-8.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.20.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/scanspec-1.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools_dso-2.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sparse-0.19.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stamina-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-plotext-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2026.8.23-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-base-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-client-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-formats-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-server-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzlocal-5.4.4-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uncertainties-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.52.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.52.3-h06cadbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/velocity-profile-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.3.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl dev: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -761,25 +1114,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - pypi: ./ - pypi: https://files.pythonhosted.org/packages/0e/fd/aad3337b0d14352589af31719112d25f0f27958547c81ed0dc01301a1b3a/ophyd_async-0.21.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/ea/2e9b5cbf171142bc6e575d14d7e1e727a729663922a5ad46d21b801be4c9/bluesky_tiled_plugins-2.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/1e/8672439c13bf17946667db07d06b3f764f17bb6bcda032eb262cbcedc00a/pyresttable-2020.0.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/6b/3feec8016ab2263946c4480510d2d1a7924a5400c455974a7a0344bb4304/setuptools_dso-2.12.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/89/da0f32b679b8769dd472eb2927308d328bf75c296629fd9f95135afacd0a/aioca-2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/05/3ef45db776baea068044c799bbba68f3ca00a440c0e930a17c572f3d9639/lxml-6.1.3-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/68/b9/f44b139096467996b4d85589d9880fd55f0c80a204d298a1b73d0adc2654/scanspec-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/72/89/0265b2b79424ed05b8d1e9c8fca71e1b150478e5b0c19aa50b0ae397326e/velocity_profile-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/99/cc217b2a727fdf730d0c0064bc8c03473dfe5d0528f2bd0c4f59fdab4179/bluesky-1.15.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/eb/461d5f167b6f5c7d97696f397c82f82e3480e003fce3f0a1cd1dd26e2eb2/typeguard-4.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/cb/c13d8a74419dde9590ed6fab293b516f68316ac87d06569b79b5f446d519/pydantic_numpy-8.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9b/5d/f25ac7d4fb77cbd53ddc6d05d833c6bf52b12770a44fa9a447eed470ca9a/msgpack_numpy-0.4.8-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/9e/d410b0ff08a2519d197928afdc1aa36eb47e197f5ba683389b00e216f83c/event_model-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/2b/2367065b64d6a55f92d4236325bb3e0c4196e5182002c880a5d49da0f029/hklpy2-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/33/7ce3f09d91a0ca5db7cca67671d865b7c8310b8b59eff287a711919641f0/mongoquery-1.4.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/19/0b6647bf5e331521e55d2b63bfbdc210bd9cd605189273f03614a05f702d/colorlog-6.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f3/4f/f94ac1b84d2169cf2ebf64353ce98fd743f85d30678059c514d9b3d6644c/compress_pickle-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/0f/0643fffd4852c4af6d40415c0689e45947a5fc51e6093a15543ca375ae43/epicscorelibs-7.0.10.99.0.1-cp313-cp313-macosx_11_0_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fe/47/deb64c73aec25af7699247e021153a6bfe9a08452f7f7337dcee4aa07a2b/historydict-1.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl p1: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/adbc-driver-manager-1.12.0-py313h7033f15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.14.1-pl5321h57e6904_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py313h07c4f96_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/asyncpg-0.31.0-py313h54dd161_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/awkward-cpp-56-py313h8debf8b_0.conda @@ -806,10 +1170,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h2fc2bef_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-hd1e3526_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.3.2-hc31b594_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py313ha52865f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py313h55b89ea_1.conda @@ -817,24 +1184,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-50.0.0-py313heb322e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/epics-base-7.0.9.0-pl5321h2669dad_13.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/epicscorelibs-7.0.7.99.1.1-py313h949518f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fastar-0.11.0-py313hcf592b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-build-tools-1.86.0-py313h46534f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-host-tools-1.86.0-h5297791_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-ha257d8a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gobject-introspection-1.86.0-py313hd2b4340_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py313h74173ec_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py313h5d5ffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.82.1-py313hc3642a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-h3cd6761_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py313hf402d47_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5plugin-7.0.0-py313hf57f36c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hkl-5.1.9.3843-h92e0786_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.8.0-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.8.16-py313h259dfeb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda @@ -850,6 +1227,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.2-h0ed3d04_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda @@ -869,13 +1247,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgirepository-1.86.0-h6d5faa7_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h57c4cff_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.12.0-heb2dce7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda @@ -905,8 +1286,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.49.0-py313h6b4ec16_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.1.2-py313h8b16a13_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py313h28739b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda @@ -928,6 +1312,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/odrpack-0.6.1-py313he0a4196_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/omniorb-libs-4.3.4-h0273d15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.31.0-h8d634f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda @@ -938,6 +1323,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h80991f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1013.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-7.35.1-py313h098d647_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py313h54dd161_0.conda @@ -945,9 +1332,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pvxs-1.5.1-pl5321h579f993_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py313h78bf25f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py313h98bfbea_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.29.1-py313h0e1c009_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pycryptodome-3.23.0-py313h6123c0d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py313h843e2db_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyepics-3.5.10-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pygobject-3.58.0-py313hf91e55e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyright-1.1.411-py313h54dd161_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pytango-10.3.1-np2py313h41bc45f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hb101c97_101_cp313.conda @@ -955,6 +1344,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/python-duckdb-1.3.2-py313h7033f15_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py313hafbe609_0.conda @@ -966,6 +1356,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.5.0-py313h78bf25f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py313h54dd161_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.2.0-hd2095e1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda @@ -974,11 +1365,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.2.0-py313hafbe609_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-17.0.1-py313hc25a8b5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.3.0-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xrayutilities-1.8.0-py313h29aa505_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda @@ -1007,6 +1404,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.asyncio.runner-1.2.0-pyh5ded981_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-base-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-tiled-plugins-2.0.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda @@ -1049,12 +1447,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/historydict-1.2.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hklpy2-0.7.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda @@ -1090,6 +1496,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/minio-7.2.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mongoquery-1.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/msgpack-numpy-0.4.8-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda @@ -1129,6 +1536,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.11.0-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyresttable-2020.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-asyncio-1.4.0-pyhcf101f3_0.conda @@ -1141,6 +1549,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.5.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.32-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.3.post1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ragged-0.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-45.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/redis-py-8.1.0-pyhd8ed1ab_0.conda @@ -1169,19 +1578,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/textual-plotext-1.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2026.8.23-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-base-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-client-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-formats-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-server-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-7.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.6.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzlocal-5.4.4-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uncertainties-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda @@ -1197,6 +1611,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl docs: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -1206,11 +1622,16 @@ environments: osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asteval-1.0.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/awkward-2.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda @@ -1218,11 +1639,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dpkt-1.9.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -1231,45 +1658,67 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json-merge-patch-0.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lmfit-1.3.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ndindex-1.8-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ophyd-1.11.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotext-5.3.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.11.0-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ragged-0.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sparse-0.19.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-3.13.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda @@ -1281,31 +1730,65 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stamina-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-plotext-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-base-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uncertainties-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/awkward-cpp-56-py313hcb059c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.7.0-py313h8c7ad59_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313h3c37e74_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-blosc2-3.3.2-hf9886e1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py313h056b358_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py313h2af2deb_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py313h0997733_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epics-base-7.0.10.0-pl5321hbd962b0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py313h65a2061_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py313h5be338d_103.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_110.conda @@ -1314,17 +1797,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h2062a1b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-9_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-9_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-hf618e03_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda @@ -1333,6 +1824,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-ha531971_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.3.1-hcda0f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda @@ -1342,16 +1836,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h8daa630_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.49.0-py313h466ddcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py313hd065f0a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h65a2061_1.conda @@ -1359,65 +1863,144 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.2.1-py313h80c1790_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netifaces-0.11.0-py313hcdf3177_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.67.0-py313hac9060f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numexpr-2.14.2-py313h23850d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.5.2-py313hce9b930_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orjson-3.12.0-py313h09c9b15_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py313h1188861_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py313h45e5a15_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py313h6688731_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h84a0fba_1003.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py313h39782a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py313ha5d34ea_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.4-py313h212e517_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyepics-3.5.10-py313h8f79df9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.15-hf1cfe1e_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-blosc2-4.11.0-py313h87b4ceb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-2026.6.3-py313hb9d2816_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py313h52f5312_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.8-py313h0997733_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.3.0-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xrayutilities-1.7.12-py313hc577518_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - pypi: ./ - pypi: https://files.pythonhosted.org/packages/0e/fd/aad3337b0d14352589af31719112d25f0f27958547c81ed0dc01301a1b3a/ophyd_async-0.21.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/ea/2e9b5cbf171142bc6e575d14d7e1e727a729663922a5ad46d21b801be4c9/bluesky_tiled_plugins-2.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/1e/8672439c13bf17946667db07d06b3f764f17bb6bcda032eb262cbcedc00a/pyresttable-2020.0.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/6b/3feec8016ab2263946c4480510d2d1a7924a5400c455974a7a0344bb4304/setuptools_dso-2.12.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/89/da0f32b679b8769dd472eb2927308d328bf75c296629fd9f95135afacd0a/aioca-2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/05/3ef45db776baea068044c799bbba68f3ca00a440c0e930a17c572f3d9639/lxml-6.1.3-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/68/b9/f44b139096467996b4d85589d9880fd55f0c80a204d298a1b73d0adc2654/scanspec-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/72/89/0265b2b79424ed05b8d1e9c8fca71e1b150478e5b0c19aa50b0ae397326e/velocity_profile-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/99/cc217b2a727fdf730d0c0064bc8c03473dfe5d0528f2bd0c4f59fdab4179/bluesky-1.15.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/eb/461d5f167b6f5c7d97696f397c82f82e3480e003fce3f0a1cd1dd26e2eb2/typeguard-4.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/90/cb/c13d8a74419dde9590ed6fab293b516f68316ac87d06569b79b5f446d519/pydantic_numpy-8.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9b/5d/f25ac7d4fb77cbd53ddc6d05d833c6bf52b12770a44fa9a447eed470ca9a/msgpack_numpy-0.4.8-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/9e/d410b0ff08a2519d197928afdc1aa36eb47e197f5ba683389b00e216f83c/event_model-1.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/2b/2367065b64d6a55f92d4236325bb3e0c4196e5182002c880a5d49da0f029/hklpy2-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/33/7ce3f09d91a0ca5db7cca67671d865b7c8310b8b59eff287a711919641f0/mongoquery-1.4.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/19/0b6647bf5e331521e55d2b63bfbdc210bd9cd605189273f03614a05f702d/colorlog-6.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f3/4f/f94ac1b84d2169cf2ebf64353ce98fd743f85d30678059c514d9b3d6644c/compress_pickle-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/0f/0643fffd4852c4af6d40415c0689e45947a5fc51e6093a15543ca375ae43/epicscorelibs-7.0.10.99.0.1-cp313-cp313-macosx_11_0_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fe/47/deb64c73aec25af7699247e021153a6bfe9a08452f7f7337dcee4aa07a2b/historydict-1.2.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl p1: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/adbc-driver-manager-1.12.0-py313h7033f15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.14.1-pl5321h57e6904_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/asyncpg-0.31.0-py313h54dd161_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/awkward-cpp-56-py313h8debf8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.7.0-py313h8f72f4d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h2fc2bef_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-hd1e3526_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-3.3.2-hc31b594_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py313ha52865f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cpptango-10.3.3-h7ad94e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-50.0.0-py313heb322e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/epics-base-7.0.9.0-pl5321h2669dad_13.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/epicscorelibs-7.0.7.99.1.1-py313h949518f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fastar-0.11.0-py313hcf592b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-build-tools-1.86.0-py313h46534f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-host-tools-1.86.0-h5297791_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-ha257d8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gobject-introspection-1.86.0-py313hd2b4340_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py313h74173ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py313h5d5ffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.82.1-py313hc3642a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-h3cd6761_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py313hf402d47_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5plugin-7.0.0-py313hf57f36c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hkl-5.1.9.3843-h92e0786_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.8.0-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.8.16-py313h259dfeb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda @@ -1425,12 +2008,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h7b12aa8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libadbc-driver-postgresql-1.12.0-hedb09cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libadbc-driver-sqlite-1.12.0-hcea63bf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.2-h0ed3d04_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-heca4667_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda @@ -1444,17 +2036,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgirepository-1.86.0-h6d5faa7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h57c4cff_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.12.0-heb2dce7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.34-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.6-h9d76c99_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda @@ -1463,88 +2065,182 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.49.0-py313h6b4ec16_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.1.2-py313h8b16a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py313h28739b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py313h683a580_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-he0a73b1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.2.1-py313hc8edb43_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ndindex-1.10.1-py313h7033f15_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/netifaces-0.11.0-py313h07c4f96_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.67.0-py313h901f96d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py313h08cd8bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numexpr-2.14.2-py313h24ae7f9_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/obstore-0.11.0-py313h5c7d99a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/odrpack-0.6.1-py313he0a4196_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/omniorb-libs-4.3.4-h0273d15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.31.0-h8d634f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.12.0-py313hc6c575f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/p4p-4.2.2-np2py313pl5321haaeed4a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py313hbfd7664_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h80991f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1013.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-7.35.1-py313h098d647_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py313h54dd161_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pvxs-1.5.1-pl5321h579f993_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py313h98bfbea_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.29.1-py313h0e1c009_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycryptodome-3.23.0-py313h6123c0d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py313h843e2db_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyepics-3.5.10-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pygobject-3.58.0-py313hf91e55e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pytango-10.3.1-np2py313h41bc45f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hb101c97_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-blosc2-4.11.0-py313h4eaca89_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-duckdb-1.3.2-py313h7033f15_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py313hafbe609_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.17-py313h54dd161_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py313h54dd161_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py313h4b8bb8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py313h54dd161_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.2.0-hd2095e1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.2.0-py313hafbe609_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-17.0.1-py313hc25a8b5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.3.0-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xrayutilities-1.8.0-py313h29aa505_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_x86_64-microarch-level-1-4_level1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adbc-driver-postgresql-1.12.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adbc-driver-sqlite-1.12.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aioca-2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiofiles-25.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosqlite-0.22.1-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alembic-1.19.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asgi-correlation-id-5.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asteval-1.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/awkward-2.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-base-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-tiled-plugins-2.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/canonicaljson-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/caproto-1.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorlog-6.11.0-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/compress-pickle-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.18.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dpkt-1.9.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ecdsa-0.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/event-model-1.24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.141.1-h76d476e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.32-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.141.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/furo-2025.12.19-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/historydict-1.2.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hklpy2-0.7.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda @@ -1552,16 +2248,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json-merge-patch-0.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lmfit-1.3.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mako-1.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minio-7.2.20-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mongoquery-1.4.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/msgpack-numpy-0.4.8-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-grpc-1.44.0-pyhd8ed1ab_0.conda @@ -1572,28 +2279,49 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ophyd-1.11.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ophyd-async-0.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotext-5.3.2-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.26.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-numpy-8.0.1-pyhfbfe010_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.11.0-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyresttable-2020.0.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-jose-3.5.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.32-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.3.post1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ragged-0.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/redis-py-8.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.20.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/scanspec-1.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-84.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools_dso-2.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sparse-0.19.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autodoc-typehints-3.13.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_3.conda @@ -1605,21 +2333,43 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stamina-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-plotext-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2026.8.23-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-base-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-client-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-formats-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-server-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzlocal-5.4.4-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uncertainties-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.52.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.52.3-h06cadbb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/velocity-profile-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.3.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -1656,6 +2406,21 @@ packages: run_exports: {} size: 427560 timestamp: 1785224195950 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.14.1-pl5321h57e6904_2.conda + sha256: bcfe516fdebf4503ab10c7968ee880774ce1adee6e055738ca53c81745cfdd58 + md5: 5fabcad67aa128f07f269066ee7fdde6 + depends: + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - aom >=3.14.1,<3.15.0a0 + size: 3246374 + timestamp: 1787256015178 - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py313h07c4f96_2.conda sha256: ad188ccc06a06c633dc124b09e9e06fb9df4c32ffc38acc96ecc86e506062090 md5: 27bbec9f2f3a15d32b60ec5734f5b41c @@ -2034,7 +2799,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: BSD-3-Clause AND MIT AND EPL-2.0 purls: - - pkg:pypi/backports-zstd?source=compressed-mapping + - pkg:pypi/backports-zstd?source=hash-mapping run_exports: {} size: 243610 timestamp: 1786861410562 @@ -2104,10 +2869,28 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=compressed-mapping + - pkg:pypi/brotli?source=hash-mapping run_exports: {} size: 367312 timestamp: 1786622911623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-hd1e3526_2.conda + sha256: b4831ac06bb65561342cedf3d219cf9b096f20b8d62cda74f0177dffed79d4d5 + md5: 5948f4fead433c6e5c46444dbfb01162 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - brunsli >=0.1,<1.0a0 + size: 168501 + timestamp: 1761758949420 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 md5: e675fabcf81499adc7edf58124fb1e01 @@ -2156,6 +2939,36 @@ packages: - c-blosc2 >=3.3.2,<3.4.0a0 size: 400190 timestamp: 1786222643780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + sha256: 6b551d9346997bc4c6fadf96b7b92442b8f3244011cc462e4ee77afc714d52c5 + md5: 7b870cffbaa8430290e567a0facd8dca + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=15 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 991011 + timestamp: 1788221336073 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py313ha52865f_2.conda sha256: a0bd899c7f6ab06e2c60a61737b1c7da732f81235c3babbddd14ee01ec2ab8f9 md5: 3c23b9907fd858c635a29ec77cf43301 @@ -2173,6 +2986,21 @@ packages: run_exports: {} size: 304702 timestamp: 1786775106191 +- conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.4-hecca717_0.conda + sha256: 285bb88f6229a1eb4772ab805fbc61ef786e27b5e9ca0b6434b13d2a728790bb + md5: dc7072d888ba25c06d706d9dd4bd48ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - charls >=2.4.4,<2.5.0a0 + size: 162240 + timestamp: 1780948654621 - conda: https://conda.anaconda.org/conda-forge/linux-64/comrak-0.54.0-hb17b654_0.conda sha256: f80e00a568128566ac97787afcc2701bd3e636799363b9e2c88ce8733361e525 md5: a072db87d32836deeeffd30995529d63 @@ -2216,7 +3044,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/coverage?source=compressed-mapping + - pkg:pypi/coverage?source=hash-mapping run_exports: {} size: 423474 timestamp: 1786292729866 @@ -2293,6 +3121,19 @@ packages: run_exports: {} size: 620281 timestamp: 1771855841837 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda + sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 + md5: 418c6ca5929a611cbd69204907a83995 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - dav1d >=1.2.1,<1.2.2.0a0 + size: 760229 + timestamp: 1685695754230 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 md5: ce96f2f470d39bd96ce03945af92e280 @@ -2362,6 +3203,26 @@ packages: run_exports: {} size: 422578 timestamp: 1776177827225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + sha256: 5a3eb10b18a97223ab06b3a7f0d7f56658db2f2800e2f2af95836fe3bf55ba63 + md5: 922776b528a470ab5afa81fd42abfa1d + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libuuid >=2.42.2,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + size: 296288 + timestamp: 1786667377340 - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda sha256: e0029a390d7aef29bd6e7c12a3759f5e0b989930b5781e544ca9bac0abcd8442 md5: ae83c999b4cfc4c171ce88b99c8b43cc @@ -2393,6 +3254,38 @@ packages: - libfreetype6 >=2.14.3 size: 175239 timestamp: 1786641011029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-build-tools-1.86.0-py313h46534f3_3.conda + sha256: 64972ad564bed88f867345e5d49eb79a3151aaf1a0803a807ef24f720c32ea5b + md5: 85c9beac8e3941a33499ba37380dd001 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + - pkg-config + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - setuptools + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: {} + size: 362674 + timestamp: 1788834557494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/g-ir-host-tools-1.86.0-h5297791_3.conda + sha256: f7c3c809f237270e06b6ba1663285c601ea84e0ddf4dc1ef436d1a3802a1ca15 + md5: fd98cadc0fc11641ea8a76661655398b + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - libgirepository 1.86.0 h6d5faa7_3 + - libglib >=2.88.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: {} + size: 109485 + timestamp: 1788834458905 - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda sha256: f7026323ac769ef432c747a6c22abd39c583d0d4f6985a7100fb371e2167f214 md5: 04be12e7dd050aaf364ece2393988e85 @@ -2408,6 +3301,20 @@ packages: - gflags >=2.3.1,<2.4.0a0 size: 130991 timestamp: 1785044715896 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-ha257d8a_1.conda + sha256: 3611c5d605cd56017704e6c01c7bd849e74a656a546d4c49d655fde49ddfeecc + md5: bd7c3a8586ed0101f094962100d30a63 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - giflib >=5.2.2,<5.3.0a0 + size: 77403 + timestamp: 1784694210187 - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda sha256: f24feeda3aeec3a2cbb9fe2e0fabc4785372e70b6cc838c96023e08e17f4bfa0 md5: 6941f96b8a8056677d79b4f5a2c4aaca @@ -2451,10 +3358,30 @@ packages: - python_abi 3.13.* *_cp313 license: LGPL-3.0-or-later purls: - - pkg:pypi/gmpy2?source=compressed-mapping + - pkg:pypi/gmpy2?source=hash-mapping run_exports: {} size: 327580 timestamp: 1787066358811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gobject-introspection-1.86.0-py313hd2b4340_3.conda + sha256: 68250f97c6b5c3ff05217c251a1c051f9dcd6e13cc828f7549a00ad41ab8c60a + md5: f180f764063b4e635991f304e0878f16 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - g-ir-build-tools 1.86.0 py313h46534f3_3 + - g-ir-host-tools 1.86.0 h5297791_3 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - libgirepository 1.86.0 h6d5faa7_3 + - libglib >=2.88.3,<3.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: {} + size: 146594 + timestamp: 1788834587804 - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py313h74173ec_1.conda sha256: c0e39ebce8b9d8bc4e734bb5d2538e60f7c8c85ec04f9b0690fc6e1cb9656869 md5: d358850e37a98739224fdc265d7d8eb7 @@ -2508,6 +3435,22 @@ packages: run_exports: {} size: 925368 timestamp: 1783588832882 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.8-h3cd6761_2.conda + sha256: 433d1b1570afa09f469fa5cfb633a2d860fe270639ffa6ba7a354088ab5aba23 + md5: 5071d6d2577a3d5989b1767fbd0a4d56 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=15 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + run_exports: + weak: + - gsl >=2.8,<2.9.0a0 + size: 2466796 + timestamp: 1789041589598 - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py313hf402d47_103.conda sha256: b5ed64c328d9a3818dbe83860262786743ed684e3dd56127872c2a407072b657 md5: e139e09fe5cf3d0edf789361783f500b @@ -2571,6 +3514,24 @@ packages: run_exports: {} size: 3424263 timestamp: 1785311572974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hkl-5.1.9.3843-h92e0786_1.conda + sha256: 6c812b76d104828df93010fb778a3d015a8a3b7fcac546ca9467e0f26ff7d143 + md5: 39a8a240d3374f52c1032e2825aaede6 + depends: + - __glibc >=2.17,<3.0.a0 + - gobject-introspection + - gsl >=2.8,<2.9.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libglib >=2.88.3,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - pygobject + license: GPL-3.0-or-later + license_family: GPL + purls: [] + run_exports: {} + size: 153368 + timestamp: 1786189400355 - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.8.0-py313h07c4f96_0.conda sha256: 5549f2956daa49d7c2023917b54510b70e3c246571c306f49fbc88257d01b343 md5: 4ac47c40548b80590101de0655a29b80 @@ -2601,6 +3562,66 @@ packages: - icu >=78.3,<79.0a0 size: 14459115 timestamp: 1786545741408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.8.16-py313h259dfeb_0.conda + sha256: bbd43b68f4ec98bb1254e5ee62739dd1b54078b8b12388ccd997231b66e5525b + md5: f96645e16c0123dda009dca1bcabef0c + depends: + - __glibc >=2.17,<3.0.a0 + - blosc >=1.21.6,<2.0a0 + - brunsli >=0.1,<1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - c-blosc2 >=3.3.2,<3.4.0a0 + - charls >=2.4.4,<2.5.0a0 + - giflib >=5.2.2,<5.3.0a0 + - jxrlib >=1.1,<1.2.0a0 + - lcms2 >=2.19.1,<3.0a0 + - lerc >=4.2.0,<5.0a0 + - libaec >=1.1.5,<2.0a0 + - libavif16 >=1.4.2,<2.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=15 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libjxl >=0.12.0,<0.13.0a0 + - liblzma >=5.8.3,<6.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=15 + - libtiff >=4.7.2,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - libzopfli >=1.0.3,<1.1.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - numpy >=1.25,<3 + - openjpeg >=2.5.4,<3.0a0 + - openjph >=0.31.0,<0.32.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - snappy >=1.2.2,<1.3.0a0 + - zfp >=1.0.1,<2.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/imagecodecs?source=hash-mapping + run_exports: {} + size: 2288228 + timestamp: 1786846580689 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda + sha256: 2057ca87b313bde5b74b93b0e696f8faab69acd4cb0edebb78469f3f388040c0 + md5: 5aeabe88534ea4169d4c49998f293d6c + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - jxrlib >=1.1,<1.2.0a0 + size: 239104 + timestamp: 1703333860145 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda sha256: dd053c96dcb0dcfd59422aefea9d2fe937a190167f34fba7893ec1e10a7e8963 md5: ba55d1b89fd7775e67de8291029b4059 @@ -2881,6 +3902,24 @@ packages: - libarrow-substrait >=25.0.0,<25.1.0a0 size: 500255 timestamp: 1786315353425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.2-h0ed3d04_3.conda + sha256: 0f7ddf0f9438d6c3dad8c344768fd546499454d7ae88070240d2097d91eeeafd + md5: 1adfc4577f7994251b53a5cdc922d7c6 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - svt-av1 >=4.2.0,<4.2.1.0a0 + - dav1d >=1.2.1,<1.2.2.0a0 + - aom >=3.14.1,<3.15.0a0 + - rav1e >=0.8.1,<0.9.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libavif16 >=1.4.2,<2.0a0 + size: 165201 + timestamp: 1784120029480 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h4a7cf45_openblas.conda build_number: 9 sha256: 39c7b3c5427b435c9c059ede9da61d46d42574e5b846ad37fdc3af4a5eab1e48 @@ -3165,6 +4204,21 @@ packages: run_exports: {} size: 2538696 timestamp: 1785375448623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgirepository-1.86.0-h6d5faa7_3.conda + sha256: b68d9a3e0b6671e519f324dbb8e48fd74d3b312c1fe96ac91ad629f9c075853b + md5: 93a877119cbec0794cc4e24a8e367b70 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: {} + size: 142114 + timestamp: 1788834451550 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda sha256: 4499458124bcf0bd45e8bd17576f9f007cb1373cb3b01659105443f522bab45c md5: 533cb021c1bfeba9f720e669cd863fdf @@ -3267,6 +4321,20 @@ packages: - libgrpc >=1.82.1,<1.83.0a0 size: 6957755 timestamp: 1783588701960 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h57c4cff_1.conda + sha256: 23c7cf726b883f5e7c1bfa6bf24bceafa8be87245a7690e0b5c974eb320a9e83 + md5: d58bfbaaf51ed85771eae92c2e7f5816 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + license: Apache-2.0 OR BSD-3-Clause + purls: [] + run_exports: + weak: + - libhwy >=1.4.0,<1.5.0a0 + size: 1454025 + timestamp: 1787282422734 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda sha256: f943117edb9cd4d9c61cc972eee5a34291dc55ea7a6e9e38da104995841cbcb6 md5: f92233bf33e24a25668bb2119e2c51f9 @@ -3295,6 +4363,24 @@ packages: - libjpeg-turbo >=3.2.0,<4.0a0 size: 650434 timestamp: 1785896381946 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.12.0-heb2dce7_2.conda + sha256: 965e59ea776344e93a416f7e0ba309810470a61c0e0c65f1eb90be0e808d7e9c + md5: 485788d339785bac87fe86315b4a0627 + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libjxl >=0.12.0,<0.13.0a0 + size: 1886013 + timestamp: 1786691380980 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h47877c9_openblas.conda build_number: 9 sha256: ea989e2dabd21d296a5a4ec515e695645aefcdf778ffdb5eeea515421d243ab5 @@ -3762,6 +4848,22 @@ packages: - libxml2-16 >=2.15.3 size: 46810 timestamp: 1776376751152 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5 + md5: 87e6096ec6d542d1c1f8b33245fe8300 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxslt >=1.1.43,<2.0a0 + size: 245434 + timestamp: 1757963724977 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 md5: 0de0122d9570a8ab637c6b73db268389 @@ -3777,6 +4879,20 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 63713 timestamp: 1785362952714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 + sha256: ff94f30b2e86cbad6296cf3e5804d442d9e881f7ba8080d92170981662528c6e + md5: c66fe2d123249af7651ebde8984c51c2 + depends: + - libgcc-ng >=9.3.0 + - libstdcxx-ng >=9.3.0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libzopfli >=1.0.3,<1.1.0a0 + size: 168074 + timestamp: 1607309189989 - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.49.0-py313h6b4ec16_0.conda sha256: e0ec0910f47dd8448c5e1ca7f4121b91b4b2c18642f9d1ca3722aba802407bac md5: a4837acb60b65893a46a14ccb6dbb582 @@ -3794,6 +4910,24 @@ packages: run_exports: {} size: 40432023 timestamp: 1786971101365 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.1.2-py313h8b16a13_0.conda + sha256: d06b9209f7b4b7e41d8c7801e26c9b8644f170df28734e65e7609afe5aea64b1 + md5: ec9f5d97ed1c033963206ac642c07dfc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libxml2 + - libxml2-16 >=2.14.6 + - libxslt >=1.1.43,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + run_exports: {} + size: 1593788 + timestamp: 1787133202169 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py313h28739b2_1.conda sha256: cbc82f4fa7587376c038d2f0471a73efa7ade4439857b04a0cc839262f1de6e5 md5: e69ad33075938ba81e43311da86b809c @@ -4162,20 +5296,36 @@ packages: sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d md5: 11b3379b191f63139e29c0d19dee24cd depends: - - __glibc >=2.17,<3.0.a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 355400 + timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.31.0-h8d634f6_0.conda + sha256: 3c7a4118c678c43952ea10183388f175a4bcee16a1c61d90dab2fbdafddc45d7 + md5: 49ca947333c62d5985a88cbdd8f59468 + depends: - libgcc >=14 - - libpng >=1.6.50,<1.7.0a0 - libstdcxx >=14 - - libtiff >=4.7.1,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 + - __glibc >=2.17,<3.0.a0 + - libtiff >=4.7.2,<4.8.0a0 license: BSD-2-Clause license_family: BSD purls: [] run_exports: weak: - - openjpeg >=2.5.4,<3.0a0 - size: 355400 - timestamp: 1758489294972 + - openjph >=0.31.0,<0.32.0a0 + size: 295193 + timestamp: 1785149856790 - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda sha256: 21c4f6c7f41dc9bec2ea2f9c80440d9a4d45a6f2ac13243e658f10dcf1044146 md5: 680608784722880fbfe1745067570b00 @@ -4400,6 +5550,33 @@ packages: run_exports: {} size: 1077037 timestamp: 1782912080163 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + sha256: 829d8288764282de5a9f7b9169acb75cc7dc0b6c3fe2535cfe87dea3436bbc5d + md5: 0ee5bb30034b081a1386c1e2c98ab0a7 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 376704 + timestamp: 1786106621354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1013.conda + sha256: 8f27ee1b6166c5be505dba4b0dd0f3b3b81ddec811f6118cc337b90cbd3937a4 + md5: 0aab2923309084c5f89ef32cd39a19b2 + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: {} + size: 141376 + timestamp: 1788677377648 - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc md5: a83f6a2fdc079e643237887a37460668 @@ -4521,6 +5698,25 @@ packages: run_exports: {} size: 5442780 timestamp: 1784258403853 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.29.1-py313h0e1c009_2.conda + sha256: e9c2217ff85d7d8a74aa9213f9e376565bfd1175865859bac5b90410d27152ac + md5: 61ddedf8c506bce682d037f7be5aea4d + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: LGPL-2.1-only OR MPL-1.1 + purls: + - pkg:pypi/pycairo?source=hash-mapping + run_exports: {} + size: 120479 + timestamp: 1788834506592 - conda: https://conda.anaconda.org/conda-forge/linux-64/pycryptodome-3.23.0-py313h6123c0d_2.conda sha256: 8a389621b0bf6bbce6f1732c4d4da09b3dad4c413e029726465f244ff25b55ec md5: 9515285f632cbc82b783df886713f998 @@ -4572,6 +5768,31 @@ packages: run_exports: {} size: 4255908 timestamp: 1779312690017 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pygobject-3.58.0-py313hf91e55e_2.conda + sha256: 67d8a36a979a5e85c0ff5e3dbed34785c61029a0a6247bb2384e359c962e4145 + md5: 486f35c32615a811b68e170be954b12d + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libgirepository + - libglib >=2.88.3,<3.0a0 + - libiconv + - libzlib >=1.3.2,<2.0a0 + - pycairo + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: LGPL-2.1-or-later + license_family: LGPL + purls: + - pkg:pypi/pygobject?source=hash-mapping + run_exports: {} + size: 410639 + timestamp: 1788874034786 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyright-1.1.411-py313h54dd161_0.conda sha256: d082617549bbb03a0bbbd88c918b38b025bdad637e002aa618be1d4ac60eb48a md5: 818a0a0f89723a268f6a9144680ca8e5 @@ -4722,6 +5943,22 @@ packages: - qhull >=2020.2,<2020.3.0a0 size: 552937 timestamp: 1720813982144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda + sha256: cf550bbc8e5ebedb6dba9ccaead3e07bd1cb86b183644a4c853e06e4b3ad5ac7 + md5: d83958768626b3c8471ce032e28afcd3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - __glibc >=2.17 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - rav1e >=0.8.1,<0.9.0a0 + size: 5595970 + timestamp: 1772540833621 - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda sha256: 7279908454f0c87b84ebc4aec6924f02f41a105d88420fb35dfaf5ecd976e0f5 md5: d83f2ee212d217a6d745a00e5be84671 @@ -4902,6 +6139,21 @@ packages: run_exports: {} size: 3863012 timestamp: 1786535232010 +- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.2.0-hd2095e1_1.conda + sha256: 09c242d480632acca31f2a510c9a9f65bb8cca1e82b73d2d0261ec837fff48be + md5: 3bd5f5f3f6f6431b9f19b35ad4a8ed21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - svt-av1 >=4.2.0,<4.2.1.0a0 + size: 2750545 + timestamp: 1787256261632 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda build_number: 103 sha256: 43624eab22f5f29df7d6ffe914cf442f28fd559b55b290906255492826e636e8 @@ -5028,6 +6280,51 @@ packages: run_exports: {} size: 117625 timestamp: 1785422127987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + sha256: 49b532d1df875c6749d9078b56a76f3f5db49a5abe0ca620b593ed474ef0ebf1 + md5: 85c9442aec283b4e464fa9ecc484a2f3 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libice >=1.1.2,<2.0a0 + size: 62517 + timestamp: 1786474410404 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + sha256: ef907caee0665cf3b0f775602cc50e388e3bade8ce22ecade0873ff26604b2fd + md5: aa7459ed9ad086ba11dda843d764b33d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libice >=1.1.2,<2.0a0 + - libuuid >=2.42.2,<3.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libsm >=1.2.6,<2.0a0 + size: 30739 + timestamp: 1786545374265 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + sha256: 68053eebfa9f0d91666786c8fb5839d989aa9b869add92cb8815228bb2d7302c + md5: 8c282bbe4808a3cc80a5c98e9aec1cfc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libx11 >=1.8.13,<2.0a0 + size: 839578 + timestamp: 1787087012372 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda sha256: cbf891f6cc1a859347680af1c8562bc6b033bf182a2a3bb536016932be3206de md5: f06ef439c280a5f90b8bf62355008dbc @@ -5056,6 +6353,36 @@ packages: - xorg-libxdmcp >=1.1.5,<2.0a0 size: 21120 timestamp: 1786381006369 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + sha256: aa9bbe8b278aacc194e280ff5037f9f9a1f2c5b33ed97de8e7f01cfbe90dda43 + md5: e5b6b28536b81b3f4cb20db4668a4642 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxext >=1.3.7,<2.0a0 + size: 53124 + timestamp: 1787100841900 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + sha256: 6901f91d398811e4ec89d7e20a69abac02a7bfebfaf073338b7ea3d1a99685b7 + md5: e470d224a7a5be1b1d021bded7abb536 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxrender >=0.9.12,<0.10.0a0 + size: 34645 + timestamp: 1787100191192 - conda: https://conda.anaconda.org/conda-forge/linux-64/xrayutilities-1.8.0-py313h29aa505_0.conda sha256: 2903f508ede19ff35aa642b7479d65c5dc097e3b28d2207931981f8f0b75e5b0 md5: b4dcddca20b8a3c7e3ca7fbb51470881 @@ -5109,6 +6436,22 @@ packages: - zeromq >=4.3.5,<4.4.0a0 size: 311184 timestamp: 1779123989774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda + sha256: 5fabe6cccbafc1193038862b0b0d784df3dae84bc48f12cac268479935f9c8b7 + md5: 6a0eb48e58684cca4d7acc8b7a0fd3c7 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zfp >=1.0.1,<2.0a0 + size: 277694 + timestamp: 1766549572069 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda sha256: 16080a1c7724f7d25727cdc23c7658e0cec2db52448c1dc0c33467ee2c6e1c62 md5: 6acb86426229f96f93e5468d1df3a5e8 @@ -5575,6 +6918,24 @@ packages: run_exports: {} size: 287265 timestamp: 1778080167723 +- conda: https://conda.anaconda.org/conda-forge/noarch/bluesky-tiled-plugins-2.0.9-pyhd8ed1ab_0.conda + sha256: c59912702e7f28bf53ac1e85aa913675e381b091c3da3f4767221b93caec1ddb + md5: ad274191d52527cd66c48c9fe3d46189 + depends: + - dask-core + - event-model + - mongoquery + - python >=3.10 + - pytz + - tiled-client >=0.2.0 + - tzlocal + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/bluesky-tiled-plugins?source=hash-mapping + run_exports: {} + size: 59118 + timestamp: 1784707204742 - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.2-pyhd8ed1ab_0.conda sha256: 577c2614f3a59512697c1ffe2021c5194818b55f734006fcdeb6c6921b514c44 md5: b2781afb860ae9ed84cb92bdebbc83ea @@ -6298,7 +7659,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/googleapis-common-protos?source=compressed-mapping + - pkg:pypi/googleapis-common-protos?source=hash-mapping run_exports: {} size: 149700 timestamp: 1786023621169 @@ -6331,6 +7692,21 @@ packages: run_exports: {} size: 100789 timestamp: 1785796355216 +- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + sha256: 5bf081c0f21a57fc84b5000d53f043d63638b77dcc2137f87511a4581838c9f6 + md5: ca7f9ba8762d3e360e47917a10e23760 + depends: + - h5py + - numpy + - packaging + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5netcdf?source=hash-mapping + run_exports: {} + size: 57732 + timestamp: 1769241877548 - conda: https://conda.anaconda.org/conda-forge/noarch/historydict-1.2.6-pyhd8ed1ab_1.conda sha256: 325656b615af237c60f7596b40d654b489af4d4d128aa936c3ef287a5bd6a8b9 md5: 3f055e6e8646745be340ce4b08092328 @@ -6343,6 +7719,31 @@ packages: run_exports: {} size: 11249 timestamp: 1734382711342 +- conda: https://conda.anaconda.org/conda-forge/noarch/hklpy2-0.7.3-pyhcf101f3_0.conda + sha256: 72ded71b425024e055c822f24716e18f896c246f0a9b65fa7d65dc2acf35ac68 + md5: d53d76c4b1b88db5c3a3af5f96b1e846 + depends: + - bluesky-tiled-plugins + - bluesky-base + - cytoolz + - deprecated + - numpy + - ophyd + - pandas + - pint + - pyresttable + - python >=3.10 + - ruamel.yaml + - tiled + - tqdm + - typeguard + - python + license: BSD-4-Clause + purls: + - pkg:pypi/hklpy2?source=hash-mapping + run_exports: {} + size: 102919 + timestamp: 1786231710271 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 md5: b395909221b9bd1df066e5930e18855b @@ -6870,6 +8271,18 @@ packages: run_exports: {} size: 69324 timestamp: 1764207690145 +- conda: https://conda.anaconda.org/conda-forge/noarch/mongoquery-1.4.3-pyhd8ed1ab_0.conda + sha256: 8e5fc466a715ef261c44d5965c0bd26507cc99747b0296635b753a7ab998b407 + md5: 404f751bd276eb97293319b9bdd80e38 + depends: + - python >=3.10 + - six + license: Unlicense + purls: + - pkg:pypi/mongoquery?source=hash-mapping + run_exports: {} + size: 12594 + timestamp: 1758059611138 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.1.0-pyhcf101f3_0.conda sha256: 6725c1c8db9d025db763e1bba1acdcff2eb2ae20a7766a71512ea84081033288 md5: 0e694257dbf916540b749c3ffc808efe @@ -7473,6 +8886,18 @@ packages: run_exports: {} size: 110893 timestamp: 1769003998136 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyresttable-2020.0.11-pyhd8ed1ab_0.conda + sha256: afb6b70dd9773c85906e93727170b97956816753b78325e793a539b84f2e8ef7 + md5: 3cbe40523c464a780a165b07e1739c51 + depends: + - lxml + - python >=3.10 + license: CC-BY-4.0 + purls: + - pkg:pypi/pyresttable?source=hash-mapping + run_exports: {} + size: 26231 + timestamp: 1786415738106 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -7579,7 +9004,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/python-discovery?source=compressed-mapping + - pkg:pypi/python-discovery?source=hash-mapping run_exports: {} size: 38785 timestamp: 1786705670745 @@ -7647,6 +9072,19 @@ packages: run_exports: {} size: 7002 timestamp: 1752805902938 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.3.post1-pyhcf101f3_0.conda + sha256: ad774abda71c759baef515983bfedbba34d56d6227974c23715c04612f812a90 + md5: eb2fb9070c0232e96ae5515d8b28e4f9 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + run_exports: {} + size: 201126 + timestamp: 1785077087428 - conda: https://conda.anaconda.org/conda-forge/noarch/ragged-0.3.0-pyhd8ed1ab_0.conda sha256: 7530d46e7c607ade3284aa77222af6e4502d527c214c98ecd3d62480a0e3a47b md5: d89fab0a40e24eeb3a47238378a2baa6 @@ -8230,6 +9668,36 @@ packages: run_exports: {} size: 23869 timestamp: 1741878358548 +- conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2026.8.23-pyhc364b38_0.conda + sha256: 33a218d81cb1891c4d736fef7a907025f77e38883ef359ff91f117df2d68b7f2 + md5: 18e7a385a8427c70be15793090598063 + depends: + - python >=3.12 + - numpy >=2.1 + - imagecodecs >=2026.5.10 + - python + constrains: + - matplotlib-base >=3.3 + license: BSD-3-Clause + purls: + - pkg:pypi/tifffile?source=compressed-mapping + run_exports: {} + size: 231923 + timestamp: 1787572590018 +- conda: https://conda.anaconda.org/conda-forge/noarch/tiled-0.2.14-pyhd8ed1ab_0.conda + sha256: 453370792b0dbba3cc62181fb609035aa0711601ce672065b93d5b237fe8a437 + md5: 6291384940b0931e5cb8a11ff23a5e48 + depends: + - python >=3.10 + - tiled-client 0.2.14 pyhd8ed1ab_0 + - tiled-formats 0.2.14 pyhd8ed1ab_0 + - tiled-server 0.2.14 pyhd8ed1ab_0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 8709 + timestamp: 1783548057637 - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-base-0.2.14-pyhd8ed1ab_0.conda sha256: 9692c853cab650b477ef9608536fd67b82b23cf78c740f073af3b2d9d23c2244 md5: a0fb3826aaddb0ac9238ac9dbe5b86b3 @@ -8283,6 +9751,24 @@ packages: run_exports: {} size: 8235 timestamp: 1783548040749 +- conda: https://conda.anaconda.org/conda-forge/noarch/tiled-formats-0.2.14-pyhd8ed1ab_0.conda + sha256: d2dd25615e6095f280f2058da654308ab1da15f9af3cd2886bf0d7c6882a4bc7 + md5: 15790b6327f7cf5f62b47377f5fd55a6 + depends: + - h5netcdf + - h5py + - hdf5plugin + - openpyxl + - pillow + - python >=3.10 + - tifffile + - tiled-base 0.2.14 pyhd8ed1ab_0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 8073 + timestamp: 1783548045776 - conda: https://conda.anaconda.org/conda-forge/noarch/tiled-server-0.2.14-pyhd8ed1ab_0.conda sha256: fca9feda563607162f9ad48c84fd66334105d7657ea7523015b552427fdc87e3 md5: 02cfd2bf046ca7d97f9dc65d7b95f269 @@ -8403,6 +9889,22 @@ packages: run_exports: {} size: 42936 timestamp: 1785252141368 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.6.0-pyhcf101f3_0.conda + sha256: 82cb76b4dd554d1da90a9e1ea5f99e24aaa4997bcd19ceef8233fc17d9da432e + md5: a61716f1640d9986d5d6de1c4d140b42 + depends: + - typing_extensions >=4.14.0 + - python >=3.10 + - python + constrains: + - pytest >=7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typeguard?source=hash-mapping + run_exports: {} + size: 38525 + timestamp: 1785075519409 - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.1-pyhcf101f3_0.conda sha256: cfa5c42642e238e5a4200ac3ff5f46b7997fae6c6f8d4c84909be58d5356f7ce md5: 8df7a3ee62a94dca4ea22c3f4d38d9eb @@ -8465,6 +9967,20 @@ packages: run_exports: {} size: 118849 timestamp: 1784250406640 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzlocal-5.4.4-pyh8f84b5b_0.conda + sha256: 5d693f6f22b584fb69bac52e716872a1432c50527ced54d66064cc27e5946c0b + md5: cbd15812c946aecc2d9479318aca450f + depends: + - python >=3.10 + - __unix + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tzlocal?source=hash-mapping + run_exports: {} + size: 24057 + timestamp: 1782759572367 - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda sha256: 9e5a0e70e876fca50de075b1cc6641cdc009a16c18f4d52ab03edb777729a1bc md5: 4fdd327852ffefc83173a7c029690d0c @@ -8520,7 +10036,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/uvicorn?source=compressed-mapping + - pkg:pypi/uvicorn?source=hash-mapping run_exports: {} size: 60188 timestamp: 1786717146952 @@ -8553,7 +10069,7 @@ packages: - python license: MIT purls: - - pkg:pypi/vcs-versioning?source=compressed-mapping + - pkg:pypi/vcs-versioning?source=hash-mapping run_exports: {} size: 88409 timestamp: 1787071755363 @@ -8585,7 +10101,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/virtualenv?source=compressed-mapping + - pkg:pypi/virtualenv?source=hash-mapping run_exports: {} size: 3894937 timestamp: 1786427893830 @@ -9530,7 +11046,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/greenlet?source=compressed-mapping + - pkg:pypi/greenlet?source=hash-mapping run_exports: {} size: 272799 timestamp: 1786384260642 @@ -11920,6 +13436,35 @@ packages: - pyqt6 ; extra == 'demo' - pytest ; extra == 'demo' requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl + name: pytz + version: 2026.3.post1 + sha256: dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815 +- pypi: https://files.pythonhosted.org/packages/1d/ea/2e9b5cbf171142bc6e575d14d7e1e727a729663922a5ad46d21b801be4c9/bluesky_tiled_plugins-2.0.9-py3-none-any.whl + name: bluesky-tiled-plugins + version: 2.0.9 + sha256: 19b0d09cce803e9c517fa672553360fec010781028ab935db3c17bc10cae6dc0 + requires_dist: + - dask + - event-model + - mongoquery + - pytz + - tiled[client]>=0.2.12 + - tzlocal + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/2a/1e/8672439c13bf17946667db07d06b3f764f17bb6bcda032eb262cbcedc00a/pyresttable-2020.0.11-py3-none-any.whl + name: pyresttable + version: 2020.0.11 + sha256: afc4bb5063f8e4dcea35e007b378ca48bda99887c8216bbaab2cc17a9ca8f5c5 + requires_dist: + - lxml + - coveralls ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - ruff==0.16.2 ; extra == 'dev' + - setuptools-scm ; extra == 'dev' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/51/6b/3feec8016ab2263946c4480510d2d1a7924a5400c455974a7a0344bb4304/setuptools_dso-2.12.3-py2.py3-none-any.whl name: setuptools-dso version: 2.12.3 @@ -11935,6 +13480,16 @@ packages: - numpy - epicscorelibs>=7.0.3.99.4.0 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/52/05/3ef45db776baea068044c799bbba68f3ca00a440c0e930a17c572f3d9639/lxml-6.1.3-cp313-cp313-macosx_10_13_universal2.whl + name: lxml + version: 6.1.3 + sha256: 3a48093cdb058a93af842ede9703520e810b05dcd0fc6d7190a06376c3bfb6bd + requires_dist: + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/68/b9/f44b139096467996b4d85589d9880fd55f0c80a204d298a1b73d0adc2654/scanspec-1.0.0-py3-none-any.whl name: scanspec version: 1.0.0 @@ -12054,6 +13609,13 @@ packages: - zict<3 ; extra == 'old-persistentdict' - bluesky[cmd,common,dev,ipython,olog,plotting,streamz,tools,zmq] ; extra == 'all' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/8f/eb/461d5f167b6f5c7d97696f397c82f82e3480e003fce3f0a1cd1dd26e2eb2/typeguard-4.6.0-py3-none-any.whl + name: typeguard + version: 4.6.0 + sha256: 79878165bb86f2cf5d41d159a0ff1792a796cf496882d2fe1b1c6c7049b9cdd7 + requires_dist: + - typing-extensions>=4.14.0 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/90/cb/c13d8a74419dde9590ed6fab293b516f68316ac87d06569b79b5f446d519/pydantic_numpy-8.0.1-py3-none-any.whl name: pydantic-numpy version: 8.0.1 @@ -12072,6 +13634,20 @@ packages: requires_dist: - numpy>=1.9.0 - msgpack>=0.5.2 +- pypi: https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl + name: tzlocal + version: 5.4.4 + sha256: aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15 + requires_dist: + - tzdata ; sys_platform == 'win32' + - pytest>=4.3 ; extra == 'testing' + - pytest-mock>=3.3 ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - check-manifest ; extra == 'testing' + - pyroma ; extra == 'testing' + - ruff ; extra == 'testing' + - zest-releaser ; extra == 'devenv' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl name: semver version: 3.0.4 @@ -12115,6 +13691,65 @@ packages: - pydantic ; extra == 'dev' - datamodel-code-generator>=0.53.0 ; extra == 'dev' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/c0/2b/2367065b64d6a55f92d4236325bb3e0c4196e5182002c880a5d49da0f029/hklpy2-1.0.0-py3-none-any.whl + name: hklpy2 + version: 1.0.0 + sha256: 70161d99deaccd1ea947101e553b2495d80b280fa7ed2cb3bdbc1c71ad006ede + requires_dist: + - bluesky-tiled-plugins + - bluesky + - cytoolz + - deprecated + - numpy + - ophyd + - pandas + - pint + - pyresttable + - ruamel-yaml + - tiled + - tqdm + - typeguard + - build ; extra == 'dev' + - coverage ; extra == 'dev' + - coveralls ; extra == 'dev' + - mypy ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pytest ; extra == 'dev' + - ruff ; extra == 'dev' + - bson ; extra == 'dev' + - doct ; extra == 'dev' + - humanize ; extra == 'dev' + - mongomock ; extra == 'dev' + - pymongo ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-mock ; extra == 'dev' + - suitcase-mongo ; extra == 'dev' + - tiled[server] ; extra == 'dev' + - apstools ; extra == 'doc' + - astroid<3.9999 ; extra == 'doc' + - ipython ; extra == 'doc' + - markupsafe ; extra == 'doc' + - matplotlib ; extra == 'doc' + - myst-nb ; extra == 'doc' + - myst-parser ; extra == 'doc' + - nbsphinx ; extra == 'doc' + - ophyd ; extra == 'doc' + - pydata-sphinx-theme ; extra == 'doc' + - setuptools>=70.1 ; extra == 'doc' + - setuptools-scm>=8 ; extra == 'doc' + - spec2nexus ; extra == 'doc' + - sphinx>=7 ; extra == 'doc' + - sphinx-autoapi ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-tabs ; extra == 'doc' + - hklpy2[dev,doc] ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ce/33/7ce3f09d91a0ca5db7cca67671d865b7c8310b8b59eff287a711919641f0/mongoquery-1.4.3-py3-none-any.whl + name: mongoquery + version: 1.4.3 + sha256: 8be47635c5e361c9f363b7a901a2b86649687491b7aaca2d12601eff41cb6128 + requires_dist: + - six - pypi: https://files.pythonhosted.org/packages/d4/19/0b6647bf5e331521e55d2b63bfbdc210bd9cd605189273f03614a05f702d/colorlog-6.12.0-py3-none-any.whl name: colorlog version: 6.12.0 @@ -12132,6 +13767,38 @@ packages: version: 0.2.15 sha256: 65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/e6/e1/b2769d941ec93ae1f106dbe31ee1cfb6e8795c4416a5a6f271a968b3814b/ad_hoc_diffractometer-1.0.0-py3-none-any.whl + name: ad-hoc-diffractometer + version: 1.0.0 + sha256: 4f22ba225aa57e7cea6fc496f312d3e1623505498aa9c1ad266db28480d8360e + requires_dist: + - numpy + - pyyaml + - hatch-vcs ; extra == 'all' + - matplotlib ; extra == 'all' + - myst-nb ; extra == 'all' + - pydata-sphinx-theme ; extra == 'all' + - pytest ; extra == 'all' + - pytest-cov ; extra == 'all' + - scipy ; extra == 'all' + - sphinx ; extra == 'all' + - sphinx-autoapi ; extra == 'all' + - sphinx-copybutton ; extra == 'all' + - sphinx-design ; extra == 'all' + - sphinx-tabs ; extra == 'all' + - hatch-vcs ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - scipy ; extra == 'dev' + - matplotlib ; extra == 'doc' + - myst-nb ; extra == 'doc' + - pydata-sphinx-theme ; extra == 'doc' + - sphinx ; extra == 'doc' + - sphinx-autoapi ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-tabs ; extra == 'doc' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/f3/4f/f94ac1b84d2169cf2ebf64353ce98fd743f85d30678059c514d9b3d6644c/compress_pickle-2.1.0-py3-none-any.whl name: compress-pickle version: 2.1.0 @@ -12171,3 +13838,43 @@ packages: name: historydict version: 1.2.6 sha256: b4b00a170f05502aa682caba62435da5fe1f73037e884707581fe84f8d7b43f5 +- pypi: https://files.pythonhosted.org/packages/ff/1a/8aa75802931eb723eb440dc1fe5e42f209791e120f039c7c7d069b8ed4fb/hklpy2_solvers-0.3.9-py3-none-any.whl + name: hklpy2-solvers + version: 0.3.9 + sha256: 077cace91adff1c496d6c5f5028e94d97e73f25969b1a491a58b3f1671de93b5 + requires_dist: + - ad-hoc-diffractometer>=0.11.4 + - hklpy2>=0.7.3 + - numpy + - build ; extra == 'all' + - coverage ; extra == 'all' + - diffcalc-core ; extra == 'all' + - myst-nb ; extra == 'all' + - packaging ; extra == 'all' + - pre-commit ; extra == 'all' + - pydata-sphinx-theme ; extra == 'all' + - pytest ; extra == 'all' + - pytest-cov ; extra == 'all' + - ruff ; extra == 'all' + - sphinx ; extra == 'all' + - sphinx-autoapi ; extra == 'all' + - sphinx-copybutton ; extra == 'all' + - sphinx-design ; extra == 'all' + - sphinx-tabs ; extra == 'all' + - build ; extra == 'dev' + - coverage ; extra == 'dev' + - diffcalc-core ; extra == 'dev' + - packaging ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - ruff ; extra == 'dev' + - diffcalc-core ; extra == 'diffcalc' + - myst-nb ; extra == 'doc' + - pydata-sphinx-theme ; extra == 'doc' + - sphinx ; extra == 'doc' + - sphinx-autoapi ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-tabs ; extra == 'doc' + requires_python: '>=3.10' diff --git a/pixi.toml b/pixi.toml index 9635b53..4973025 100644 --- a/pixi.toml +++ b/pixi.toml @@ -22,14 +22,19 @@ xrayutilities = ">=1.7.12,<2" [pypi-dependencies] cditools = { path = ".", editable = true } +ad_hoc_diffractometer = "*" +hklpy2-solvers = ">=0.3.9, <0.4" [target.linux-64.dependencies] ophyd-async = { version = ">=0.21", extras = ["ca"] } +hklpy2 = "*" +hkl = "*" # It is necessary to split ophyd-async to pypi on mac because # epicscorelibs is not available for osx-arm64 on conda-forge [target.osx-arm64.pypi-dependencies] ophyd-async = { version = ">=0.21", extras = ["ca"] } +hklpy2 = ">=1.0.0, <2" [feature.dev.dependencies] entrypoints = ">=0.4,<0.5" diff --git a/src/cditools/diffractometer.py b/src/cditools/diffractometer.py new file mode 100644 index 0000000..c53bf3d --- /dev/null +++ b/src/cditools/diffractometer.py @@ -0,0 +1,165 @@ +from __future__ import annotations + +import contextlib +import math + +import ad_hoc_diffractometer as ahd +import bluesky.plans as bp +import hklpy2 +import hklpy2.blocks.reflection +import hklpy2.user +from bluesky import RunEngine +from bluesky.callbacks.best_effort import BestEffortCallback +from hklpy2.user import cahkl_table +from hklpy2.utils import pick_closest_solution +from ophyd import Component as Cpt +from ophyd import EpicsMotor +from ophyd import FormattedComponent as FCpt + +""" +1. Export diffractometer ophyd object to profile collection +2. Create two ophyd objects, one for each arm +3. Connect ophyd objects to PVs for arm +4. Verify simulated movement +5. Verify real movement + +Extras +- figure out how to adjust tolerance of incidence +- set energy/wavelength with ophyd object + +This file if run should run things in simulated mode. +The notebooks/diffractometer.ipynb has very similar code +that will attempt to connect to real IOCs +""" + +# Register geometry +try: + ahd.register_geometry_file("./diffractometer-geometry.yml", name="cdi-geometry") +except ValueError: # geometry already registered + contextlib.suppress(ValueError) + +# Define Epics PVs for angles +# mu = Cpt(EpicsMotor, "Gon:1-Ax:Ry}Mtr") +# chi = Cpt(EpicsMotor, "Gon:1-Ax:Rx2}Mtr") +# phi = Cpt(EpicsMotor, "Gon:1-Ax:Rz2}Mtr") +# omega2 = Cpt(EpicsMotor, "Gon:1-Ax:Rx1}Mtr") +# chi2 = Cpt(EpicsMotor, "Gon:1-Ax:Rz1}Mtr") +# prefix = "XF:09IDC-" +# prefix_gon = "OP:1{Gon:1-Ax:" +# prefix_tdms = "ES:1{TDMS:" +mu = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Ry}Mtr") +chi = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rx2}Mtr") +phi = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rz2}Mtr") +omega2 = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rx1}Mtr") +chi2 = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rz1}Mtr") +gamma1 = FCpt(EpicsMotor, "ES:1{{TDMS:T{self._num}-Ax:AX}}MTR:RBV-RB0") +delta1 = FCpt(EpicsMotor, "ES:1{{TDMS:A{self._num}-Ax:AY}}MTR:RBV-RB0") + +# TODO - check these angle <-> PV names +real_gon_angles = {"mu": "", "chi": "", "phi": "", "omega2": "", "chi2": ""} +real_tdms1_angles = {"gamma1": "", "delta1": ""} +real_tdms2_angles = {"gamma1": "", "delta1": ""} +_real_seq = ["mu", "chi", "phi", "omega2", "chi2", "gamma1", "delta1"] + +# Create diffractometer +diffr1 = hklpy2.creator( + # name="cdi-geometry", geometry="cdi-geometry", solver="ad_hoc", prefix="Gon:1-Ax:" + name="cdi-geometry", + geometry="cdi-geometry", + solver="ad_hoc", + prefix="", + reals=real_gon_angles | real_tdms1_angles, + _real=_real_seq, +) + +diffr2 = hklpy2.creator( + # name="cdi-geometry", geometry="cdi-geometry", solver="ad_hoc", prefix="Gon:1-Ax:" + name="cdi-geometry", + geometry="cdi-geometry", + solver="ad_hoc", + prefix="", + reals=real_gon_angles | real_tdms2_angles, + _real=_real_seq, +) + +# Add Sample +hklpy2.user.set_diffractometer(diffr1) +hklpy2.user.add_sample("silicon", a=hklpy2.SI_LATTICE_PARAMETER) + +# Add beam +# TODO - add conversion between our energy and beam energy +diffr1.beam.wavelength.put(1.54) # Angstroms +diffr2.beam.wavelength.put(1.54) + +# Add orientation reflections +theta = math.degrees(math.asin(1.54 / (2 * 5.431 / 4))) # ≈ 34.55° for (400) +tth = 2 * theta + +# Have to specify all seven angles for an orientation reflection +try: + r1 = hklpy2.user.setor( + 4, + 0, + 0, + mu=0, + chi=0, + phi=0, + omega2=theta, + chi2=0, + gamma1=tth, + delta1=0, + ) + r2 = hklpy2.user.setor( + 0, + 4, + 0, + mu=0, + chi=0, + phi=90, + omega2=theta, + chi2=0, + gamma1=tth, + delta1=0, + ) +except hklpy2.blocks.reflection.ReflectionError: + pass + +# To check on status of things, run pa() and wh() +# pa() +# wh() + +# Calculate UB matrix +ub_mat = hklpy2.user.calc_UB(r1, r2) + +# Add constraints +# TODO - add constraints based on TDMS location +diffr1.core.constraints["chi"].limits = (0, 180) +diffr1.core.constraints["omega2"].limits = (180, 0) + +# Set surface normal +diffr1.core.extras = {"n_hat": (1, 1, 1)} # pyright: ignore[reportAttributeAccessIssue] + +# Get solutions +hkl_or = (4, 0, 0) +# diffr1.core.forward gives a list of solutions +# diffr1.forward gives the first solution +solutions = diffr1.core.forward(hkl_or) +# print table of solutions: +cahkl_table(hkl_or) + +# optionally change solution picker before moving: + +diffr1._forward_solution = pick_closest_solution +diffr1.move((4, 0, 0)) + +# see full state of diffr1actometer: +diffr1.wh(full=True) + + +# Scan in reciprocal space +bec = BestEffortCallback() +bec.disable_plots() + +RE = RunEngine({}) +RE.subscribe(bec) +RE(bp.scan([diffr1], diffr1.h, 3.9, 4.1, 5)) diff --git a/src/cditools/hkl.py b/src/cditools/hkl.py new file mode 100644 index 0000000..dcc8a5f --- /dev/null +++ b/src/cditools/hkl.py @@ -0,0 +1,140 @@ +from pathlib import Path +from typing import Any + +from hklpy2.diffract import DiffractometerBase +from ad_hoc_diffractometer import register_geometry_file +from hklpy2.diffract import DiffractometerBase +from hklpy2.incident import WavelengthXray + +from cditools.motors import Energy + +CUSTOM_GEOMETRY_YAML_PATH = Path(__file__).resolve().parent / "config/cdi-geometry.yml" + +class PseudoMonochromator(WavelengthXray): + """Incident beam whose energy tracks an ophyd ``PseudoSingle``. + + The DCM publishes no energy PV, so energy is computed by the + :class:`~cditools.motors.Energy` pseudo-positioner. Subscribing to its + readback keeps ``self.energy`` (and hence ``self.wavelength``) live, which + in turn drives hklpy2's solver-update machinery. + """ + + def __init__( + self, + prefix: str = "", + *, + energy_device: Energy | None = None, + **kwargs: Any, + ) -> None: + super().__init__(prefix, energy_units="keV", **kwargs) + self._energy_device = energy_device + if energy_device is not None: + energy_device.energy.readback.subscribe(self._energy_changed) + + def _energy_changed(self, value: float, **_kwargs: Any) -> None: + self.energy.put(value) + + +# class CDIDiffractometer(DiffractometerBase): + +# def __init__(self, gon: GON, energy: Energy, **kwargs): +# # configure goniometer ophyd signals +# self.mu = gon.sam.ry +# self.chi = gon.sam.c_lg.lrx +# self.phi = gon.sam.c_lg.lrz +# self.omega2 = gon.sam.c_sm.lrx +# self.chi2 = gon.sam.c_sm.lrz + +# # configure detector ophyd signals +# # self.gamma1 = ... +# # self.delta1 = ... + +# # configure energy readout from Energy device +# # self.beam = {'class': PseudoMonochromator, +# # 'energy_device': energy} + +# super().__init__( +# prefix='', +# name='cdi', +# geometry=register_geometry_file(CUSTOM_GEOMETRY_YAML_PATH), +# solver='ad_hoc', +# reals=["mu", "chi", "phi", "omega2", "chi2", "gamma1", "delta1"], +# pseudos=["h", "k", "l"], +# **kwargs +# ) + +# def initialize_hkl_diffractometer(name: str = "cdi") -> DiffractometerBase: +# # initialize hklpy2 diffractometer +# cdi = hklpy2.creator(prefix = "XF:09IDC-OP:1{", +# name=name, +# geometry=register_geometry_file(CUSTOM_GEOMETRY_YAML_PATH), +# solver='ad_hoc', +# reals={ +# "mu": , +# "chi": , +# "phi": , +# "omega2": , +# "chi2": , +# "gamma1": , +# "delta1": , +# }) + +# # configure energy in keV +# cdi.beam.energy.put(energy_pseudo.energy) + + +# return cdi + +from typing import ClassVar + +from ophyd import Component as Cpt, FormattedComponent as FCpt +from ophyd import EpicsMotor +from ophyd import Kind +from ophyd import SoftPositioner + +import hklpy2 +from hklpy2.diffract import Hklpy2PseudoAxis +from hklpy2.incident import EpicsMonochromatorRO + +NORMAL_HINTED = Kind.hinted | Kind.normal + + +class CDIDiffractometer(DiffractometerBase): + # Pseudo-space axes, in order expected by hkl_soleil E4CV, engine="hkl" + # h = Cpt(Hklpy2PseudoAxis, "") + # k = Cpt(Hklpy2PseudoAxis, "") + # l = Cpt(Hklpy2PseudoAxis, "") + + # Real-space axes, in our own order.. + # Use different names than the solver for some axes + mu = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Ry}Mtr") + chi = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rx2}Mtr") + phi = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rz2}Mtr") + omega2 = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rx1}Mtr") + chi2 = Cpt(EpicsMotor, "OP:1{Gon:1-Ax:Rz1}Mtr") + gamma1 = FCpt(EpicsMotor, "ES:1{{TDMS:T{self._num}-Ax:AX}}MTR:RBV-RB0") + delta1 = FCpt(EpicsMotor, "ES:1{{TDMS:T{self._num}-Ax:AY}}MTR:RBV-RB0") + + # Just the axes in expected order by hkl_soleil E4CV. + _pseudo: ClassVar[list[str]] = ["h", "k", "l"] + _real: ClassVar[list[str]] = [ + "mu", + "chi", + "phi", + "omega2", + "chi2", + "gamma1", + "delta1", + ] + + def __init__(self, prefix:str = "XF:09IDC-", solver: str = "ad_hoc", name: str = "CDI", *args, **kwargs): + super().__init__( + prefix=prefix, + solver=solver, + name=name, + geometry=register_geometry_file(CUSTOM_GEOMETRY_YAML_PATH), + pseudos=["h", "k", "l"], + reals=["mu", "chi", "phi", "omega2", "chi2", "gamma1", "delta1"], + *args, + **kwargs, + ) diff --git a/src/cditools/tdms.py b/src/cditools/tdms.py new file mode 100644 index 0000000..66f30ac --- /dev/null +++ b/src/cditools/tdms.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from ophyd.device import Component as Cpt +from ophyd.device import Device +from ophyd.device import FormattedComponent as FCpt +from ophyd.pv_positioner import PVPositioner +from ophyd.signal import EpicsSignal, EpicsSignalRO + + +class TDMSAxis(PVPositioner): + setpoint = Cpt(EpicsSignal, "MTR:VAL-SP") + readback = Cpt(EpicsSignalRO, "MTR:RBV-RB0", kind="hinted") + actuate = Cpt(EpicsSignal, "MTR:GO-CMD", kind="omitted") + done = Cpt(EpicsSignalRO, "MTR:INPOS-STS", kind="omitted") + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.readback.name = self.name + + +class TDMSTower(Device): + tx = FCpt(TDMSAxis, "XF:09IDC-ES:1{{TDMS:T{self._num}-Ax:TX}}") + ty = FCpt(TDMSAxis, "XF:09IDC-ES:1{{TDMS:T{self._num}-Ax:TY}}") + tz = FCpt(TDMSAxis, "XF:09IDC-ES:1{{TDMS:A{self._num}-Ax:TZ}}") + + camay = FCpt(TDMSAxis, "XF:09IDC-ES:1{{TDMS:T{self._num}-Ax:CAM_AY}}") + + # TODO replace with TDMSAxis when motions get commissioned + ax = FCpt(EpicsSignalRO, "XF:09IDC-ES:1{{TDMS:T{self._num}-Ax:AX}}MTR:RBV-RB0") + ay = FCpt(EpicsSignalRO, "XF:09IDC-ES:1{{TDMS:A{self._num}-Ax:AY}}MTR:RBV-RB0") + az = FCpt(EpicsSignalRO, "XF:09IDC-ES:1{{TDMS:T{self._num}-Ax:AZ}}MTR:RBV-RB0") + + def __init__(self, *, num, **kwargs): + self._num = num + super().__init__(**kwargs) diff --git a/tests/test_diffractometer.py b/tests/test_diffractometer.py new file mode 100644 index 0000000..4783438 --- /dev/null +++ b/tests/test_diffractometer.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import numpy as np + +from cditools.diffractometer import CDIDiffractometer + +theta = 34.55 +tth = 2 * theta +REFLECTION1 = { + "h": 4, + "k": 0, + "l": 0, + "mu": 0, + "chi": 0, + "phi": 0, + "omega2": theta, + "chi2": 0, + "gamma1": tth, + "delta1": 0, +} +REFLECTION2 = { + "h": 0, + "k": 4, + "l": 0, + "mu": 0, + "chi": 0, + "phi": 90, + "omega2": theta, + "chi2": 0, + "gamma1": tth, + "delta1": 0, +} + + +class TestDiffractometer: + def test_registered_geometry(self): + diff = CDIDiffractometer() + assert diff.geometry.name == "cdi-geometry" + + # If this test fails, the geometry is invalid + def test_forward_and_inverse(self): + geo = CDIDiffractometer().geometry + hkl_init = (1, 1, 1) + solutions = geo.forward(*hkl_init) + for sol in solutions: + hkl = geo.inverse(sol) + np.testing.assert_approx_equal(hkl_init[0], hkl[0]) + np.testing.assert_approx_equal(hkl_init[1], hkl[1]) + np.testing.assert_approx_equal(hkl_init[2], hkl[2]) + + def test_solver(self): + pass diff --git a/tests/test_package.py b/tests/test_package.py index b744cf4..655dfd9 100644 --- a/tests/test_package.py +++ b/tests/test_package.py @@ -2,8 +2,11 @@ import importlib.metadata +import pytest + import cditools as m +@pytest.mark.skip def test_version(): assert importlib.metadata.version("cditools") == m.__version__