1053 lines (1052 with data), 170.6 kB
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Effective Dimension of Qiskit Neural Networks\n",
"In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
"\n",
"Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## 1. Global vs. Local Effective Dimension\n",
"Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
"\n",
"Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
"\n",
"The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. The Effective Dimension Algorithm\n",
"\n",
"Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
"\n",
"In particular, this algorithm follows 4 main steps:\n",
"\n",
"1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
"2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
"3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
"4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## 3. Basic Example (SamplerQNN)\n",
"\n",
"This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
"\n",
"We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_3937/2968235742.py:6: DeprecationWarning: ``qiskit.algorithms`` has been migrated to an independent package: https://github.com/qiskit-community/qiskit-algorithms. The ``qiskit.algorithms`` import path is deprecated as of qiskit-terra 0.25.0 and will be removed no earlier than 3 months after the release date. Please run ``pip install qiskit_algorithms`` and use ``import qiskit_algorithms`` instead.\n",
" from qiskit.algorithms.optimizers import COBYLA\n"
]
}
],
"source": [
"# Necessary imports\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from IPython.display import clear_output\n",
"from qiskit import QuantumCircuit\n",
"from qiskit.algorithms.optimizers import COBYLA\n",
"from qiskit.circuit.library import ZFeatureMap, RealAmplitudes, ZZFeatureMap\n",
"from qiskit.utils import algorithm_globals\n",
"from sklearn.datasets import make_classification\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"\n",
"from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
"from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
"from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
"\n",
"# set random seed\n",
"algorithm_globals.random_seed = 42"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
},
"slideshow": {
"slide_type": "skip"
}
},
"source": [
"### 3.1 Define QNN\n",
"\n",
"The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits, and we will define the circuit used in the `SamplerQNN` class."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 621.941x284.278 with 1 Axes>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"num_qubits = 3\n",
"# create a feature map\n",
"feature_map = ZZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
"# create a variational circuit\n",
"ansatz = RealAmplitudes(num_qubits, reps=1)\n",
"\n",
"# combine feature map and ansatz into a single circuit\n",
"qc = QuantumCircuit(num_qubits)\n",
"qc.append(feature_map, range(num_qubits))\n",
"qc.append(ansatz, range(num_qubits))\n",
"qc.decompose().draw(\"mpl\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# parity maps bitstrings to 0 or 1\n",
"def parity(x):\n",
" return \"{:b}\".format(x).count(\"1\") % 2\n",
"\n",
"\n",
"output_shape = 2 # corresponds to the number of classes, possible outcomes of the (parity) mapping."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# construct QNN\n",
"qnn = SamplerQNN(\n",
" circuit=qc,\n",
" input_params=feature_map.parameters,\n",
" weight_params=ansatz.parameters,\n",
" interpret=parity,\n",
" output_shape=output_shape,\n",
" sparse=False,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 Set up Effective Dimension calculation\n",
"\n",
"In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# we can set the total number of input samples and weight samples for random selection\n",
"num_input_samples = 10\n",
"num_weight_samples = 10\n",
"\n",
"global_ed = EffectiveDimension(\n",
" qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# we can also provide user-defined samples and parameters\n",
"input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
"weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
"\n",
"global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# finally, we will define ranges to test different numbers of data, n\n",
"n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3 Compute Global Effective Dimension\n",
"Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data size: 5000, global effective dimension: 5.2939\n",
"Number of weights: 6, normalized effective dimension: 0.8823\n"
]
}
],
"source": [
"d = qnn.num_weights\n",
"\n",
"print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
"print(\n",
" \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Effective dimension: [5.29390229 5.33597126 5.35545289 5.46354885 5.49042841 5.52135717\n",
" 5.54374079 5.55854944 5.60045031 5.62756494]\n",
"Number of weights: 6\n"
]
}
],
"source": [
"print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
"print(\"Number of weights: {}\".format(d))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"image/png": "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+sEEzgEiIo3NnTsXW7duxZEjR9TamzZtivT0dLUkSJu1e/7++2/Vz2VlZYiPj1f9X1+XLl1w9uxZuLm5oXXr1movMUmPtbU1nJ2dcejQIbX2Q4cOPbZH5lHu7u4wMzPD0aNHVW137txR/ZIGyid137p1C3PnzkWfPn3g6elZqder4ik1hUKhart16xaSkpIQGRmJ559/Hu3atcOdO3c0jo3I0PLz83Hy5EnV74crV67g5MmTSElJQdu2bTF8+HAEBwcjNjYWV65cwbFjxxAdHY3t27cDKH8oo0uXLnj33XeRkJCA+Ph4fPDBB3jhhRfUeoU0wQSIiDTWqVMnDB8+HN9++61a+7PPPousrCx88cUXuHz5MhYvXow///xTa9+7ePFibNq0CYmJiQgLC8OdO3fw7rvvAgDCwsJw+/ZtvP322/jnn39w+fJl7Ny5E6GhoWrJgyYmTpyIefPmYf369UhKSkJERAROnjyJ8ePHa3wMS0tLvPfee5g4cSL27NmDf//9FyNHjlQb+mvevDnMzc2xcOFCJCcn4/fff8esWbPUjtOiRQtIJBJs27YNWVlZyM/PR6NGjdCkSRN8//33uHTpEvbs2YPw8HBR50hkSMePH4ePjw98fHwAAOHh4fDx8cH06dMBAMuXL0dwcDA++eQTeHh4YODAgfjnn3/QvHlzAOW9zVu3boWdnR369u2LV155Be3atcO6devEB6OFeUxEVE89PAm6wpUrVwRzc3Ph0V8fS5YsEVxdXYWGDRsKwcHBwuzZsytNgn70WP369as0MbhFixbCN998o/ouAMKaNWsEX19fwdzcXGjfvr2wZ88etX0uXLggDBo0SLC1tRXkcrng6ekpTJgwQVAqldV+T1UUCoUwY8YMwcXFRTAzMxO8vLyEP//8U22bJ02CFoTyidDvvPOO0KBBA8HBwUH44osvKsWwZs0awc3NTbCwsBB69Ogh/P777wIAISEhQbXNzJkzBUdHR0EikQghISGCIAjC7t27hXbt2gkWFhZC586dhX379lWaTEpETyYRhEcG7omIiIjqOQ6BERERkdFhAkRERERGhwkQERERGR0mQERERGR0mAARERGR0WECREREREaHCRAREREZHSZAREREZHSYABEREZHRYQJERERERocJEBERERkdJkBERERkdP4fzksyO9XWIyMAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot the normalized effective dimension for the model\n",
"plt.plot(n, np.array(global_eff_dim_1) / d)\n",
"plt.xlabel(\"Number of data\")\n",
"plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## 4. Local Effective Dimension Example\n",
"As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
"\n",
"This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.1 Define Dataset and QNN\n",
"\n",
"We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"num_inputs = 3\n",
"num_samples = 50\n",
"\n",
"X, y = make_classification(\n",
" n_samples=num_samples,\n",
" n_features=num_inputs,\n",
" n_informative=3,\n",
" n_redundant=0,\n",
" n_clusters_per_class=1,\n",
" class_sep=2.0,\n",
")\n",
"X = MinMaxScaler().fit_transform(X)\n",
"y = 2 * y - 1 # labels in {-1, 1}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"estimator_qnn = EstimatorQNN(\n",
" circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.2 Train QNN\n",
"\n",
"We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# callback function that draws a live plot when the .fit() method is called\n",
"def callback_graph(weights, obj_func_eval):\n",
" clear_output(wait=True)\n",
" objective_func_vals.append(obj_func_eval)\n",
" plt.title(\"Objective function value against iteration\")\n",
" plt.xlabel(\"Iteration\")\n",
" plt.ylabel(\"Objective function value\")\n",
" plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"# construct classifier\n",
"initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
"\n",
"estimator_classifier = NeuralNetworkClassifier(\n",
" neural_network=estimator_qnn,\n",
" optimizer=COBYLA(maxiter=80),\n",
" initial_point=initial_point,\n",
" callback=callback_graph,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAIjCAYAAAB/OVoZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACO+ElEQVR4nOzdd3xT9f7H8XfSNuneUCirbAQVEIGLioiiiDgQB3q9V0S5jh9eURwXrhO8itct96JcJ7hxoF6vW4Y4ULao7I3sUrrbpE3O7480adNF0qZN2r6ej0ceTU5OTr7JSZRPPp/v52syDMMQAAAAAAAIOnOwBwAAAAAAAFwI0gEAAAAACBEE6QAAAAAAhAiCdAAAAAAAQgRBOgAAAAAAIYIgHQAAAACAEEGQDgAAAABAiCBIBwAAAAAgRBCkAwAAAAAQIgjSAaCJeuCBB2QymZSZmXnMfTMyMnTNNdc0/KAqmTt3rkwmk3bu3Nnoz71ixQqdcsopiomJkclk0tq1axt9DL4I1rkJtGCe62AymUx64IEHgj0MSU3zHLj/OwYAKEeQDgAh5LffftOf/vQntWvXTlarVenp6brqqqv022+/BXtotXr44Yf14YcfBnsYHiUlJbrsssuUlZWlp556Sq+99po6deoUtPH88MMPeuCBB5SdnR20MaDp2bdvnx544IF6/cD07LPPau7cuQEbU10UFhbqgQce0JIlS4I6DgBoKkyGYRjBHgQAQFqwYIGuvPJKJScn67rrrlPnzp21c+dOvfTSSzpy5IjefvttXXzxxZ79H3jgAU2fPl2HDx9Wampqrce22Wwym82KiIhokLHHxsbq0ksvrRIMOBwOlZSUyGq1Nmq2bOPGjTruuOP0wgsvaOLEiY32vDV5/PHHdeedd2rHjh3KyMjwuq+hz01jmTt3riZMmFDta2zOiouLFR4ervDw8IAfe+XKlRo4cKBeeeUVn6otqvu+HX/88UpNTQ1qgJyZmalWrVrp/vvvr1J1UFpaqtLSUkVGRgZncAAQggL/fxQAgN+2bdumP//5z+rSpYuWLl2qVq1aee6bPHmyhg4dqj//+c9at26dunTp4vfxrVZrIIfrs7CwMIWFhTX68x46dEiSlJiY2OjP7a9gnRsERigFl431fSstLZXT6ZTFYqn3sRrqBw4AaMoodweAEPDYY4+psLBQzz//vFeALkmpqan6z3/+o4KCAj366KNVHpuZmanLL79c8fHxSklJ0eTJk1VcXOy1T3XznrOzs3XrrbeqQ4cOslqt6tatm/75z3/K6XR67ed0OvXMM8/ohBNOUGRkpFq1aqVzzz1XK1eulOSak1tQUKB58+bJZDLJZDJ5nqvyHNnzzz+/xh8ZhgwZopNPPtlr2+uvv64BAwYoKipKycnJuuKKK7Rnz55a38trrrlGw4YNkyRddtllMplMOuOMMyRJZ5xxhud65cdUzP7u3LlTJpNJjz/+uJ5//nl17dpVVqtVAwcO1IoVK6o8fuPGjbr88svVqlUrRUVFqWfPnrr77rsluSoe7rzzTklS586dPe+R+z2p7txs375dl112mZKTkxUdHa0//OEP+uSTT7z2WbJkiUwmk9555x099NBDat++vSIjI3XWWWdp69attb5H7733nkwmk7755psq9/3nP/+RyWTSr7/+Kklat26drrnmGnXp0kWRkZFq06aNrr32Wh05cqTW55Bqnq9dn89jdT766CONHj1a6enpslqt6tq1qx588EE5HI4q+86ePVtdunRRVFSUBg0apG+//bbK58Jut+u+++7TgAEDlJCQoJiYGA0dOlSLFy8+5mt0z7HeunWrrrnmGiUmJiohIUETJkxQYWGh12O/+uornXbaaUpMTFRsbKx69uypv//975Jc53fgwIGSpAkTJng+N7WVrlf+vmVkZOi3337TN99843l8xdfpy3te8bvw9NNPe74L69ev9+l92rlzp+e/adOnT/eMw/2eVTcnvbS0VA8++KDnuTIyMvT3v/9dNpvNa7+MjAydf/75+u677zRo0CBFRkaqS5cuevXVV2t8jwCgKeCnSwAIAR9//LEyMjI0dOjQau8//fTTlZGRUSVQk6TLL79cGRkZmjlzpn788UfNmjVLR48erfUfqoWFhRo2bJj27t2rG264QR07dtQPP/ygadOmaf/+/Xr66ac9+1533XWaO3euRo0apYkTJ6q0tFTffvutfvzxR5188sl67bXXNHHiRA0aNEjXX3+9JKlr167VPu+4ceN09dVXa8WKFZ4ARJJ27dqlH3/8UY899phn20MPPaR7771Xl19+uSZOnKjDhw/rX//6l04//XStWbOmxiz5DTfcoHbt2unhhx/WLbfcooEDByotLa3G96I2b775pvLy8nTDDTfIZDLp0Ucf1dixY7V9+3ZPefq6des0dOhQRURE6Prrr1dGRoa2bdumjz/+WA899JDGjh2rzZs366233tJTTz3lmZpQ+ccYt4MHD+qUU05RYWGhbrnlFqWkpGjevHm68MIL9d5773lNeZCkRx55RGazWXfccYdycnL06KOP6qqrrtJPP/1U4+saPXq0YmNj9c4773h+0HCbP3+++vTpo+OPP16SK5Dcvn27JkyYoDZt2ui3337T888/r99++00//vhjQKYx+PN5rM7cuXMVGxurKVOmKDY2VosWLdJ9992n3Nxcr8/Uc889p5tvvllDhw7Vbbfdpp07d2rMmDFKSkpS+/btPfvl5ubqxRdf1JVXXqm//OUvysvL00svvaSRI0dq+fLl6tev3zFf0+WXX67OnTtr5syZWr16tV588UW1bt1a//znPyW5+k+cf/75OvHEEzVjxgxZrVZt3bpV33//vSTpuOOO04wZM3Tffffp+uuv9/y34ZRTTvH5fX366af117/+VbGxsZ4fjdzfBX/f81deeUXFxcW6/vrrZbValZyc7NP71KpVKz333HO66aabdPHFF2vs2LGSpBNPPLHGcU+cOFHz5s3TpZdeqttvv10//fSTZs6cqQ0bNuiDDz7w2nfr1q269NJLdd1112n8+PF6+eWXdc0112jAgAHq06ePz+8VAIQUAwAQVNnZ2YYk46KLLqp1vwsvvNCQZOTm5hqGYRj333+/Icm48MILvfb7v//7P0OS8fPPP3u2derUyRg/frzn9oMPPmjExMQYmzdv9nrs1KlTjbCwMGP37t2GYRjGokWLDEnGLbfcUmU8TqfTcz0mJsbr+G6vvPKKIcnYsWOHYRiGkZOTY1itVuP222/32u/RRx81TCaTsWvXLsMwDGPnzp1GWFiY8dBDD3nt98svvxjh4eFVtle2ePFiQ5Lx7rvvem0fNmyYMWzYsCr7jx8/3ujUqZPn9o4dOwxJRkpKipGVleXZ/tFHHxmSjI8//tiz7fTTTzfi4uI8Y3er+P489thjXu9DRZXPza233mpIMr799lvPtry8PKNz585GRkaG4XA4vF7jcccdZ9hsNs++zzzzjCHJ+OWXX6p/c8pceeWVRuvWrY3S0lLPtv379xtms9mYMWOGZ1thYWGVx7711luGJGPp0qWebZXPtWEYhiTj/vvvP+Zr9vXzWJPq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Wp0RI0YoOTlZ8+fP1/z58zVo0CCvH3zcWcrK5+BY3dbdunbtWmVu8/PPP18lk+7r57E61Y3Rbrfr2Wef9drv5JNPVkpKil544QWv473xxhtVSqOrO+ZPP/3kdU7qKysrq8o2d9d491Jj/nxualLTd7M+77mbr+9TdHS057jHct5550mq+hl78sknJblWJgCA5o5MOgCEgO7du2vevHm66qqrdMIJJ+i6665T586dtXPnTr300kvKzMzUW2+9Ve3SZjt27NCFF16oc889V8uWLdPrr7+uP/7xj+rbt2+Nz3fnnXfqv//9r84//3zPckUFBQX65Zdf9N5772nnzp1KTU3V8OHD9ec//1mzZs3Sli1bPCXO3377rYYPH66bb75ZkjRgwAB9/fXXevLJJ5Wenq7OnTtXO6/a7bzzzlNcXJzuuOMOhYWF6ZJLLvG6v2vXrvrHP/6hadOmeZbJiouL044dO/TBBx/o+uuv1x133OH3+3zttdfqySef1MiRI3Xdddfp0KFDmjNnjvr06VNlLrOvZs2apdNOO00nnXSSrr/+es95++STT7R27VpJrvdHku6++25dccUVioiI0AUXXOAJwiqaOnWq3nrrLY0aNUq33HKLkpOTNW/ePO3YsUPvv/9+QOcrR0REaOzYsXr77bdVUFCgxx9/3Ov++Ph4nX766Xr00UdVUlKidu3a6csvv6ySpa7JxIkTdeONN+qSSy7R2WefrZ9//llffPGFZxk6N18/j9U55ZRTlJSUpPHjx+uWW26RyWTSa6+9VuWHBYvFogceeEB//etfdeaZZ+ryyy/Xzp07NXfuXHXt2tUr23v++edrwYIFuvjiizV69Gjt2LFDc+bMUe/evZWfn+/Taz+WGTNmaOnSpRo9erQ6deqkQ4cO6dlnn1X79u091TRdu3ZVYmKi5syZo7i4OMXExGjw4MF+zfceMGCAnnvuOf3jH/9Qt27d1Lp1a5155pn1es/dfH2foqKi1Lt3b82fP189evRQcnKyjj/++Gp7OfTt21fjx4/X888/75nKsHz5cs2bN09jxozxqoIAgGarkbvJAwBqsW7dOuPKK6802rZta0RERBht2rQxrrzyymqX03IvXbR+/Xrj0ksvNeLi4oykpCTj5ptvNoqKirz2rbzklWG4lvWaNm2a0a1bN8NisRipqanGKaecYjz++OOG3W73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H3xQFfulh/r3iiA9BM2fP19TpkzR/fffr9WrV6tv374aOXKkDh06FOyhtWgFBQXq27evZs+eXe39jz76qGbNmqU5c+bop59+UkxMjEaOHKni4uJGHim++eYbTZo0ST/++KO++uorlZSU6JxzzlFBQYFnn9tuu00ff/yx3n33XX3zzTfat2+fxo4dG8RRt0zt27fXI488olWrVmnlypU688wzddFFF+m3336TxHkKVStWrNB//vMfnXjiiV7bOV+ho0+fPtq/f7/n8t1333nu4zyFjqNHj+rUU09VRESEPvvsM61fv15PPPGEkpKSPPvw74vQsGLFCq/v1FdffSVJuuyyyyTxvQol//znP/Xcc8/p3//+tzZs2KB//vOfevTRR/Wvf/3Ls0/If68MhJxBgwYZkyZN8tx2OBxGenq6MXPmzCCOChVJMj744APPbafTabRp08Z47LHHPNuys7MNq9VqvPXWW0EYISo6dOiQIcn45ptvDMNwnZuIiAjj3Xff9eyzYcMGQ5KxbNmyYA0TZZKSkowXX3yR8xSi8vLyjO7duxtfffWVMWzYMGPy5MmGYfC9CiX333+/0bdv32rv4zyFlr/97W/GaaedVuP9/PsidE2ePNno2rWr4XQ6+V6FmNGjRxvXXnut17axY8caV111lWEYTeN7RSY9xNjtdq1atUojRozwbDObzRoxYoSWLVsWxJGhNjt27NCBAwe8zltCQoIGDx7MeQsBOTk5kqTk5GRJ0qpVq1RSUuJ1vnr16qWOHTtyvoLI4XDo7bffVkFBgYYMGcJ5ClGTJk3S6NGjvc6LxPcq1GzZskXp6enq0qWLrrrqKu3evVsS5ynU/Pe//9XJJ5+syy67TK1bt1b//v31wgsveO7n3xehyW636/XXX9e1114rk8nE9yrEnHLKKVq4cKE2b94sSfr555/13XffadSoUZKaxvcqPNgDgLfMzEw5HA6lpaV5bU9LS9PGjRuDNCocy4EDBySp2vPmvg/B4XQ6deutt+rUU0/V8ccfL8l1viwWixITE7325XwFxy+//KIhQ4aouLhYsbGx+uCDD9S7d2+tXbuW8xRi3n77ba1evVorVqyoch/fq9AxePBgzZ07Vz179tT+/fs1ffp0DR06VL/++ivnKcRs375dzz33nKZMmaK///3vWrFihW655RZZLBaNHz+ef1+EqA8//FDZ2dm65pprJPHfv1AzdepU5ebmqlevXgoLC5PD4dBDDz2kq666SlLT+Hc7QTqAZm3SpEn69ddfveZjIrT07NlTa9euVU5Ojt577z2NHz9e33zzTbCHhUr27NmjyZMn66uvvlJkZGSwh4NauLNFknTiiSdq8ODB6tSpk9555x1FRUUFcWSozOl06uSTT9bDDz8sSerfv79+/fVXzZkzR+PHjw/y6FCTl156SaNGjVJ6enqwh4JqvPPOO3rjjTf05ptvqk+fPlq7dq1uvfVWpaenN5nvFeXuISY1NVVhYWFVukEePHhQbdq0CdKocCzuc8N5Cy0333yz/ve//2nx4sVq3769Z3ubNm1kt9uVnZ3ttT/nKzgsFou6deumAQMGaObMmerbt6+eeeYZzlOIWbVqlQ4dOqSTTjpJ4eHhCg8P1zfffKNZs2YpPDxcaWlpnK8QlZiYqB49emjr1q18r0JM27Zt1bt3b69txx13nGd6Av++CD27du3S119/rYkTJ3q28b0KLXfeeaemTp2qK664QieccIL+/Oc/67bbbtPMmTMlNY3vFUF6iLFYLBowYIAWLlzo2eZ0OrVw4UINGTIkiCNDbTp37qw2bdp4nbfc3Fz99NNPnLcgMAxDN998sz744AMtWrRInTt39rp/wIABioiI8DpfmzZt0u7duzlfIcDpdMpms3GeQsxZZ52lX375RWvXrvVcTj75ZF111VWe65yv0JSfn69t27apbdu2fK9CzKmnnlplidDNmzerU6dOkvj3RSh65ZVX1Lp1a40ePdqzje9VaCksLJTZ7B3mhoWFyel0Smoi36tgd65DVW+//bZhtVqNuXPnGuvXrzeuv/56IzEx0Thw4ECwh9ai5eXlGWvWrDHWrFljSDKefPJJY82aNcauXbsMwzCMRx55xEhMTDQ++ugjY926dcZFF11kdO7c2SgqKgryyFuem266yUhISDCWLFli7N+/33MpLCz07HPjjTcaHTt2NBYtWmSsXLnSGDJkiDFkyJAgjrplmjp1qvHNN98YO3bsMNatW2dMnTrVMJlMxpdffmkYBucp1FXs7m4YnK9QcfvttxtLliwxduzYYXz//ffGiBEjjNTUVOPQoUOGYXCeQsny5cuN8PBw46GHHjK2bNlivPHGG0Z0dLTx+uuve/bh3xehw+FwGB07djT+9re/VbmP71Xo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\n",
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# create empty array for callback to store evaluations of the objective function (callback)\n",
"objective_func_vals = []\n",
"plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
"\n",
"# fit classifier to data\n",
"estimator_classifier.fit(X, y)\n",
"\n",
"# return to default figsize\n",
"plt.rcParams[\"figure.figsize\"] = (6, 4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The classifier can now differentiate between classes with an accuracy of:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# score classifier\n",
"estimator_classifier.score(X, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3 Compute Local Effective Dimension of trained QNN\n",
"\n",
"Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"normalized local effective dimensions for trained QNN: [0.87638858 0.88426363 0.88786719 0.90741924 0.91217989 0.91761725\n",
" 0.92152879 0.92410711 0.93136874 0.93604738]\n"
]
}
],
"source": [
"trained_weights = estimator_classifier.weights\n",
"\n",
"# get Local Effective Dimension for set of trained weights\n",
"local_ed_trained = LocalEffectiveDimension(\n",
" qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
")\n",
"\n",
"local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
"\n",
"print(\n",
" \"normalized local effective dimensions for trained QNN: \",\n",
" local_eff_dim_trained / estimator_qnn.num_weights,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.4 Compute Local Effective Dimension of untrained QNN\n",
"\n",
"We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"normalized local effective dimensions for untrained QNN: [0.91779425 0.92317419 0.9256189 0.93874285 0.9419124 0.9455245\n",
" 0.94811886 0.94982747 0.95463488 0.95772971]\n"
]
}
],
"source": [
"# get Local Effective Dimension for set of untrained weights\n",
"local_ed_untrained = LocalEffectiveDimension(\n",
" qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
")\n",
"\n",
"local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
"\n",
"print(\n",
" \"normalized local effective dimensions for untrained QNN: \",\n",
" local_eff_dim_untrained / estimator_qnn.num_weights,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"### 4.5 Plot and analyze results\n",
"\n",
"If we plot the effective dimension values before and after training, we can see the following result:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"tags": [
"nbsphinx-thumbnail"
]
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiEAAAFzCAYAAADoudnmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0JUlEQVR4nO3deVhUZfvA8e+ADPsiIqsIigquoCK8amWWhVm+avbTytyyzDe1jNQ0zTVFc8MtrcwlTfMtlyxL3yKxNFPDJVdUXFAU3FllnfP7Y2R0ZJHBgWG5P9fF5cyZc87cc9Lm5jn3cz8qRVEUhBBCCCHKmZmpAxBCCCFE9SRJiBBCCCFMQpIQIYQQQpiEJCFCCCGEMAlJQoQQQghhEpKECCGEEMIkJAkRQgghhElIEiKEEEIIk6hh6gAqIo1Gw+XLl7G3t0elUpk6HCGEEKLSUBSF1NRUPD09MTMrfqxDkpBCXL58GW9vb1OHIYQQQlRaFy9epE6dOsXuI0lIIezt7QHtBXRwcDBxNEIIIUTlkZKSgre3t+67tDgmT0IWL17MrFmzSExMJDAwkIULFxISElLovjk5OURERLBq1SoSEhLw9/dn5syZdO7cWW+/hIQEPvjgA37++WcyMjJo0KABK1asIDg4uEQx5d+CcXBwkCRECCGEKIWSlDOYtDB1/fr1hIeHM3HiRA4cOEBgYCBhYWFcvXq10P3Hjx/PZ599xsKFCzl+/DhDhgyhR48eHDx4ULfPrVu3aN++PRYWFvz8888cP36cOXPmULNmzfL6WEIIIYQoAZUpV9ENDQ2lTZs2LFq0CNAWhHp7ezN8+HDGjBlTYH9PT0/GjRvH0KFDddt69uyJtbU1a9asAWDMmDHs3r2bP/74o9RxpaSk4OjoSHJysoyECCGEEAYw5DvUZCMh2dnZxMTE0KlTp3vBmJnRqVMn9uzZU+gxWVlZWFlZ6W2ztrZm165duudbtmwhODiY//u//8PV1ZWWLVvyxRdfFBtLVlYWKSkpej9CCCGEKFsmS0KuX79OXl4ebm5uetvd3NxITEws9JiwsDDmzp3L6dOn0Wg0/PLLL2zcuJErV67o9jl79ixLliyhYcOGbN++nf/85z+88847rFq1qshYIiIicHR01P3IzBghhBCi7FWqZmXz58+nYcOGBAQEoFarGTZsGAMHDtSbh6zRaGjVqhXTp0+nZcuWDB48mDfffJOlS5cWed6xY8eSnJys+7l48WJ5fBwhhBCiWjNZEuLi4oK5uTlJSUl625OSknB3dy/0mNq1a7N582bS09O5cOECJ0+exM7Ojvr16+v28fDwoEmTJnrHNW7cmPj4+CJjsbS01M2EkRkxQgghRPkwWRKiVqtp3bo1UVFRum0ajYaoqCjatm1b7LFWVlZ4eXmRm5vLhg0b6Natm+619u3bExsbq7f/qVOn8PHxMe4HEEIIIcQjMWmfkPDwcPr3709wcDAhISFERkaSnp7OwIEDAejXrx9eXl5EREQAsHfvXhISEggKCiIhIYFJkyah0WgYPXq07pzvvfce7dq1Y/r06fTq1Yt9+/bx+eef8/nnn5vkMwohhBCicCZNQnr37s21a9eYMGECiYmJBAUFsW3bNl2xanx8vF69R2ZmJuPHj+fs2bPY2dnRpUsXVq9ejZOTk26fNm3asGnTJsaOHcuUKVOoV68ekZGR9OnTp7w/nhBCCCGKYdI+IRWV9AkRQghRpWg0kJMB2WmQlQbZqXf/TIPsdGj6IjxksbmSMuQ71ORt24UQQgjxAEXRJgf5SUJW6n0JRNrd5+n3PU7TTyoK20YxYw6NOoOlXbl9vHyShAghhBCPSlG0Iw26L/0HE4b85+n6oxCFJhV3txWXNJSaCiztQW2nTTrUttrHmpwyeK+HkyRECCFE9aMokHOnhEnC3QShyKTi7nZFUwaBqu5LGO77s8A2e/2kQi/RuG8/CxsowcJy5UWSECGEEBWfokBuZsF6huJGHnSJw4P73000yiRpoJAk4W5CoLYtuK3QpOK+/S1sjFarURFJEiKEEML48pOGIusZiksSHkwq8kca8somVvX9Iwj3jyrkJw72D0kq7tu/iicNxiZJiBBCiLtJQ1YR9QmpxScHRe1fVkmDhW0JkoQSJhUWtpI0mJAkIUIIUVnlZj2QJBRRz3B/7UJxMyk0uWUTp4XNo9Uz3J9UqG3BzLxs4hTlTpIQIYQoL7nZhSQCDyt6LOZWRVnNaKhhXbqix6L2l6RBFKFUSUhUVBRRUVFcvXoVjUa/sGf58uVGCUwIIUwuP2kwqJ7hwaTivn3KMmkorD5Blwg8uM2+mP0laRDlx+AkZPLkyUyZMoXg4GA8PDxQVaCpPkKIai4vpxRFj8Xsn5ddNnHWsCqmnuHBJOEhIw9qOzCXQW1RORn8N3fp0qWsXLmSvn37lkU8QghxT24W3L4It8/DrfNw6wIkX4LM5MKTiryssonD3LJ0RY+F7m8H5hZlE6cQlYzBSUh2djbt2rUri1iEENWNRgOpV+D2hXtJxu0L2j9vnde+Vpqukebq0hU9FpVUSNIgRJkwOAl54403WLt2LR999FFZxCOEqEoUBe7c0iYU+cnF/UlG8sWH3/KwsAEnH6jpCzV9wKkuWNcsvkiyhrocPpwQ4lEZnIRkZmby+eef8+uvv9KiRQssLPR/Q5g7d67RghNCVALZGXA7/oEk4/y9x1kpxR+vMgfHOvclGfkJh6/2sa1LhWozLYQwHoOTkH/++YegoCAAjh49qveaFKkKUQXl5UJKQtFJRlrSw89h53Y3ufC592d+kuHgJYWVQlRTBv/L37FjR1nEIYQwFUWB9Ov3kosHk4zkSw9vYqW2L2Qk4+5jp7qgtin7zyGEqHQe6dePS5cuAVCnTh2jBCOEKCNZafq1GA/WZ+SkF3+8uRocvQtPMmr6ams0ZCRUCGEgg5MQjUbDxx9/zJw5c0hLSwPA3t6e999/n3HjxmEmPfiFKH95Odoiz0KTjPOQceMhJ1CBvUcRSYaP9jVpYCWEMDKDk5Bx48bx5ZdfMmPGDNq3bw/Arl27mDRpEpmZmUybNs3oQQpR7SmKtvaiqCQjJeHhy5JbORWSZNz909EbLKzK/GMIIcT9VIqiGDQJ39PTk6VLl/Lvf/9bb/v333/P22+/TUJCglEDNIWUlBQcHR1JTk7GwcHB1OGI6iIzuWCvDF2dRrx2WfTi1LDS1l/kF3w+mHBYOZb9ZxBCVHuGfIcaPBJy8+ZNAgICCmwPCAjg5s2bhp5OiOojJ/PeLZPb5wuOamTeLv54lZl2JklRSYatqyxJLoSoVAxOQgIDA1m0aBELFizQ275o0SICAwONFpgQlY4mT9vh88GGXPmPS9L906ZW0UmGQx1pwiWEqFIMTkI++eQTnn/+eX799Vfatm0LwJ49e7h48SI//fST0QMUosIorPvn/Y9L1P3TVr/g88FOoJb25fBBhBCiYjA4CenQoQOnTp1i8eLFnDx5EoAXX3yRt99+G09Pz1IFsXjxYmbNmkViYiKBgYEsXLiQkJCQQvfNyckhIiKCVatWkZCQgL+/PzNnzqRz5866fSZNmsTkyZP1jvP399fFK0SR9Lp/ni84qpGdWvzxZjW03T8fbMgl3T+FEKKAUvUJ8fT0NNosmPXr1xMeHs7SpUsJDQ0lMjKSsLAwYmNjcXV1LbD/+PHjWbNmDV988QUBAQFs376dHj168Oeff9KyZUvdfk2bNuXXX3/VPa9RQzoyCh7o/nm+YJKRfvXh57i/++eDt06k+6cQQpRYiWbH/PPPPzRr1gwzMzP++eefYvdt0aKFQQGEhobSpk0bFi1aBGj7kHh7ezN8+HDGjBlTYH9PT0/GjRvH0KFDddt69uyJtbU1a9asAbQjIZs3b+bQoUMGxZJPZsdUYvndP+/v/Hl/kpGS8PDun5YORScZ0v1TCCGKZfTZMUFBQSQmJuLq6kpQUBAqlYrCcheVSkVeXl6JA83OziYmJoaxY8fqtpmZmdGpUyf27NlT6DFZWVlYWen3M7C2tmbXrl16206fPo2npydWVla0bduWiIgI6tatW+Q5s7KydM9TUh6y4JYwrdwsuHHmgZGM+x7nZBR/vK77p2/h9RnS/VMIIcpFiZKQc+fOUbt2bd1jY7l+/Tp5eXm4ubnpbXdzcyuyfiMsLIy5c+fyxBNP4OfnR1RUFBs3btRLfkJDQ1m5ciX+/v5cuXKFyZMn8/jjj3P06FHs7QsW/kVERBSoIREViKJok44zURAXBed3PSTRyO/+6Vv4gmn2HjKVVQghKoASJSE+Pj6FPjaF+fPn8+abbxIQEIBKpcLPz4+BAweyfPly3T7PPfec7nGLFi0IDQ3Fx8eH//73vwwaNKjAOceOHUt4eLjueUpKCt7e3mX7QUTx7tyGczvvJh47IDle/3VLR3CuV0iS4QtO3lDD0gRBCyGEMITBFXSrVq3CxcWF559/HoDRo0fz+eef06RJE9atW2dQkuLi4oK5uTlJSfpLgSclJeHu7l7oMbVr12bz5s1kZmZy48YNPD09GTNmDPXr1y/yfZycnGjUqBFnzpwp9HVLS0ssLeVLy6Q0eXD54L3Rjkt/g3LfrT1zNdRtC35PQYOnwa2Z3DIRQohKzuAx6enTp2NtbQ1o+4MsWrSITz75BBcXF9577z2DzqVWq2ndujVRUVG6bRqNhqioKF0PkqJYWVnh5eVFbm4uGzZsoFu3bkXum5aWRlxcHB4eHgbFJ8pYcgIc+Ar+2x8+qQ/Lnobo6XBxrzYBqdUQQofAq9/CB+eh/xZ4bAS4N5cERAghqgCDR0IuXrxIgwYNANi8eTMvvfQSgwcPpn379jz55JMGBxAeHk7//v0JDg4mJCSEyMhI0tPTGThwIAD9+vXDy8uLiIgIAPbu3UtCQgJBQUEkJCQwadIkNBoNo0eP1p1z5MiRdO3aFR8fHy5fvszEiRMxNzfnlVdeMTg+YUQ5d+DCbjjzm3a049oDdT+WjlC/g3akw+8p7UwUIYQQVZbBSYidnR03btygbt26/O9//9PVUlhZWXHnzh2DA+jduzfXrl1jwoQJJCYmEhQUxLZt23TFqvHx8ZjdV0SYmZnJ+PHjOXv2LHZ2dnTp0oXVq1fj5OSk2+fSpUu88sor3Lhxg9q1a/PYY4/x119/6YprRTm6fhpObdPeZrnwJ+Tdm4WEygw8W91NOp4Gr9bSY0MIIaoRg1fR7dOnDydPnqRly5asW7eO+Ph4atWqxZYtW/jwww85evRoWcVabqRPyCPKy4XYrbDvCzj/h/5r9p7Q4Clt0lH/SbBxNkmIQgghykaZrqK7ePFixo8fz8WLF9mwYQO1atUCICYmRm53VHdpV+HAKvh7hbYpGGhHO+o/CQ06aROP2v5SzyGEEAIoxUhIdSAjIQZQFLi0XzvqcWwTaHK0221coHV/aD1QO2VWCCFEtVCmIyEAt2/fZt++fVy9ehWNRqPbrlKp6Nu3b2lOKSqbnDtwdAPs+xyuHL633SsYQgZD0+7Sq0MIIUSxDE5CfvjhB/r06UNaWhoODg6o7htalySkGrh1HvZ/CQdXa5e1BzC3hOYvQZs3wKuVScMTQghReRichLz//vu8/vrrTJ8+HRsbWcirWtBo4Oxv2lsup7YDd+/gOdaFNoOgZV+wrWXSEIUQQlQ+BichCQkJvPPOO5KAVAd3bsOhtbB/GdyMu7fd7yntLZeGz4KZucnCE0IIUbkZnISEhYXx999/F9smXVRySce0ox7/rL+3UJylAwT10d5ycWlg2viEEEJUCQYnIc8//zyjRo3i+PHjNG/eHAsLC73X//3vfxstOFGONBo4sUVbaHph973trk20iUeL3mBpZ7r4hBBCVDkGT9E1K2YJdJVKRV5eXpGvVxbVbopu2jXYPATO/Kp9rjKHxl0h5E3waS99PYQQQpRYmU7RvX9KrqgCzkbDxsGQlgQ1rKDtMG2xqYOnqSMTQghRxT3SQh2ZmZlYWVkZKxZRnvJyYMd02DUPUKB2ALy0AtyamDoyIYQQ1UTR91aKkJeXx9SpU/Hy8sLOzo6zZ88C8NFHH/Hll18aPUBRBm5dgBXPwa65gAKtB8CbOyQBEUIIUa4MTkKmTZvGypUr+eSTT1Cr1brtzZo1Y9myZUYNTpSBY5tg6ePaVuuWjvB/K6HrfFDLlGshhBDly+Ak5KuvvuLzzz+nT58+mJvf6xERGBjIyZMnjRqcMKLsDPjhXfh2AGQlQ502MOQPaNrD1JEJIYSopkrVrKxBg4J9IjQaDTk5OUYJShhZ0nH47nW4dgJQwWPvQccPwdzioYcKIYQQZcXgJKRJkyb88ccf+Pj46G3/7rvvaNmypdECE0agKBCzAraNhdxMsHODHp+BX0dTRyaEEEIYnoRMmDCB/v37k5CQgEajYePGjcTGxvLVV1/x448/lkWMojTu3IIt72gbkAE06ATdl4JdbdPGJYQQQtxlcE1It27d+OGHH/j111+xtbVlwoQJnDhxgh9++IFnnnmmLGIUhorfqy0+PbEFzGrAsx/Dq99KAiKEEKJCMbhjanVQaTumavK0fT92TAclD2r6wkvLwau1qSMTQghRTZRpx9T7paWlFeigWqm+tKuSlCuwaTCc+137vPn/wfNzwUr+ewghhKiYDE5Czp07x7Bhw4iOjiYzM1O3XVGUKrN2TKWTeBS+6gYZ18HCBrrMhqBXZc0XIYQQFZrBSchrr72GoigsX74cNzc3VPJFZ1p3bsP617QJiFszbev12o1MHZUQQgjxUAYnIYcPHyYmJgZ/f/+yiEcYQqOBTUPg1jlwqgv9fwAbZ1NHJYQQQpSIwbNj2rRpw8WLF8siFmGoXXPg1M9gbgm9VksCIoQQolIxOAlZtmwZM2fOZNWqVcTExPDPP//o/ZTG4sWL8fX1xcrKitDQUPbt21fkvjk5OUyZMgU/Pz+srKwIDAxk27ZtRe4/Y8YMVCoVI0aMKFVsFdaZKPhtmvbx83PAM8ik4QghhBCGMvh2zLVr14iLi2PgwIG6bSqVqtSFqevXryc8PJylS5cSGhpKZGQkYWFhxMbG4urqWmD/8ePHs2bNGr744gsCAgLYvn07PXr04M8//yzQsXX//v189tlntGjRwtCPWbHdjocNbwAKtOoPrfqaOiIhhBDCYAb3CWnSpAmNGzdm9OjRhRamPtjO/WFCQ0Np06YNixYtArRr0Hh7ezN8+HDGjBlTYH9PT0/GjRvH0KFDddt69uyJtbU1a9as0W1LS0ujVatWfPrpp3z88ccEBQURGRlZopgqdJ+QnExY0RkuHwSPIHh9O1hYmToqIYQQAijjPiEXLlxgy5YthS5iZ6js7GxiYmIYO3asbpuZmRmdOnViz549hR6TlZWFlZX+l661tTW7du3S2zZ06FCef/55OnXqxMcff1xsHFlZWWRlZemep6SkGPpRys+2D7QJiHVN6L1aEhAhhBCVlsE1IU899RSHDx82yptfv36dvLw83Nzc9La7ubmRmJhY6DFhYWHMnTuX06dPo9Fo+OWXX9i4cSNXrlzR7fPNN99w4MABIiIiShRHREQEjo6Ouh9vb+/Sf6iydHANxKwEVNDzS+2MGCGEEKKSMngkpGvXrrz33nscOXKE5s2bY2Ghvxz8v//9b6MFV5j58+fz5ptvEhAQgEqlws/Pj4EDB7J8+XIALl68yLvvvssvv/xSYMSkKGPHjiU8PFz3PCUlpeIlIlcOw9b3tY87fggNnjZtPEIIIcQjMjgJGTJkCABTpkwp8JqhhakuLi6Ym5uTlJSktz0pKQl3d/dCj6lduzabN28mMzOTGzdu4OnpyZgxY6hfvz4AMTExXL16lVatWumOycvL4/fff2fRokVkZWVhbm6ud05LS0ssLS1LHHe5u3ML1veF3ExoGAaPjzR1REIIIcQjM/h2jEajKfLH0JkxarWa1q1bExUVpXf+qKgo2rZtW+yxVlZWeHl5kZuby4YNG+jWrRsATz/9NEeOHOHQoUO6n+DgYPr06cOhQ4cKJCCVwg8j4PYF7YJ0L34GZgb/ZxNCCCEqnEdawM4YwsPD6d+/P8HBwYSEhBAZGUl6erpuCnC/fv3w8vLS1Xfs3buXhIQEgoKCSEhIYNKkSWg0GkaPHg2Avb09zZo103sPW1tbatWqVWB7pXDnNpz4Qfv4pRXaglQhhBCiCihRErJgwQIGDx6MlZUVCxYsKHbfd955x6AAevfuzbVr15gwYQKJiYkEBQWxbds2XbFqfHw8Zvf95p+Zmcn48eM5e/YsdnZ2dOnShdWrV+Pk5GTQ+1YaZ6NByQOXRuDV6qG7CyGEEJVFifqE1KtXj7///ptatWpRr169ok+mUnH27FmjBmgKFapPyPfD4OBq+NdQ6DzdtLEIIYQQD2H0PiHnzp0r9LEoY4qibc8OMhtGCCFElSMVjhXZ1ROQehlqWINPe1NHI4QQQhhViUZC7u+h8TBz584tdTDiAWd+0f7p+5h0RhVCCFHllCgJOXjwoN7zAwcOkJubi7+/PwCnTp3C3Nyc1q1bGz/C6uzMr9o/G3QybRxCCCFEGShRErJjxw7d47lz52Jvb8+qVauoWVM7XfTWrVsMHDiQxx9/vGyirI6y0uDC3fVzGj5j2liEEEKIMmDwKrpeXl7873//o2nTpnrbjx49yrPPPsvly5eNGqApVIjZMbE/w7qXtQ3K3jkED6xWLIQQQhRHURTu5ORxKyOHW+nZ3MrI5mZ6NrczcriVkX13m/bxqoEhmJkZ53umTFfRTUlJ4dq1awW2X7t2jdTUVENPJ4py/60YSUCEEKJaUxSF1Kxcbqdrk4abGdnczsjmZnoOtzOy7yYVOQUSjaxcTYnOn5KZg5ONuow/RUEGJyE9evRg4MCBzJkzh5CQEEDbxXTUqFG8+OKLRg+wWlIUOH23KFXqQYQQokrRaBRSMnO4mT8ScXeU4nZGzn3Jhfa1+xONXI1BNy501OZmONlYUNNGTU3b/D/V1MzfZqPGsoZpljQxOAlZunQpI0eO5NVXXyUnJ0d7kho1GDRoELNmzTJ6gNXSjTjtWjHmavCVOhshhKiocvM03L5zL1m4/zbH/cnErYx7icbtjGxKmU9gZWGGs40aJxs1zrbq+5ILbVKh3XZfgmGrxlZtjqqCjqgbnITY2Njw6aefMmvWLOLi4gDw8/PD1tbW6MFVW/m3Yuq2BUs708YihBDVRFZu3n31EvcSh1sPjFjcuq+mIiUzt9TvZ2dZA6f7EgdnGwtdclHzvsf5+9S0UWNlUQkXYS1GqRews7W1pUWLFsaMReSTqblCCPFI7mTn6dVH5N/muD+5eLBIMz3bsJXg7+dobaEdfbibLDjZWOCsG6HQTyryH6trSL9Qk6+iKx6QcwfO/6F9LEmIEKKaUxSFtKxcXbKgSyrS79ZOZBSsnbiZXvKCzAeZqShwO+Nhjx2tLahhLglFaUgSUtFc2A25mWDvCa6NTR2NEEIYjUajkJqZezdxKKJ2opAizZy80hVQWJir9BOKomon7o5WONuosbeqYbSpquLhJAmpaPIXrGsoU3OFEBVXnka5OzX0/mLMB5/r11E8SkGmZQ2ze7UTtha6BKKwIs38x3aWNSpsQabQkiSkopF6ECFEOcvO1egSivzbHPcnEzczCja4Sr6TU+r3s1WbF1p0qV+kqf+atbpqFWQKrVIlIatXr2bp0qWcO3eOPXv24OPjQ2RkJPXq1aNbt27GjrH6uHUBrp8ClTnU62DqaIQQlVBmTl6htRO39Ooo7t0CuZ2RQ1pW6Wd4OFjV0Cu+1KuXeCC5yH9sqp4UouIxOAlZsmQJEyZMYMSIEUybNo28PG01sZOTE5GRkZKEPIr8URDvELB2MmkoQgjTUhSF9Oy8ArczCq2duK9IMzOndAWZKhU4WVvcl1DoJxKFPXaSgkzxiAxOQhYuXMgXX3xB9+7dmTFjhm57cHAwI0eONGpw1U5+PUiDp00bhxDCqBRFISUz976E4oE+FIUmFTlk55Uuoahhpnqg6LLgbY4HizQdrCykIFOUO4OTkHPnztGyZcsC2y0tLUlPTzdKUNVSbjac26l93EBWzRWiosrTKCTfKbz48mZGtm5tj/uTi9t3csgrbcvtGmYF6iP0aid0RZp3EwxbC+ylIFNUEgYnIfXq1ePQoUP4+Pjobd+2bRuNG8uU0lK7uBey08C2NrhLEzghykNOnqbALQ292on7Fwe7W5iZfCcHw9Yev8dGba6/fscDTazuTzTyRymsLSpuy20hHpXBSUh4eDhDhw4lMzMTRVHYt28f69atIyIigmXLlpVFjNXDmbsL1vk9DWZyj1UIQ2Xm5BXaxKqo2onb6TmkPkJBpr1VjUJqJYquo3CysahyLbeFeFQGJyFvvPEG1tbWjB8/noyMDF599VU8PT2ZP38+L7/8clnEWD3o6kFkaq4QD8rO1XAqKZVjl5M5mZjK9bRsvdkdN9OzuZNTupbbKpW25bbzA7c5iksunGwssJCCTCEemUpRSjuwCBkZGaSlpeHq6mrMmEwuJSUFR0dHkpOTcXBwKIc3vAJzAwAVjIoD21pl/55CVFCZOXmcTEzlaEIyxy4nczQhhdjE1BIVaZqbqe7d3iiudsL23j4O1haYS0GmEEZjyHeowSMhH3/8MX369KFevXrY2NhgY2NT6kDzLV68mFmzZpGYmEhgYCALFy4kJCSk0H1zcnKIiIhg1apVJCQk4O/vz8yZM+ncubNunyVLlrBkyRLOnz8PQNOmTZkwYQLPPffcI8daJuLujoJ4tZIERFQrGdm5HL+cwtGEZI7e/fP01bRCizgdrGrQzMuRJh4OuDtaFVqk6WAlBZlCVCYGJyHffvstEydOJDQ0lNdee41evXrh4uJS6gDWr19PeHg4S5cuJTQ0lMjISMLCwoiNjS10hGX8+PGsWbOGL774goCAALZv306PHj34888/dbN26tSpw4wZM2jYsCGKorBq1Sq6devGwYMHadq0aaljLTOn79aDyK0YUYWlZOZwLCHl7uiGNumIu5ZWaJGns62aZl6ONPN0uPunI97O1pJgCFHFlOp2zLFjx/j666/55ptvuHTpEs888wx9+vShe/fuBo+MhIaG0qZNGxYtWgSARqPB29ub4cOHM2bMmAL7e3p6Mm7cOIYOHarb1rNnT6ytrVmzZk2R7+Ps7MysWbMYNGjQQ2Mq19sxebkwqz5kJsOgX7SNyoSo5G6lZ3P07q2Uo5eTOZaQzPkbGYXu62pvSXMvR5rel3R4OFpJwiFEJVWmt2NAe3tj+vTpTJ8+nd27d7N27VpGjBjBkCFDSElJKfF5srOziYmJYezYsbptZmZmdOrUiT179hR6TFZWFlZWVnrbrK2t2bVrV6H75+Xl8e2335Kenk7btm2LPGdWVpbuuSGf4ZElxGgTECsn8Gpdfu8rhJFcS83SjmwkJOsSj4Tbdwrd18vJmmZeDjTzdKSZlyNNPR1wdbAqdF8hRNX3yAvY2draYm1tjVqtJjU11aBjr1+/Tl5eHm5ubnrb3dzcOHnyZKHHhIWFMXfuXJ544gn8/PyIiopi48aNuvbx+Y4cOULbtm3JzMzEzs6OTZs20aRJk0LPGRERweTJkw2K3WjyW7X7PQVmMn1PVFyKopCYksmRS9pbKcfuJh1JKVmF7u9Ty0Z3K6WZlwNNPR1xtlWXc9RCiIqsVEnIuXPnWLt2LWvXriU2NpYOHTowefJkXnrpJWPHV8D8+fN58803CQgIQKVS4efnx8CBA1m+fLnefv7+/hw6dIjk5GS+++47+vfvz86dOwtNRMaOHUt4eLjueUpKCt7e3mX+WQBZNVdUSIqicOnWHY4k3KvfOJaQzI307AL7qlRQ38WW5l75oxuONPF0wNHawgSRCyEqE4OTkH/961/s37+fFi1aMHDgQF555RW8vLxK9eYuLi6Ym5uTlJSktz0pKQl3d/dCj6lduzabN28mMzOTGzdu4OnpyZgxY6hfv77efmq1mgYNGgDQunVr9u/fz/z58/nss88KnNPS0hJLS8tSfYZHkn4dLh/UPpb1YoSJaDQK52+kcyQhmWP5M1USkknJLNjIy9xMRUNXO72i0cYeDthaPvKgqhCiGjL4/xxPP/00y5cvL/LWhiHUajWtW7cmKiqK7t27A9rC1KioKIYNG1bssVZWVnh5eZGTk8OGDRvo1atXsftrNBq9uo8KIe43QAG35mBfeNIlhDHl5mk4ez397i2VZN1slfTsgo2+LMxV+Lvb6+o3mnk5EuBuL10/hRBGY3ASMm3aNKMGEB4eTv/+/QkODiYkJITIyEjS09MZOHAgAP369cPLy4uIiAgA9u7dS0JCAkFBQSQkJDBp0iQ0Gg2jR4/WnXPs2LE899xz1K1bl9TUVNauXUt0dDTbt283auyPTHcrRkZBhPFl52o4fTWVYwkp2tsql5M5cSWl0KXeLWuY0djDgWZeDtqZKp6ONHKzR11DuoIKIcpOiZKQ8PBwpk6diq2trV7tRGHmzp1rUAC9e/fm2rVrTJgwgcTERIKCgti2bZuuWDU+Ph6z+9ZSyczMZPz48Zw9exY7Ozu6dOnC6tWrcXJy0u1z9epV+vXrx5UrV3B0dKRFixZs376dZ56pQKvTajT3WrU3rEBxiUopMyeP2MTUu7NTiu8yaqM2p6mntlA0v47Dr7YtNaQNuRCinJWoT0jHjh3ZtGkTTk5OdOzYsdh9d+zYYbTgTKVc+oQkHIAvOoLaHkafhRoya0CUTEZ2LieupOhmqRTXZdTeqoZudkr+LRXfWrbSplwIUWaM3ifk/sSiKiQZFUL+KEj9DpKAiCKlZObca2v+kC6jNW0sdIlGc+kyKoSoBAyuCXn99deZP38+9vb2etvT09MZPnx4gamyoghSDyIecCs9Wzs75XKydqbKQ7qM6rU1ly6jQohKyOC27ebm5ly5cqXAui7Xr1/H3d2d3NyC0/oqmzK/HXPnFnxSHxQNjDgCTnWN/x6iQruWmqVrZ34k4eFdRpvqkg1tt1HpMiqEqKjKpG17SkoKiqKgKAqpqal6rdPz8vL46aefCl1wThTibLQ2AXHxlwSkisvvMno0IUWvtXmxXUY9HWl6X2tz6TIqhKiqSpyEODk5oVKpUKlUNGrUqMDrKpXKdK3PKxvpklol5XcZvX8NlaMP6TKa39a86d225tJlVAhRnZQ4CdmxYweKovDUU0+xYcMGnJ2dda+p1Wp8fHzw9PQskyCrFEW5V5Qq9SCVVn6X0fx25kdK0GW06X2zVJpIl1EhhCh5EtKhQwdAu25M3bp1pQCutK4eh9QrUMMafNqbOhpRAvldRvP7bxy9nMzxyymkZRVMOO7vMpq/NH1jDwfpMiqEEIUw+Fex3377DTs7O/7v//5Pb/u3335LRkYG/fv3N1pwVVL+rZh6j4OFFBdWNPd3Gc2fpVKSLqP59RvSZVQIIUrO4CQkIiKi0EXgXF1dGTx4sCQhD3P5kPZP38dMGoZ4sMuodg2Vk1ce3mU0f5ZKg9p20mVUCCEegcFJSHx8PPXq1Suw3cfHh/j4eKMEVaWlJmr/lFkx5Sq/y6hulsrlFE4npZJbgi6jTT0dqeciXUaFEMLYDE5CXF1d+eeff/D19dXbfvjwYWrVqmWsuKqu1CvaP+1k1dyycn+X0fyl6eOupVFIvqHXZTQ/8fCuaYOZJBxCCFHmDE5CXnnlFd555x3s7e154oknANi5cyfvvvsuL7/8stEDrFIU5d5IiL0kIcZwOyNbVyyan3Scu55e6L617S3vtjN30BaNejniKV1GhRDCZAxOQqZOncr58+d5+umnqVFDe7hGo6Ffv35Mnz7d6AFWKZnJkHu3K6YkIaWSnpXL5kMJ/HHqOkcvJ3PpVuFdRj0drWiav4aKdBkVQogKyeAkRK1Ws379eqZOncrhw4extramefPm+Pj4lEV8VUv+KIiVE1hYmzSUyubM1TTW/HWBDTGXSH1gamxdZ5t7q8R6OtLU04FadpYmilQIIURJlbpbkq+vL4qi4OfnpxsREQ+RXw9i72HaOCqJ3DwNv564yuq/zrP7zA3d9noutrzUug4t6zrR1MMRRxvpMiqEEJWRwdlDRkYGw4cPZ9WqVQCcOnWK+vXrM3z4cLy8vBgzZozRg6wypB6kRK6lZrF+fzxr98ZzOTkTADMVPBXgRr+2PjzWwEUKR4UQogowOAkZO3Yshw8fJjo6ms6dO+u2d+rUiUmTJkkSUpw0SUKKoigKMRdusfqvC/x05Ao5edqpLM62anq38aZPaF3q1LQxcZRCCCGMyeAkZPPmzaxfv55//etferMKmjZtSlxcnFGDq3Iybmr/tJGpzPkysnP5/tBlVu+5wPErKbrtQd5O9GvrQ5fmHtLyXAghqiiDk5Br167h6upaYHt6erpMdXyYzNvaP62dTBlFhXDuejqr91zg25iLpN5d9M2yhhndgjzp+y9fmtdxNHGEQgghyprBSUhwcDBbt25l+PDhALrEY9myZbRt29a40VU1d25p/7Suado4TCRPo/Dbyat8tec8f5y+rtte19mGvv/y4f+C6+BkozZhhEIIIcqTwUnI9OnTee655zh+/Di5ubnMnz+f48eP8+eff7Jz586yiLHquHNb+6eVkymjKHc30rJY//dFvv4rnoTb2r4eKhV09Helb1sfOjSsLYWmQghRDRmchDz22GMcOnSIGTNm0Lx5c/73v//RqlUr9uzZQ/PmzcsixqojPwmpJiMh11KzmLX9JJsPXtYtCudkY0HvYG/6hPpQt5YUmgohRHVWoiQkPDycqVOnYmtry++//067du344osvyjq2qkd3O8bJpGGUNUVR+PbvS0z76QTJd3IAaFHHkb7/8qFroKcUmgohhACgROuQL1y4kLS0NAA6duzIzZs3jRrE4sWL8fX1xcrKitDQUPbt21fkvjk5OUyZMgU/Pz+srKwIDAxk27ZtevtERETQpk0b7O3tcXV1pXv37sTGxho15lKpBjUhZ6+l8coXfzF6wz8k38mhmZcDG/7Tli3DHuP/gr0lARFCCKFTopEQX19fFixYwLPPPouiKOzZs4eaNQv/Is1f1K6k1q9fT3h4OEuXLiU0NJTIyEjCwsKIjY0tdBbO+PHjWbNmDV988QUBAQFs376dHj168Oeff9KyZUtAu6De0KFDadOmDbm5uXz44Yc8++yzHD9+HFtbW4PiM5rcbMi5u7BaFUxCsnM1fP57HAt+O0N2rgZrC3PCn2nEwPa+1DAvUa4rhBCimlEpilLIAuf6Nm/ezJAhQ7h69SoqlYqiDlGpVOTl5RkUQGhoKG3atGHRokWAdjE8b29vhg8fXmjjM09PT8aNG8fQoUN123r27Im1tTVr1qwp9D3ypxXv3LmzRElSSkoKjo6OJCcn4+DgYNDnKVLaVZjdEFDBhJtgVnW+mGMu3OLDjUeITUoF4IlGtZnWvRnezlLzIYQQ1Y0h36ElGgnp3r073bt3Jy0tDQcHhyJHKQyVnZ1NTEwMY8eO1W0zMzOjU6dO7Nmzp9BjsrKysLLSXw3V2tqaXbt2Ffk+ycnJADg7Oz9yzKWmmxnjWGUSkNTMHGZtj2X1XxdQFKhlq2ZC1yb8O9BTesYIIYR4KIMKU+3s7NixYwf16tUzyqJ1169fJy8vDzc3N73tbm5unDx5stBjwsLCmDt3Lk888QR+fn5ERUWxcePGIkdgNBoNI0aMoH379jRr1qzQfbKyssjKytI9T0lJKXS/R1LFilK3H0tk4vfHSEzRru3yf63r8GGXxtS0lT4fQgghSsbgwtSnnnrK6IWphpg/fz4NGzYkICAAtVrNsGHDGDhwIGZFjC4MHTqUo0eP8s033xR5zoiICBwdHXU/3t7exg+8ihSlJiZn8tbqv3lrdQyJKZn41rJh7RuhzPq/QElAhBBCGMSkhakuLi6Ym5uTlJSktz0pKQl398IXeatduzabN28mMzOTGzdu4OnpyZgxY6hfv36BfYcNG8aPP/7I77//Tp06dYqMY+zYsYSHh+uep6SkGD8R0bVsr5xJiEaj8PW+eD75+SSpWbnUMFPxVof6DH+qocx4EUIIUSolSkJmzZrFkCFDiIiIQKVS0aNHj0L3M7QwVa1W07p1a6KioujevTugvX0SFRXFsGHDij3WysoKLy8vcnJy2LBhA7169dK9pigKw4cPZ9OmTURHR1OvXr1iz2VpaYmlpWWJ4y6V/JGQStgt9VRSKmM3HiHmgvYzBHk7EfFicxp7GKloVwghRLVk0sJU0Nab9O/fn+DgYEJCQoiMjCQ9PZ2BAwcC0K9fP7y8vIiIiABg7969JCQkEBQUREJCApMmTUKj0TB69GjdOYcOHcratWv5/vvvsbe3JzExEQBHR0esra2NErfBKuHtmMycPD7dcYYlO+PIyVOwVZszunMAr/3LB3Npsy6EEOIRGVRdauzCVIDevXtz7do1JkyYQGJiIkFBQWzbtk1XrBofH69X75GZmcn48eM5e/YsdnZ2dOnShdWrV+Pk5KTbZ8mSJQA8+eSTeu+1YsUKBgwYYJS4DaZr2e5kmvc30F9nb/DhpiOcvabtbdKpsRtTujXF08lESZwQQogqp0R9Qh4UFxfHihUriIuLY/78+bi6uvLzzz9Tt25dmjZtWhZxlqsy6ROy4U048l949mNoN9w45ywDyRk5RPx8gm/2XwSgtr0lU/7dlM7N3GXarRBCiIcy5DvU4IYVO3fupHnz5uzdu5eNGzfqZs0cPnyYiRMnli7i6qASFKb+cPgyT8/dqUtAXg2ty6/hHXiuuYckIEIIIYzO4CRkzJgxfPzxx/zyyy+o1femZD711FP89ddfRg2uSqnghakLo04zfN1Brqdl0cDVjm+HtGV6j+Y4WluYOjQhhBBVlMGFHUeOHGHt2rUFtru6unL9+nWjBFUldfsU0pLAtYmpIylg7d545vxyCoC3n/Tj3U4Nsawh026FEEKULYNHQpycnLhy5UqB7QcPHsTLy8soQVVJtRtBvcfBtpapI9Gz7Wgi4zcfAWBYxwaM7hwgCYgQQohyYXAS8vLLL/PBBx+QmJiISqVCo9Gwe/duRo4cSb9+/coiRlFG/jp7g3e+OYhGgZfbePP+s41MHZIQQohqxOAkZPr06QQEBODt7U1aWhpNmjThiSeeoF27dowfP74sYhRl4PjlFN5c9TfZuRqebeLGx92bSfGpEEKIclWqKboAFy9e5MiRI6SlpdGyZUsaNmxo7NhMpkym6FYgF29m8OKSP7mWmkWIrzNfDQqR1utCCCGMwpDv0FJ3HPP29i6bhd5EmbqelkXfL/dyLTWLAHd7vugfLAmIEEIIkzD4doyovNKycnl95X7O38jAy8maVa+HyBRcIYQQJiNJSDWRnathyOoY/rmUjLOtmtWDQnBzsDJ1WEIIIaoxSUKqAY1G4f1vD7PrzHVs1OasGNCG+rXtTB2WEEKIas5oScjt27cLbWImTEtRFKb8eJwfDl+mhpmKpa+1JtDbydRhCSGEEMZLQi5cuEDfvn2NdTphJJ9Gx7Hyz/MAzOkVyBONaps2ICGEEOIuuR1Tha3fH8+s7bEATHihCd2CpKOtEEKIikOSkCrql+NJjN2obcf+nyf9eP2xeiaOSAghhNAnSUgVtP/8TYatPYBGgV7BdRgd5m/qkIQQQogCStysbMGCBcW+npCQ8MjBiEd3MjGFQSv3k5Wr4ekAV6b3aC7t2IUQQlRIJU5C5s2b99B96tat+0jBiEdz6VYG/ZfvIyUzl2Cfmix6tRU1zGWwSwghRMVU4iTk3LlzZRmHeEQ307Ppt3wfSSlZNHKzY1n/YKzV0o5dCCFExWXUPiGLFi0y1umEATKycxm4cj9nr6Xj6WjFqtdDcLJRmzosIYQQoliPnIRERUXx6quv4uHhwcSJE40RkzDQkug4Dl+8jZONBV8NCsXD0drUIQkhhBAPVaok5OLFi0yZMoV69erx7LPPolKp2LRpE4mJicaOTzzEjbQslu/S3iqL6NGcBq7Sjl0IIUTlUOIkJCcnh2+//ZawsDD8/f05dOgQs2bNwszMjHHjxtG5c2csLGRF1vK2JDqO9Ow8mnk50LmZu6nDEUIIIUqsxIWpXl5eBAQE8Nprr/HNN99Qs2ZNAF555ZUyC04ULzE5k9V/XQDg/Wf9ZSquEEKISqXEIyG5ubmoVCpUKhXm5sabdbF48WJ8fX2xsrIiNDSUffv2FblvTk4OU6ZMwc/PDysrKwIDA9m2bZvePr///jtdu3bF09MTlUrF5s2bjRZrRbNox2mycjUE+9TkSVkTRgghRCVT4iTk8uXLDB48mHXr1uHu7k7Pnj3ZtGnTI/32vX79esLDw5k4cSIHDhwgMDCQsLAwrl69Wuj+48eP57PPPmPhwoUcP36cIUOG0KNHDw4ePKjbJz09ncDAQBYvXlzquCqDizcz+GbfRQBGhskoiBBCiMpHpSiKYuhBcXFxrFixglWrVpGQkMArr7zCgAEDeOqppwwaJQkNDaVNmza6qb0ajQZvb2+GDx/OmDFjCuzv6enJuHHjGDp0qG5bz549sba2Zs2aNQU/3N2C2e7duxv0+VJSUnB0dCQ5ORkHBweDji0vI789zHcxl3i8oQurB4WaOhwhhBACMOw7tFSzY/z8/Pj444+5cOECW7duJSsrixdeeAFXV9cSnyM7O5uYmBg6dep0LxgzMzp16sSePXsKPSYrKwsrKyu9bdbW1uzatas0H0PvvCkpKXo/FdmZq2lsPHAJ0NaCCCGEEJXRI/UJMTMz47nnnuO7774jISGBcePGlfjY69evk5eXh5ubm952Nze3Iqf6hoWFMXfuXE6fPo1Go+GXX35h48aNXLly5VE+BhERETg6Oup+vL29H+l8ZW3er6fQKNCpsRtB3k6mDkcIIYQolRInIbdu3WLhwoWFjhIkJyezbt063njjDaMG96D58+fTsGFDAgICUKvVDBs2jIEDB2Jm9mg918aOHUtycrLu5+LFi0aK2PiOXU5m6z9XUKng/WcbmTocIYQQotRK/O29aNEifv/990Lv7zg6OvLHH38Y1LbdxcUFc3NzkpKS9LYnJSXh7l54v4vatWuzefNm0tPTuXDhAidPnsTOzo769euX+H0LY2lpiYODg95PRTXvl1MAvNDCk8YeFTdOIYQQ4mFKnIRs2LCBIUOGFPn6W2+9xbffflviN1ar1bRu3ZqoqCjdNo1GQ1RUFG3bti32WCsrK7y8vMjNzWXDhg1069atxO9bmR2Iv8WvJ65ipoL3OjU0dThCCCHEIylxs7K4uDgaNiz6i69hw4bExcUZ9Obh4eH079+f4OBgQkJCiIyMJD09nYEDBwLQr18/vLy8iIiIAGDv3r0kJCQQFBREQkICkyZNQqPRMHr0aN0509LSOHPmjO75uXPnOHToEM7OztStW9eg+CqaOf+LBaBnqzrUry3t2YUQQlRuJU5CzM3NuXz5cpFf5JcvXza4NqN3795cu3aNCRMmkJiYSFBQENu2bdMVq8bHx+udMzMzk/Hjx3P27Fns7Ozo0qULq1evxsnJSbfP33//TceOHXXPw8PDAejfvz8rV640KL6K5M+46+w+cwMLcxXvPC2jIEIIISq/EvcJ6dixI6GhocyYMaPQ1z/44AP27dvHjh07jBqgKVS0PiGKovDS0j3EXLhFv7Y+TOnWzNQhCSGEEIUy5Du0xCMhw4YN4+WXX6ZOnTr85z//0TUly8vL49NPP2XevHmsXbv20SIXhYqOvUbMhVtYWZgxrGMDU4cjhBBCGEWJk5CePXsyevRo3nnnHcaNG6ebkXL27FnS0tIYNWoUL730UpkFWp0t/O00AP3b+uLqYPWQvYUQQojKocRJCMC0adPo1q0bX3/9NWfOnEFRFDp06MCrr75KSEhIWcVYrWXm5HH4UjIA/dr5mjYYIYQQwogMSkIAQkJCJOEoR6eSUsnTKNSyVePpKKMgQgghqg6Dk5D9+/ezbt06Tp3SNs3y9/fnlVdeITg42OjBCTh2Wduhtomng6yUK4QQokoxaE7t6NGjCQ0NZdmyZVy6dIlLly7x+eefExoaygcffFBWMVZrx+9LQoQQQoiqpMRJyKpVq1i4cCELFizgxo0bHDp0iEOHDnHz5k3mzZvHggUL+Oqrr8oy1mrp2GVtPUgTadEuhBCiiinx7ZjFixczffp0hg0bprfdwsKCd955h9zcXBYtWkS/fv2MHmR1ladROJmYCkBTT0cTRyOEEEIYV4lHQo4dO1bsGi3du3fn2LFjRglKaJ2/kU5Gdh7WFubUc7E1dThCCCGEUZU4CTE3Nyc7O7vI13NycnQNzIRx5NeDBHjYY24mRalCCCGqlhInIa1ateLrr78u8vXVq1fTqlUrowQltHQzY6QeRAghRBVU4pqQkSNH0r17d7Kysnj//fd1i8wlJiYyZ84cIiMj2bRpU5kFWh0dv6JNQqQeRAghRFVU4iTkhRdeYN68eYwcOZI5c+bg6Kj9YkxOTqZGjRrMnj2bF154ocwCrW4UReF4/swYmZ4rhBCiCjKoWdnw4cPp0aMH3377LadPa9czadSoET179sTb27tMAqyurqVmcT0tGzMVBLjbmzocIYQQwugM7phap04d3nvvvQLb//nnH4KDg4stXhUll18P4lfbDisLKfgVQghR9RjUMbU4iqKQl5dnrNNVe/n1IHIrRgghRFVltCREGFd+p9SmkoQIIYSooiQJqaB0a8Z4yMwYIYQQVVOJa0JSUlKKfT01NfWRgxFaqZk5nL+RAcjtGCGEEFVXiZMQJyenYpeSVxRFlpo3kvz1YjwcrXC2VZs4GiGEEKJslDgJ2bFjR1nGIe5zLEHqQYQQQlR9JU5COnToUJZxiPvoZsZIu3YhhBBVmBSmVkC6NWOkXbsQQogqrEIkIYsXL8bX1xcrKytCQ0PZt29fkfvm5OQwZcoU/Pz8sLKyIjAwkG3btj3SOSuS7FwNp5PSALkdI4QQomozeRKyfv16wsPDmThxIgcOHCAwMJCwsDCuXr1a6P7jx4/ns88+Y+HChRw/fpwhQ4bQo0cPDh48WOpzViRnrqaRnafB3qoGdWpamzocIYQQosyoFEVRTBlAaGgobdq0YdGiRQBoNBq8vb0ZPnw4Y8aMKbC/p6cn48aNY+jQobptPXv2xNramjVr1pTqnA9KSUnB0dGR5ORkHBzKdzTiu5hLjPz2MKH1nFn/VttyfW8hhBDiURnyHWrSkZDs7GxiYmLo1KmTbpuZmRmdOnViz549hR6TlZWFlZWV3jZra2t27dr1SOdMSUnR+zGVe51SpR5ECCFE1Vai2TEvvvhiiU+4cePGEu97/fp18vLycHNz09vu5ubGyZMnCz0mLCyMuXPn8sQTT+Dn50dUVBQbN27UrVtTmnNGREQwefLkEsddlnSdUqUeRAghRBVXopEQR0dH3Y+DgwNRUVH8/fffutdjYmKIiorC0bHsf3ufP38+DRs2JCAgALVazbBhwxg4cCBmZqUf1Bk7dizJycm6n4sXLxox4pJTFEU3PVeKUoUQQlR1JRoJWbFihe7xBx98QK9evVi6dCnm5tol5vPy8nj77bcNrp9wcXHB3NycpKQkve1JSUm4u7sXekzt2rXZvHkzmZmZ3LhxA09PT8aMGUP9+vVLfU5LS0ssLS0Nir0sXLp1h9TMXNTmZjRwtTN1OEIIIUSZMnj4YPny5YwcOVKXgACYm5sTHh7O8uXLDTqXWq2mdevWREVF6bZpNBqioqJo27b4okwrKyu8vLzIzc1lw4YNdOvW7ZHPaWr5/UEaudthYW7yiUtCCCFEmSpxx9R8ubm5nDx5En9/f73tJ0+eRKPRGBxAeHg4/fv3Jzg4mJCQECIjI0lPT2fgwIEA9OvXDy8vLyIiIgDYu3cvCQkJBAUFkZCQwKRJk9BoNIwePbrE56yojt8tSpVOqUIIIaoDg5OQgQMHMmjQIOLi4ggJCQG0icGMGTNK9SXfu3dvrl27xoQJE0hMTCQoKIht27bpCkvj4+P16j0yMzMZP348Z8+exc7Oji5durB69WqcnJxKfM6KStq1CyGEqE4M7hOi0WiYPXs28+fP58qVKwB4eHjw7rvv8v777+vdpqmsTNUnpG1EFFeSM/l2SFva+DqX2/sKIYQQxmLId6jBIyFmZmaMHj2a0aNH6/pplHdDr6roZno2V5IzAQhwtzdxNEIIIUTZK1X1Y25uLr/++ivr1q1DpVIBcPnyZdLS0owaXHWS3x/Et5YN9lYWJo5GCCGEKHsGj4RcuHCBzp07Ex8fT1ZWFs888wz29vbMnDmTrKwsli5dWhZxVnnHr9wtSpX+IEIIIaoJg0dC3n33XYKDg7l16xbW1vcWWOvRo4fetFhhmPzpudKuXQghRHVh8EjIH3/8wZ9//olardbb7uvrS0JCgtECq2507dplZowQQohqwuCREI1Go1un5X6XLl3C3l4KKkvjTnYecde09TTSrl0IIUR1YXAS8uyzzxIZGal7rlKpSEtLY+LEiXTp0sWYsVUbsUmpaBRwsVNT29707eOFEEKI8mDw7Zg5c+YQFhZGkyZNyMzM5NVXX+X06dO4uLiwbt26soixyjuW3ynV01E320gIIYSo6gxOQurUqcPhw4dZv349hw8fJi0tjUGDBtGnTx+9QlVRclIPIoQQojoyOAkBqFGjBn369KFPnz7GjqdaujczRpIQIYQQ1YfBNSHm5uZ07NiRmzdv6m1PSkqqEi3by1ueRuFk4t2REElChBBCVCMGJyGKopCVlUVwcDDHjh0r8JowzLnraWTmaLBRm+Nby9bU4QghhBDlxuAkRKVSsWHDBrp27Urbtm35/vvv9V4Thsm/FRPgbo+5mVw/IYQQ1UepRkLMzc2ZP38+s2fPpnfv3nz88ccyClJKx6VTqhBCiGqqVIWp+QYPHkzDhg35v//7P37//XdjxVStHL8i9SBCCCGqJ4NHQnx8fPQKUDt27Mhff/3FxYsXjRpYdaAoiu52jEzPFUIIUd0YPBJy7ty5AtsaNGjAwYMHSUpKMkpQ1UVSShY307MxN1Ph7y4t74UQQlQvBo+EFMXKygofHx9jna5ayO+U6lfbFisLmd4shBCieinRSIizszOnTp3CxcWFmjVrFjsL5sH+IaJoUpQqhBCiOitREjJv3jzdCrn3L14nHo3UgwghhKjOSpSE9O/fv9DH4tHkz4yRdu1CCCGqoxIlISkpKSU+oYODfKGWREpmDvE3MwCZniuEEKJ6KlES4uTk9NBuqIqioFKpyMvLM0pgVd2Ju7divJyscbJRmzgaIYQQovyVKAnZsWNHWcdR7eTfimks9SBCCCGqqRIlIR06dCizABYvXsysWbNITEwkMDCQhQsXEhISUuT+kZGRLFmyhPj4eFxcXHjppZeIiIjAysoKgNTUVD766CM2bdrE1atXadmyJfPnz6dNmzZl9hlK49hlqQcRQghRvZW6bXtGRgbx8fFkZ2frbW/RokWJz7F+/XrCw8NZunQpoaGhREZGEhYWRmxsLK6urgX2X7t2LWPGjGH58uW0a9eOU6dOMWDAAFQqFXPnzgXgjTfe4OjRo6xevRpPT0/WrFlDp06dOH78OF5eXqX9uEaXPz1X6kGEEEJUVyrFwJXnrl27xsCBA/n5558Lfd2QmpDQ0FDatGnDokWLANBoNHh7ezN8+HDGjBlTYP9hw4Zx4sQJoqKidNvef/999u7dy65du7hz5w729vZ8//33PP/887p9WrduzXPPPcfHH39corhSUlJwdHQkOTm5TApts3M1NJ24jZw8hV0fdKROTRujv4cQQghhCoZ8hxrcMXXEiBHcvn2bvXv3Ym1tzbZt21i1ahUNGzZky5YtJT5PdnY2MTExdOrU6V4wZmZ06tSJPXv2FHpMu3btiImJYd++fQCcPXuWn376iS5dugCQm5tLXl6e7tZMPmtra3bt2lVkLFlZWaSkpOj9lKXTV1PJyVNwtLbAy8m6TN9LCCGEqKgMvh3z22+/8f333xMcHIyZmRk+Pj4888wzODg4EBERoTcCUZzr16+Tl5eHm5ub3nY3NzdOnjxZ6DGvvvoq169f57HHHkNRFHJzcxkyZAgffvghAPb29rRt25apU6fSuHFj3NzcWLduHXv27KFBgwZFxhIREcHkyZNLeAUe3f1Nyh4260gIIYSoqgweCUlPT9fVa9SsWZNr164B0Lx5cw4cOGDc6B4QHR3N9OnT+fTTTzlw4AAbN25k69atTJ06VbfP6tWrURQFLy8vLC0tWbBgAa+88gpmZkV/1LFjx5KcnKz7KesVgaUeRAghhCjFSIi/vz+xsbH4+voSGBjIZ599hq+vL0uXLsXDw6PE53FxccHc3LzAyrtJSUm4u7sXesxHH31E3759eeONNwBt4pOens7gwYMZN24cZmZm+Pn5sXPnTtLT00lJScHDw4PevXtTv379ImOxtLTE0tKyxLE/quPSrl0IIYQwfCTk3Xff5cqVKwBMnDiRn3/+mbp167JgwQKmT59e4vOo1Wpat26tV2Sq0WiIioqibdu2hR6TkZFRYETD3Fy7+uyD9bW2trZ4eHhw69Yttm/fTrdu3UocW1nSaJR77dq9JAkRQghRfRk8EvLaa6/pHrdu3ZoLFy5w8uRJ6tati4uLi0HnCg8Pp3///gQHBxMSEkJkZCTp6ekMHDgQgH79+uHl5UVERAQAXbt2Ze7cubRs2ZLQ0FDOnDnDRx99RNeuXXXJyPbt21EUBX9/f86cOcOoUaMICAjQndPULt7KIC0rF3UNM/xq25k6HCGEEMJkSt0nJJ+NjQ2tWrUq1bG9e/fm2rVrTJgwgcTERIKCgti2bZuuWDU+Pl5v5GP8+PGoVCrGjx9PQkICtWvXpmvXrkybNk23T3JyMmPHjuXSpUs4OzvTs2dPpk2bhoWFxaN9UCPJvxXj72aPhbnBA1FCCCFElWFwnxBFUfjuu+/YsWMHV69eRaPR6L2+ceNGowZoCmXZJ2T29lgW7ThD72BvZr5U8sZuQgghRGVgyHeowSMhI0aM4LPPPqNjx464ubnJFFMDXbi7cm5DN7kVI4TQysvLIycnx9RhCFEiFhYWuhKIR2VwErJ69Wo2btyoaxAmDHM7Q9vmvqasnCtEtacoComJidy+fdvUoQhhECcnJ9zd3R95IMLgJMTR0bHY6a6ieCl3tL/tOFpXjBoVIYTp5Ccgrq6u2NjYyMiyqPAURSEjI4OrV68CGNSaozAGJyGTJk1i8uTJLF++HGtraTluqNt3kxAnG0lChKjO8vLydAlIrVq1TB2OECWW/91/9epVXF1dH+nWjMFJSK9evVi3bh2urq74+voWmHVS1l1TK7tkGQkRQoCuBsTGRhawFJVP/t/bnJyc8k1C+vfvT0xMDK+99poUphpIo1HuJSEyEiKEAPl/qKiUjPX31uAkZOvWrWzfvp3HHnvMKAFUJ6lZueRPiJaRECGEENWdwd2yvL29jd47o7pIztCOglhbmGNZwzjTm4QQorLz9fUlMjKyzN/nySefZMSIEWX+PvkGDBhA9+7dDTqmvK5FRWFwEjJnzhxGjx7N+fPnyyCcqu32He30XBkFEUJUZsb+Mt+/fz+DBw822vkqivnz57Ny5UqjnvP8+fOoVCoOHTpk1POaSqnWjsnIyMDPzw8bG5sChak3b940WnBVTbLMjBFCVBOKopCXl0eNGg//mqldu3Y5RFT+HB0dTR1ChWfwSEhkZCSff/45y5cvZ9GiRcybN0/vRxTt9t3bMQ4yEiKEKISiKGRk55rkp6QreAwYMICdO3cyf/58VCoVKpWK8+fPEx0djUql4ueff6Z169ZYWlqya9cu4uLi6NatG25ubtjZ2dGmTRt+/fVXvXM+eAtCpVKxbNkyevTogY2NDQ0bNmTLli16xxw9epTnnnsOOzs73Nzc6Nu3L9evX9e9np6eTr9+/bCzs8PDw4M5c+YU+7mSk5MxNzfn77//BrSrujs7O/Ovf/1Lt8+aNWvw9vbWPb948SK9evXCyckJZ2dnunXrpneX4MHbMampqfTp00e3yvu8efMKHVXKyMjg9ddfx97enrp16/L555/rXqtXrx4ALVu2RKVS8eSTTwIQHR1NSEgItra2ODk50b59ey5cuFDsZ64IDBoJycnJYefOnXz00Ue6CyFKTjcSIkmIEKIQd3LyaDJhu0ne+/iUMGzUD/9KmD9/PqdOnaJZs2ZMmTIF0I5k5H/5jhkzhtmzZ1O/fn1q1qzJxYsX6dKlC9OmTcPS0pKvvvqKrl27EhsbS926dYt8n8mTJ/PJJ58wa9YsFi5cSJ8+fbhw4QLOzs7cvn2bp556ijfeeIN58+Zx584dPvjgA3r16sVvv/0GwKhRo9i5cyfff/89rq6ufPjhhxw4cICgoKBC38/R0ZGgoCCio6MJDg7myJEjqFQqDh48SFpaGnZ2duzcuZMOHToA2u/DsLAw2rZtyx9//EGNGjX4+OOP6dy5M//88w9qdcGu2OHh4ezevZstW7bg5ubGhAkTCo1pzpw5TJ06lQ8//JDvvvuO//znP3To0AF/f3/27dtHSEgIv/76K02bNkWtVpObm0v37t158803WbduHdnZ2ezbt69SzLwyaCTEwsKCDRs2lFUsVV5+EiIjIUKIysrR0RG1Wo2NjQ3u7u64u7vr9YmYMmUKzzzzDH5+fjg7OxMYGMhbb71Fs2bNaNiwIVOnTsXPz6/AyMaDBgwYwCuvvEKDBg2YPn06aWlp7Nu3D4BFixbRsmVLpk+fTkBAAC1btmT58uXs2LGDU6dOkZaWxpdffsns2bN5+umnad68OatWrSI3N7fY93zyySeJjo4GtCMLzzzzDI0bN2bXrl26bflJyPr169FoNCxbtozmzZvTuHFjVqxYQXx8vO4c90tNTWXVqlW6mJo1a8aKFSvIy8srsG+XLl14++23adCgAR988AEuLi7s2LEDuHfrqlatWri7u+Ps7ExKSgrJycm88MIL+Pn50bhxY/r3719skldRGFwT0r17dzZv3sx7771XFvFUaelZ2n8AdpYGX3YhRDVgbWHO8SlhJntvYwgODtZ7npaWxqRJk9i6dStXrlwhNzeXO3fuEB8fX+x5WrS4t8q4ra0tDg4Oulbhhw8fZseOHdjZFVwINC4ujjt37pCdnU1oaKhuu7OzM/7+/sW+Z4cOHfjyyy/Jy8tj586dPPvss7i7uxMdHU2LFi04c+aM7vbH4cOHOXPmDPb29nrnyMzMJC4ursC5z549S05ODiEhIbptjo6OhcZ0/2dXqVS4u7vrPnthnJ2dGTBgAGFhYTzzzDN06tSJXr16PXJL9fJg8Ldhw4YNmTJlCrt376Z169bY2trqvf7OO+8YLbiqJiNbm/HaWsr0XCFEQSqVqkS3RCqyB78TRo4cyS+//MLs2bNp0KAB1tbWvPTSS2RnZxd7ngcnPahUKjQaDaBNbLp27crMmTMLHOfh4cGZM2dKFfsTTzxBamoqBw4c4Pfff2f69Om4u7szY8YMAgMD8fT0pGHDhroYWrduzddff13gPI9aaFvcZy/KihUreOedd9i2bRvr169n/Pjx/PLLL3o1LRWRwX/bv/zyS5ycnIiJiSEmJkbvNZVKJUlIMfJHQmxlJEQIUYmp1epCbyMUZvfu3QwYMIAePXoA2i/vR23x0KpVKzZs2ICvr2+hs2/8/PywsLBg7969ulsSt27d4tSpU7rbKYVxcnKiRYsWLFq0CAsLCwICAnB1daV37978+OOPese2atWK9evX4+rqWqLeWfXr18fCwoL9+/frYkpOTubUqVM88cQTJf7s+bUmhV3/li1b0rJlS8aOHUvbtm1Zu3ZthU9CDJ4dc+7cuSJ/zp49WxYxVhm6kZBK/puOEKJ68/X1Ze/evZw/f57r168X+1t6w4YN2bhxI4cOHeLw4cO8+uqrD/2t/mGGDh3KzZs3eeWVV9i/fz9xcXFs376dgQMHkpeXh52dHYMGDWLUqFH89ttvHD16lAEDBmBm9vCvvCeffJKvv/5al3A4OzvTuHFj1q9fr5eE9OnTBxcXF7p168Yff/zBuXPniI6O5p133uHSpUsFzmtvb0///v0ZNWoUO3bs4NixYwwaNAgzMzODCkhdXV2xtrZm27ZtJCUlkZyczLlz5xg7dix79uzhwoUL/O9//+P06dM0bty4xOc1FYOTkPspilLiaV0C0rO1IyE2arkdI4SovEaOHIm5uTlNmjShdu3axdZ3zJ07l5o1a9KuXTu6du1KWFgYrVq1eqT39/T0ZPfu3eTl5fHss8/SvHlzRowYgZOTky7RmDVrFo8//jhdu3alU6dOPPbYY7Ru3fqh5+7QoQN5eXm62g/QJiYPbrOxseH333+nbt26vPjiizRu3JhBgwaRmZlZ5MjI3Llzadu2LS+88AKdOnWiffv2NG7cGCsrqxJ/9ho1arBgwQI+++wzPD096datGzY2Npw8eZKePXvSqFEjBg8ezNChQ3nrrbdKfF5TUSmlyCK++uorZs2axenTpwFo1KgRo0aNom/fvkYP0BRSUlJwdHQkOTnZqC3qey3dw77zN/m0Tyu6NK/4BUNCiLKTmZnJuXPnqFevnkFfQqLqSE9Px8vLizlz5jBo0CBTh2OQ4v7+GvIdavB9gblz5/LRRx8xbNgw2rdvD8CuXbsYMmQI169fl1kzxZCRECGEqL4OHjzIyZMnCQkJITk5WddnpVu3biaOzHQMTkIWLlzIkiVL6Nevn27bv//9b5o2bcqkSZMkCSnGvdkxUhMihBDV0ezZs4mNjUWtVtO6dWv++OMPXFxcTB2WyRj8bXjlyhXatWtXYHu7du24cuWKUYKqqvJnx8hIiBBCVD8tW7YsMKu0ujO4MLVBgwb897//LbB9/fr1uvnTonAyO0YIIYS4x+AkZPLkyUyYMIHOnTszdepUpk6dSufOnZk8ebLu/pYhFi9ejK+vL1ZWVoSGhura8hYlMjISf39/rK2t8fb25r333iMzM1P3el5enm5tG2tra/z8/Jg6darJZ/EoinKvJkSalQkhhBCG347p2bMne/fuZd68eWzevBmAxo0bs2/fPlq2bGnQudavX094eDhLly4lNDSUyMhIwsLCiI2NxdXVtcD+a9euZcyYMSxfvpx27dpx6tQpBgwYgEqlYu7cuQDMnDmTJUuWsGrVKpo2bcrff//NwIEDcXR0NGkjtcwcDfl5kIyECCGEEKVIQgBat27NmjVrHvnN586dy5tvvsnAgQMBWLp0KVu3bmX58uWMGTOmwP5//vkn7du359VXXwW0DXNeeeUV9u7dq7dPt27deP7553X7rFu37qEjLGUtfxQEjLdGgxBCCFGZPVKzskeRnZ1NTEwMnTp1uheMmRmdOnViz549hR7Trl07YmJidAnF2bNn+emnn+jSpYvePlFRUZw6dQrQLjK0a9cunnvuuSJjycrKIiUlRe/H2DKytPUgNmpzzMwq/vLKQgghRFkr8UhISVrLqlSqhy6VnO/69evk5eXh5uamt93NzY2TJ08Wesyrr77K9evXeeyxx1AUhdzcXIYMGcKHH36o22fMmDGkpKQQEBCAubk5eXl5TJs2jT59+hQZS0REBJMnTy5R3KV1r0eI3IoRQgghwICRkE2bNrFx48ZCf0aNGoWlpWWhCwkZU3R0NNOnT+fTTz/lwIEDbNy4ka1btzJ16lTdPv/973/5+uuvWbt2LQcOHGDVqlXMnj2bVatWFXnesWPHkpycrPu5ePGi0WPPyM5fvE5uxQghhLGtXLkSJyenMn+f6OhoVCoVt2/fLvP3Ajh//jwqlYpDhw6V+JjyuhbGUOKsobCObrGxsYwZM4YffviBPn36GDQ7xsXFBXNzc5KSkvS2JyUl4e7uXugxH330EX379uWNN94AoHnz5qSnpzN48GDGjRuHmZkZo0aNYsyYMbz88su6fS5cuEBERAT9+/cv9LyWlpZYWlqWOPbSSNPdjpGRECGEiI6OpmPHjty6dcsoX5i9e/fWuzVfVXh7e3PlyhWjNzQbMGAAt2/f1k0wMZVS1YRcvnyZN998k+bNm5Obm8uhQ4dYtWoVPj4+JT5Hfre4qKgo3TaNRkNUVBRt27Yt9JiMjIwCqyCam2tHFvKn4Ba1z6Ou2vioMu42KrOVRmVCCFFi2dnZJdrP2tq60FmVlZ25uTnu7u5lfqfBVAxKQpKTk/nggw9o0KABx44dIyoqih9++IFmzZqV6s3Dw8P54osvWLVqFSdOnOA///kP6enputky/fr1Y+zYsbr9u3btypIlS/jmm284d+4cv/zyCx999BFdu3bVJSNdu3Zl2rRpbN26lfPnz7Np0ybmzp1Ljx49ShWjsaTfbVRmIy3bhRBFURTITjfNjwG9lHx9fYmMjNTbFhQUxKRJk3TPVSoVy5Yto0ePHtjY2NCwYUO2bNkCaG8xdOzYEYCaNWuiUqkYMGAAoF2xdtiwYYwYMQIXFxfCwsIA7WzK5s2bY2tri7e3N2+//TZpaWm693vwFsSkSZMICgpi9erV+Pr64ujoyMsvv0xqaqpuH41GQ0REhK6vVGBgIN99953e5/rpp59o1KgR1tbWdOzYkfPnzxd7bUaOHMkLL7ygex4ZGYlKpWLbtm26bQ0aNGDZsmW658uWLdOtphsQEMCnn36qe62w2zFbtmyhYcOGWFlZ0bFjR1atWlXoLaLt27fTuHFj7Ozs6Ny5s66r+aRJk1i1ahXff/89KpUKlUpFdHQ02dnZDBs2DA8PD6ysrPDx8SEiIqLYz/uoSvyN+MknnzBz5kzc3d1Zt26dURbc6d27N9euXWPChAkkJiYSFBTEtm3bdMWq8fHxeqMa48ePR6VSMX78eBISEqhdu7Yu6ci3cOFCPvroI95++22uXr2Kp6cnb731FhMmTHjkeB+FriZERkKEEEXJyYDpnqZ57w8vg9rWqKecPHkyn3zyCbNmzWLhwoX06dOHCxcu4O3tzYYNG+jZsyexsbE4ODhgbW2tO27VqlX85z//Yffu3bptZmZmLFiwgHr16nH27FnefvttRo8erfeF/aC4uDg2b97Mjz/+yK1bt+jVqxczZszQfWdERESwZs0ali5dSsOGDfn999957bXXqF27Nh06dODixYu8+OKLDB06lMGDB/P333/z/vvvF/uZO3TowLJly8jLy8Pc3JydO3fi4uJCdHQ0nTt3JiEhgbi4OJ588kkAvv76ayZMmMCiRYto2bIlBw8e5M0338TW1rbQEoJz587x0ksv8e677/LGG29w8OBBRo4cWWC/jIwMZs+ezerVqzEzM+O1115j5MiRfP3114wcOZITJ06QkpLCihUrAHB2dmbBggVs2bKF//73v9StW5eLFy+WSY3k/UqchIwZMwZra2saNGjAqlWriiz03Lhxo0EBDBs2jGHDhhX6WnR0tN7zGjVqMHHiRCZOnFjk+ezt7YmMjCyQpZtautSECCGqmQEDBvDKK68AMH36dBYsWMC+ffvo3Lkzzs7OALi6uhaoCWnYsCGffPKJ3rYRI0boHvv6+vLxxx8zZMiQYpMQjUbDypUrsbe3B6Bv375ERUUxbdo0srKymD59Or/++quuBKB+/frs2rWLzz77jA4dOrBkyRL8/PyYM2cOAP7+/hw5coSZM2cW+Z6PP/44qampHDx4kNatW/P7778zatQoXe1FdHQ0Xl5eNGjQAICJEycyZ84cXnzxRQDq1avH8ePH+eyzzwpNQj777DP8/f2ZNWuWLqajR4/q/TIOkJOTw9KlS/Hz8wO037X5dZt2dnZYW1uTlZWlV4MZHx9Pw4YNeeyxx1CpVAaVWJRWib8R+/Xr99ApuqJoMjtGCPFQFjbaEQlTvbeRtWjRQvfY1tYWBwcHrl69+tDjWrduXWDbr7/+SkREBCdPniQlJYXc3FwyMzPJyMjAxqbw2H19fXUJCICHh4fu/c+cOUNGRgbPPPOM3jHZ2dm67t8nTpwgNDRU7/WiahbzOTk5ERgYSHR0NGq1GrVazeDBg5k4cSJpaWns3LmTDh06AJCenk5cXByDBg3izTff1J0jNzcXR0fHQs8fGxtLmzZt9LaFhIQU2M/GxkaXgDz42YsyYMAAnnnmGfz9/encuTMvvPACzz77bLHHPKoSJyErV64swzCqPhkJEUI8lEpl9FsiZcHMzKzAelw5OTkF9rOwsNB7rlKpSjRJwNZW/xqcP3+eF154gf/85z9MmzYNZ2dndu3axaBBg8jOzi4yCSnu/fPrSbZu3YqXl5fefo86W/LJJ58kOjoaS0tLOnTogLOzM40bN2bXrl3s3LlTd0snP4YvvviiQLKTX+dYWoV99oetodaqVSvOnTvHzz//zK+//kqvXr3o1KlTgToZY5JvxHKSPxJiJyMhQohKrnbt2roiR4CUlBTOnTtn0DnUajWgXXT0YWJiYtBoNMyZM0dXJ1jYau6GaNKkCZaWlsTHx+tGJh7UuHFjXTFtvr/++uuh5+7QoQPLly+nRo0adO7cGdAmJuvWrePUqVO6ehA3Nzc8PT05e/ZssQ017+fv789PP/2kt23//v0lOvZ+arW60Gvv4OBA79696d27Ny+99BKdO3fm5s2buttnxiZJSDnRzY6RkRAhRCX31FNPsXLlSrp27YqTkxMTJkww+Dd3Hx8fVCoVP/74I126dMHa2ho7O7tC923QoAE5OTksXLiQrl27snv3bpYuXfpIn8He3p6RI0fy3nvvodFoeOyxx0hOTmb37t04ODjQv39/hgwZwpw5cxg1ahRvvPEGMTExJbor8MQTT5CamsqPP/7IjBkzAG0S8tJLL+Hh4UGjRo10+06ePJl33nkHR0dHOnfuTFZWFn///Te3bt0iPDy8wLnfeust5s6dywcffMCgQYM4dOiQLiZDSiZ8fX3Zvn07sbGx1KpVC0dHRxYuXIiHhwctW7bEzMyMb7/9Fnd39zJtfGaytWOqG12fEBkJEUJUcmPHjqVDhw688MILPP/883Tv3l2v/qAkvLy8mDx5MmPGjMHNza3ICQoAgYGBzJ07l5kzZ9KsWTO+/vpro0wdnTp1Kh999BERERE0btyYzp07s3XrVurVqwdA3bp12bBhA5s3byYwMJClS5cyffr0h563Zs2aNG/enNq1axMQEABoExONRlNg1OWNN95g2bJlrFixgubNm9OhQwdWrlypi+FB9erV47vvvmPjxo20aNGCJUuWMG7cOMCw20hvvvkm/v7+BAcHU7t2bXbv3o29vT2ffPIJwcHBtGnThvPnz/PTTz8V6L1lTCrlYTeJqqGUlBQcHR1JTk7GwcHBKOd8+fM9/HX2JgtfaUnXQBNNwRNCVBiZmZmcO3eOevXqYWVlZepwRCU2bdo0li5dWubTae9X3N9fQ75D5d5AOWnkZk92rgZX+7JtDy+EEKJq+/TTT2nTpg21atVi9+7dzJo1q9iRpIpMkpByMqVb6brKCiGEEPc7ffo0H3/8MTdv3qRu3bq8//77et3FKxNJQoQQQohKZN68ecybN8/UYRiFFKYKIYQQwiQkCRFCCBOSuQGiMjLW31tJQoQQwgTyO1pmZGSYOBIhDJf/9/bBzqyGkpoQIYQwAXNzc5ycnHTredjY2Mj6XKLCUxSFjIwMrl69ipOT0yO3l5ckRAghTCR/BdOSLOomREXi5OSktwJvaUkSIoQQJqJSqfDw8MDV1bXQBeCEqIgsLCweeQQknyQhQghhYubm5kb7n7oQlYkUpgohhBDCJCQJEUIIIYRJSBIihBBCCJOQmpBC5DdhSUlJMXEkQgghROWS/91ZkoZmkoQUIjU1FQBvb28TRyKEEEJUTqmpqTg6Oha7j0qRnsEFaDQaLl++jL29/SM3D0pJScHb25uLFy/i4OBgpAirN7mmxifX1PjkmhqfXFPjK4trqigKqampeHp6YmZWfNWHjIQUwszMjDp16hj1nA4ODvKPxsjkmhqfXFPjk2tqfHJNjc/Y1/RhIyD5pDBVCCGEECYhSYgQQgghTEKSkDJmaWnJxIkTsbS0NHUoVYZcU+OTa2p8ck2NT66p8Zn6mkphqhBCCCFMQkZChBBCCGESkoQIIYQQwiQkCRFCCCGESUgSIoQQQgiTkCTECBYvXoyvry9WVlaEhoayb9++Yvf/9ttvCQgIwMrKiubNm/PTTz+VU6SVhyHX9IsvvuDxxx+nZs2a1KxZk06dOj30v0F1ZOjf03zffPMNKpWK7t27l22AlZCh1/T27dsMHToUDw8PLC0tadSokfz7f4Ch1zQyMhJ/f3+sra3x9vbmvffeIzMzs5yirfh+//13unbtiqenJyqVis2bNz/0mOjoaFq1aoWlpSUNGjRg5cqVZRegIh7JN998o6jVamX58uXKsWPHlDfffFNxcnJSkpKSCt1/9+7dirm5ufLJJ58ox48fV8aPH69YWFgoR44cKefIKy5Dr+mrr76qLF68WDl48KBy4sQJZcCAAYqjo6Ny6dKlco684jL0muY7d+6c4uXlpTz++ONKt27dyifYSsLQa5qVlaUEBwcrXbp0UXbt2qWcO3dOiY6OVg4dOlTOkVdchl7Tr7/+WrG0tFS+/vpr5dy5c8r27dsVDw8P5b333ivnyCuun376SRk3bpyyceNGBVA2bdpU7P5nz55VbGxslPDwcOX48ePKwoULFXNzc2Xbtm1lEp8kIY8oJCREGTp0qO55Xl6e4unpqURERBS6f69evZTnn39eb1toaKjy1ltvlWmclYmh1/RBubm5ir29vbJq1aqyCrHSKc01zc3NVdq1a6csW7ZM6d+/vyQhDzD0mi5ZskSpX7++kp2dXV4hVjqGXtOhQ4cqTz31lN628PBwpX379mUaZ2VVkiRk9OjRStOmTfW29e7dWwkLCyuTmOR2zCPIzs4mJiaGTp066baZmZnRqVMn9uzZU+gxe/bs0dsfICwsrMj9q5vSXNMHZWRkkJOTg7Ozc1mFWamU9ppOmTIFV1dXBg0aVB5hViqluaZbtmyhbdu2DB06FDc3N5o1a8b06dPJy8srr7ArtNJc03bt2hETE6O7ZXP27Fl++uknunTpUi4xV0Xl/R0lC9g9guvXr5OXl4ebm5vedjc3N06ePFnoMYmJiYXun5iYWGZxVialuaYP+uCDD/D09CzwD6m6Ks013bVrF19++SWHDh0qhwgrn9Jc07Nnz/Lbb7/Rp08ffvrpJ86cOcPbb79NTk4OEydOLI+wK7TSXNNXX32V69ev89hjj6EoCrm5uQwZMoQPP/ywPEKukor6jkpJSeHOnTtYW1sb9f1kJERUKTNmzOCbb75h06ZNWFlZmTqcSik1NZW+ffvyxRdf4OLiYupwqgyNRoOrqyuff/45rVu3pnfv3owbN46lS5eaOrRKKzo6munTp/Ppp59y4MABNm7cyNatW5k6daqpQxMlJCMhj8DFxQVzc3OSkpL0ticlJeHu7l7oMe7u7gbtX92U5prmmz17NjNmzODXX3+lRYsWZRlmpWLoNY2Li+P8+fN07dpVt02j0QBQo0YNYmNj8fPzK9ugK7jS/D318PDAwsICc3Nz3bbGjRuTmJhIdnY2arW6TGOu6EpzTT/66CP69u3LG2+8AUDz5s1JT09n8ODBjBs3DjMz+T3bUEV9Rzk4OBh9FARkJOSRqNVqWrduTVRUlG6bRqMhKiqKtm3bFnpM27Zt9fYH+OWXX4rcv7opzTUF+OSTT5g6dSrbtm0jODi4PEKtNAy9pgEBARw5coRDhw7pfv7973/TsWNHDh06hLe3d3mGXyGV5u9p+/btOXPmjC6hAzh16hQeHh7VPgGB0l3TjIyMAolGfpKnyLJopVLu31FlUu5ajXzzzTeKpaWlsnLlSuX48ePK4MGDFScnJyUxMVFRFEXp27evMmbMGN3+u3fvVmrUqKHMnj1bOXHihDJx4kSZovsAQ6/pjBkzFLVarXz33XfKlStXdD+pqamm+ggVjqHX9EEyO6YgQ69pfHy8Ym9vrwwbNkyJjY1VfvzxR8XV1VX5+OOPTfURKhxDr+nEiRMVe3t7Zd26dcrZs2eV//3vf4qfn5/Sq1cvU32ECic1NVU5ePCgcvDgQQVQ5s6dqxw8eFC5cOGCoiiKMmbMGKVv3766/fOn6I4aNUo5ceKEsnjxYpmiW9EtXLhQqVu3rqJWq5WQkBDlr7/+0r3WoUMHpX///nr7//e//1UaNWqkqNVqpWnTpsrWrVvLOeKKz5Br6uPjowAFfiZOnFj+gVdghv49vZ8kIYUz9Jr++eefSmhoqGJpaanUr19fmTZtmpKbm1vOUVdshlzTnJwcZdKkSYqfn59iZWWleHt7K2+//bZy69at8g+8gtqxY0eh/3/Mv479+/dXOnToUOCYoKAgRa1WK/Xr11dWrFhRZvGpFEXGrIQQQghR/qQmRAghhBAmIUmIEEIIIUxCkhAhhBBCmIQkIUIIIYQwCUlChBBCCGESkoQIIYQQwiQkCRFCCCGESUgSIoQoU+fPn0elUlWoFXlPnjzJv/71L6ysrAgKCirxcU8++SQjRowos7iEKA+///47Xbt2xdPTE5VKxebNmw0+h6IozJ49m0aNGmFpaYmXlxfTpk0z+DyShAhRxQ0YMACVSsWMGTP0tm/evBmVSmWiqExr4sSJ2NraEhsbW2CdDGOKjo5GpVJx+/btMnsPIQyVnp5OYGAgixcvLvU53n33XZYtW8bs2bM5efIkW7ZsISQkxODzyCq6QlQDVlZWzJw5k7feeouaNWuaOhyjeJSVZ+Pi4nj++efx8fExclRCVHzPPfcczz33XJGvZ2VlMW7cONatW8ft27dp1qwZM2fO5MknnwTgxIkTLFmyhKNHj+Lv7w9AvXr1ShWLjIQIUQ106tQJd3d3IiIiitxn0qRJBW5NREZG4uvrq3s+YMAAunfvzvTp03Fzc8PJyYkpU6aQm5vLqFGjcHZ2pk6dOqxYsaLA+U+ePEm7du2wsrKiWbNm7Ny5U+/1o0eP8txzz2FnZ4ebmxt9+/bl+vXruteffPJJhg0bxogRI3BxcSEsLKzQz6HRaJgyZQp16tTB0tKSoKAgtm3bpntdpVIRExPDlClTUKlUTJo0qdDzpKen069fP+zs7PDw8GDOnDkF9lm9ejXBwcHY29vj7u7Oq6++ytWrVwHtbaiOHTsCULNmTVQqFQMGDABg27ZtPPbYYzg5OVGrVi1eeOEF4uLiCo1DiPI2bNgw9uzZwzfffMM///zD//3f/9G5c2dOnz4NwA8//ED9+vX58ccfqVevHr6+vrzxxhvcvHnT4PeSJESIasDc3Jzp06ezcOFCLl269Ejn+u2337h8+TK///47c+fOZeLEibzwwgvUrFmTvXv3MmTIEN56660C7zNq1Cjef/99Dh48SNu2benatSs3btwA4Pbt2zz11FO0bNmSv//+m23btpGUlESvXr30zrFq1SrUajW7d+9m6dKlhcY3f/585syZw+zZs/nnn38ICwvj3//+t+5/oFeuXKFp06a8//77XLlyhZEjRxZ6nlGjRrFz506+//57/ve//xEdHc2BAwf09snJyWHq1KkcPnyYzZs3c/78eV2i4e3tzYYNGwCIjY3lypUrzJ8/H9AmOOHh4fz9999ERUVhZmZGjx490Gg0BvyXEML44uPjWbFiBd9++y2PP/44fn5+jBw5kscee0z3y8XZs2e5cOEC3377LV999RUrV64kJiaGl156yfA3LLOl8YQQFcL9K+D+61//Ul5//XVFURRl06ZNyv3/C5g4caISGBiod+y8efMUHx8fvXP5+PgoeXl5um3+/v7K448/rnuem5ur2NraKuvWrVMURVHOnTunAMqMGTN0++Tk5Ch16tRRZs6cqSiKokydOlV59tln9d774sWLCqDExsYqiqJdQbVly5YP/byenp7KtGnT9La1adNGefvtt3XPAwMDi11lOTU1VVGr1cp///tf3bYbN24o1tbWyrvvvlvkcfv371cAJTU1VVGUeyuYPmxV12vXrimAcuTIkWL3E8LYAGXTpk265z/++KMCKLa2tno/NWrUUHr16qUoiqK8+eabev82FUVRYmJiFEA5efKkQe8vNSFCVCMzZ87kqaeeKvK3/5Jo2rQpZmb3BlHd3Nxo1qyZ7rm5uTm1atXS3ZbI17ZtW93jGjVqEBwczIkTJwA4fPgwO3bswM7OrsD7xcXF0ahRIwBat25dbGwpKSlcvnyZ9u3b621v3749hw8fLuEn1L5ndnY2oaGhum3Ozs66+9/5YmJimDRpEocPH+bWrVu6kYz4+HiaNGlS5PlPnz7NhAkT2Lt3L9evX9c77v5rKUR5S0tLw9zcnJiYGMzNzfVey//36eHhQY0aNXT/LgEaN24MaP8OP/jvpDiShAhRjTzxxBOEhYUxduxY3W2DfGZmZmh/MbonJyenwDksLCz0nqtUqkK3GXJrIS0tja5duzJz5swCr3l4eOge29ralvicZS09PZ2wsDDCwsL4+uuvqV27NvHx8YSFhZGdnV3ssV27dsXHx4cvvvgCT09PNBoNzZo1e+hxQpS1li1bkpeXx9WrV3n88ccL3ad9+/bk5uYSFxeHn58fAKdOnQIwuNhbakKEqGZmzJjBDz/8wJ49e/S2165dm8TERL1ExJi9Pf766y/d49zcXGJiYnS/PbVq1Ypjx47h6+tLgwYN9H4MSTwcHBzw9PRk9+7dett3795d7MjEg/z8/LCwsGDv3r26bbdu3dL9jxa0hbY3btxgxowZPP744wQEBBQY/cmfvZOXl6fbduPGDWJjYxk/fjxPP/00jRs35tatWyWOTYhHlZaWxqFDh3T/vs+dO8ehQ4eIj4+nUaNG9OnTh379+rFx40bOnTvHvn37iIiIYOvWrYC20L1Vq1a8/vrrHDx4kJiYGN566y2eeeYZvdGRkpAkRIhqpnnz5vTp04cFCxbobX/yySe5du0an3zyCXFxcSxevJiff/7ZaO+7ePFiNm3axMmTJxk6dCi3bt3i9ddfB2Do0KHcvHmTV155hf379xMXF8f27dsZOHCg3hd4SYwaNYqZM2eyfv16YmNjGTNmDIcOHeLdd98t8Tns7OwYNGgQo0aN4rfffuPo0aMMGDBA7zZU3bp1UavVLFy4kLNnz7JlyxamTp2qdx4fHx9UKhU//vgj165dIy0tjZo1a1KrVi0+//xzzpw5w2+//UZ4eLhBn1GIR/H333/TsmVLWrZsCUB4eDgtW7ZkwoQJAKxYsYJ+/frx/vvv4+/vT/fu3dm/fz9169YFtKOmP/zwAy4uLjzxxBM8//zzNG7cmG+++cbwYIxQ1yKEqMDuL0zNd+7cOUWtVisP/i9gyZIlire3t2Jra6v069dPmTZtWoHC1AfP1aFDhwLFmj4+Psq8efN07wUoa9euVUJCQhS1Wq00adJE+e233/SOOXXqlNKjRw/FyclJsba2VgICApQRI0YoGo2myPcpTF5enjJp0iTFy8tLsbCwUAIDA5Wff/5Zb5+HFaYqirY49bXXXlNsbGwUNzc35ZNPPikQw9q1axVfX1/F0tJSadu2rbJlyxYFUA4ePKjbZ8qUKYq7u7uiUqmU/v37K4qiKL/88ovSuHFjxdLSUmnRooUSHR1doEBQiOpApSgP3AQWQgghhCgHcjtGCCGEECYhSYgQQgghTEKSECGEEEKYhCQhQgghhDAJSUKEEEIIYRKShAghhBDCJCQJEUIIIYRJSBIihBBCCJOQJEQIIYQQJiFJiBBCCCFMQpIQIYQQQpiEJCFCCCGEMIn/B9jvBDAP5uHEAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot the normalized effective dimension for the model\n",
"plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
"plt.plot(\n",
" n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
")\n",
"\n",
"plt.xlabel(\"Number of data\")\n",
"plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples. \n",
"\n",
"Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
"\n",
"We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"pycharm": {
"name": "#%%\n"
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.142810821533203</td></tr><tr><td colspan='2'>Thu Oct 05 02:58:35 2023 UTC</td></tr></table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>© Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import qiskit.tools.jupyter\n",
"\n",
"%qiskit_version_table\n",
"%qiskit_copyright"
]
}
],
"metadata": {
"celltoolbar": "Tags",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.8"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {
"099cd5df51ac4766abb2f96a8bfe2698": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "ButtonModel",
"state": {
"button_style": "primary",
"description": "Clear",
"layout": "IPY_MODEL_46c5542d2e7e4f9baa5e93efec180c61",
"style": "IPY_MODEL_b16908004816405d8e6f9a0d5e695d84",
"tooltip": null
}
},
"0be1d70b55c5426c9838e5c31168b07d": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"margin": "0px 0px 10px 0px"
}
},
"1a74ca867df54391a6a73ef13416353d": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_e705f341f3c94618b6ea29846b09f493",
"style": "IPY_MODEL_cf15ba24c2b641ceb5daac50b6ac6510",
"value": "<h5>Status</h5>"
}
},
"2f844f67efeb407185e8948c4b0feab2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_0be1d70b55c5426c9838e5c31168b07d",
"style": "IPY_MODEL_c0ee0425dce64ea4907c30c54f72c2f0",
"value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
}
},
"4463787546344c92bc78c6a94c2a6a48": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"width": "70px"
}
},
"46c5542d2e7e4f9baa5e93efec180c61": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"grid_area": "right",
"padding": "0px 0px 0px 0px",
"width": "70px"
}
},
"56c6f37c05624f6fa27209d84155286f": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_cb017d30c3de49c395be336ecaaa8474",
"style": "IPY_MODEL_8ac7533d5cc94a4492bceedc9a569754",
"value": "<h5>Message</h5>"
}
},
"5f0959872e1449e38120067b40bc668a": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"width": "145px"
}
},
"68ae99c4c84c482f82bd137d3c731646": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_cff61a9667de4e0fafa9f8940e77904a",
"IPY_MODEL_83a2320a6d9c4db59d2b6e47d0cef028",
"IPY_MODEL_1a74ca867df54391a6a73ef13416353d",
"IPY_MODEL_e0eb9a2d9bf14bb58f2b48444c913f31",
"IPY_MODEL_56c6f37c05624f6fa27209d84155286f"
],
"layout": "IPY_MODEL_af9e9a12d79e4f788ba200fbb20a18a9"
}
},
"6bcfcd54f8e145a7b41e5f5bd5251f55": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLStyleModel",
"state": {
"description_width": "",
"font_size": null,
"text_color": null
}
},
"728b78541cee42e1922c2f31e6b25d0b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"width": "190px"
}
},
"83a2320a6d9c4db59d2b6e47d0cef028": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_5f0959872e1449e38120067b40bc668a",
"style": "IPY_MODEL_849f9b3b68224551bd63d04dfcc4c5cf",
"value": "<h5>Backend</h5>"
}
},
"849f9b3b68224551bd63d04dfcc4c5cf": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLStyleModel",
"state": {
"description_width": "",
"font_size": null,
"text_color": null
}
},
"8ac7533d5cc94a4492bceedc9a569754": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLStyleModel",
"state": {
"description_width": "",
"font_size": null,
"text_color": null
}
},
"af9e9a12d79e4f788ba200fbb20a18a9": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"margin": "0px 0px 0px 37px",
"width": "600px"
}
},
"b16908004816405d8e6f9a0d5e695d84": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "ButtonStyleModel",
"state": {
"font_family": null,
"font_size": null,
"font_style": null,
"font_variant": null,
"font_weight": null,
"text_color": null,
"text_decoration": null
}
},
"c0ee0425dce64ea4907c30c54f72c2f0": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLStyleModel",
"state": {
"description_width": "",
"font_size": null,
"text_color": null
}
},
"c0ef34a0122b4275ac2446ac3759b4e9": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "GridBoxModel",
"state": {
"children": [
"IPY_MODEL_099cd5df51ac4766abb2f96a8bfe2698"
],
"layout": "IPY_MODEL_faefe23ed1a34413bcd72143e8e58806"
}
},
"cb017d30c3de49c395be336ecaaa8474": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {}
},
"cf15ba24c2b641ceb5daac50b6ac6510": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLStyleModel",
"state": {
"description_width": "",
"font_size": null,
"text_color": null
}
},
"cff61a9667de4e0fafa9f8940e77904a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_728b78541cee42e1922c2f31e6b25d0b",
"style": "IPY_MODEL_f8d15c972da14d929107001f68657706",
"value": "<h5>Job ID</h5>"
}
},
"e0eb9a2d9bf14bb58f2b48444c913f31": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_4463787546344c92bc78c6a94c2a6a48",
"style": "IPY_MODEL_6bcfcd54f8e145a7b41e5f5bd5251f55",
"value": "<h5>Queue</h5>"
}
},
"e705f341f3c94618b6ea29846b09f493": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"width": "95px"
}
},
"f8d15c972da14d929107001f68657706": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "HTMLStyleModel",
"state": {
"description_width": "",
"font_size": null,
"text_color": null
}
},
"faefe23ed1a34413bcd72143e8e58806": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"grid_template_areas": "\n \". . . . right \"\n ",
"grid_template_columns": "20% 20% 20% 20% 20%",
"width": "100%"
}
}
},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}