{ "cells": [ { "cell_type": "markdown", "id": "feff33f0-f65b-4910-b170-0c8e9a463d92", "metadata": {}, "source": [ "# NR PDSCH Throughput with HARQ\n", "This notebook demonstrates how to measure the physical downlink shared channel (PDSCH) throughput of a 5G New Radio (NR) link, as specified in the 3GPP NR standard. It is similar to the MATLAB example [NR PDSCH Throughput](https://www.mathworks.com/help/5g/ug/nr-pdsch-throughput.html) and showcases the use of the following NeoRadium features:\n", "\n", "- Carrier and Bandwidth Part classes.\n", "- PDSCH and DMRS objects.\n", "- LDPC and HARQ capabilities.\n", "- CDL channel model and extraction of channel matrix and precoding matrix.\n", "- Resource grids, populating them, and applying channel models to them." ] }, { "cell_type": "code", "execution_count": 2, "id": "71f7bef5-356f-48a4-8fd5-c50e8e57ad80", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import scipy.io\n", "import time\n", "import matplotlib.pyplot as plt\n", "\n", "from neoradium import Carrier, PDSCH, CdlChannel, AntennaPanel, LdpcEncoder, random, HarqEntity, SnrScheduler" ] }, { "cell_type": "code", "execution_count": 3, "id": "011a24de-fc9b-436a-a350-c8656e1ec17f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Carrier Properties:\n", " Cell Id: 1\n", " Bandwidth Parts: 1\n", " Active BWP: 0\n", " Bandwidth Part 0:\n", " Resource Blocks: 51 RBs starting at 0 (612 subcarriers)\n", " Subcarrier Spacing: 30 kHz\n", " CP Type: normal\n", " Bandwidth: 18.36 MHz\n", " symbolsPerSlot: 14\n", " slotsPerSubFrame: 2\n", " nFFT: 1024\n", " frameNo: 0\n", " slotNo: 0\n", "\n" ] } ], "source": [ "# Create a Carrier object with 51 resource blocks and 30KHz subcarrier spacing\n", "carrier = Carrier(numRbs=51, spacing=30)\n", "carrier.print()\n", "bwp = carrier.curBwp # The only bandwidth part in the carrier" ] }, { "cell_type": "code", "execution_count": 4, "id": "95516d14-f43f-49de-8d69-69f160ee27df", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "PDSCH Properties:\n", " mappingType: A\n", " nID: 1\n", " rnti: 1\n", " numLayers: 2\n", " numCodewords: 1\n", " modulation: 16QAM\n", " portSet: [0, 1]\n", " symSet: 0 1 2 3 4 5 6 7 8 9 10 11 12 13\n", " prbSet: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n", " 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39\n", " 40 41 42 43 44 45 46 47 48 49 50\n", " interleavingBundleSize: 0\n", " PRG Size: Wideband\n", " Bandwidth Part:\n", " Resource Blocks: 51 RBs starting at 0 (612 subcarriers)\n", " Subcarrier Spacing: 30 kHz\n", " CP Type: normal\n", " Bandwidth: 18.36 MHz\n", " symbolsPerSlot: 14\n", " slotsPerSubFrame: 2\n", " nFFT: 1024\n", " frameNo: 0\n", " slotNo: 0\n", " DMRS:\n", " configType: 2\n", " nIDs: []\n", " scID: 0\n", " sameSeq: 1\n", " symbols: Single\n", " typeA1stPos: 2\n", " additionalPos: 2\n", " cdmGroups: [0, 0]\n", " deltaShifts: [0, 0]\n", " allCdmGroups: [0]\n", " symSet: [ 2 7 11]\n", " REs (before shift): [0, 1, 6, 7]\n", " epreRatioDb: 0 (dB)\n", "\n", "\n", "HARQ Entity Properties:\n", " HARQ Type: IR\n", " Num. Processes: 16\n", " Num. Codewords: 1\n", " RV sequence: [0, 2, 3, 1]\n", " maxTries: 4\n", " Encoder:\n", " Base Graph: 1\n", " Modulation: 16QAM\n", " Number of layers: 2\n", " Target Rate: 0.478515625\n", " Decoder:\n", " Base Graph: 1\n", " Modulation: 16QAM\n", " Number of layers: 2\n", "\n", "\n", "CDL-C Channel Properties:\n", " carrierFreq: 4 GHz\n", " normalizeGains: True\n", " normalizeOutput: True\n", " txDir: Downlink\n", " filterLen: 16 samples\n", " delayQuantSize: 64\n", " stopBandAtten: 80 dB\n", " dopplerShift: 5 Hz\n", " coherenceTime: 84.628 milliseconds\n", " delaySpread: 300 ns\n", " ueDirAZ: 0.0°, 90.0°\n", " Cross Pol. Power: 7 dB\n", " angleSpreads: 2° 15° 3° 7°\n", " TX Antenna:\n", " Total Elements: 8\n", " spacing: 0.5𝜆, 0.5𝜆\n", " shape: 1 rows x 4 columns\n", " polarization: x\n", " RX Antenna:\n", " Total Elements: 2\n", " spacing: 0.5𝜆, 0.5𝜆\n", " shape: 1 rows x 1 columns\n", " polarization: +\n", " hasLOS: False\n", " NLOS Paths (24):\n", " Delays (ns): 0.000 62.97 66.57 69.87 65.28 190.9 193.4 196.8 197.5 238.0 246.3 280.0\n", " 368.5 392.4 651.1 813.1 1277. 1380. 1647. 1682. 1891. 1991. 2112. 2595.\n", " Powers (dB): -4.40 -1.20 -3.50 -5.20 -2.50 0.000 -2.20 -3.90 -7.40 -7.10 -10.7 -11.1\n", " -5.10 -6.80 -8.70 -13.2 -13.9 -13.9 -15.8 -17.1 -16.0 -15.7 -21.6 -22.8\n", " AODs (Deg): -47 -23 -23 -23 -41 0 0 0 73 -64 80 -97 \n", " -55 -64 -78 103 99 89 -102 92 93 107 119 -124\n", " AOAs (Deg): -101 120 120 120 -128 170 170 170 55 66 -48 47 \n", " 68 -69 82 31 -16 4 -14 10 6 1 -22 34 \n", " ZODs (Deg): 97 99 99 99 101 99 99 99 105 95 106 94 \n", " 104 104 93 104 95 93 92 107 93 93 105 108 \n", " ZOAs (Deg): 88 72 72 72 70 75 75 75 67 64 71 60 \n", " 91 60 61 101 62 67 53 62 52 62 58 57 \n", "\n" ] } ], "source": [ "# Initialize the modulation and code rate.\n", "modulation = '16QAM'\n", "codeRate = 490/1024\n", "\n", "# Create a PDSCH onject with 2 tramsmission layers\n", "pdsch = PDSCH(bwp, interleavingBundleSize=0, numLayers=2, nID=carrier.cellId)\n", "pdsch.setDMRS(prgSize=0, configType=2, additionalPos=2, otherCdmGroups=[])\n", "pdsch.print()\n", "\n", "# Create an LDPC encoder object using base graph 1 and passing modulation and code rate settings\n", "ldpcEncoder = LdpcEncoder(baseGraphNo=1, modulation=modulation, txLayers=pdsch.numLayers, targetRate=codeRate)\n", "\n", "# HARQ configuration:\n", "harqType = \"IR\" # \"IR\" -> \"Incremental Redundancy\", \"CC\" -> \"Chase Combining\"\n", "numProc = 16 # Number of HARQ processes\n", "harq = HarqEntity(ldpcEncoder, harqType, numProc) # Create the HARQ entity\n", "harq.print()\n", "\n", "# Create the CDL channel model\n", "channel = CdlChannel(bwp, 'C', delaySpread=300, carrierFreq=4e9, dopplerShift=5,\n", " txAntenna = AntennaPanel([1,4], polarization=\"x\"), # 8 TX antenna\n", " rxAntenna = AntennaPanel([1,1], polarization=\"+\", beamWidth=[75,360]), # 2 RX antenna, Omni-directional\n", " rxOrientation = [0,0,0]) # Default is [180,0,0]\n", "print(channel)" ] }, { "cell_type": "code", "execution_count": 5, "id": "42548089-5319-4d3a-863b-093806422101", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SNR(dB) Tx Bits Rx Bits Throughput(%) TX Blocks RX Blocks BLER(%) Retry Mean time(Sec.)\n", "------- ---------- ---------- ------------- --------- --------- ------- ---------- ----------\n", "6 30216000 3263328 10.80 1000 108 89.20 3.54 158.70 \n", "5 30216000 423024 1.40 1000 14 98.60 3.94 158.07 \n", "4 30216000 0 0.00 1000 0 100.00 4.00 159.37 \n", "3 30216000 0 0.00 1000 0 100.00 4.00 159.64 \n", "7 30216000 5166936 17.10 1000 171 82.90 3.03 161.71 \n", "8 30216000 6738168 22.30 1000 223 77.70 2.61 167.97 \n", "9 30216000 8218752 27.20 1000 272 72.80 2.19 173.80 \n", "10 30216000 10756896 35.60 1000 356 64.40 1.62 178.26 \n", "11 30216000 12751152 42.20 1000 422 57.80 1.33 184.86 \n", "12 30216000 13566984 44.90 1000 449 55.10 1.20 188.20 \n", "13 30216000 15198648 50.30 1000 503 49.70 0.98 194.23 \n", "14 30216000 18099384 59.90 1000 599 40.10 0.67 204.43 \n", "15 30216000 22208760 73.50 1000 735 26.50 0.36 222.47 \n", "16 30216000 24777120 82.00 1000 820 18.00 0.22 231.26 \n", "17 30216000 26499432 87.70 1000 877 12.30 0.14 238.67 \n", "18 30216000 27345480 90.50 1000 905 9.50 0.10 241.45 \n", "19 30216000 28644768 94.80 1000 948 5.20 0.05 246.40 \n", "20 30216000 29792976 98.60 1000 986 1.40 0.01 251.06 \n", "21 30216000 30095136 99.60 1000 996 0.40 0.00 252.46 \n", "22 30216000 30216000 100.00 1000 1000 0.00 0.00 252.83 \n", "23 30216000 30216000 100.00 1000 1000 0.00 0.00 252.05 \n" ] } ], "source": [ "# Print header lines:\n", "print(\"SNR(dB) Tx Bits Rx Bits Throughput(%) TX Blocks RX Blocks BLER(%) Retry Mean time(Sec.)\")\n", "print(\"------- ---------- ---------- ------------- --------- --------- ------- ---------- ----------\")\n", "\n", "snrScheduler = SnrScheduler(6,1, loSnrVal=0, hiSnrVal=100) # Start at 6 dB, use increments of 0.2 dB\n", "numSlots = 1000 # The number of slots transmitted for each SNR value\n", "for snrDb in snrScheduler:\n", " random.setSeed(123)\n", " channel.restart() # Reset the channel and the bandwidth part associated with it\n", " harq.reset() # Reset HARQ state and buffers\n", "\n", " t0 = time.time() # Start the timer\n", " for s in range(numSlots): # The inner loop doing 'numSlot' transmissions\n", " grid = bwp.createGrid(pdsch.numLayers) # Create a resource grid with 2 layers\n", " pdsch.allocateResources(grid) # Allocat PDSCH resources including DMRS\n", " txBlockSizes = pdsch.getTxBlockSize(codeRate) # Calculate the Transport Block Size (TBS)\n", " numBits = pdsch.getBitSizes(grid) # Total number of PDSCH data bits available in the resource grid\n", "\n", " # Preparing the transport blocks\n", " txBlocks = [] # Transport blocks, one per codeword.\n", " for c in range(harq.numCW):\n", " if harq.needNewData[c]: # New transmission.\n", " txBlocks += [ random.bits(txBlockSizes[c]) ] # Create random bits for new transmissions\n", " else: # Retransmission\n", " txBlocks += [ None ] # Set transport block to None to indicate a retransmission\n", "\n", " # The following function returns a coded, rate-matched bitstream, ready for transmission/retransmission\n", " rateMatchedCodeBlocks = harq.getRateMatchedCodeBlocks(txBlocks, numBits) \n", " \n", " pdsch.populateGrid(grid, rateMatchedCodeBlocks) # Map/modulate the data to the resource grid\n", " \n", " channelMatrix = channel.getChannelMatrix() # Get channel matrix (Assuming perfect channel estimation)\n", " precoder = pdsch.getPrecodingMatrix(channelMatrix) # Get precoding matrix based on the channel matrix\n", " \n", " precodedGrid = grid.precode(precoder) # Perform precoding\n", " \n", " rxGrid = precodedGrid.applyChannel(channelMatrix) # Apply the channel to the precoded resource (Freq. domain)\n", " noisyRxGrid = rxGrid.addNoise(snrDb=snrDb, useRxPower=True) # Add noise (Using RX power to calcualte Noise Power)\n", "\n", " # Calculate the channel matrix with the precoding effect. This is assuming perfect channel estimation. For practical\n", " # channel estimation we can use the DMRS reference signals and use the \"estimateChannelLS\" method of resource grid object.\n", " precodingChannelMatrix = channelMatrix @ precoder[None,...]\n", "\n", " # Use the channel matrix (with precoding effect) to equalize the received resource grid\n", " eqGrid, llrScales = noisyRxGrid.equalize(precodingChannelMatrix)\n", "\n", " # Demodulate the equalized resource grid (eqGrid) to get the Log-Likelihood values\n", " llrs = pdsch.getLLRsFromGrid(eqGrid, pdsch.dataIndices, llrScales) \n", "\n", " # Use HARQ entity to decode the LLRs to transport blocks\n", " decodedTxBlocks, blockErrors = harq.decodeLLRs(llrs, txBlockSizes, numIter=2)\n", "\n", " # Get the statistics from HARQ entity and print them:\n", " print(\"\\r%-7d %-10d %-10d %-13.2f %-9d %-9d %-7.2f %-10.2f %-10.2f\"\n", " %(snrDb, harq.totalTxBits, harq.totalRxBits, harq.throughput, harq.totalTxBlocks, \n", " harq.totalRxBlocks, harq.bler, harq.meanTries, time.time()-t0), end='')\n", " \n", " channel.goNext()\n", " harq.goNext()\n", " \n", " snrScheduler.setData(harq.throughput)\n", " print(\"\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "692be182-a20c-49c3-8da1-63f98e496c4a", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+0AAAIjCAYAAAB20vpjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB8d0lEQVR4nO3dBXiVdf/H8c86gA1Gd3eXgGKghIqBrRjYhYmJj93dXaiPYv0fO1BULEJa6e7ObTDW5399f7i5jQEbbrvvs71f13XY7vsczr6nz+f+VUggEAgIAAAAAAD4TqjXBQAAAAAAgMIR2gEAAAAA8ClCOwAAAAAAPkVoBwAAAADApwjtAAAAAAD4FKEdAAAAAACfIrQDAAAAAOBThHYAAAAAAHyK0A4AAAAAgE8R2gEAvvTzzz8rJCRE//d//6dgtHz5clf/448/7nUpvmT3zd133527/dZbb7l9dr/l9dhjj6lZs2YKCwtTly5d3L7MzEzdfPPNatiwoUJDQzVkyJAyrx8lo0mTJjr//PO9LgMAfI3QDgA+kBNYck7R0dFq1aqVrrrqKm3YsGGPIJtzioqKUu3atXXEEUfowQcf1KZNmwq9/lmzZunUU09V48aN3XXXr19fAwYM0HPPPbfHZbOysjRq1Ch3nQkJCe5v2BfrCy64QFOnTt2j5rz78rL/36FDh/3e9tGjR+vpp58u4j2Fovrmm2/yheKSUpaP1/fff+/C+SGHHOKek/YcN2+++aYL8/acfvvtt3X99dervDwO2dnZeuedd9SrVy/3+qtSpYp7LzjvvPM0adKkQt8Lpk2btsf1WBCuXLnyHq/JvO8fMTEx6tSpk3s87e8CAPwp3OsCAAD/uPfee9W0aVOlpqbq999/10svveS+9M+ePVuxsbG5l7vmmmvUs2dPF7AtqE+YMEF33XWXnnzySX300Uc68sgjcy9r5/Xr10+NGjXSJZdcojp16mjVqlUuADzzzDO6+uqrcy+7a9cunXzyyRozZowOO+ww3XbbbS44WOunXa8FpJUrV6pBgwYlGgLt9l133XUldp3YHRZfeOGFEg/upfV4nXvuuTrzzDPdQaIcP/30k2tJf+ONNxQZGZlvvx14euqpp1TeHgd7bdvlTzzxRJ199tkKDw/XggUL9O2337oeB717997j/9h1f/nll0W6fnvtPvTQQ+73zZs3u8fTDnrY+8gDDzxQzFsHACgLhHYA8JFjjjlGPXr0cL9ffPHFql69ugvin3/+uc4666zcyx166KGulTGvP//8UwMHDtQpp5yiuXPnqm7dum6/fRGPj4/XlClTVLVq1Xz/Z+PGjfm2b7rpJhfYLQwVDGV2UCAYQlKOlJSUfAc64G/W/d1OBZ+f1hqcN7Dn7C/4XP43AoGAO1Bmf8tL1qvmxRdfdAfXXn311XznWWt4YT1pbMjAV199penTp6tbt277/Rv2XnDOOefkbl9++eVq06aN63VjBw0LPgYAAO/RPR4AfCynxXzZsmX7vWznzp3dF/vt27fr+eefz92/ZMkStW/fvtCQU6tWrdzfV69erVdeecV1my+sFdW+zN94440l2spu3XW//vprrVixIrfLrnXFz8u67dqBB/u71rX/qKOO0uLFiwvtim/dhK2HgIV16yWQE/AuuugiN4zA/r/dT9ZjIK+crsb2s7Bx6TYUIK+PP/5Y7dq1c9dnf/fTTz913ZEL1p7DAljz5s1dK7L1kLADKIV1ZV66dKkGDRqkSpUqqV69ei5EWaAsbp12fdZaa/J2h94XOzA0ePBg93etTqv3vvvuc705ivN4FZSWluZacmvWrOm6ep9wwgnuuVZQwTHt9rt1id+5c2fu38q5zLhx4zRnzpzc/Tn3hz1X7DVgz3d7bOwxv+yyy7Rt27Z8f8tqPu644/Tdd9+5g2QW1u25b+z1Y89/Gy9v90OLFi30yCOP5Os+nne+gn09tsV9HOx1bo+3DQcoyP5f3tdrDuspU61atQPuUWH3k9WdnJy8x0G8guy5br12CrL7xno+5D2QaPfNwQcf7A482v3bvXv3Is1PYbejsPtob3MeWA8EO4hprxl7ftlz2J4bea1fv94N77H3EHuc7ICm9WQoeF0A4Fe0tAOAj1ngNvbFtyjsS7MFVBsLnNPV1caxT5w40XVp3tcYc/vyaxN8WTfl4khMTHTdbAvKyMjY7//9z3/+4/6/hbicVvyC43Affvhh10XaDhjYZR999FHXbfiPP/7Id7ktW7a4ngrWxdpaEi2wWXd/C5oW8m1+ABt6YIHbwpSFs2uvvVbFZaH1jDPOUMeOHV03YwuEdp9baCmMdT+2QGTh0UKH1W9DECygR0RE5F7OwvHRRx/tuj/bZazHg/VusMfEwntx2N9au3atxo4dq//+979F+j8Wiuy+HzFihPtpXdDvvPNOJSUlufHjRX28CrIeI++++66GDh3qQpxdrwWr/bG6LRBPnjxZr7/+utvXtWtXt9+e2zt27Mjt5t22bdvc2223wwKadTO3EGwHsGbMmKHx48fnu7+ty7n1XrH/Yy3brVu3dr0zDj/8cK1Zs8bttyElNrxk5MiRWrdu3R5j+ff32Bb3cbDXqrHn6GmnnVakniJxcXHuoIg9VkVtbS8o5yDE/nov2PPeQrWFYBtmk8OG8tjttNdeDht6Ywdo7LWanp6uDz74wN0m6xVQlMe/KOw+HTZsmDvQZQdW7PGzIUV9+/Z1j3nOASXrfWRB3g5w2D47OGGPiQ312d9BJwDwhQAAwHOjRo2y5tTADz/8ENi0aVNg1apVgQ8++CBQvXr1QExMTGD16tXucuPGjXOX+/jjj/d6XZ07dw5Uq1Ytd/v7778PhIWFuVOfPn0CN998c+C7774LpKen5/t/119/vbvuGTNmFKvmfZ3at2+/3+sZPHhwoHHjxnvsz7mtbdu2DaSlpeXuf+aZZ9z+WbNm5e47/PDD3b6XX34533U8/fTTbv+7776bu89ut90PlStXDiQlJeX7W/Yzr2XLlrn9dltzdOzYMdCgQYNAcnJy7r6ff/7ZXS7v7cj5v/YYbt26NXf/559/7vZ/+eWXufuGDRvm9l199dW5+7Kzs919ExkZ6Z4Txa1z+PDhbl9RpaSk7LHvsssuC8TGxgZSU1P3+3gVZubMma6GK6+8Mt/+oUOHuv133XXXHs8nuy1575dKlSrtcb32eBd8bv3222/u/7/33nv59o8ZM2aP/Va/7bPz8rrvvvvc31u4cGG+/bfeeqt7/axcubLYj21xH4fzzjvPXd5ewyeddFLg8ccfD8ybN2+Py+V9L9i+fbu7/AknnLDP+87utzZt2rjnk53mz58fuOmmm9z12OO6PwsWLHCXfe655/Ltt8fXXk95n0MFn0/2uuvQoUPgyCOPzLffHgurNYc9Jwq7vwo+P+z1V7Vq1cAll1yS73Lr168PxMfH5+7ftm2b+3+PPfbYfm8fAPgV3eMBwEf69+/vuhFb11xrtbJWTOt6vbdW3MLY/7HWvxzW3d1a2q3Vy8a9W2ugtUzZdX7xxRe5l7MWVWNdTIvDuv9aq1XBk81KXRKs1TTvmGbrCmusNTMv6/Zqly04CZi1COadD8BaQK0V1lpqf/nll2LVYq2JNhO/zeSdt4XZWmet5X1vrZPWfXl/9RvrDZDDWj5t21opf/jhB5W2vOO57fljvSesVmu9nD9//gFdp93/xu7vvEpj0kFrnbbx2vZ8t9pzTtYt2x4r61Kfl/W6sNdBweuw22yPV97rsNel9YT49ddfD/ixLSobEmC9A6w+e+1bDxPrSWDDQqwHQGHsdtt9aq9na2HeF3ss7T3GTjaW3XpR2HtDwSEghbFZ7G0M/Ycffpi7z+4X6/Z+/PHH53sO5f3deqNYDw27f6w3QEmw9xjrLWOv7byPlQ3jsZn3cx7vnDkRbAhFwWESABAs6B4PAD5iAdi+GNuM0da927rsWtfw4rAwWjB425jVTz75xAVAC+4WBqx7s3Wnnzlzphufbd1sTd7AXxQHHXRQ7uR5eeUEn3/LuigXvF5T8Au4HYQoOGGZjb1u2bLlHvdhTndqO784ci5v45wLsn2FBZKi1m812uzgedlzwZTF2FvrPnz77be77us5B3ByWOA6EHZ/2e2yMd952fO6pC1atMjVWdi4b1NwvLaF4sKu46+//nKBtijXUdTHtjjs/ho+fLg72ZAP69b/8ssvu+ErdiDvt99+K/T/2VAPe01b93Wbn2BvrDv4a6+95sah2/AbG2pgE9zZ2PaisAMVNl+EHUCw15yFYbtfbH9e1g3+/vvvd+8vNq9Bjv3NrVBU9liZvCtl5JXzfmYH86zr/A033ODeU234ic1nYAfe8nbxBwA/I7QDgI/sLQAXlY0jX7hw4V7HrluotQBvJwuE1jJtrYs2dtpa3Yy1JFtrml/sbTbrvBO0mX8z8/fegkTeSdhKu34v67QWS+stYEHHxs9byLYQZwchbrnllqBYw9tqtMD+3nvvFXp+wSBe2PPFrsNa6m1t+MLkHEQpjce2MDaXhbWC28nmZrCeIXYgJGfse2Gt7Rba99XabhO2Wc+BHDbpnY2DtyD+7LPP7rcmC+c2xt/eN+zv2VKQ9rdtPoYcdmDBarZJIW02fJv4zXq4WC8CmwegJJ7jOc9JG9deWPi2A585rE7rCfDZZ5+5yQfvuOMONx+CHaCyeRIAwO8I7QBQjlg3VZt8rWC338LkHBywCbaMTeJmIcQmDSvuZHT/Rkm1vBXGwo21nNoX/Lyt7TndvXPCT04LqYXXvAq2xOdcvuDs9XvbVxxWo3WrzhsM7QCMyZksq6h1Fvd+tdZSa9W13hgWtHIUtmpBca7X7q+cFt28res2CVxJswMNNozAQuiBHsCx67CeKnlDrV+e3/Z6tdBur9fCQntOOLXJ8u65554iL4lnw1hs4kabPd+64hfsPVCQ9VCwg4vWRd6Gb9hzZsiQIa5FO8f//vc/d9DHAnLe/Rba9yfvczzvbSj4HM/pvWEHaoryeNnlrbXdTtZKbwcmn3jiCfd+BwB+x5h2ACgnrNu7fWm3L73WtTaHje0srOUvZ7xxTpiycfQ2i7bNPG9rNhdk4cu+5Ba2XNe/YS1/B9r9en+OPfZYN9N13jG4Nhu73T4b52yty8ZCkB2wKDhm2VoJ87Ll0KwXwzvvvOPCXQ4LU9ZD4d/Ku1SfPWa2bS2UNp65OHXm3K+FBfzC5LQY532e2FCKvV1vUR8vOxBkCrbgFpyFvSScfvrprjXWlqkryB7zotwPdh02/4OFzYLs/9v1FFdxHgd7rs6dO3eP/fZY/Pjjj+7AU2FDMwq2tlv3eOuWXlTWs8B66Tz55JNFury1tk+aNElvvvmmGwJTsGu8PZ/sYEXe1nEb4mEt3fuTE8bzPsdt2b+CyzTagUnrGfLggw8WulJFzpr2NidDamrqHn/DhhDl7bYPAH5GSzsABCHrfmpfRO1Lcc64V5uEyr6023j1vN1FbZkj++J60kknuS7wFgBsGSsLstaCm3fyNgvl1ipqE4dZC5qN/bSDALY0knWHtRbqvMs6lQSbKMxqsaXGrNu+hWnryloSLr30UteCaEu82RrudnutN4LdXxYcc8b+2/1my1FZmLewYV/qbUxuYetWW0iwNZ6tRdfuOxu/bOHawnzeIF9c1jJpy7zZElY2kZaNYbbl5azbck7X7uLUaferscfSAo4Fqb09drYUmz3O9rft8nbd1u24sIM9xXm8rDXTJgqz8G9B3/6Ohc9/2yuhMHYAxpZYs27PFlgHDhzoDnhYq6o9d20JsrzriBfmpptucq8je97bc8ZuqwVGOyBjzxsLnjVq1ChWXcV5HOyAmLVi2zhtO1Bjr2N7bN9///3cg3L7+/s5Y9vt8jkHDPbH5rSwA1y2tJ51Hd/fEpN2cMNa5e2UkJCwR0u3LelmBwCsy7wt9We3webrsAMO1vNlX+xxs9Z+W0bRHg+7v+zggL0G7H0ohwV2W97NegVZ9367T3MuY68be33a69J6q9h9aTXb7bRu8/YeuWHDhhJ/LwOAUuP19PUAgH+WM5oyZco+L5ezzFPOKSIiIlCzZs3AYYcdFnjggQcCGzdu3OP/fPvtt4ELL7zQLfVkyzLZEmItWrRwy4tt2LBhj8tnZmYGXn/99cChhx7qlk6yv2HLMl1wwQX5loPbX82FLctVmB07drglwGz5przLpu1tebvCljfb19+y22i116hRw912W7It7//NYUtgnXLKKW6JM1s+y5Y7mz179h5/y9hyfHZ/RkVFuWWsvvjiC/d/bV/BOgtbaqrgcmc5y3MtWbIkMHDgQFdD7dq13WWysrIOqE57HO0xtudHSEjIfpcdGz9+fKB3795uicF69erlLg1YcIm5vT1ee7Nr167ANddc45ZHs9t4/PHHuyUNS3rJtxyvvvpqoHv37u52VKlSxT3edlvWrl2bexmreW9LnNlSYiNHjnSvEXu+2PPm4IMPdkuv5SyTWJzHtjiPgy1BaEsaDho0yC0raK89uw22ROFrr73mlgHMsa/lH3OWTStsybe93W85yxbmrX1fDjnkEHf5iy++uNDz33jjjUDLli3da8ReF/b4FracW8El38y0adMCvXr1cvd/o0aNAk8++WShz4+c+8HuL3uvio6ODjRv3jxw/vnnB6ZOnerO37x5s1t2z2qw+8MuZ9f90UcfFel2AoAfhNg/pXdIAACAisFala2lz5aiKi5r1bWW3H/TUg8AAMonxrQDAFAMNn624Nhmm8jNuiPbDN8AAAAliTHtAAAUg61PbWN4bcZtm5jOxvnbOto2/vjyyy/3ujwAAFDOENoBACgGm7DNJhezSbtshmqb7Msm3nr44Yf3O4EXAABAcTGmHQAAAAAAn2JMOwAAAAAAPkVoBwAAAADApxjTLik7O1tr165VlSpVFBIS4nU5AAAAAIByLhAIKDk52U1sGxq69/Z0QrvkAnvDhg29LgMAAAAAUMGsWrVKDRo02Ov5hHbJtbDn3FlxcXHy89rA33//vQYOHKiIiAgFE2r3BrV7g9q9Qe3eoHZvULs3qL3sBWvdhtq9kRFEtSclJbnG45w8ujeEdptC/+8u8RbY/R7aY2NjXY1+fwIWRO3eoHZvULs3qN0b1O4NavcGtZe9YK3bULs3MoKw9v0N0WYiOgAAAAAAfIrQDgAAAACATxHaAQAAAADwKUI7AAAAAAA+RWgHAAAAAMCnCO0AAAAAAPgUoR0AAAAAAJ8itAMAAAAA4FOEdgAAAAAAfIrQDgAAAACATxHaAQAAAADwKUI7AAAAAAA+RWgHAAAAAMCnCO0AAAAAAPiUp6H9119/1fHHH6969eopJCREn332Wb7zA4GA7rzzTtWtW1cxMTHq37+/Fi1alO8yW7du1dlnn624uDhVrVpVF110kXbs2FHGtwQAAAAAgHIW2nfu3KnOnTvrhRdeKPT8Rx99VM8++6xefvll/fHHH6pUqZIGDRqk1NTU3MtYYJ8zZ47Gjh2rr776yh0IuPTSS8vwVgAAAAAAUDrC5aFjjjnGnQpjrexPP/20br/9dp144olu3zvvvKPatWu7FvkzzzxT8+bN05gxYzRlyhT16NHDXea5557Tscceq8cff9y14AMAAAAAyofs7IBSM7OUmpGt1Az7+ffvti89SztS0zVzS4jab01Ri9rxKg88De37smzZMq1fv951ic8RHx+vXr16aeLEiS6020/rEp8T2I1dPjQ01LXMn3TSSYVed1pamjvlSEpKcj8zMjLcya9yavNzjXtD7d6gdm9Quzeo3RvU7g1q9wa1l71grbsi1W4hOi0zu0CQ3r2dlrGP/badmWd/Rtbu6/l7f1pGlnb9fV5anv3pmdlFuAVhatB8oxonxMrPivrcCAlYk7YP2Jj2Tz/9VEOGDHHbEyZM0CGHHKK1a9e6Me05Tj/9dHfZDz/8UA8++KDefvttLViwIN911apVS/fcc4+uuOKKQv/W3Xff7c4vaPTo0YqN9fcDCwAAAAAlwfJvUoaU7E4hSk7/5/edmVJ6lpSRbaeQv3/+c0r/+2dmIMSz+sNCAooMlSIKOR1eN1tdqvsi6u5VSkqKhg4dqsTERDdHW9C1tJemkSNHasSIEfla2hs2bKiBAwfu887yw5EYG7s/YMAARUREKJhQuzeo3RvU7g1q9wa1e4PavUHtZS9Y6/ay9pT0TG3eka4tO9Ldz8070/Jsp2nLzt377WdyamaJ/u2IsBBFhYcpJiJUURFhig4PVbT9tO3w3T9ztqPD97O/wP+PLmR/WGhIUD9ncnp8749vQ3udOnXczw0bNuRrabftLl265F5m48aN+f5fZmamm1E+5/8XJioqyp0KsgfV7w9sMNVZGGr3BrV7g9q9Qe3eoHZvULs3qL3sBWvdJVG7dYxOSrUgnpYbvN0pOU2b8m67femuS3mx6gsLUY3KUX+fIt3PhNgIrV+5WN06dVDl6Mh/gnOeAB4Tab/nDdaFh2ivRATBc6ao9fk2tDdt2tQF7x9//DE3pNuRCBurntPtvU+fPtq+fbumTZum7t27u30//fSTsrOz3dh3AAAAAPAbGwe+fVdGbvjebK3f9jM3gKfnO69o47j/YcH6nyAepZpVdofxvOG8uu2vHKW4mHA3/Lhga/U33yzSsQc19H3wrQg8De22nvrixYvzTT43c+ZMJSQkqFGjRrruuut0//33q2XLli7E33HHHW5G+Jxx723bttXRRx+tSy65xC0LZ0+uq666yk1Sx8zxAAAAALxgrePz1ydr3NoQzfpuobamWED/J5hv3ZmuzOzijbeuEhWu6n+3hLtTgSCeN5jHRobtEcQRvDwN7VOnTlW/fv1yt3PGmQ8bNkxvvfWWbr75ZreWu627bi3qffv2dUu8RUdH5/6f9957zwX1o446ys0af8opp7i13QEAAACgLC3emKwv/1ynr/5aqyWbdrpZzLVi+V4vXzU2woXs6pUiVaPK7pbvGvmC+T/b1v0cFZOnof2II45wR6H2xo4O3Xvvve60N9Yqb7O+AwAAAEBZW7Z5p776c62+nrXOta7niAwPVcsqmTqobVPViovZHb5zg3mUEipFussAQTumHQAAAAD8aNXWFH311+4W9Tlrk/JN6nZYy5o6rnNdHd6iun776Xsde0xrxoXjXyG0AwAAAMB+rEvcpa//Wqcv/1qnP1dtz91vM6Yf0qKGjutUV4Pa1VF87O6AbvNtASWB0A4AAAAAhdiYnKpvXIv6Ok1dsS13v61s1rtZdR3XqZ6O7lDHdXUHSguhHQAAAAD+tmVHmr6dvd51ff9j2VblTMFlk7H3bJzgur5bUK9V5Z/JsYHSRGgHAAAAUKFtT0nXd3MsqK/ThCVblJVnObaujaq6FvXBHeuqTjxBHWWP0A4AAACgwklKzdDYORtci/rvizcrI+ufoN6xfrwboz64U101qBbraZ0AoR0AAABAhbAzLVM/zLOgvk6/LNik9Kzs3PPa1Kmi4zvvblFvUqOSp3UCeRHaAQAAAJRbu9KzNG7BRtei/tP8jUrN+Ceot6hV2bWoW/d3+x3wI0I7AAAAgHIlLTPLtaRbi7q1rKekZ+We16R6rAvpNqFc69pVFGIzzAE+RmgHAAAAEPTSM7M1fvFmffnXWjdWPTktM/e8+lVjXEg/vlM9ta8XR1BHUCG0AwAAAAhKmVnZmrh0i776c53GzFmvxF0ZuefViYt2E8lZ9/cuDasS1BG0CO0AAAAAgoYtxzZ52VY3Rn3M7PXasjM997walaM0uGMdHde5nro3qqbQUII6gh+hHQAAAICvZWcHNHW5BfV1+nrWOm1KTss9L6FSpI7uUMe1qPdqWl1hBHWUM4R2AAAAAL40b12yPl0eqoee+FXrk/4J6nHR4X8H9Xo6uHl1hYeFelonUJoI7QAAAAB8IzElQ1/8uUYfTl2l2WuSJFkgT1PlqHANbFfbTSjXt0VNRYYT1FExENoBAAAAeN793SaU+2jqKjdOPS1z91rqEWEhah+fpUsHddOR7eooOiLM61KBMkdoBwAAAOCJNdt36f+mrtbH01Zp9bZdufvb1Kmi03s01OAOtTTplx80oF0tRRDYUUER2gEAAACUmbTMLH0/Z4NrVf998WYFArv3V4kK1wld6umMng3VsX68W6ItI+OfJdyAiorQDgAAAKDUzV2b5IL6ZzPXaHvKP2G8T7PqOr1nAx3dvq5iImlNBwoitAMAAAAoo0nldqsbH61TuzfQad0bqlH1WE9rBPyO0A4AAACgxCeV+3DKKo2Zs17peSaVG9iujk7r0UCHtqzJeupAERHaAQAAAJT6pHJDutZXQqVIT2sEghGhHQAAAEDJTioXHa4Tu9RzYT1nUjkAB4bQDgAAAKBY5qxN1MdTV+8xqdzBzau7oH50B9ZUB0oKoR0AAABAkSaV+/zPNa5VveCkcqd1b6BTmVQOKBWEdgAAAAAHNKnc6T0bqm+LGkwqB5QiQjsAAACAIk8qd0bPhjqxC5PKAWWF0A4AAABAqRlZGjt375PKndGjkTrUj2NSOaCMEdoBAACACixnUrlPZ6xR4q78k8pZq/qg9kwqB3iJ0A4AAABUMHubVK5efLRO7d5Ap/VoqIYJTCoH+AGhHQAAAKgAsgPS+CVb9MmMdfkmlYsMC9WA9rXdUm1MKgf4D6EdAAAAKKeysgOauzZJY+es07szwrR10rQ9JpUb0qW+qjGpHOBbhHYAAACgnIX0SUu3uNPkZVuVnJb597khblI5C+nWqs6kckBwILQDAAAA5TKk72ZBvWfjaqqftV43Dz1KVWKjPasXQPER2gEAAIBgDenLtyo5dc+Q3qtpgno3q+5ObevGKTsrU9988w2zwANBiNAOAAAA+Dikz1v3T0j/Y1nRQnrByeSys8q4cAAlhtAOAAAABFNIjwrXQXlCert6e4Z0AOUHoR0AAADwCCEdwP4Q2gEAAABPQvpWTV62RUmEdAD7QGgHAAAAPAzplXND+u6g3q5unMLDQj2rGYC/ENoBAACAEkJIB1DSCO0AAADAAcq2kL4+SROX7Duk92xSzQX0Ps0J6QCKh9AOAAAAFFF2QJq7LklTV+5uTZ+8bKsSd2XsNaTbqX09QjqAA0doBwAAAPYhEAho/OItenvCMo1fGKaUSZPynU9IB1CaCO0AAADAXlhr+pNjF7oW9d1CVCkyTD3zzO7egZAOoBQR2gEAAIACpq3Y6sK6tbCbyPBQndGjgWruWKpLTu2vmOgor0sEUEEQ2gEAAIC/zVy13YX1XxductsRYSE6s2cjXdmvuWrEhuubb5bSqg6gTBHaAQAAUOHNXpOop8Yu1I/zN7rt8NAQndajgYb3a6EG1WLdvoyM/BPOAUBZILQDAACgwpq/PsmF9e/mbHDboSHSyd0a6JojW6pR9d1hHQC8RGgHAABAhbN4Y7Ke+mGRvv5rndsOCZFO7FxP1xzVUs1qVva6PADIRWgHAABAhbFs804988NCff7nWgUCu/cN7lRX1x3VUi1rV/G6PADYA6EdAAAA5d7KLSl69qdF+nTGGmVl707rg9rX1nX9W6lt3TivywOAvSK0AwAAoNxas32Xnv9pkT6eulqZf4f1o9rU0vUDWqlD/XivywOA/SK0AwAAoNxZn5iqF8Yt1gdTVioja3dYP6xVTV3fv6W6NqrmdXkAUGSEdgAAAJQbG5NT9dLPS/TeHyuVnpnt9h3cvLprWe/ZJMHr8gCg2AjtAAAACHpbdqTplV+X6p2Jy5WasTus92xSTSMGtFaf5tW9Lg8ADhihHQAAAEFre0q6Xv11qd6asFwp6VluX5eGVXXDwFbq26KGQmwtNwAIYoR2AAAABJ3EXRl64/dlevP3ZdqRlun2dWoQ77rBH9GqJmEdQLlBaAcAAEDQSE7N0Fvjl+u135YqKXV3WLcl20YMaKX+bWsR1gGUO4R2AAAA+F5KeqbenrBCr/y6RNtTMty+VrUr6/r+rTSofR2FhhLWAZRPhHYAAAD4VmpGlt6dtMLNCL9lZ7rb16xGJV3bv6WO61RPYYR1AOUcoR0AAAC+DOsfTF6pF35eok3JaW5f4+qxuvaoljqhcz2Fh4V6XSIAlAlCOwAAAHzD1lb/aOoqvTBusdYlprp99avGuLB+Urf6iiCsA6hgCO0AAADwXEZWtj6ZvlrP/rhYa7bvcvvqxkfrqiNb6LTuDRUZTlgHUDER2gEAAOCZzKxsfT5zrZ79aZFWbElx+2pVidLwfi10Rs+Gio4I87pEAPAUoR0AAABlLis7oG9mrtEzPy7S0k073b4alSN1+eHNdU7vxoR1APgboR0AAABlJjs7oJlbQvT8CxO0aOPusF4tNkKXHd5c5/VprNhIvp4CQF68KwIAAKBMzFy1Xbf+7y/NX2+t6DsVFx2uSw9rpvMPaarKUXwtBYDC8O4IAACAUhUIBPT2hOV64Jt5ysgKKDosoEsOa66LD2uh+JgIr8sDAF8jtAMAAKDUJKdm6Nb/zdLXs9a57UHtaunw2LU67cgWioggsAPA/hDaAQAAUCrmrk3S8NHTtWzzToWHhui2Y9vqnIPq69tv13pdGgAEDUI7AAAASrw7/EdTV+nOz+coLTNb9eKj9fzZ3dStUTVlZGR4XR4ABBVCOwAAAEpMSnqm7vhsjv43fbXbPqJ1TT11ehdVqxTpdWkAEJRC5WNZWVm644471LRpU8XExKh58+a677773NHbHPb7nXfeqbp167rL9O/fX4sWLfK0bgAAgIpo8cYdGvLCeBfYQ0Okmwa11pvDehLYAaC8trQ/8sgjeumll/T222+rffv2mjp1qi644ALFx8frmmuucZd59NFH9eyzz7rLWLi3kD9o0CDNnTtX0dHRXt8EAACACuGLP9dq5P/+0s70LNWsEqVnz+yqPs2re10WAAQ9X4f2CRMm6MQTT9TgwYPddpMmTfT+++9r8uTJua3sTz/9tG6//XZ3OfPOO++odu3a+uyzz3TmmWd6Wj8AAEB5l5aZpfu+mqt3J610272bJejZs7qqVhUaTwCg3If2gw8+WK+++qoWLlyoVq1a6c8//9Tvv/+uJ5980p2/bNkyrV+/3nWJz2Gt8L169dLEiRP3GtrT0tLcKUdSUpL7aROj+HlylJza/Fzj3lC7N6jdG9TuDWr3BrVX7NpXbk3RtR/+pdlrd3+XuuLwprqmX3OFh4XutTa/1H4gqL3sBWvdhtq9kRFEtRe1xpBA3gHiPpOdna3bbrvNdYEPCwtzY9wfeOABjRw5Mrcl/pBDDtHatWvdmPYcp59+ukJCQvThhx8Wer1333237rnnnj32jx49WrGxsaV4iwAAAMqHWVtD9N7iUO3KClGl8IDOaZGtdtV8+7USAHwnJSVFQ4cOVWJiouLi4oKzpf2jjz7Se++958K0jWmfOXOmrrvuOtWrV0/Dhg074Ou10D9ixIh8Le0NGzbUwIED93ln+eFIzNixYzVgwABFREQomFC7N6jdG9TuDWr3BrVXvNozsrL1xNhFemPBCrfdpWG8nj2js+rGF607PPe7N4K19mCt21C7NzKCqPacHt/74+vQftNNN+nWW2/N7ebesWNHrVixQg899JAL7XXq1HH7N2zYkK+l3ba7dOmy1+uNiopyp4LsQfX7AxtMdRaG2r1B7d6gdm9QuzeovWLUvi5xl64ePUNTV2xz2xf1bapbjm6jyPDiL0jE/e6NYK09WOs21O6NiCCovaj1hfq9u0BoaP4SrZu8dZs3Nlu8Bfcff/wx39GKP/74Q3369CnzegEAAMqrXxdu0uBnf3eBvUpUuF4+p5vuOK7dAQV2AEDR+bql/fjjj3dj2Bs1auS6x8+YMcNNQnfhhRe6823cunWXv//++9WyZcvcJd+s+/yQIUO8Lh8AACDoZWUH9MyPi/TcT4tkMyG1rxenF8/upsbVK3ldGgBUCL4O7c8995wL4VdeeaU2btzowvhll12mO++8M/cyN998s3bu3KlLL71U27dvV9++fTVmzBjWaAcAAPiXNiWn6boPZ2j84i1ue2ivRrrzuHaKjgjzujQAqDB8HdqrVKni1mG3095Ya/u9997rTgAAACgZfyzdoqvfn6GNyWmKiQjTgyd30EldG3hdFgBUOL4O7QAAAChb2dkBvfLrUj3+/QLXNb5lrcquO3zL2lW8Lg0AKiRCOwAAAJztKem64aM/9eP8jW77pK719cBJHRQbyVdGAPAK78AAAADQzFXbNfy96VqzfZebEf7u49vrrIMauqGIAADvENoBAAAqsEAgoLcnLNcD38xTRlZAjavH6oWh3dShfrzXpQEACO0AAAAVV3Jqhm793yx9PWud2z66fR09elonxUVHeF0aAOBvhHYAAIAKaN66JF353nQt27xT4aEhuu3YtrrgkCZ0hwcAnyG0AwAAVDAfTVmlOz6frbTMbNWLj9bzZ3dTt0bVvC4LAFAIQjsAAEAFsSs9y4X1/5u22m0f0bqmnjy9ixIqRXpdGgBgLwjtAAAAFcDijTvc7PALNiQrNES6YWBrXXF4c4XaBgDAtwjtAAAA5dwXf67VyP/9pZ3pWapROUrPntVFBzev4XVZAIAiILQDAACUU2mZWbrvq7l6d9JKt927WYKePauralWJ9ro0AEAREdoBAADKoVVbU9zs8LPWJLrt4f2a6/r+rRQeFup1aQCAYiC0AwAAlDNj527QDR/NVFJqpqrGRuipM7qoX+taXpcFADgAhHYAAIByIiMrW499t0Cv/rrUbXdtVFXPD+2m+lVjvC4NAHCACO0AAADlwLrEXbp69AxNXbHNbV94SFPdekwbRYbTHR4AghmhHQAAIMj9unCTrvtwprbuTFeVqHA9dlonHd2hrtdlAQBKAKEdAAAgSGVlB/Tc2IV67qdFCgSkdnXj9OLZ3dSkRiWvSwMAlBBCOwAAQBBKzpAufGeaJizZ6rbPOqiR7jq+naIjwrwuDQBQggjtAAAAQWbK8m169M8wJWVsVUxEmB48uYNO6trA67IAAKWA0A4AABBEvpm1Tle/P0NZ2SFqXrOSXj6nu1rWruJ1WQCAUkJoBwAACBKz1yRqxEcz3Vj2btWz9eZlvVS1Msu5AUB5RmgHAAAIApuS03TJO1OVmpGtw1pW10nVN6hSFF/lAKC8Y+FOAAAAn0vLzNJl/52qdYmpalazkp46rZNCQ7yuCgBQFgjtAAAAPhYIBPSfT2dr+srtiosO1+vn9VBcTITXZQEAygihHQAAwMfe+H2Z/m/aatey/vzQbmpWs7LXJQEAyhChHQAAwKd+WbhJD34zz/3+n8HtdFirml6XBAAoY4R2AAAAH1qyaYeuGj1d2QHp9B4NdOEhTbwuCQDgAUI7AACAzyTuytAlb09VcmqmujeupvuGdFBICDPPAUBFRGgHAADwkcysbF39/gwt3bxT9eKj9fI53RUVHuZ1WQAAjxDaAQAAfOShb+fr14WbFBMRplfP66GaVaK8LgkA4CFCOwAAgE98NHWVmy3ePHF6Z3WoH+91SQAAjxHaAQAAfGDaiq26/dPZ7vdrj2qpYzvW9bokAIAPENoBAAA8tmb7Ll3232lKz8rWMR3quNAOAIAhtAMAAHgoJT1Tl74zVZt3pKtt3TjXLT40lJniAQC7EdoBAAA8EggEdNPHf2nO2iRVrxSp187rrtjIcK/LAgD4CKEdAADAI8/9tFhfz1qniLAQvXxudzWoFut1SQAAnyG0AwAAeGDM7PV6cuxC9/t9J3ZQzyYJXpcEAPAhQjsAAEAZm7cuSSM+mul+P//gJjrzoEZelwQA8ClCOwAAQBnasiNNF789VSnpWerbooZuH9zW65IAAD5GaAcAACgj6ZnZuuLd6W6JtybVY/X80K4KD+PrGABg7/iUAAAAKKOZ4u/6YrYmL9+qKlHhen1YD1WNjfS6LACAzxHaAQAAysA7E1fo/cmrFBIiPXtWV7WoVcXrkgAAQYDQDgAAUMrGL96se7+a636/9eg26temltclAQCCBKEdAACgFC3fvFNXvjddWdkBndy1vi49rJnXJQEAggihHQAAoJQkp2bo4nemKnFXhro0rKoHT+6oEOsfDwBAERHaAQAASoG1rF/7wUwt3rhDteOi9Oq53RUdEeZ1WQCAIENoBwAAKAWPfbdAP83fqKjwUL12Xg/Viov2uiQAQBAitAMAAJSwT2es1su/LHG/P3pqJ3VqUNXrkgAAQYrQDgAAUIJmrtquW/43y/1+5RHNdWKX+l6XBAAIYoR2AACAErI+MVWXvjNV6ZnZ6t+2lm4c2NrrkgAAQY7QDgAAUAJSM7J02X+namNymlrVrqynz+yq0FBmigcA/DuEdgAAgH8pEAjolv/9pT9XJ6pqbIReP6+nKkeFe10WAKAcILQDAAD8Sy//slSfz1yr8NAQvXh2NzWqHut1SQCAcoLQDgAA8C/8MHeDHv1uvvv9rhPa6+DmNbwuCQBQjhDaAQAADtDCDcm69oMZCgSks3s10rm9G3tdEgCgnCG0AwAAHIBtO9N18dtTtTM9S72bJejuE9p7XRIAoBwitAMAABRTRla2rnxvulZuTVHDhBi9eHZ3RYTxtQoAUPL4dAEAACim+76aq4lLt6hSZJibKT6hUqTXJQEAyilCOwAAQDG898cKvTNxhUJCpKfO6KLWdap4XRIAoBwjtAMAABTRpKVbdNfnc9zvNw5srYHt63hdEgCgnCO0AwAAFMGqrSm64t1pyswO6PjO9XTlEc29LgkAUAEQ2gEAAPZjR1qmLnlnqralZKhj/Xg9ekonhVj/eAAAShmhHQAAYB+yswMa8eFMzV+frJpVovTqed0VExnmdVkAgAqC0A4AALAPT/2wUN/P3aDIsFC9cm531Y2P8bokAEAFQmgHAADYiy//XKvnflrsfn/o5I7q1qia1yUBACoYQjsAAEAhZq9J1E3/96f7/dLDmumU7g28LgkAUAER2gEAAArYmJzqJp5LzcjWEa1r6paj23hdEgCgggovzoXnzZunDz74QL/99ptWrFihlJQU1axZU127dtWgQYN0yimnKCoqqvSqBQAAKGVpmVm67L/TtC4xVc1qVtKzZ3VVWCgzxQMAfNzSPn36dPXv39+F899//129evXSddddp/vuu0/nnHOOAoGA/vOf/6hevXp65JFHlJaWVvqVAwAAlDD7TnPbJ7M1Y+V2xUWH641hPRUXHeF1WQCACqxILe3Wgn7TTTfp//7v/1S1atW9Xm7ixIl65pln9MQTT+i2224ryToBAABK3Ru/L9P/pq92LesvnN1NTWtU8rokAEAFV6TQvnDhQkVE7P8oc58+fdwpIyOjJGoDAAAoM+MWbNSD38xzv98+uK0ObVnT65IAACha9/iiBPZ/c3kAAAAvLd64Q9eMnqHsgHRGj4Y6/+AmXpcEAMC/mz1+3bp1OvXUU91EdAkJCTr++OO1dOnSA706AAAATyTuynAzxSenZapnk2q6b0gHhYQw8RwAIMhD+4UXXqgOHTrol19+0U8//aTatWtr6NChJVudpDVr1rjJ7qpXr66YmBh17NhRU6dOzTdhzJ133qm6deu6823CvEWLFpV4HQAAoPzJCkjXfviXlm3eqfpVY/TSOd0VGc6KuAAA/yjyp9K1116rnTt35m4vXrxYt9xyi9q1a6cuXbq48xcsWFCixW3btk2HHHKI627/7bffau7cuW6Su2rVquVe5tFHH9Wzzz6rl19+WX/88YcqVarklp9LTU0t0VoAAED58/mKUI1fskUxEWF69bzuqlGZpWsBAEG6TnuDBg3UvXt3F5JPOOEEnXHGGW7pt2OPPdZNPPfJJ5/o7LPPLtHibPm4hg0batSoUbn7mjZtmq+V/emnn9btt9+uE0880e175513XKv/Z599pjPPPLNE6wEAAOXHx9PW6Jd1u9svnjy9s9rXi/e6JAAADjy025JvNob9yiuv1FtvvaXnnnvOhfaff/5ZWVlZLszb+SXpiy++cK3mp512muuGX79+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rVqluLg4BRNq9wa1e4PavUHt3qB2b1C7N6i97AVr3YbavZEURLVbFLfAXq9ePYWG7n3kOi3tNrA/NFQNGjRQsLAnn9+fgHtD7d6gdm9Quzeo3RvU7g1q9wa1l71grdtQuzfigqT2fbWw52AiOgAAAAAAfIrQDgAAAACATxHag0hUVJTuuusu9zPYULs3qN0b1O4NavcGtXuD2r1B7WUvWOs21O6NqCCufW+YiA4AAAAAAJ+ipR0AAAAAAJ8itAMAAAAA4FOEdgAAAAAAfIrQDgAAAACATxHag8zDDz+skJAQXXfddQoGd999t6s376lNmzZel1Uka9as0TnnnKPq1asrJiZGHTt21NSpUxUMmjRpssf9bqfhw4fLz7KysnTHHXeoadOm7j5v3ry57rvvPgXLfJnJycnutdm4cWNX/8EHH6wpU6bIb3799Vcdf/zxqlevnntefPbZZ/nOt/v7zjvvVN26dd3t6N+/vxYtWqRgqP2TTz7RwIED3evWzp85c6b8Yl+1Z2Rk6JZbbnHvM5UqVXKXOe+887R27VoFw/1u7/X23m61V6tWzT1n/vjjDwVD7Xldfvnl7jJPP/20gqH2888/f4/3+aOPPlrBcr/PmzdPJ5xwguLj491zp2fPnlq5cqX8Xnthn692euyxx+T32nfs2KGrrrpKDRo0cO/v7dq108svvyw/2F/tGzZscM95Oz82NtY91/3y2fTQQw+552+VKlVUq1YtDRkyRAsWLMh3mdTUVPc9zD6fKleurFNOOcXdpmCo/dVXX9URRxyhuLg499hs375dfvDQfmrfunWrrr76arVu3do93xs1aqRrrrlGiYmJCjaE9iBiX/5feeUVderUScGkffv2WrduXe7p999/l99t27ZNhxxyiCIiIvTtt99q7ty5euKJJ9yX0WB5ruS9z8eOHev2n3baafKzRx55RC+99JKef/5592XOth999FE999xzCgYXX3yxu6//+9//atasWS48WnixA0B+snPnTnXu3FkvvPBCoefbff7ss8+6L3IWvOzL9KBBg9wXDr/Xbuf37dvXPXf8Zl+1p6SkaPr06e6glf20gw/2xcMCjR/s735v1aqVe93a897e4+3AoT3/N23aJL/XnuPTTz/VpEmTXCDwi6LUbsEl7/v9+++/r2CofcmSJe61agd7fv75Z/3111/u+R8dHS2/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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Draw the throughput graph:\n", "snrDbs, throughputs = snrScheduler.getSnrsAndData()\n", "plt.figure(figsize=(12, 6))\n", "plt.plot(snrDbs, throughputs)\n", "plt.title(\"PDSCH throughput at different SNR values\");\n", "plt.grid()\n", "plt.xlabel(\"SNR (dB)\")\n", "plt.xticks(snrDbs)\n", "plt.ylabel(\"Throughput (%)\")\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.6" } }, "nbformat": 4, "nbformat_minor": 5 }