{ "cells": [ { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "
Peter Norvig
2017, updated 2026
\n", "\n", "# The Convex Hull Problem" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Pound a bunch of nails into a board, then stretch a rubber band around them and let the rubber band snap taut, like this:\n", "\n", "![](https://ds055uzetaobb.cloudfront.net/uploads/tantSbEgDe-ch2.gif)\n", "\n", "The rubber band has traced out the **convex hull** of the set of nails. It turns out this is an important problem with applications in computer graphics, robot motion planning, geographical information systems, ethology, and other areas.\n", "More formally, we say that:\n", "\n", "*Given a finite set, **P**, of points in a plane, the convex hull of **P** is a polygon, **H**, such that:*\n", "\n", "- *Every point in **P** lies either on or inside of **H**.*\n", "- *Every vertex of **H** is a point in **P**.*\n", "- **H** *is convex: a line segment joining any two vertexes of **H** either is an edge of **H** or lies inside **H**.*\n", "\n", "\n", "In this notebook we develop an algorithm to find the convex hull. The first thing to do is decide how we will represent the objects of interest.\n", "\n", "# Points, Sets of Points, and Polygons\n", "\n", "Here are the types I want to define:\n", "\n", "- **Point**: a class such that `Point(3, 4)` returns a point `p` such that `p.x` is 3 and `p.y` is 4.\n", "- **Set of Points**: a Python set: `{Point(0,0), Point(3,4), ...}` The function `Points(n)` will return a set of `n` random points.\n", "- **Polygon**: an ordered list of vertex points.\n", "\n", "After some necessary imports, here is the implementation:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "import csv\n", "import collections\n", "from collections.abc import Iterable\n", "import math\n", "import matplotlib.pyplot as plt\n", "import random\n", "import re\n", "import time" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "Point = collections.namedtuple('Point', 'x, y')\n", "Polygon = list[Point]\n", "\n", "def Points(n: int) -> set[Point]:\n", " \"\"\"Create a set of n random points within a unit square.\"\"\"\n", " return {Point(random.random(), random.random())\n", " for _ in range(n)}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "{Point(x=0.17464561621533636, y=0.8295359793654173),\n", " Point(x=0.21776227621335453, y=0.460000427486846),\n", " Point(x=0.27479975467800144, y=0.9532283692649101)}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Points(3)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Visualizing Points and Line Segments\n", "\n", "\n", "To visualize points, I'll define a function `plot_points`. We will want to be able to see:\n", "- The **points** themselves. \n", "- Optionally, **line segments** between points. An optional `style` parameter allows you to specify whether you want lines or not, and what color they should be. The lines go from point to point in order; if you want the lines to close\n", "back from the last point to the first (to form a complete polygon), specify `closed=True`. \n", "- Optionally, **labels** on the points that let us distinguish one from another. You get\n", "labels (integers from 0 to *n*) if you specify `labels=True`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def plot_points(points, style='r.', labels=False, closed=False) -> None: \n", " \"\"\"Plot a collection of points. Optionally change the line style, label points with numbers, \n", " and/or form a closed polygon by closing the line from the last point to the first.\"\"\"\n", " if closed:\n", " points = points + [points[0]]\n", " plt.plot([p.x for p in points], [p.y for p in points], style)\n", " if labels:\n", " for (i, (x, y)) in enumerate(points):\n", " plt.text(x, y, f' {i}')\n", " plt.axis('scaled'); plt.axis('off')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Convexity\n", "\n", "\n", "We want to make a *convex* hull, so we need to understand what makes a polygon *convex*. or concave. Here's a convex polygon:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "octagon = [Point(-10, 0), Point(-7, -7), Point(0, -10), Point(+7, -7), \n", " Point(+10, 0), Point(+7, +7), Point(0, +10), Point(-7, 7)]\n", "plot_points(octagon, 'bs-', labels=True, closed=True)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "If you start at point 0 at the left and proceed in order counterclockwise around the octagon, following edges from point to point, you can see that at every vertex you are making a **left** turn.\n", "\n", "Now let's consider a concave (non-convex) polygon:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pacman = octagon[:4] + [Point(0, 0)] + octagon[5:]\n", "plot_points(pacman, 'yo-', labels=True, closed=True)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "As you move counterclockwise around the pacman, you turn **right** at 4. That's the point where the polygon is concave; you can draw a line from 3 to 5 that is poutside the polydgon. That leads to the idea: **a polygon is convex if there are no right turns** as we go around the polygon counterclockwise. " ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Turn Directions\n", "\n", "\n", "Now how do we determine if a turn from point A to B to C is a left turn at B or a right turn (or straight)? Consider this diagram:\n", "\n", "\n", "\n", "It is a left turn at B if angle β is bigger than angle α; in other words, if β's opposite-over-adjacent ratio is bigger than α's: \n", "\n", " (C.y - B.y) / (C.x - B.x) > (B.y - A.y) / (B.x - A.x)\n", " \n", "But if we did that computation, we'd need special cases for when each denominator is zero. So multiply each side by the denominators:\n", "\n", " (B.x - A.x) * (C.y - B.y) > (B.y - A.y) * (C.x - B.x) \n", " \n", "(*Note:* This step should make you very nervous! In general, multiplying both sides of an inequality by a negative number reverses the inequality, and here the denominators might be negative. In this case it works out; basically because we are doing two multiplications so that negatives cancel out, but [the math proof](https://en.wikipedia.org/wiki/Cross_product) is tricky, involving some concepts in vector algebra, so I won't duplicate it here; instead I will provide good test coverage below.)\n", " \n", "That leads to the function definition: " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def is_left_turn(A: Point, B: Point, C: Point) -> bool:\n", " \"\"\"Is the turn from A->B->C a left turn?\"\"\"\n", " delta = (B.x - A.x) * (C.y - B.y) - (B.y - A.y) * (C.x - B.x)\n", " return delta > 0" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Sketch of Convex Hull Algorithm\n", "\n", "\n", "Now we have the first part of a strategy to find the convex hull:\n", "\n", "***Travel a path along the points in some order. (It is not yet clear exactly what order.) Any point along the way that does not mark a left-hand turn is not part of the hull.***\n", "\n", "What's a good order? Let's see what happens if we start at the leftmost point and work our way to the rightmost. We can achieve that ordering by calling the built-in function `sorted` on the points (since points are tuples, `sorted` sorts them lexicographically: first by their first component, `x`, and if there are ties, next by their `y` component). I will define a function to plot the partial hull as we go:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def plot_partial_hull(points, hull_indexes=()) -> None:\n", " \"\"\"Plot all the points as labeled red dots, with a blue line for the points named by `hull_indexes`.\"\"\"\n", " plot_points(points, labels=True)\n", " plot_points([points[i] for i in hull_indexes], 'bs-')" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "Given a sorted list of 11 points, let's start at the leftmost point and keep going until we make a right turn:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xys = [(40, 190), (138, 55), (143, 173), (182, 79), (182, 179), (206, 58), \n", " (235, 80), (236, 111), (258, 160), (259, 19), (269, 150)]\n", "pts = sorted(Point(x, y) for (x, y) in xys)\n", "\n", "plot_partial_hull(pts, [0, 1, 2, 3])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "There is a right turn at 2, so remove it from the hull and continue on to points 4 and 5:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [0, 1, 3, 4, 5])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "That's a right turn at 4, so remove it:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [0, 1, 3, 5])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "But now we see point 3 is also a right turn. The addition of one new point (5) can remove multiple points (4 and 3) from the hull. We remove 3 and move on to 6, 7, and 8:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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CAD84803c5cS/vQn19WED4JBGLrySunxx+158GBp40a39QBAccvOlp57zp6HDLG/DKF4sPkwTGVn24yDhQvt2tFVq5gEBiB8fPCB1KmTdUm/+84+onjQMQhTJUrYKYXEROmLL6S//tV1RQBQfHIGGvXvTygobnQMwtzcudL119vz++9bwgaAUPb551LjxnY0+9tvbY8Big8dgzDXsaNdzSxJffpIP/zgtBwAOGs53YKuXQkF/kDHIAIcPixdfbW0fr3UurU0fz4jkwGEprQ0qVYt6dgxac0am1+A4kXHIAKUKiVNny6VKSMtWiT985+uKwKAonnxRQsFzZsTCvyFjkEEmTRJ6tvXugXLl1sXAQBCxb59UvXqUkaG9O9/S126uK4oPNExiCB9+kjduuWOTM7IcF0RABTcpEn2feuCC9hI7U8Egwji8Ugvvyydf760fbv05z8zMhlAaDh2TBozxp6HDbMj2fAP/quNMOXLS9Om2XLC22/brAMACHazZkk7dkiVKkm9ermuJrwRDCJQ06bS3/9uz3/5i/TNN27rAYDT8XpzjyjefbdtpIb/sPkwQmVlSW3bSosXS5ddJq1caacXACDYfPqp1KyZfY/auVM65xzXFYU3OgYRKipKmjrV2nKffy6NHOm6IgDIW063oGdPQkEg0DGIcHPmSDfcYM8ffii1b++2HgA43tatdgrB65W++kpq0MB1ReGPjkGE69JFGjTInu+4Q0pPd1sPABxvzBgLBR06EAoChY4BdOiQdOWV0pdfSu3aWeeAo0AAXNuzxwYaZWbaFfJt2riuKDLw7R+KjbWRyaVL2z0Kzz3nuiIAsLkrmZlSo0Z2zwsCg2AASdaiGzvWnh980C4nAQBXDh+2exEkafhwG9CGwCAYwKdfP+mWW2zCWPfuNpccAFx4+23b81S1qo1yR+AQDODj8Uivvmpretu22fAjAAg0rzd3SXPwYCkmxm09kYbNhzjF8uVSixZSdrbNOujZ03VFACLJggW2ETouTvruO6lCBdcVRRY6BjhFs2bSI4/Y85//bN0DAAiUnIFGffsSClygY4A8ZWXZLuBly6QrrrAuAu08AP62YYN08cV2ZHrLFql2bdcVRR46BshTVJT05puW1teskR5+2HVFACJBzt6Cm24iFLhCxwCnNWuWdPPN9jxvnq37AYA/pKdLNWtKR45IK1bY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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [0, 1, 5, 6, 7, 8])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 7 is a right turn so we remove 7 and move on to 9:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [0, 1, 5, 6, 8, 9])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 8 is a right turn, so we remove 8. But then 6 and 5 are also right turns, so they too are removed. We proceed on to 10:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgYAAAGFCAYAAACG8ztLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAANQBJREFUeJzt3XuczmX+x/HXPSfDME4zDDkWK+fQAVkhBkXHLYcQOdaWQ9KqrV86r9aW2MpZkrDVarEicsgxIaIk5zEySjQO4zhz//649p7bMMMw99zX/b3v9/Px8Jiv+x7j3baZj891XZ/L5Xa73YiIiIgAYbYDiIiISOBQYSAiIiKZVBiIiIhIJhUGIiIikkmFgYiIiGRSYSAiIiKZVBiIiIhIJhUGIiIikkmFgYiIiGRSYSAiIiKZVBiIiIhIJhUGIiIikkmFgYiIiGRSYSAiIiKZVBiIiIhIJhUGIiIikskxhcHp06d54okniIuLIyYmhrvuuovk5GTbsURERIKKYwqDgQMHMmvWLGbMmMGKFSs4fvw47dq1Iz093XY0ERGRoOFyu91u2yEuJzU1lfj4eKZOnUqHDh0A+Pnnnylfvjzz5s2jdevWlhOKiIgEB0d0DNavX8/Zs2dJTEzMfK1s2bLUqlWLVatWWUwmIiISXCL8/RsmJcGhQzm/HxcHFSpkfS0lJYWoqCiKFy+e5fXSpUuTkpKSDylFRERCk18Lg6QkqFYNTp3K+XOio2HbtouLg+y43W5cLpfvAoqIiIQ4vy4lHDp06aIAzPsXdhQSEhI4c+YMR44cyfL6L7/8QunSpX2cUkREJHQ5Yo9BgwYNiIyMZOHChZmvHThwgC1bttC4cWOLyURERIKL3/cYXI2iRYvSs2dPBg8eTMmSJSlRogRPPfUUtWvXpmXLlrbjiYiIBA1HFAYAb731FhERETz44IOcPHmS22+/nffff5/w8HDb0URERIKGX+cYbNgADRpc/vPWr4f69fM/j4iIiGTliD0GIiIi4h8qDERERCSTXwuDuDgzp+BSXK7Lf46IiIjkD7/flZDT5MOjR6FjRzh4ELp2hQ8+8GcqERERgQC7RGnFCrjtNsjIgKlToUsX24lERERCS0DtMWjSBF54wTw/+ijs3Gk3j4iISKgJqI4BQHo6tGgBX30FN91kughRUbZTiYiIhIaA6hgAhIfDhx9C8eLwzTfw/PO2E4mIiISOgOsYeMyaBffdZ54XLIDERLt5REREQkHAdQw87r0X+vUzz926wS+/2M0jIiISCgK2MAB4802oWdMcYeze3ZxWEBHJL263m7Zt2+Jyufjss89sxxGxIqALg4IFYcYMM/Do889h1CjbiUQkmI0cORKXy2U7hohVAV0YANSqZToHAE8/bS5iEhHxtU2bNvHmm28yadIk21FErAr4wgDMXoN77oGzZ6FTJzh+3HYiEQkmaWlpdOrUiX/+858kJCTYjiNilSMKA5cLJk6EcuXgp5+gf3/biUQkmAwaNIjGjRtz9913244iYp0jCgOAEiXMfAOXCyZPhunTbScSkWAwe/ZsFi9ezMiRI21HEQkIjikMwNyj8Nxz5rlfP9i9224eEXG+xYsXs3PnTooVK0ZERAQREREA3H///TRr1sxuOBELAnbAUU7OnTMFwqpV0LChGZ0cGWk7lYgEnORk2L4dqlY165A5SElJ4dAFV77Wrl2bt99+m/bt21O5cuX8TioSUBxXGADs3Qt160JqKjz7LLz6qu1EIhJQJk6EPn3M8JOwMBg3Dnr2zPUvd7lczJo1i3vuuSf/MooEKEctJXhUrAjjx5vn11+HxYvt5hGRAJKc7C0KwHzs29e8LiKX5cjCAOCBB6B3b3C7oUsXuKATKCKhavv2i8ekpqfDjh25/hJut1vdAglZji0MAN56C66/Hg4cgB49TJEgIiGualWzfHC+8HCoUsVOHhGHcXRhEBNjRiZHRcHcufDPf9pOJGLX4cOHeeKJJ6hWrRqFChWiQoUK9O/fn9TUVNvR/KdcObOnIDzc/Dw8HMaOveQGRBHxcuTmwwuNHm2GHhUoAF9/bTYmioSiLVu28MILL9C9e3dq1KjB3r176devH3Xq1OGTTz6xHc+/kpPN8kGVKioKRK5AUBQGbjfcdZfpGlx/PaxbZ7oJIgIff/wxXbp04cSJE5ln9EVEcuLopQQPzzTEMmXgxx9h0CDbiUQCR2pqKrGxsSoKRCRXgqIwAIiL845MHj8ePv7YdiIR+3777Tdefvll+vbtazuKiDhEUCwlnO/ZZ81sg6JFYdMmM/NAJBQdPXqUxMREihcvzuzZs4nUiFARyYWgKwzOnoU//tFsQmzcGJYtA3VQJdQcO3aM1q1bU6hQIebOnUt0dLTtSCLiEEGzlOARGWluXoyNNfcpvPyy7UQiPpCcDEuW5Gp6n6dTEBUVxezZs1UUiMgVCbqOgcf06dC5s5lzsnixuXhJxJGuYO7/sWPHaNWqFWlpacyaNYuY847nxMfHE+452y8ikoOgLQwAHnnEnFYoVw42boSSJW0nErlCyclmo8z5I37Dw2HPnmzP5i9dupTmzZtn+6V2795NpUqV8ieniASNoFtKON+oUfCHP5g/W3v10shkcaArnPvfrFkz3G53tj9UFIhIbgR1YVC4sFlSiIyEzz6DMWNsJxK5Qpr7LyJ+FtSFAUD9+jB8uHl+8knYssVuHpErorn/IuJnQb3HwCMjA9q1g88/h5o14ZtvoGBB26lEroDm/ouIn4REYQDwyy9Qpw4cPAiPPgrvvms7kYiISOAJ+qUEj1KlYOpU8/zeezBrlt08IiIigShkCgOAVq3g6afNc8+esG+f3TwiIiKBJmSWEjzOnIFbbzVXM//xj2aYnGa+iIiIGCHVMQCIijJHGAsXhuXL4dVXbScSEREJHCHXMfD48EPo2tUcEf/qK9NFEBERCXUhWxgAdOtmNiRWqGBGJhcvbjuRiIiIXSFdGBw7ZgYg7dgB998PH38MLpftVCIiIvaE3B6D8xUpYvYbRETAp5/ChAm2E4mIiNgV0oUBwI03wmuvmecBA+CHH+zmERERsSmklxI8MjKgTRtYuBBq14a1ayE62nYqERER/wv5jgGYkwkffADx8bB5s3cIkoiISKhRYfA/CQkwZYp5Hj0a5syxm0dERJwrJSWFrl27kpCQQExMDPXr1+eTTz6xHStXVBicp21bczUzQI8esH+/3TwiIuJMXbt2Zdu2bcyePZvNmzdz33330aFDB7799lvb0S5LewwucPo0NG4MGzZA8+Zm34FGJouIyJUoXLgw7733Hl27ds18rWTJkrzxxhv07NnTYrLLU8fgAgUKmCOMMTHmHoXhw20nEhERp2nSpAkzZ87k8OHDZGRkMGPGDE6fPk2zZs1sR7ssdQxy8P77ZjkhPNzcqdCoke1EIiLiFKmpqXTo0IEFCxYQERFBoUKF+OSTT2jVqpXtaJeljkEOHn4YOnWC9HTo3BlSU20nEhERp3juuec4cuQIixYtYt26dTz55JM88MADbN682Xa0y1LH4BJSU6FePdi9Gzp0MEsMGpksIhKikpNh+3aoWhXKlcvx03bu3EmVKlXYsmULNWvWzHy9ZcuWVKlShTFjxvgj7VVTx+ASihb1jkyeOdMsL4iISAiaOBEqVoQWLczHiRNz/NS0tDQAwsKyfosNDw8nIyMjX2P6gjoGufC3v8Ezz0ChQua0QrVqthOJiIjfJCebYuD8b+rh4bBnT7adg7Nnz1KjRg3KlCnDiBEjKFmyJJ999hlDhgxh7ty53HHHHf7LfhXUMciFp582RWJaGnTsaI40iohIiNi+PWtRAGYD2o4d2X56ZGQk8+bNIz4+nvbt21OnTh0++OADpkyZEvBFAahjkGs//wx16sBvv8HAgfDWW7YTiYiIX1xhx8Dp1DHIpbJlvXsMRo6EefNsphEREb8pVw7GjfNOuwsPh7Fjg7IoAHUMrtiAATBqlLlwadMmKFPGdiIREfGL5GSzfFClStAWBaDC4IqdOgUNG5qioGVLWLDA3M4oIiISDPQt7QpFR8OMGeaEwqJFMGKE7UQiIiK+o47BVZowAXr3NjMOVq6Em2+2nUhERCTvVBhcJbfbTEP8+GO49lr49luIjbWdSkREJG+0lHCVXC6zSbViRdi1Cx57zHYiERGRvFNhkAfFisFHH5mTK9OmwdSpthOJiIjkjQqDPGrcGIYNM8+PPWYGZImIiPjauHHjaNasGbGxsbhcLn7//feLPufIkSN07dqVokWLUrRoUbp27Zrt512KCgMfeOYZuO02OH7cXNV85oztRCIiEmzS0tJo06YNzz77bI6f07lzZzZu3Mj8+fOZP38+GzdupGvXrlf0+2jzoY8kJ0PdunD4MDz1FPz977YTiYhIMFq6dCnNmzfnyJEjFCtWLPP1rVu3UqNGDdasWcMtt9wCwJo1a2jUqBE//vgj1XJ5A6A6Bj5SrhxMmmSeR4wwg49ERET8ZfXq1RQtWjSzKABo2LAhRYsWZdWqVbn+OioMfOjuu72nE7p1g4MH7eYREZHQkZKSQqlSpS56vVSpUqSkpOT660T4MpSYbsFXX8GWLdC9O/z3vxqZLCIiXklJcOhQzu/HxUGFClf3tV0u10Wvud3ubF/PiQoDHytY0IxMvvFGmD/f3MT45JO2U4mISCBISoJq1cy9OzmJjoZt2668OEhISOBgNq3qX3/9ldKlS+f66+jvsvmgZk1TEAAMHQrr11uNIyIiAeLQoUsXBWDev1RHISeNGjUiNTWVtWvXZr729ddfk5qaSuPGjXP9dVQY5JM+feC+++DsWejYEY4ds51IREScLCUlhY0bN7Jjxw4ANm/ezMaNGzl8+DAA1atXp02bNvTu3Zs1a9awZs0aevfuTbt27XJ9IgFUGOQblwvGjzenFXbsgCeesJ1IREScbMyYMdSrV4/evXsD0LRpU+rVq8fs2bMzP2fatGnUrl2bxMREEhMTqVOnDlOvcCyv5hjks6++gubNISPDjE3u3Nl2IhERsWXDBmjQ4PKft3491K+f/3myo45BPmvaFJ5/3jz362cuXBIREQlUKgz84LnnoEkTs8+gUyez70BERCQQqTDwg4gIs4xQrBisXQv/93+2E4mIiGRPhYGfVKgAEyaY5+HDYdEiu3lERMT/4uLMnIJLiY42n2eLNh/6Wd++MG4cJCTAd99BfLztRCIi4k+eyYdnz0LDhua1xYuhaFHznJfJh76gwsDP0tLMVMStW+HOO2HOHHO0UUREQsuBA1C2rBmbf/Zs4IzPD5AYoaNQITMyuUABc4/C6NG2E4mIiA2//WY+ligROEUBqDCwok4d+Mc/zPOQIbBxo9U4IiJigWfsccmSdnNcSIWBJY89BnfdBWfOmJHJJ07YTiQiIv7k6RjY3GiYHRUGlrhcMGkSXHONuUVrwADbiURExJ/UMZCLlCwJU6eaImHiRJg503YiERHxF3UMJFvNm8Ozz5rnPn1gzx6rcURExE/UMZAcvfACNGoER4+aS5bOnbOdSERE8ps6BpKjyEj46COIjYXVq+HFF20nEhGR/KaOgVxSpUpmIiLAq6/C0qU204iISH5Tx0Auq0MH6NkT3G546CFvNSkiIsFHHQPJlbffhmrV4OefvUWCiIgEH3UMJFdiYmD6dIiKgtmz4d13bScSERFfO3sWfv/dPKswkMuqVw/eeMM8Dx4MmzfbzSMiIr51+LD56HJB8eJ2s1xIhUGA6t/f3L54+rQZmZyWZjuRiIj4imcZoXhxCA+3m+VCKgwClMsFkydDQgL88AM8+aTtRCIi4iuBuvEQVBgEtPh4+PBDUySMHQuffmo7kYiI+EKgbjwEFQYB7/bb4emnzXOvXpCUZDePiIjknToGkicvvww332x2sD70kEYmi4g4nToGkieekclFisCKFWYyooiIOJc6BpJn110HY8aY55deguXL7eYREZGrp46B+ETnzvDww5CRYZYUPOdgRUTEWdQxEJ8ZPRqqVoV9+6B3b41MFhFxInUMxGeKFDEjkyMj4d//9t7IKCIizuHpGKgwEJ9o0ABef908DxwI339vNY6IiFyhQF5KcLndakY7UUYG3HEHLFgAtWvD119DwYK2U4mIyOWcO2cuynO74eBBKFXKdqKs1DFwqLAwmDLF/B9q82YYMsR2IhERyY0jR7z7w0qUsJslOyoMHKx0afjgA/P8zjvwn//YzSMiIpfn2XhYrBhERFiNki0VBg7XujU89ZR5fuQRSE62m0dERC4tkPcXgAqDoPDqq2ZD4uHD0KULpKfbTiQiIjkJ5KOKoMIgKERFmSOMMTGwbJn3xIKIiAQedQzEL6pWhXffNc/DhsGqVVbjiIhIDtQxEL/p2tWMSk5PN+OTf//ddiIREbmQOgbiNy6X6Rpcey3s3Qt9+mhksohIoFHHQPwqNtbsN4iIgI8/hkmTbCcSEZHzBfI4ZFBhEJRuvhleecU89+8PW7fazSMiIl6ejoGWEsSvhgyBli0hLQ06dYJTp2wnEhERUMdALAkLM1MR4+Jg0yb4y19sJxIREdDmQ7GoTBlznwLAqFEwd67dPCIioS493dyVAOoYiCV33GGuZgbo0QN+/tlqHBGRkPb77+Z2XAjMC5RAhUFI+Nvf4IYbTPuqa1eNTBYRscWz8TA21kytDUQqDEJAgQIwYwYUKgSLF8Pf/247kYhIaAr0/QWgwiBkVKsGo0eb5+eegzVr7OYREQlFgT7cCFQYhJQePaBDB+/I5NRU24lEREKLOgYSUFwuGDMGKlWC3bvh0Uc1MllExJ/UMZCAU6wYfPQRhIeb0ckffGA7kYhI6Aj04UagwiAkNWoEL71knv/8Z/jpJ7t5RERCRaCPQwYVBiHrL3+B5s3hxAno2BFOn7adSEQk+KljIAErPBymTjVV67ffwrPP2k4kIhL8tPlQAto113ivZX7zTZg/324eEZFgp82HEvDuugsef9w8P/wwpKTYzSMiEsyc0DFwud06sBbqTp2Cm2+GzZshMRE+/9zczigiIr6TkWHGIKenw/79ULas7UTZ0x//QnS0GZlcsCB88YVZVhAREd9KTfXeVRPIHQMVBgJAjRrw9tvm+Zln4Jtv7OYREQk2nv0FhQubO2wClQoDydSrF9x/P5w7B506wbFjthOJiAQPJ+wvABUGch6XC8aPh/LlYedOM/xIRER8wwknEkCFgVygeHEzMjkszMw5+PBD24lERIKDE4YbgQoDyUaTJvDCC+b50UdN90BERPLGCeOQQYWB5OCvf4WmTeH4cbPf4MwZ24lERJxNHQNxtPBws4xQvLg5ofD887YTiYg4mzoG4njly8PEieb5jTfMjAMREbk66hhIULj3XujXzzx36wa//GI3j4iEpj179uByubL98fHHH9uOlys6rihB4803oWZNOHgQunc3Yz1FRPypfPnyHDhwIMuPF198kZiYGNq2bWs7Xq7ouKIEjYIFzcjk6Ghzj8KoUbYTiUioCQ8PJyEhIcuPWbNm0aFDBwoXLmw7Xq6oYyBBpVYt7x0KTz8NGzbYzSMioW39+vVs3LiRnj172o6SK263OgYShPr1g3vugbNnzRHG48dtJxKRUDVx4kSqV69O48aNbUfJlaNHzbh5UMdAgojLBRMmwDXXwE8/Qf/+thOJSCg6efIkH330kWO6BeDtFhQqZJZnA5kKA7kiJUvCtGmmSJg82ew9EBG5asnJsGSJ+ZhLn3zyCWlpaXTr1i0fg/mWU44qggoDuQq33QbPPWee+/aF3bvt5hERh5o4ESpWhBYtzEfP4JTL/rKJ3HXXXcTHx+dzQN9xynAjUGEgV+n//g8aNzbrZp07m30HIiK5lpwMffp4zz9nZJi/aVymc7Bjxw6++uorevXq5YeQvqOOgQS9iAhzC2PRorBmDQwbZjuRiDjK9u0XD0VJT4cdOy75yyZNmsQ111xDYmJiPobzPXUMJCRUrAjjx5vn11+HxYvt5hERB6la1dzvfr7wcKhS5ZK/7LXXXmPfvn2EXfhrA5w6BhIyHngAevUyZ3S7dPH+n19E5JLKlYNx40wxAObj2LHm9SCkjoGElJEj4frr4cABeOQRUySIiFxWz56wZ485lbBnj/l5kFLHQEJKTIw5thgVBXPmwDvv2E4kIo5Rrhw0axa0nQIPp4xDBhUG4iN168KIEeb5qadg0ya7eUREAolTxiGDCgPxoccfh3bt4PRp6NgRTpywnUhEJDCoYyAhyTMNsUwZ+PFHGDTIdiIREfucdIESqDAQH4uLgw8/NEXC+PHw8ce2E4mI2HX8OJw5Y57VMZCQ1KIFDB1qnnv3hr177eYREbHJ0y2IjjaXKAU6FQaSL158EW65BVJT4aGHvNeNioiEmvOPKrpcdrPkhgoDyReRkTB9OsTGwsqV8PLLthOJiNjhpOFGoMJA8lHlyjBmjHl+5RVYtsxuHhERG5w03AhUGEg+69QJevQwd6V06eKtnEVEQoU6BiIXGDUK/vAHc5uq514FEZFQoY6ByAUKFzb7DSIj4bPPvMsLIiKhwEnDjUCFgfhJ/fowfLh5fvJJ2LLFbh4REX9x0nAjUGEgfjRgALRtC6dOmZHJJ0/aTiQikv/UMRDJQVgYvP8+lC4N338PgwfbTiQikv/UMRC5hFKlYOpU8/zeezBrlt08IiL5TR0Dkcto1QqGDDHPPXvCvn1284iI5BenXaAE4HK7dXhM/O/MGbj1Vli3Dv74R1iyBMLDbacSEfGtEyfMySyAY8e8z4FMHQOxIirKHGEsXBiWL4dXX7WdSETE9zzdgqgoiImxmyW3VBiINVWqmH0GYC5dWrnSbh4REV9z2gVKoMJALOvSBbp2NSOTO3eGI0dsJxIR8R2njUMGFQYSAN55x3QPkpKgd2+NTBaR4OG0ccigwkACQJEi8NFHEBEBn34KEybYTiQi4hvqGIhcpZtugtdeM88DBsAPP9jNIyLiC+oYiOTB4MFmxsHJk2Zk8qlTthOJiOSN04YbgQoDCSBhYfDBBxAfD5s3w9NP204kIpI3ThtuBCoMJMAkJMCUKeZ59GiYM8duHhGRvFDHQMQH2rY1VzMD9OgB+/fbzSMicrXUMRDxkddeg3r1zH9UXbtCerrtRCIiV06bD0V8pEABmDHDjBBdsgSGD7edSETkyjnxuKIuUZKA9v77ZjkhPNzcqdCoke1EIiK5c/IkFCpknlNTITbWbp7cUsdAAtrDD0OnTmYpoXNn8x+XiIgTeLoFERFmkJtTqDCQgOZymYuWKleGPXugb1+NTBYRZ3DiBUqgwkAcoGhRc0VzRATMnGmWF0REAp0T9xeACgNxiFtugZdfNs+PPw7bttnNIyJyOU48kQAqDMRBnn4aWrSAtDQzMvn0aduJRERy5sThRqDCQBwkLAymTjX/kW3cCEOH2k4kIpIzJw43AhUG4jBly3r3GIwcCfPm2UwjIpIzdQxE/KRdO+jf3zx37w4HDliNIyKSLXUMRPxo+HCoWxd+/RW6dYOMDNuJRESy0uZDET+KjjYjkwsVgkWLYMQI24lERLLScUURP7v+enj7bfP817/C2rV284iInE8dAxELevaEBx6Ac+fM6OSjR20nEhEx1DEQscDlgnHjoGJF2LUL/vxn24lERMyclePHzbM6BiJ+VqwYfPSRuYHxww/NrAMREZs83YLwcDPW3UlUGEhQaNwYhg0zz489Btu3W40jIiHu/BkGTrpACVQYSBB55hm47TbTvuvUCc6csZ1IREKVU/cXgAoDCSKepYQSJWD9enNSQUTEBqeeSAAVBhJkypWDiRPN84gRsGCB3Twi4hurV6+mRYsWxMTEUKxYMZo1a8bJkydtx8qRU8chgwoDCUL33GP2GQA8/DAcPGg1jojk0erVq2nTpg2JiYmsXbuWb775hscff5ywsMD9FubUccigwkCC1IgRUKuWKQq6d9fIZLm0vn37ct1111GwYEHi4+O5++67+fHHH23Hkv8ZNGgQ/fv3Z+jQodSsWZOqVavypz/9iQIFCtiOliMtJYgEmIIFzcjk6GiYP9/cxCiSkwYNGjB58mS2bt3KggULcLvdJCYmkp6ebjtayPvll1/4+uuvKVWqFI0bN6Z06dLcdtttrFixwna0S9LmQ5EAVLOmtyAYOtRsSBTJTp8+fWjatCmVKlWifv36vPLKK+zbt489e/bYjhbydu3aBcCwYcPo3bs38+fPp379+tx+++1sD+BzyeoYiASoPn3gvvvg7Fno2BGOHbOdSALdiRMnmDx5MpUrV6Z8+fK244S8jP+tA/bt25cePXpQr1493nrrLapVq8akSZMsp8uZOgYiAcrlgvHjzWmFHTvgiSdsJ5JA9e6771K4cGEKFy7M/PnzWbhwIVFRUbZjBa/kZFiyxHy8hDJlygBQo0aNLK9Xr16dpKSkfIuXV+oYiASwEiVg2jQIC4MpU8z4ZJELPfTQQ3z77bcsW7aMqlWr8uCDD3Lq1CnbsYLTxInmgpMWLcxHzxnjbFSqVImyZcuybdu2LK//9NNPVKxYMb+TXjUndwxcbrfbbTuEiD8MGwYvvghFisDGjXDttbYTSb5KTjazsatWNS2jK3DmzBmKFy/OhAkT6NSpUz4FDFHJyaYYOP+oUHg47NmT47+nkSNH8sILLzBx4kRuuOEGpkyZwogRI9iyZQvXXXedf3JfgTNnwHNg4rffzF9OnCTCdgARf3nuOfjyS1ixwoxMXrECIiNtp5J8MXGi2WCSkWFaRePGmTu6r4Db7eb06dP5FDCEbd9+8fnh9HSz1pdDYTBw4EBOnTrFoEGDOHz4MHXr1mXhwoUBWRQAHD5sPoaFmUvenEYdAwkpSUlQty78/rs5qfD667YTic9d4d9Id+3axcyZM0lMTCQ+Pp79+/czfPhwli9fztatWylVqpT/soeCq+gYOM2WLVC7ttlf8OuvttNcOe0xkJBSoQJMmGCehw+HRYvs5pF8cKm/kWYjOjqa5cuXc8cdd1ClShUefPBBYmJiWLVqlYqC/FCunOnghIebn4eHw9ixQVMUgLP3F4A6BhKi+vY1fzYlJMB330F8vO1E4jMh8DfSoJCcbIq1KlWC7t/Lp5/Cn/4Et95qliydRh0DCUlvvQXVq0NKCvToASqPg0gI/I00KJQrB82aBeW/FycfVQQVBhKiChUyI5MLFID//hdGj7adSHyqZ0/TIViyxHy8wo2HInnh9KUEFQYSsurUgX/8wzwPGWKOMEoQCeK/kUpgU8dAxMEeewzuusucO+7YEU6csJ1IRJxOHQMRB3O5zJH3smVh2zYYMMB2IhFxOnUMRBwuLg4+/NBbJPzrX7YTiYiTqWMgEgSaN4dnnzXPffqY/WoiIldDHQORIPHCC9CoEaSmQufOcO6c7UQi4kTqGIgEichIc/NibCysXm0uXBIRuRLnzpmR66COgUhQqFTJzMYBePVVWLrUZhoRcRrPBUouFxQvbjfL1VJhIHKBDh3gkUfMNMSHHvKuF4qIXI7nz4vixb3DN51GhYFINkaNgmrV4OefzdA8jUwWkdzwFAZO3V8AKgxEshUTA9OnQ1QUzJ4N771nO5GIOIFn46FT9xeACgORHNWrB2+8YZ6ffBI2b7abR0QCn9OPKoIKA5FL6t8f7rwTTp82I5PT0mwnEpFA5vSjiqDCQOSSXC6YPBkSEuCHH0znQEQkJ+oYiISA+HiYOtUUCWPHwqef2k4kIoFKHQORENGyJTz9tHnu1QuSkuzmEZHApI6BSAh5+WW4+WYz1eyhhzQyWUQupo6BSAjxjEwuUgRWrDCTEUVEzqeOgUiIue46GDPGPL/0EixfbjePiAQWdQxEQlDnzvDww5CRYZYUPLPRRSS0pafDkSPmWR0DkRAzejRUqQL79kHv3hqZLCKmKPD8WVCihN0seaHCQOQqFCkCM2aYfQf//rf3RkYRCV2e/QXFikFEhNUoeaLCQOQqNWgAr79ungcOhO+/txpHRCwLho2HoMJAJE8GDYLWreHUKejUCU6etJ1IRGwJho2HoMJAJE/CwmDKFChVylyyNGSI7UQiYos6BiICQOnS8MEH5vmdd+A//7GbR0TsUMdARDK1bg2DB5vnRx6B5GS7eUTE/9QxEJEsXnvNbEg8fBi6dDFnmkUkdKhjICJZREXB9OkQEwPLlnlPLIjkp2bNmuFyubL86Nixo+1YIUkdAxG5SNWq8O675nnYMFi1ymocCRG9e/fmwIEDmT/Gjh1rO1JIUsdARLLVtasZlZyebsYn//677UQS7AoVKkRCQkLmj6JFi9qOFJLUMRCRbLlcpmtw7bWwdy/06aORyZK/pk2bRlxcHDVr1uSpp57i2LFjtiOFpGDpGLjcbv2RJZIf1q6FW2+Fc+dgwgTo2dN2IglG48ePp3LlyiQkJLBlyxaeeeYZqlSpwsKFC21HCynp6WafUUYGHDgACQm2E109FQYi+Wj4cBg6FAoVgnXroHp124kk2K1fv54bb7yR9evXU79+fdtxQsZvv3mXEM6cMfeoOJWWEkTy0ZAh0LIlpKWZkcmnTl391xo3bhzNmjUjNjYWl8vF79q8INmoX78+kZGRbN++3XaUkOJZRoiNdXZRACoMRPJVWJiZihgXB5s2me7B1UpLS6NNmzY8++yzvgsogSk5GZYsuapJWd9//z1nz56lTJky+RBMchIsGw9BhYFIvitTxtynAPD22zB37tV9nYEDBzJ06FAaNmzou3ASeCZOhIoVoUUL83HixBw/defOnbz00kusW7eOPXv2MG/ePB544AHq1avHrbfe6sfQEiwbD0GFgYhf3HGHuZoZoEcP+Plnq3EkUCUnm2MsGRnm5xkZ0Ldvjp2DqKgovvzyS1q3bk21atXo378/iYmJLFq0iPDwcD8Gl2DqGETYDiASKv72N1i6FDZuhHvuMRcuZfdnd1wcVKjg53ASGLZv9xYFHunpsGMHlCt30aeXL1+eZcuW+SmcXEowdQxUGIj4SYEC8OabpkP8zTdw883Zf150NGzbpuIgJFWtajamnF8chIdDlSr2MkmuBFPHQEsJIn6Um4F0p055/5CREFOuHIwb520lhYfD2LHZdgsksKhjICIi+aNnT3OP944dplOgosARgqljoMJAxCFSUlJISUlhx44dAGzevJkiRYpQoUIFSpQoYTmd+FS5cioIHCaYOgZaShAJQCdPXvzamDFjqFevHr179wagadOm1KtXj9mzZ/s5nYhcKJg6BhqJLOJHGzZAgwaX/7yoKDMxsV07uPNObUQUCXSlS8Mvv8B330Ht2rbT5I0KAxE/ym1hcKE6dUyR0K6dOc2gI+oigSMjwxTz6emwfz+ULWs7Ud6oMBDxo9wWBv/6F+zaZaYkrlqV9fRafLwZmNSuHSQmmtnsImLPkSPg2eZz6pQ5muxkKgxE/CgpCapVu/RlShfOMfjtN5g/H+bMMR9TU72fGxkJTZuaIqF9e7juuvzNLyIX27HDjKAoXBiOHbOdJu9UGIj4WVLSpecUXGry4dmzsHKl6STMnWsKiPNdf713yeHWWyFC545E8t2aNdCoEVSqBLt3206TdyoMRBxs+3ZvkfDVV3DunPe9YsWgbVtTJLRp4211iohv/fe/5r+zBg1g3TrbafJOhYFIkEhNhS++MEXCvHlZuxJhYaaD4OkmVK8OLpe9rCLBZMoU6N7dzKWaP992mrxTYSAShNLT4euvvd2EzZuzvn/ttd4ioWlT52+WErHpzTdh8GDo3BmmTbOdJu804EgkCIWHQ+PG8Npr5lz1nj3mNse2bU0RsGsXjBplTjXExcH998PkyXDwoO3kIs4TTMONQIWBSEioWBEee8y7xPDZZ9CrFyQkwPHj8O9/wyOPQJky0LAhvPKKuR5a/USRywumccigpQSRkJaRAd9+a5Yb5syB9euzvn/NNd4lh9tvh4IF7eQUCWT332+K63feMQW406kwEJFMP/9sugpz58LChZCW5n2vYEFTHHjGNOuOHxGjWTNYtgxmzoQHH7SdJu9UGIhItk6dgiVLvBsYk5Kyvn/DDd7BSjfeaE4+iISiWrXg++9h0SJTPDudCgMRuSy3G7Zs8RYJq1dn3X9QqpTpIrRrB61aQZEi9rKK+FuZMpCSYvbl1K1rO03eqTAQkSv266/w+eemSFiwAI4e9b4XGWlaq569Cddeay2mSL5zu80FSufOwb59wbHEpsJARPLkzBlYscK7gXHHjqzv16jhLRIaNdKYZgkuqalmyiiYPTnBsEFXhYGI+NS2bd4lh+XLzbAlj+LFzSyF9u3NlLjixe3lFPGFXbvM5WWFCsGJE7bT+IYKAxHJN7//bpYaPGOaDx/2vhceDk2aeLsJ1appTLM4z9q1cMst5uKzvXttp/ENFQYi4hfnzplb6DzdhO+/z/r+ddeZTkK7dvDHP5p1W5FA9/nncMcdUK8ebNhgO41vqDAQESt27/YWCUuXmr0KHkWKmKWGdu3M0kOpUtZiilzS1KnQrZs5jfPFF7bT+IYKAxGx7tgxcwZ87lxzhe35dza4XKZV6+km1K6tJQcJHCNHwqBB0LEjTJ9uO41vaCSJiFhXpAjcey9MnGimL65dC88/b9qzbrdZgvjrX80Z8fPvfTh50nZyCXXBdoESqDAQkQATFgY33QQvvWTWbPftg7FjTcegYEHz8/feMwOV4uLg7rth/HhTUIj4m+cCpWAqDLSUICKOcfIkLF7s3ZuQnJz1/fr1vaccGjTQmGbJfw88AJ98AqNHw+OP207jGyoMRMSR3G747jtvkfD111nHNCckeMc0t2wJhQvbyyrBq0ULc6fI9Olmn0EwUGEgIkHh4MGsY5qPH/e+FxUFzZub5Yg774RKlazFlCBTpw5s3mxOJLRqZTuNb6gwEJGgc/q0mbo4Z475sXt31vdr1fIuOTRsaIYtiVyNsmXhwAGzH6ZePdtpfEOFgYgENbcbfvzRu+SwcmXWMc0lS2Yd01y0qL2s4ixuN0RHmxkce/ea6YfBQIWBiISUw4dh/nxTJHz+uRnb7BERYaYueroJf/iDtZjiAMeOQWyseT5xwtyXEAxUGIhIyDp3Dlat8nYTtm7N+n7Vqt7BSk2amCulRTz27IHKlU3XIJhmaqgwEBH5n507vUXCsmVw9qz3vdhYaNPGO6Y5mM6ty9VZt87M3ChXzszXCBYqDEREsnH0KCxc6B3T/Ouv3vfCwqBRI++SQ82aGtMcihYsMMVi3bqwcaPtNL6jwkBE5DIyMsyYZk83YdOmrO9XrOgtEpo1M61lCX7TpkGXLnD77eauj2ChwkBE5Art22e6CHPmwJdfmuORHjEx5jx7u3bmOt4yZezllPw1ahQMGAAPPggzZ9pO4zsaGCoicoXKl4d+/Uxx8NtvMHs29OljzrSfOAGffQa9epmf33QTvPgirF+fdTKjOF8wXqAEKgxERPIkJsacXBg71tzdsGGDKQRuusm8v24dDBsGN95oNqn16WMKiRMnrMYWHwjGC5RASwkiIvkmJcVcDz13rhmZe34xUKCAmbPv2ZsQLMNxQkmHDvCvf8Hbb0P//rbT+I4KAxERPzh92hyBnDPHFAp79mR9v04db5Fw880a0+wELVuaPSbTpkHnzrbT+I4KAxERP3O74YcfvKccVq0yJx884uLMxsX27SEx0TtdTwLLDTeYEyrz55tx2sFChYGIiGWHDnnHNM+fD6mp3vciIuC227zdhCpV7OWUrMqVg/37zT6SBg1sp/EdFQYiIgHk7Flz0dPcuWbZ4aefsr5frZp3THPjxhrTbIvbbe5GOHXK3N4ZTFd5qzAQEQlgP/1kjkXOnQtffWXud/AoVsw7prlNG3NTpPjHiRNQuLB5PnbM+xwMVBiIiDhEaqo53TBnjjnt4DkuB2ZM8623epccqlfXmOb8lJRkJl5GRZmuQTD9b63CQETEgdLT4euvvRsYN2/O+n7lyt4i4bbbzPFI8Z0NG8y+grJlzT6DYKLCQEQkCOzd6x3TvHgxnDnjfa9wYXO6wTOmuXRpezmDxcKF5n/T2rXhu+9sp/EtFQYiIkHm+HFzvt7TTUhJyfr+zTd7uwk33BBcbXB/mT7dzC5o3twUYsFEhYGISBDLyDBtb0+RsH591vevucZbJLRoYXbay+X985/wxBPwwANm+mEw0V0JIiJBLCzM3NMwbJg5b79/P4wfD3ffbYqA/fvNPQ/t25tTDe3awZgx5t4HyZnnAqVgPAmiwkBEJISULWtufvzsM/PNbd48eOwxc1fDqVNmn8Kjj5obJOvVg+efN5scz5/MKMF7gRJoKUFERDADe7Zs8Q5WWrMm6zXRpUrBnXeajkKrVlCkiL2sgaBTJ5gxA956CwYOtJ3Gt1QYiIjIRX79FT7/3BQKCxbA0aPe9yIjoVkz796Ea6+1FtOaVq1g0SKYOhW6dLGdxrdUGIiIyCWdOQMrVni7CTt2ZH2/Rg1vkdCokbnfIdjVrw/ffmuWYtq2tZ3Gt1QYiIhIrrndZkyz55TD8uVm2JJH8eLmG6VnTHPx4vay5qcKFWDfPli7Fm66yXYa31JhICIiV+3IEbPUMHeuWXo4fNj7Xng4NGni7SZUqxY8MxNiYiAtDXbuDL6lFBUGIiLiE+fOmU2Lnm7C999nff+667xFQtOm5p4BJzp50jvvITUVYmPt5vE1FQYiIpIvdu3y3gy5dGnWMc1FikDr1qZIaNvWnHpwiuRkc5wzIsL8MwVLF8RDhYGIiOS7Y8fMLv65c02xcPCg9z2XC265xRQJ7dub+wcC+Zvtxo1mxkNCAhw4YDuN76kwEBERv8rIMFMYPUsO336b9f3y5b1LDs2bQ8GCdnLm5MsvoWVLqFXr4lstg4EKAxERsSo52Rz7mzPHdBVOnfK+V7Cg+SbsKRTKlrWX02PmTOjY0VxnvXSp7TS+p8JAREQCRloaLFni7SZceGdD/freIqFBA3MXhL+9+y78+c9w//3wySf+//3zm+5KEBGRgFGokBm9/N57kJRk1vNfftnsQXC5zE2RL71kro4uWxZ69jT3Phw/7r+MwXyBEqgwEBGRAOVyQd268Nxz5hjkgQMwebL5m3rhwmYD46RJcO+95pt0mzbmOuQ9e/I315VcoLRz507uvfde4uPjiY2N5cEHH+Tg+TsvA5AKAxERcYTSpaF7d9O+P3QIvvgC+veHypXNscEFC+CJJ8zPa9WCZ56BlSuzTmb0hdx2DE6cOEFiYiIul4vFixezcuVKzpw5Q/v27ckI4OsqtcdAREQcze2GH3/07ktYsSLrNdElS3rHNLduDcWK5e33a93aFCVTpkC3bjl/3hdffEHbtm05cuQIsf+bgnTkyBFKlCjBwoULadmyZd6C5BN1DERExNFcLqheHYYMgWXLzM2Q06aZq5GLFTOt/w8/NCcJ4uLMEcg33zR3PlwNz1LC5ToGp0+fxuVyUaBAgczXoqOjCQsLY8WKFVf3m/uBCgMREQkqJUpA587w0UemSFi2zBQN119vlhWWLoXBg83dDX/4Azz5JCxeDGfP5vw1k5LMxscNG2D/fvPaoUPe15KSLv41DRs2JCYmhr/85S+kpaVx4sQJhgwZQkZGBgcCeDKSlhJERCRk7NjhHdO8bFnWYiA21mxg9Ixp9mwuTEoyRcT58xUuFB0N27aZWxfP98UXX/Doo4+ye/duwsLC6NSpEz/88AO33HIL7777ru//AX1AhYGIiISko0dh4UIzWGnePNNd8HC5oFEjUyRce61Zhric9evNnIXsHDp0iIiICIoVK0ZCQgKDBw9myJAhvvkH8TEVBiIiEvLS0+Gbb7wbGDdtuvKvcanCwGPx4sW0bNmSrVu3Uq1atasLm89UGIiIiFwgKcm75LBw4aX3H3hkVxhMnjyZ6tWrEx8fz+rVqxkwYADdu3fnH//4R/4E9wEVBiIiIpewciU0aXL5z8uuMBg6dCjvv/8+hw8fplKlSvTr149BgwbhCuDrI1UYiIiIXMKGDeZehsvJzVKCE+i4ooiIiGRSYSAiIiKZVBiIiIhcQlycmVNwKdHRubtUyQm0x0BEROQykpK8lydlJy7u4uFGTqXCQERERDJpKUFEREQyqTAQERGRTCoMREREJJMKAxEREcmkwkBEREQyqTAQERGRTCoMREREJJMKAxEREcmkwkBEREQyqTAQERGRTCoMREREJJMKAxEREcmkwkBEREQyqTAQERGRTCoMREREJJMKAxEREcmkwkBEREQyqTAQERGRTCoMREREJJMKAxEREcn0/y9GwcCIRd2RAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [0, 1, 9, 10])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Now what do we do? We got all the way to the end of our set of 11 points, but we only got half the hull (the lower half). Well, if looking at all the points in left-to-right order gives us the lower half of the hull, maybe looking at all the points in right-to-left order will give us the upper half. Let's try. " ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [10, 9, 8])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 9 is a right turn; remove it and move on:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgYAAAGFCAYAAACG8ztLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIDpJREFUeJzt3X10lOWdxvFrmBAiSZOACQSF8GIiAkUEtAVURLARqUB9KRQRaqWAddWGKqcHa+tp3dpjV3lZlYXsRkSrC4IbNnWRGgWsStAaCBUrlKApTnGESIxASMBk9o/bPIAkJIHM3M888/2cw5mXPAlX7R+5+N33c48vFAqFBAAAIKmd7QAAAMA9KAYAAMBBMQAAAA6KAQAAcFAMAACAg2IAAAAcFAMAAOCgGAAAAAfFAAAAOCgGAADAQTEAAAAOigEAAHBQDAAAgINiAAAAHBQDAADgoBgAAABH1BSD2tpa3X333UpLS1NiYqImTJigQCBgOxYAAJ4SNcUgNzdXBQUFWrFihd58800dOnRI119/verq6mxHAwDAM3yhUChkO0RzqqqqlJ6ermeffVaTJ0+WJO3du1c9evTQ2rVrde2111pOCACAN0TFxKCkpETHjh1TTk6O8955552nb37zm9q0aZPFZAAAeEtUFINgMKj4+Hh16tTppPe7du2qYDBoKRUAAN4TFcWgKaFQSD6fz3YMAAA8w24xCASkDRvM42lkZGTo6NGjqqysPOn9ffv2qWvXruFMCABATLFXDPLzpZ49pdGjzWN+fpOXDh06VO3bt1dRUZHz3ieffKLt27drxIgRkUgLAEBMsHNXQiBgykB9/fH3/H6pvFzq3r3Rb/nJT36il156SU8//bQ6d+6s++67T5999plKSkrk9/sjkxsAAI+Ls/K37tp1cimQpLo6qaysyWKwYMECxcXFadKkSTpy5IjGjBmjp59+mlIAAEAbipqJAQAACD87ewy6d5fy8kwZkMzj0qWUAgAALLN78mEgYJYPsrIoBQAAuEBUHIkMAAAiI6oPOAIAAG2LYgAAABwUAwAA4KAYAAAAB8UAAAA4KAYAAMBBMQAAAA6KAQB8JRQK6brrrpPP59OaNWtsxwGsoBgAwFcWLlwon89nOwZglZ1PVwQAl9m2bZvmz5+vv/zlL+rWrZvtOIA1TAwAxLzq6mpNmTJFTzzxhDIyMmzHAayiGACIeXPmzNGIESM0ceJE21EA61hKABDTCgsLtX79em3dutV2FMAVmBgAiGnr16/X7t27lZqaqri4OMXFmX8v3XTTTRo1apTdcIAFfOwyAG8KBKRdu6TsbKl79yYvCwaDqqioOOm9gQMHatGiRRo/frx69+4d7qSAq7CUAMB78vOlWbOk+nqpXTspL0+aMaPRSzMyMhrdcJiZmUkpQExiKQGAtwQCx0uBZB5nzzbvA2gWEwMA3rJr1/FS0KCuTiorO+2SwolYYUUsY2IAwFuys83ywYn8fikry04eIMpQDAAPOXDggO6++2717dtXHTt2VGZmpu655x5VVVXZjhY53bubPQV+v3nt90tLl7Z4WgDEOpYSAA/Zu3ev9u7dq0cffVT9+/fXP/7xD91xxx3au3evVq9ebTte5MyYIV17rVk+yMqiFACtwO2KgMetWrVKt956qw4fPuzcow8ATWEpAfC4qqoqJScnUwoAtAjFAPCwzz77TA899JBmz55tOwqAKMFSAuBRX3zxhXJyctSpUycVFhaqffv2tiMBiAIUA8CDDh48qGuvvVYdO3bUSy+9pISEBNuRAEQJlhKAaBAISBs2tOj0voZJQXx8vAoLCykFAFqFYgC4XX6+1LOnNHq0eczPb/LSgwcPKicnR4cPH1Z+fr6++OILBYNBBYNB1dXVRTA0gGjFUgLgZoGAKQMnHvHr90vl5Y3em79x40ZdffXVjf6ojz76SL169QpPTgCewf1LgJu18tz/UaNGcc4/gLPCUgLgZpz7DyDCKAaAm3HuP4AIY48BEA0CAc79BxARFAMAAOBgKQEAADgoBgAAwEExAAAADooBAABwUAwAAICDYgAAABwUAwAA4KAYAAAAB8UAAAA4KAYAAMBBMQAAAA6KAQAAbSwYDGratGnKyMhQYmKihgwZotWrV9uO1SIUAwAA2ti0adO0c+dOFRYW6r333tONN96oyZMna+vWrbajNYtiAABAGysuLtbdd9+tb33rW+rTp48eeOABpaamasuWLbajNYtiAABAG7viiiu0cuVKHThwQPX19VqxYoVqa2s1atQo29GaFWc7AAAAbrVnj1RR0fTX09KkzMxT31+5cqUmT56sc889V3FxcerYsaMKCgp0wQUXhC9sG6EYAADQiD17pL59pZqapq9JSJB27jy1HDzwwAOqrKzUq6++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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [10, 8, 7, 6, 5])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Now 6 is a right turn and must be removed. We could continue step-by-step, but I'll just skip to the end:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [10, 8, 4, 0])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Let's bring back the lower hull and concatenate it with the upper hull:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(pts, [0, 1, 9, 10] + [10, 8, 4, 0])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "editable": true, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "That's all there is to the basic idea of the algorithm, but there are a few edge cases to worry about: \n", "\n", "* **Degenerate polygons**: A triangle has 3 sides, and no \"true\" polygon has fewer, but it is possible to have a set of 0, 1, or 2 points. Such a set of points is convex because there is no way to draw a line segment that goes outside the points.\n", "\n", "* **Colinear points:** if three or more points are colinear and are on the hull, we could keep them all, or we could keep only the two \"outside\" ones. I decided to make the convex hull be the minimal possible set of points, and thus only keep the outside points. \n", "\n", "* **First and last points:** An astute reader might have noticed that our algorithm only rejects the middle point, point B, in the A->B->C turn. That means that the first and last point in sorted order will never be a candidate for rejection, and thus will always end up on the hull. Is that correct? Yes it is. The first point is the leftmost point, the one with lowest `x` value (and if there are ties, it is the lowest-leftmost point). That is an extreme corner, so it should always be on the hull. A similar argument holds for the last point in sorted order." ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "editable": true, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "# Implementation of Convex Hull Algorithm\n", "\n", "We're ready to code up the algorithm: sort the points, find the upper and lower half hulls, and put them together:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "button": false, "collapsed": false, "deletable": true, "editable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "def convex_hull(points) -> Polygon:\n", " \"\"\"Find the convex hull of a set of points.\"\"\"\n", " if len(points) < 3: \n", " return Polygon(points) # Degenerate polygons\n", " sorted_points = sorted(points)\n", " # Find the two half-hulls ...\n", " upper = half_hull(sorted_points)\n", " lower = half_hull(reversed(sorted_points))\n", " return upper + lower[1:-1] # ... and append them, but don't repeat first and last points\n", "\n", "def half_hull(sorted_points) -> list[Point]:\n", " \"\"\"Return the half-hull from following points in sorted order, eliminating right turn points.\"\"\"\n", " # Add each point C in order; remove previous point B if A->B-C is not a left turn.\n", " hull = []\n", " for C in sorted_points:\n", " # if A->B->C is not a left turn ...\n", " while len(hull) >= 2 and not is_left_turn(hull[-2], hull[-1], C):\n", " hull.pop() # ... then remove B from hull.\n", " hull.append(C)\n", " return hull" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "run_control": {}, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "# Visualization of Results\n", "\n", "To visualize the results of the algorithm, I'll define a function to call `convex_hull` and plot the results: " ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def plot_convex_hull(points) -> None:\n", " \"\"\"Find the convex hull of these points; plot the hull in blue and the interior points in red.\"\"\"\n", " hull = convex_hull(points)\n", " plot_points(points)\n", " plot_points(hull, 'bs-', closed=True)\n", " print(len(hull), 'of', len(points), 'points are on the convex hull')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First the set of 11 random points, and then 1000 random points:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6 of 11 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(pts)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "17 of 1000 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(Points(1000))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the octagon and pacman shapes:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8 of 8 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(octagon)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7 of 8 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(pacman)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Next I'll use a set of latitude/longitude coordinates of US cities, taken from my [Traveling Salesperson Problem notebook](TSP.ipynb):" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "17 of 1089 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "! [ -e latlong.csv ] || curl -O https://raw.githubusercontent.com/norvig/pytudes/refs/heads/main/data/latlong.csv\n", " \n", "def parse_latlong(rows: Iterable[tuple], skip=('AK', 'HI'), long_scale=-48, lat_scale=69) -> set[Point]:\n", " \"\"\"Make a set of Points from the CSV file of \"long,lat,city,state\", skipping the given states.\"\"\"\n", " return {Point(long_scale * float(long), lat_scale * float(lat))\n", " for (long, lat, city, state) in rows\n", " if state not in skip}\n", "\n", "USA = parse_latlong(csv.reader(open('latlong.csv')))\n", "plot_convex_hull(USA)" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "I wanted to make sure that a regular grid gets just the 4 corner points on the hull:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "button": false, "collapsed": false, "deletable": true, "jupyter": { "outputs_hidden": false }, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4 of 100 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "grid = {Point(x, y) for x in range(10) for y in range(10)}\n", "\n", "plot_convex_hull(grid)" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "Here is a variant with some noise thrown in:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 of 100 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def noisy(points, delta=0.4) -> set[Point]: \n", " \"\"\"Add some uniform noise to each of the points.\"\"\"\n", " def noise(): return random.uniform(-delta, +delta)\n", " return {Point(x + noise(), y + noise())\n", " for (x, y) in points}\n", "\n", "plot_convex_hull(noisy(grid))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some stranger shapes:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "17 of 720 points are on the convex hull\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdgAAAGFCAYAAABeyeKwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAap1JREFUeJztnXmYFMX5x789y7FyeXF4rCBEMJqoEUERNBpzEIkXCoLxwGSDGpLoT10DikeiIcAuR0g8Ike8BVajUaKGHK6JwMIu632viS4zoByeLILATv3+eLeZnp6qPma6p7un38/zzLOzM909NT1V9Va9pyaEEGAYhmEYxlMSQTeAYRiGYUoRFrAMwzAM4wMsYBmGYRjGB1jAMgzDMIwPsIBlGIZhGB9gAcswDMMwPsAClmEYhmF8gAUswzAMw/gAC1iGYRiG8QEWsAzDMAzjAyxgGYZhGMYHWMAyDMMwjA+wgGUYhmEYH2AByzAMwzA+wAKWYRiGYXyABSzDMAzD+AALWIZhGIbxARawDMMwDOMDLGAZhmEYxgdYwDIMwzCMD3QIugFxZd06YMsW9fs9ewJ9+xavPQwTNniMMFGHBWwArFsHHH44sGOH+pjycuDtt3kCYeIJjxGmFGAVcQBs2WI9cQD0vtXqnWFKGR4jTCnAApZhGIZhfIBVxCFm0iSge3f1+0K4fy+fc6J8vWJ+Frfdu8/asXkrAIvOzzARgAVskRECePNNZ8euWeNvWxgmvLBwZaIPC9gCcOPlmEwCDz0EPPAA8MYbzq5/221A//6ApqmPyee9uF2vmJ8V6+tt3gykUkBFBb23vv15r17W5z31FDBrFiDSADRoEHgHAzERC9UNYpgIwAI2T5x4OXbuDEybBjz9NFBXl1F/dewosGuXxWzWzqidf8HgC8/xpsEM4yeLFgGXXQak0xnpKQSQSADz5wOVlfLzUilg9lntwjVDN2z1ucEM4z/s5JQnTrwcv/wSqKoCnn2W5ppvfhNYuBD4R/WLzj5k2jSagBgmzKRSGeEKUGfXV5PpNHD55bn9OJWiVeeqVZnzGKbEYAHrM/3wHn6j3Yj3ZizFv/9NC/n+Jx6Icmy3PK8c29EzvRF4990itZRhbNCFollY2gnJtrbsflxTQ7aT004Dxo+X6p97YovtGAGAFx2uVRkmCDQhrHz6GBUvvAAcd5z9cWsxGMfhRaCsDHj//T32qXXVS7Blyqwc1ZhOT2xB38R6YPVqYOhQD1vOMHlgVAEb1b7G11UkEkBLC/X9WbOA667Lfl/T6Ji2NnquaUA6jXVaP2wR+wMQgJYAbrwROOccCEHKnccfB/baC/j3v3mIMOGEBWyeNDUBQ4Y4OA6DMRjty+y6OuDUU+m5bGIyTC57sLNhMYzfpFJAv37Z/bKsDKivB4YNs1fxVlXRrlV2HZ3aWnKGOuww+r++Hhg3Ljumx7BI3b0bOPNM4G9/A3r3pnVo//4Ff1OG8RRWEefBunXAlVe6PKmsLDN5mG1WAAnSNWtopjCqzFQ2LIYpFs3NuUKxrQ1YscJeuJaVAVddpb4OQP39xBNp8VlRQY+ePXMDZg2q5g4dSCZ/4xvApk3AqFHAJ5/k9e0YxjdYwLognQZuvx342tfI7OSYsjLg7rv3qIelE006DWzbBrS2Wk4sANS2MIbxg4EDaQFopKwMOOmk3Nc1jd7TjzH2e9l1AOrvy5dn/k+lSMNjpqwM6Np1T9/v3p0ifCoqgLfeAkaPJsdChgkNgnHEG28IMXy47h4pxDHHZJ5bPZrubhQimcy+WDIpRCKRfWBZGb1u9Z4QQixcmHk/kaD/GcZvFi6kfqj3R73fyV5PJoWoq8vt9/rxmpY7UMrKhGhoEKKqSj2YjjtO2vdfeUWIHj3o5R/+UIi2tuLdFoaxggWsDV9+KcSttwrRqRMN4G7dhLj9diHee0+I8nJr4VpeLkRLS/uFkkkhnn02W1DqE1MiIURNTeZDVZOZnfBlGD9RCU4rgSq7hkzA5vMw9P1//EOIDh3o5Rtu8PybM0xexNrJyS4TUypFjouvvkr/jxoF3HVXJjvTnvM3bqRUTYccAvTps+f8PZmcVB6YNTXA5MnygPzGRrJxnXRSxkWyro5CG8wYnacYJoykUsCyZcD995OfgVcY+v699wI/+hG9vGAB8JOfePcxDJMPsRWwTjIx6fTsCcybB1xwgcH/KJUiW+rAgRkbkxH9/W7dcj0tdQ/ME06Qe0kuX56dFefaazOOIjJvTkP4D8OEjkWLgIkTrbP854OmkWNga+uecXjLLcCtt9KweOopYORIbz+SYVwR7AY6OJqanGmhTj9diM0vr89V78rsoLoauLo6875KHXbqqfLXa2tz1cD6dWpq1OpjhgkbyaQQS5faq4S/8x37Y/Q+bx4T+nnt4zCdFuLiizPmnJdeCvomMHEmtjtYp4kimm76CwZPOy+j3p0xA5gyJXcXOWMGqXsLTfs2bRowdar6/epq2kq/+y6F/fDOlfELOy2NFU4SUBgx5y+eOBH49reBQw8l7/pNmygu1op2bc7O3hX4/vdJe3zwwaSR5mHCBAELWBuatCEYLJoyLyQS8klD9brT93VuuYXK6KiONWbFYRivMAtTld+A02upEkpYUVYGLF5MMbHm/u30mu022U8/BUaMoMpVRx8NPP880KOHu+YwTKFwHKwd5lSG+oRjxJx9yUxZGQXQ3nyz/ee9+y4wc6Y8XlD/fM5PzHjJokUkvE47jf7W1GTvPmXJToyx2Oa4bFVCCTva2jKl7cxx3hUVJOSNMbbmHMaGZC777ENVrA44AHjlFWDMGGDXLvdNYpiCCFZDHRxObbBN2nG5tqCamlybkcqGZLYTOQlR0DSKNTjzTMvQBIYpGFnol8wHAKBQHCGyfRDM/bu6Wog778wv7EY/3+jfYAxf09urhwQ58EdYu1aILl3okB//WIh02vc7yjB7YAFrJ2Cvuk8eSK+ahPTHD34gxOWXy4WnnQOU7Bx2amL84Nln1cJOtrBz0vfzfVxxhfza1dXq9lvF5rY7Ji5blrnsbbf5ejcZJovYqogda7B+/3tg+nRSWb3/PtmhnKjAnnqK0sSZEYLUb3V1FGKgUgUb0TRKvKp/PsN4hSoN4syZ8pSH+ap/7dA04Fvfkl97yhR1WtCKikwOYx2TyvuMjYtw++301k03AQ8+6HnrGUZKbAXsI4/YH1OO7egpNgHXX5/tsTtwoLSGpWMWLKCcqq2t2ROZinSabFPs2MR4jW7b1IVsIkHCtKqKFnTGhSWgzifsBtXY6d9ffm03fgfmQhrt9uOfnpnaUyXvxz+mr8UwftMh6AYEwfPPU1lKALjl/z7DWfO+nevMhPaarEgCbaDEED170gRTKG1tmSQTeujPpk3AnDlqD+XDDissbIJh3KJXtjG/Nn++uxAcM0LIX9u2DTjvvNzVr7ESlR2qyj/vvosZMyrQ0kLKoNGjqWDHkUfm9xUYxhFB66iLzaZNQhx0ENljLrmk3elhwgR75wujI4dVQvJ8Hkb7Vl1drhOVplEbOck/4zX55rd24sikaWQ/lSWJkI2Bhgb3NliX32f7diFGjKCX+/UT4oMP8r91DGNHrFTE6TRw8cXAhg3AEUcAd94JaOtTwAMP2J+or7rTadppyuxWF16Yn/rMWI5OCOCUU7LVaEIA991nHTbBMPlgseOzZMgQuarXqGpesAC47jpSMc+ZY3296dPJZCLbFR96qPW5RmThPIaSeeXlwBNPkBKopQU44wzaODOMH8RKwM6cSWl+99qL1ERduyI/p410GrjmmtxB/OCDNGrr6iiW0M62qlNWRsn9dceME06wb5OTSZBh7FBJl9ZW9TmLFlF+bbOqV9PI3FFXR+NAt9tWVABjx1ovPocOVdt3x43L1Id1Ugu5slJuP25n//2BZ54hi09TEyVGa2tTX45h8iboLbQftLRQGI7xsWBBRuuaFVpnF3ZQVpYbTmNW6crUacmkWo2madmhPzU17kMfOB6W8YLZs+X9a+7c3BKLQjgbL6p+aYyfVZ1jjG01H2McJzIziay9FqxalSk5+bOfcYws4z0lJ2BbWlzWaRUie1Ab41T1uFO3CfZVE4n+qKrKFs52sYhlZWSD5ST/jNc0NMj73tSpcmGm6qvGh56QQkYySf3fqi/L4seN40ElmPPwUXj00cz6edYs97ePYawouVzEjnMMNwGDBxteSKUyCfSB3GT6qRR5EgsBDB+u9uK1y5mql6ozlNhCYyNw/PG5x/7iF8C552baYWyjVYk89jJm3HDppWTj1xkzBnjssew+nEhQ1vwDD7Tv307KJ6r6smr8aFquShogNfBhhxVUxnHOHKoICZAD85gxtqcwjDOClvBe4zhDU5PDCxpL0OlLXU1Tr5CtVvj6TtS80rbawTpVA+e5gmcYIQTtZOfOpb+q/qj3ezuNTyGoPvvyy+VaoZoa9TlWO2kD6bQQP/85ndK5sxArVxb2FRhGh3ewVliV3NI0qtrupOqHXiXk0EPVxdfNr+u0VwexRPWZXIidyQcrLYzerwBrjY+Xn61/5uLFwC9/mdueKVOozKOsnQ7b09ZGyqInnyQnqPp6b0LemXgTKy9iV5gzwpgRgkah2atRFSYwdqw8DKGtjTw5Z86Uf87atfZtzTfUgmFkmLM7GdH7lTFFoSxdYaGfLQuzGTJE3p7p03Nfnz7dVXvKyoCHH6aP+OgjYNQoYMuWPL8Dw+gEvYX2Gscq4pset76QE2eOiy5Sq2VlHsZ2Qf033CBXK+tqO5W6ON9kAQxjRUODtQe9C49d1zgdP3aVf1zy4YdCHHooXeLEE4X44gtPvg0TU+IrYBNDrCcHJ1VDVJOPFVYeyVa2LzvbqltPZ4ZxgqxfeWXvz0dIm9tj9Hb2aHH5xhtC7LMPXeq884Roa8v7UkzMia8NFoMxuG4O2Y1WraIXzd7B112XSVpsxsqr0YnN1I0HpREr25KdlzHD5IPZw94Le7/RvyGRILWw00pRensaG8n+am7L3XcXXHXq3/8Gvvc9YOdO8jBWTQMMY0XJ2WB79qR0aFaUYzt6Jj4h+2bfvpQpZtw4eq5njAGAq65SV/4QIvc9p0nJVTarigrK5WiFlW3VS1sYw+hUVFC/bm6mxahTe78q65Ki4o3j1J96e8zCVb+WB5xyCnDPPfR89mzgjjs8uSwTN4LeQvtBS4sQ112XsaM0NZHNtSkxRDThWNGSOJTCbmQqYHNojCqzjK669VIt60QtzbZVxg+s1LVmlbAT04iVGrnAsBohhBBLlxZljEyblvkKTz7pySWZGFGSAlYIIc4/nwbGb35jeNFJ9iRAiDlzcp0r5syRH1tbq06X6BYnGZ3Ytsp4jZUwVDkWWfVJO6e7Qp3y7DKlFeDkZCadFuInP6FLdukiRGOjJ5dlYkJJCth0OlOS7rnnFAfZ7RadTDRe7yZVn9HQ4J0QZxgjdv1atei76y51n3SyQ83XKa8QLU+ens87dwoxciRduk8fId57z9XpTIwpORssQP4WGzYAHTsCQw9an20H0u1CgDrWD8i1C9mUwfIE1WcMHcq2VcYf7GKoVRVuJk0C/vtfeZ+UnWP2T7CpeOOqvUDm81TjctGiTLWqfv2yfS1s6NiRUigecwywcSPFyH7yiePTmTgTtIT3g/vvp9XmsAEbs1VfsjSFxhSITlRNVhV0vCKfz/A7LpEpTZxoZqwq3FhVzvEjbCwfLY9H2qdkUoiDD6bTTz1ViB07vPlKTOlSkgL2sstoEFyLWdaqJKMtKcoORZyHmCkEJ8JQ5VRkVznHj8WoW+HthVNVOy+/LET37nT6RRdxiTvGmpKLgwWAr30NeOMN4HGcg3PwRH4X8SieznPMFXM4DzGTL8a+BNhXarLrZ8Ws5uQm5tvjMfL3v5OauK0NuPFG4LbbXF+CiQtBS3iv+eijzAJ1k9bb/Q62rIw8g81exGFQv8p2qh6uzpkYkY/Ww2rn6KUWJd/xZhdq5KHKetGizFBbtKigSzElTMkJ2GXLqNMffrjIHVSyouV2Ay9I9atxwrCyPXEeYsYNhdgk88mx7YZ8x5uT8xoaKNyuocF9uyTceGPmqy5f7sklmRKj5ATs5MnU6Ssr218wTwiqCUJmKwoyiX5NTfaEUVUl36nOmUPHch5ixgnJpBCzZ9trPdzsIr3SouQz3pJJsg87cdTyeKGcTpMdFiC77EsvFXxJpsQoOQE7YgR1+Hvu8eBiQalfq6vlDlcqb+dEgs7hWFnGCqsEDUaB5FYYNTTIr+l2p+h2vNklnNDPUyXL8GAn++WX5FEMkIcxDz/GSEnFwe7YQfm/AeCkkxQHqfKjynASz+c1qRQweXLu621tlHVcj5E1kk4D11/PSf4ZNY2N6vrGxtjRfPIEt7bKX9+2zV0bVeOta9fcMWtXr9k4TmWxs+k0MGyYq3hYGZ06AY89BhxxBLB+PfCDHwCff17QJZkSoqQE7Nq1VP2iTx/gK1+RHOA22LwYySXMNDfTGtuMpgHnn0+ej3Pm5L7PBdYZFYsWASecIBdGc+dmJ3qwSzwhw6uFqGy8XXQRCULzmFUlnNDPM45TVbIMt0UGFOy7L/D00zTvvPIKDdNduwq6JFMqBL2F9pLp00lVc943N3prTy1GcgnjZ6nUXrq6TqXyYv0UY8aqP8n6f77jxEsvXX28WTnwWX0vTbN2VvTJ5NPYSPmKAcpfzDGyTEkJ2B8c3SIAIebiqsIreAQZmmNVwUefYBYuzLbJyiYVhrEqIKHqL1bCUncqWrpULpy9XIjajVkn48RIETzuly3LfMS0aZ5dlokoJSNg21qSYh98TL4VGJI7eNyszMOQGcmqgo8+iXF4DmNHvg4+MmFZ7EWdkz5uN07M+JXC0cAdd2Sa8NBDnl+eiRAlI2BfW7RaAEJ0QavYiQ7yQeZkcIVJcFm1hRNMME7xQqgkk3Ivdr/Hhh9jtggmn2uvpWZ06mRR0YspeUrGyWnFpkEAgGFYjY7YTS/mU8EjHycPv7BysnLiWOLGY5opXfKtXGNE5Xzn99hw0na3zogVFb5Xp6quBsaMIafLc84B3nzTt49iQkyHoBvgFSte3xcAcJK2ChDIDDKABqeeH1V/qNAFlzlvqR4qUIw8qzqpFDBgAFBfTyEPxjAcfVK5/HKa5MyTyqJFmTCGRIKODVteZaZ42PV7OwYOJE92s5D1O2wNyG27LOdxZSUwcqTz/MQ+k0gA999PoTv19ZS7ePVq8jRmYkTQW2ivOPRQUsn8fepzmVzCxlJ0btOumVMsFtsma2cH1tXEsjJdYVJzM9FH72vm0o5B+Cc48Y8IS+5wIcTmzUIcdhg1d8gQIVpbg24RU0xKQsAmk+3jDbvF5+hGA2/MmMLsRXreUqNbYLGElZ2ANE8y1dXZE4rKPltV5V+bmdLE3NdqamgBay6IUQyc1q4N2kHRRHOzEPvvT00680whdu8OukVMsSgJAbvkji0CEGIw1soFi8wD12qFaxykqvSEfjoTWTkw5Rsnq78fglU9U2Ss+rvde2HShKjGxZw51gUxQtDnV64UonNnatLPf84xsnGhJJycVvxjOwDgJKywPjCRoJRxVtmczCnYZI4dftudrByYrDLY6JlpAOCaa+Tvv/suOz/FCavsZXaZzcLk8AeoMzJdcw21f968cLXXwPDhwIMPkhn79tspgRYTA4KW8F7wja99KQAhaiFRCxsfU6far3CtAvN9jJ3LQRWeYLWDNe90zbvvsrLcKj0hUKExPmG1o3MaYxq2HaFdcglZnw/BDlZn1qyMYuzRR4NuDeM3kRewn32WmQPWJyrUQueKK5zFjlrVXS12tRpVvJ7TDDZmIV1dHb4Jk/EPq/7uNI7aaRxqMZ2KrJJLVFWFunRjOi3Ez35GzSsvF2LVqqBbxPhJ5AXs8uXUWfv3FzTwamtzV7G67dHpilw2qYTIM1EIkRG+Y8dmf58xY7LbaRTSnJwiXhS6gzVeR7W4DMqpSKXJqa4ubu7wPNi9m5ydACF69iQnKKY0ibyAvekm6qgXX2x40WrV7TSrjXGQhtAzUQhh7/BUU2N/PO9gS5dkknZ0KvNGoRmeitmfZAvcmhprDU6IaW2lsB1AiIEDKZyHKT0iL2C/9S3qpHffLbIHodUq1s0KN8xCSbUjNa/ojRQhFysTAsyLwqqqwseCmWJpRFQL3Hw+P0SaqA8+EKJfP2ryiBFCbN8edIsYr4m0gN25U4i99qIO+vqtj/qzywyzWlW2gpftZP2uesKEi2ItCovxOV6puYUIpSbqjTeE2GcfatLYsUK0tQXdIsZLIh2m8+KLwPbtwH77tOGrt4zLuOh7VEgZgHfFpAvFHFqTSgG//KX9eXpojpEi5GJlAqRY4TVucwDng9V3cfP55vA7L+eIAjjiCOCxx4COHYFHHgGmTAm0OYzHRFrArmgPex1xxCdIiLbsN72aUIoxidghi1dctYrW7HYEsRhggsWvRaEsftqLQgJW2H0Xp58ftpheA9/6FvCnP9HzmhrgrruCbQ/jIUFvoQth9GhSrcy84ZPiqKqCUKvK1GCaps4wZXyPbazxxWtbe5DqVTeOiW6zUskKxwfEbbdlbu+yZUG3hvGCyArYdFqIXr2oQ65cKUrXeceJI5NRuNbUsI2VIbzqB2Fw9LP7LlYLAGOxAn2OSCTyKwTiI+m0EJWV1KQuXYRYuzboFjGFognhRM8YPt55Bzj8cKBzZ+Czz+gvUqnQlKvyjFSK1MKq9IhmuDQd45ZUikwOAOX0M4+dujoyT5ipqyNbftDIxkhZGamMly/PLts4cyYdO25ctoklkQAWL5Z//yKyaxdwxhnA3/8OHHAAlbjr1y+w5jAFElkbrG5/Pf74duEKZDvvlEq+XbMNOJGghKYqQuK8wUSEmhrgkENI4IwbB/Ttm5uTOCyOfipU9tX6+lzHpilTMvtwI+k0fX9ZTuYiojs7HX008OGHVEf2008Daw5TIJEVsCtX0t8RFS25wsTsFDRrVrSFrdGRo6UFWLAgW+CaCYnzBhNyZs3K9UQXIneBFgZHPytUCwAh5IJX0+TjBgjFArVHD+Cpp4CDDwbeeAM491xg587AmsMUQtA66nwZ1OcTAQjxV4zKtqE4KedWCug2qYaG/O1jIQq6Z4qMXdEIWZx3mG37qvSmqrSpVvm8QxLn/tJLQnTvTs25+GIucRdFIilgN764fs84+Bj7ZAsVO6egsGRh8pJ8HLxCGHTPFBGrcRLVMWJeAMgErKZlv19bG7wDlwV/+1tmaN98c9CtYdwSSRXxyic/AgB8Ha9iX3xKL+pqUVXNSB2n6tMo2XDdxiKGNOieKSKqcaJp4VL/usGcQKW5OdfWKkRm/FdUAGPHhlr9PXIkNQcAbr0VuOeeYNvDuCOSAnZF6lAApgLrutOF2V5kxolzhl0h6jDiJjtTiIPumSJhN07CjNPFr1PnLL+TZRRIZSUwdSo9v+wy4J//DLY9jAuC3kLnw/HHk8rkQe0itVpUVxcZY9+cqE/DEPNnhRd207B/R6Z4NDSEvkh5Fm5NGyUSH59OC/HDH9LX6NFDiFdeCbpFjBMiFwe7bRuwzz7A7t3A+/UfoN+Ot+3jXt3Ex4Y55m/RouyYvkLiXRctIrVwW1tGLRaylTtTBMLc381Yxbt6Nf5DzJdfksr43/+mr7F6NXkaM+ElcgJWnw8qKoB166xDQvMi30HsN4VMLs3NpC4zH1ciEw9TAGHt7zKsFgOHHabu5yXEJ59QLoy33gKOOQZ4/nmge/egW8WoiJwNVk8wcdJJPghXILwxf1Z2U5VNys6WXFEBdO0K1NYCjY3+tp8JJ2Ht7zJUNtXGxuj5TOTJvvsCTz8N9O4NvPwycP75lP2JCSnBaqjdM3Ik2SFuv93nDwpbzJ/KblpdLbdJObGzTpiQ/f6ECUF8MyYMhK2/qzDbVGtqYulP0NBA+YoBISZO5BjZsBIpFXFbG63gtm6lWrDf+EYeF7FSmYYds910xgxg8mS5eq+52dq21thIeSbNNDQAQ4f69Q0Yv9H7d7duQGtrNPu5HUbThl0/L2GefBIYPZqG/29/C1x/fdAtYsxESkX86qskXLt3B446Ko8LRDH8xog5nOC449RqY7sQheefl3+GnoOSCT9m04Cxfx9/fHT7uR3GkLSw50n2kbPOAubNo+c33AA8/HCw7WFyiZSA1e2vw4fnEb5XKskVnE4udra1k0+WX3/ECN+azniIebFYU5Pdv3Xy7edRSbQiK4Zx9dXeXT/k9+HnPweuuYae/+hHwH/+E2x7GBNB66jdMG4c2Rxuu83wotO4UFVquBDkHC0Iuzg/K9sa22Cjicy+bpVX2G0/j2IazWRSiKoqb9sdkfvQ1ibEeedRM/fdV4g33wy6RYxOZGywQtBidcMGg3nFTVyo03CEKNpoCwm3aWwktfCIEWx7jQqqcJVEQl432CrsxtzfoxS2Y6SQMDZZLdyI3Yft24Fvf5sq9PXvT3/79Am6VUxkdrDvvUcrtA4dhNi2TeSXjchutxeRFSsTc1R9v6Ymt0KMVfYiWX+PqqYnn3YvXJidxUrTMvcqgvdh0yYhvvIVaubxx7fPk0ygREbAPvAAdZwTTmh/Id8BoFKZcvpAJkqoFovV1RmhkUiQ0JWh6u+FlD8MErfjV1Zpx3hOROeDd94RYv/9qblnny3E7t1BtyjeRMbJyZhgAoAz70GZg4IqKT4nwGeihCxBfSoFTJmSqSCTTtP/MgcdVX/fti06iSeMuE2YIau0A9A9qK+PVgIOAwMHAk88AXTuTH91BygmIIKW8E75+tdpVfb444YXrVS+TtW9upNUVFfuDKPjRqujcpRaujSzg4tC4gkzTtut2sGaVcURvQ+1tZmvM3du0K2JL5EQsB9/nOksmzaZ3pQNACfqHZnX4YQJJVF5QwjhTdUdJlq4VWsaF6ialq1ajnLfd4rZBqtSFUd0HFVXZ37aP/856NbEk0gI2L/+lTrKoEEOT7BbyasGViIhxLJlkVyxZsHOWvHFbXm2ZJK2O3HV3iSTQtx8s3y+8Drsp8ik00L89KfU/PJyIerrg25R/IiEDXaP/fXYbfkXWgaAtWszCSdk9pd0Gjj7bOC//w29rUWJXUKNkAfOMwXitnh4RQXQs2c8/Q/0EJ0DDsidLxIJYM6cSCem0TTg978HfvADYMcO4MwzaWpjike0BGztlc7Sv1VUUJ5eM5MnA8uWyWMFdcI8kJwIRytnrainimTkmPuF7sgH5L8gjWq6QacLyEWLgL59gXHjgEmTMrH0AH33a64piUVHhw7AkiXA4MHAli3A6acDH30UdKtiRNBbaDu2bxeiU6e0AIR4B4c5V2Gp1MRGW5PVI2zxbm6ctkop/IKxRtUv3JoJ3KqWw4ibMSKbAzSN1OURDtNRsWGDEH370tcYMYLmVcZ/Qi9gV6ygTtEbH4q0GyEoGyBGW6v+nkzghm0gFeK8ok+WhcQNR9TJo+TxejEVUY9ZIYS7MVJV5WxhXQqLDgOvvSbE3nvT1zn/fEqxyPhL6FXEe9TDWIms+up2Kiw9jk1mi02nSW9SVwesWwcsWBDueDe3MboyO1w+akBWKYcbVb9YsSI/9aYqRjwKOB0jqRTZVmUkEtnjwa09O+R87WvA448DHTsCtbVUgYfxmaAlvB1nnEErrjnn1+e3mmxocLZDDfPq3St1ldMVeTJJ8ZAlpCIrSdgckMHpGFFpcoDI71Cdcv/9ma/8xz8G3ZrSJtQCtq2NqkMANGfkLQRLQdWTz3cwqnf158uWCTFnTvsNVXyOVWWWsNmm446qX5RCn3eLk++sSrChGg8lyq23Zr76U08F3ZrSJdTVdN54g9QaXboAn35Kqo28KaTiTFhw8x2MlYa0duW68aeWVR+SVRAxEuJqIrFG1S+sXo9axSinOBkjixZRpEBbW8YkZFb/lvI9Ak0FP/kJ8Kc/AV27Uh3ZwYODblUJErSEt+Luu2mVddppQbckYlg5eFmp0KzUZ3HZBZU6nISEsNKGxeQe7dwpxHe/S1/zgAOEaGkJukWlR6idnHQHpxEjgm1H5JA5fMgwO4HIHKESCfKIKAEnj5LDbdIQuyQkcULl0BWje9SxI/DII8BRRwEffgiMGkWaQsY7IiFg91TQYZyhymRlxuxFLKsgMn8+MHZsSarJIk0+Ht5cMcqemN2jvfcGnnoKOOgg4PXXgfPOA3buDLpVpUNoBez69cB775GcGDasgAvFMTWgWVAmEhk7rI4qHKnEQhNKknx3WaWUsckPUilg82b5WCnhe3TIISRku3UDnn0WmDgx212DyZ/QCtiVK+nvMccAPXrkeZE4x3EaBWVLC8X71tUBDQ32wjPK8ZBxIN9dVkRrnBYFfa4YN47+14VsTO7RN75B6uKyMuD++4Ff/zroFpUGofUivvJK4A9/AH7xC0pY7RqZRyx7wWYocS/JksaqbwPq31X/zbt1o8LqUfao9xLV/Vy8GDjxxFjdowULSDkCAPfcA1x6aaDNiTyh3cEWbH+NmS3FFXHe2ZcCqp3o8uXq39X4mw8bFu2KUV6jmit69YrdPZo4Ebj++szzf/4z2PZEnVDuYLduBfbZh/p8KgUcfHAeF+EdrBy+L6WDMeYTkP+uDz8M9O9PQpV/czk8JrJIp4GLLqINfI8etNk56qigWxVNQrmDXb2afuT+fXfj4HdsHJRUTkxxtTfZOXW53dnH0UksKhht5arfddw44IQTWJtjRVznCgWJBKmHv/lN4PPPqZ7shg1BtyqahFLA7lEPr1tsrca0U3XGzSNWdj/MAtKNJymrkqODVWiWTElV4p6xWdgtElMpoHt3cvrgmG8AQOfOVBjg8MOBZJKE7NatQbcqggSb50LOaSO2C0CIuzFRnXWoxOo1FozsfmiaulZoPjlb43x/o4Dxd7XL4FWi2YlysMvKtHBhdjEQTYvPvXHA//4nRO/edGtGjRJi166gWxQtQidgd+4Uokv5bgEI8RqOVCeaz7e+aalileZQJiDtCifw/Y0mySQVDZcVFAeEmDs3Posku0WiKqVoIhGfe+SAhgYh9tqLbs3llwuRTgfdougQOhXxSy8BX+wow774GEfgzcwbZpVWt26xCwi3xEn2prY2CnZLpexjXTkpQTSpqKDMW9XVue+VlQFjxsTHtmjnb6BKKZpOs33awNCh5PCkaWSalnUtRk7oBOye/MNHtyJR1t48s9PBokXkFWmuDnP11cVtbJhwkr0JAK65xpk9lR0/ok1VFc2ECcUYigN2i0TVotRceN1ITJ3+zj4bmDePnk+ZAixZEmx7IkPQW2gz555LqogZM0S2GlOvZyorJq2yNcYR4z2zssk5taeGuRA9Y09Dg3X931LHzt/AXP/YygYbkyo7Vvzf/9HX79RJiP/8J+jWhJ9QxcEKARxwALBpE+1k91TRMdY2TSTsK8XEOIYth1SK1MLXXJP7Xl0dqYmZ0sQ8bsz1f+OCXY3YVAqor6fnqsxNHCsLgDTsY8eSh/G++9JtO/zwoFsVXkIlYJubgUGDyEX8s8/or20RcBVxFR6yFIg8OcQP/s29pa6OwtVkr8dsnvniC7oVa9ZQDpPVq4HevYNuVTgJlQ1Wt78OHdouXAG1I4JuO1FViomjM44qbpXtqfHDSUKRmNoT82LgwNx5xspWW8J06QI8+SQwYABVPDvzTBK6TC6hErB6BZ2s/MMqR4XVqzOVYhYsYOFhV8Isbkk34o6dgw8nESmc8Cj/ik7v3sAzzwD77UcFui68kNZvTDahErB7Mjh9dUtmZa3afQ0dmgkzqawkY8CcOfQ3jsLDyY6Fy9DFByutRb71ZONMc3OuQBUi1uE8gwYBTzxB2sa//AW49tqgWxQ+QmOD3bw5o8f/WNsf+4qPsx0zrBwV2JnDO5sbl7ErLczjJpWidICy2bDU7YlO+7ZTP4ZEgjRoMR8nS5cC48fT89/9DrjqqkCbEy6CdGE28vjj5P79NbzqLpyEU/plcJIC0e78mIchlDTmkJQ4jRmnfdvqOE6rqGTmzMwtefzxoFsTHkIjYK+9tj0VF+5yl55PldKvtpbeK+VJQ0a+cau8UCltVGkB45Cb2Gnfzie1Io8RIQSlT7ziCrole+0lxJo1QbcoHITGBrvH/qqtyn7DziNY5t2naaSziKMDR752Vi5QH1688PZVeePPnVv6Tm9O+3Y+qRV5jACgKfcPf6CqO9u3A2ecAfzvf0G3KnhCIWC/+AJoaiJT8EmTR7jzCF6+XP46O3C4g3MPhxOvvH1VC9E45CZ22rdlxyUSlPkmleIxYkOHDpRCcfBg8qkZNQr4+OOgWxUsoRCwDbc8hd27NRyMFPrNnATMmOEsnET3hjTnJDb7bfEq0x6OlQ0ffnv7ynJVlyJO+3ZFBTBzZkaIahrNJePG0eJm+fLs93mM5NCtG/DXvwJ9+wJvvw2ccw6wY0fQrQqQoHXUIpkUt2k3CkCIcVjszq6hsr+ynSR/OPdweKiq8s6/gMsP2vdtWV5i87yiv6ZpQlRXF7X5UeK114To0YNu1fjxQrS1Bd2iYAh+B9vcjJViOADgJLQbYp3uOFXVMM47j3di+cKxsuEglQJmz859XdNoR+VWZczqTeu+bdYWALmasHQ685oQwPXXs+lJwde+Bjz2WEZtPHVq0C0KhsAFbNuAgVgFk4B1OvArKkidbOaxxyjhBGctYqKKLLEBkNlPAe5UxmwCsEblBGYFm54s+fa3gYUL6fmMGdT94kbgAva1TyvwOfZGd3yOo/Cq+4E/ZEjua21twLZtvBOTwflno4FsxymzmbqZ5Dldpppu3eSvG+2tnPPcNRMmAL/6FT2fNInSK8aJwAXsimoKyxmOVSjTBDB9uruBz6ov53D+2egg23HecEPhkzybAOS0tspfX7IksyDhnOd5cfPNwKWXZkrdvfhi0C0qHsGmSkylcMEhK7AE43EbbsSNmJZfer9Fi0hV1taW6fi8Os+Gy5dFEz3V4dq1wOTJub8f93VvcDo+7GrLMlJ27qSwnX/9CzjwQKrV0rdv0K3yn0B3sOKdZjwPKp0zAu2ldPKxa7Dqyx43QfKsRg4PFRU0mZuFayIR38IWfuAmlIc1AK7p1An485+Br38d+OADSkjx2WdBt8p/AhWw67p8FetRgQ7YhePRQC/mq97ljm+NU1U6q5HDh2xxlE6TnwHjHbxQ95W99waefpp2sK+9RsEeO3cG3Sp/CVTArvjvgQCAwXgRXfEF2zX8xMkKncuYhRP2MygevFD3lUMOAZ56inzK/vUvml7CUc/NH4IVsHr+4YlH8KqxGNit0FVq5Pp6+fVYlew/eum0mTPZwYYpCY49liomlpUB994L3HZb0C3yj0CdnI4+Gnj1VQpbHT06qFYwe5A5egDyGrtcg9d/zPd4xgxg6FB2sGFKgvnzaQcLAPfdB1xySbDt8YPABOwnnwD770/qgY0bM8XWPYWLh7vHOKkbMXpUskey//A9ZmLA9dfTurFDB0r1fNppQbfIWwJTEdfXk3AdNMgn4crOOtao1LuVlcDixbnH66riujpg1Sou2+U3XBotPLApxDemTaPKort3A+eeC7z+etAt8pai7mDr6zM1ApcuBZYtA775TdowAcCAAcCJJ5pOymcXyqt/a+zUu7L7p1cpEiKT7MDYdfj+ekuhfbixEXj+eeDkk0mtzOQHm0J8Z8cO4LvfJZ+cvn0pRvbAA4NulUcUq6rAqlXyYh7mx6pVhpOM1S0SCfpfJ5lUVxThyiFqkkln1YYWLqTX9ffNlUU0Lft942/DeIP5N3B6jydMyP6tJkzws5Wli9OxwhTMli1CDBpEt3jwYCG2bg26Rd5QNBWx0+r2e46zChmxU/9yWIMap6pHo8fxww/n+tILQapk9v72j3ziMhsbyWPEyH330euMO1hNXzT235/yFPfqBbzwAhWM2r076FYVTuC5iJVYhYzYxWpy5RA1bhYfekzg8OG5OXATCdLnc8ygv9iVWDPbBp9/Xn6dlSt9aV5Jk89Cne21eTNgAJkN99qLElL84hfRj5ENr4CVde5EAtiyxfkOrL4emDOHU8oZ8WrxEfWeH3VUWpyTT5YfP2JE8dpWKrgdK+xYWTAnnEAKM00D/vhHoKYm6BYVSLF00Q8+6MwG++CDhpMWLsy1/ckeKhuiyn7L0P2qq3NmT2Kbdriwsw2yDdZbnIwVttd6yu9+l7mNS5YE3Zr8Ce8OFgBGjpTXwDTCKf/yw01KOFWtzK5dPW0S4xA72+C99wINDcDcufT33nuL3cLSwslYYXutp1x1FT0AqimrZ/2LGh2CboAlsk5rZvFiKjJod57e2dle6B5VrUxONh8MuvnEHMJjtA0OHcrhOcVk7drc19ixsiBmzwbWrQMefxw4+2yy9A0aFHSr3BHuHazMDmukrEwSOKs4jzt7/vD9DBcy2+CMGbSwZC1N8UmlgClTcl+fMYMX9AVQVgY8+CDZZT/+GDj9dGDz5qBb5Y6iCdgBA/I4zjyRaFpmordyOGAvYm/h+1l87LxRjSE806dTvVh2rikO5t9GpWnr1489igukSxfgySdJLvzvf8BZZwHbtwfdKucElsnp2mspB/HUqcARR9Br0kxOAHXQd9/N7Jj053YTvPE8FgaFw/ezOLjJHsRZy/xDlkVO9tuMHJn7G2gaPTgDlCe8/TZFC378MaVU1KvxhJ3Akv1/61vAc8+RCuDCC4NoAcOECH0y79YNGDbMucCsq5NnSK+rI8ccJj+cClL9t1m+nBwp29qy04qaj+NFT948/zzwne9Qkfarr6YIzLATmA324IPp7/r1QbWAKQgOqPcOY/zkCSe480Zl+7j3qKIQrIpcGFX2ixfnxomzR3HBnHxyJknZ3LnAH/4QbHucwAKWcQ8H1HuHeTKXKZSsBKbKPg7wAihfVFEIRh8QHeNvY8x8xoseXxg/nlwOAArjeeKJYNtjBwtYxh0cY+wtKgcZJ858OuacxQAvgApBpRU48URnzn7sFOgrkyfTFCQEcMEFFOodVgKzwf75z8CYMWRuqq8PogVMXrDNz1tUTkr19RRn7MahLJUiNeYFF7DTU6EsWpSxqeoCsrIyc481jQSu1T1lp0Df2L2bPIqfeYbqia9eDfTvH3Srcim6gF23jtIJv/oqcOmlQJ8+lNhZp2dPqgnIhBT2WvUe1WRuhdnD1eiUI4MXQO4xC0iuDRsqtm4FTjkFePFFikBZuBDYe2/5sUHJlaIK2HXrgMMPpwK7KsrLySWbhWxIUIUquBUITC7Gews43+2YJ/oZMyjRgUq48gKocHhhGUo2bACGDAE++MD6uKDkSlFtsFu2WAtXgN7fsqU47WFsUDkz5VOnlMnGfG+XL3eWG1pmA7cTrmz/KxzONRxKDjoI+N3v7I8LSq6EO1UiExx2zkxuigUw2RTiKCab6PWdrJFEgqLxeQHkDVbhUFYhaxzO5jthds5mAcvIUa3YH3mEJ4tCKWQ3pJroZ87M9lqdP5+KYPACyBtUnsHLl2drImbNypzD4Wyxp6g22BdeAI47zv64piZg8GD/28NYILM56bCDR2EUas+z8nBlr1V/MadtlY2R6mry5GabbVEIs1zhHSwjx7xiN8Kxr4VRaJykygbOanv/Md5jVQzzlCnWWZ+Y2MAClsnGaDPSJ3JZ0k+eLAqjUEcxFqbBoyqnmU7bZ31iYgELWCaDzGZUUUG2PJ4svIeFZLSpqCDbtxk3WZ+YkqaoArZnT4pHsuPjj8Hed8VG5tl62WVAYyOnfisW3OejR1UV2VxlqS05nK0oOJEr5eV0XLEJLJOTmd27gUmTyBA9qM+naNjUH3uLT9mhplioUiBqGrBgAZXqcpoijnGPXZYgWcIPJjywg1mgGOXKunXA6NFAx47AihVAhw4xyeRkx6ZNwJBjdyO5oQPOxJP4C85BAoK974qBldewVfFonvgLx86rmFP0hQPu65FACGC//YBPPwXWrnXmYewXobLB9u4NPHbTS+iMHViGs3AbbqI3jA41rEbzB10NLHPaEEKeFIHj/LzBKi6WqxeFA+7rkUHTgOOPp+dBV9oJlYAFgCFnHIA/apMAAL/Cr/Ekzsw41HAn95fKSipLoWnWx7W1UbUXnvi9wSpLEKfoCx5e5ESOE06gvyxgzVRU4NIFI/Bz7XYAwMV4AG//egm9x53cf4YOJZur7tCUSOQK3LKy7F2tDk/8+WHlRNbUlHs8e3AXFy8WOax5Kyr6DnbNmmDbESobrJFd76Vw2tndsOLVfXDEEcCamv+g+xmn5B7IZbi8Q1XdZfny3MxBI0dyphqvMTvKqOzi1dXAddfJz2cbofd4kXmLbehFZdMmKoWqacAnn6jL2PmOCDEffCDEQQcJAQgx+vtfiDatjP7RH2VlQiSTQTezNFi4UIhEgu5rIkH/G0kmhairy77fCxfSb6D/FuZzmMJ49tns/q4/6upyj7X7/ZjCyLevJ5OZ34XnLXckkzQG8rxXhx5Kt/tf//K4XS4ItYAVQoj6eiE6daIbNW10I0/ofmA1Cdh1cpngZbzB6eTMk3hxyKevu1kkMRk8WDCefz6d/tvf+tA+h4TPBmti2DDgjjvo+Y1/GYJn7vmQA7e9RmVjmjfP3qmMsxH5x/LlNB3rJBLyBB/sCFUc8unr3brJX+/a1ZMmlSQeOZWFwZM49AIWAH7yE7q/QgA/vLIn/nvIqTyhe4nKi3X2bHYqCwp9kjG7SIwcmXuslRcyEyytrfLXt20rbjuihEcLxjB4EkdCwAK0mRo2jIKHzzkHaH17PXvleYXMi/Xqq3Mnd94VFQ9VYXXZ/edUluFl4MBcL3xN48WPFaoF46ZNrub7Y4+l0zZsCE5MhNaLWMaGDZSV48MPgfNRiyUYB4298rzDrtYlewkXj3w8VzldX/hIpShHn1nV39LCv5EVxprHiUTGeu1wvtdTJ44fT2vVmprsTLBFS50YnPk3P1Y8tlF0wE4BCFGNKnbo8BP2Eg4Wvv/Rh52c8ieZFKK2VghNc+XA19IiRHm5/Lbrj/JyOs5vIqMi1hmxz+v4Pa4EAEzBDPwD32HVpVeYg+G5GkiwOLn/nMAg3LB9PH8qKmir6dJUtWULsGOH9aV37JAXnfGayAlYDByIK7T5+BH+hDTKMB5L8F7iK9xhC0WVhpK9hIPF6v7LfjMWuOGC7eOFEXEbdvQEbEUFtAXzcWfiFxiCRnyM/XHuwWvwxX7cYfPGC7d42cTOk71/qOr39u3LubrDiPF3YgrDLld6iIiegAWAykqUt7yNx5buRq/92/BScn9pRAPjkELd4mU7KS7MUDhWCxSVl7E+CDisKhyYw62E4N/FDc3NuRO7yps+hERTwAJARQUOOf9EPPLnMpSVAQ89RKE8TB64sROZJ33VTooLMxSG3QJF9puZYd+E4mMeH5wEpDAibsOOroBt55RTgDlz6HlVFfVtxiVO7USySV+1k+JJJX+cqOzNWZ40TV71KCITUUkgGx8RFxCBE3Ubtv+Oyv6TTgtx0UXkft2rV3Hcr0sSq1yrqny3DQ25rycSnBu3EOxCO2S/RSIhRE0Nh/X4hZOc3Ko+z+FWheMiD3RTk3WIjv5oavK/2R2CFvBeoGm0qHn9deDFF4FzzwWefx7Ya6+gWxYxKirUK0OVqmvbNlphmsvZAbmvRWXVGTT6rsecZELf9ai0BkOGUDgPJ5vwFifl5qxUwZWVwNFHAytWACedRDWXGXdYzU0mevYEysutQ3XKy+k4v4lUJic73n+f5piPPgImTADuuSdSDmfhxi6zkCyLEGcWyh9jJht9gaJP6qo6sTU1ZCdhvMNpRi2r45Yv53qwRWbdOmDjRjIhbt8OLFmSKXMNcCanvPnnPzOamttvD7o1JUYhNTELqOsYW6zUYtXVuTovVsN7j9uavMbxUV0txNKlrjMRMXlimmdee41ud9euQuzeHUyTSmoHqzN7Ni3kO3QAnn0WOPnkoFtUQqRSQH09TRXDh9vvTJ2o1+JEKkXqxIEDC9vV19VlJ1c1vn7qqflfl8nGbU5oXWuzdi0webI67pV/J2+RzDN/0ipRWUm72OeeC6hdwch1f0mnhRg/nlYvffoIkUoF3aISwk0hZC4Eno0HRaT3wPe2eLjV3Mh+G/6d/EMxFi6/aKsAhLjuuuCaFvkwHRmaBixcCBx1FOnhzzsP+PLLoFtVArjN+KRy/Kiv97edYcSjItJ7iHr4QpQw5oSurwcGDLD+3WT9Xod/J+9RzDNrVpNyVi+8HgQlKWABoGtX4PHHgX33BdasAX7xi6BbVALYBc2bg+xVyRDGjYtfZic/Eg5wMYbiUVEB/Pe/VJTaLjtZt27y2NfaWv6d3OIk3apknvki0Q2vvtcNQKbweiAEt3kuDn/7W8bH4O67g25NxLGL9ZOpP43qtTirydyodNkpLHw4/f2M48AYo1xVxb+nU/T+X1OTPadY3UOTGn/F5CcFIMQBB5DJMChKXsAKIcT06XTfO3YUYtWqoFsTcWT2KLvJZ+lSrokphDNbnpd2WsY7rLyJdYEgS7qiafx7ukG2QDHfT9U9NHjdz55Nh599djEbn0ssBGw6LcR559ENP/BAITZsCLpFEcccPqKafKqqMsezQw6RT7Ysu/vEO17/Uf021dWZ183hOOzg5A475zAX93DcODp02rQitV1BydpgjWgaJZ048kjggw+AsWOBnTuDblWEMdcoVdla58wh2wk75GSwqu+aj52WqxYVB1kfnjEDmDIl85s5iXjknNxqrJzDjDi4h2vW0N8gHZyAEsvkZEdzM2Up++wzYNIk4I47gm5RCXHddcCsWbmvG+P9OLOTNfnEXLo5nikcYx9ubpbHIutpLhOJzL5Lh38fNaoMZWZs7uGmTUCfPvT800+Bvff2tJWuiMUOVmfgQCprp2nAnXfSrpbxiKuusq/mYrV7Y9zv9LkUWvEx9mFVpZzVq2lh2dICLFjAmhunVFQAM2fK39Pvs4N72NhIf7/61WCFKxAzAQsAP/gB8Ktf0fOf/jTzYzAFUlHBk4kXuAm94VJowaJaEA0dmhHCHErljuOOk7++ZInje6irhwMNz2knVipinXQaGD0aePJJGgNNTUDv3kG3qkRgNXBxsSoKwBQHr/q8V2k0o4wHZo/vf5/qK9xxB5kCgySWAhYgO+wJJwBvv025Kv/xD6Bjx6BbxTB5wIua6JFKAatW0fPhw7nijhE3i0bTokQIYP/9gU8+Ie3kkCHFbbqZ2ApYAHjrLfIy27qVTIi/+13QLYo4vAJnGHsWLQImTsw4P+m+C+wMlcFJURFJgv/mb1Zi0CCgc2fg88+BTp2K33QjsbPBGvnqV4H776fn8+YBDz4YbHsCxUlKMis4XIRh7NFzUhuFqdnTGGBnteXLgfHjKa1qv34UpWCcmxS5vRv+9hEA4NhjgxeuQMwFLACccw5w4430fOJE4MUXA21OMNgJRzvh6zSRfaFCPA7wPSptnMZ6xtlZTTafzJpFFdL1uUmV4L9uO4BwODgBLGABkFfxqFHAjh3k/LRlS9AtKiJ2wtHJztRJuMisWbzDtYO1AKWPKimLprkKRSlZUikqiiBbhAiRmZsUHvQN7/cCEHyCiT0El0QqXHzyiRCHHUa6mm9/W4hdu4JuUZGwy7HqJHWf3XHV1Zwyzg5OJxkfzPl29fy6Vmk044BdHmLz3FRVlZXb+8s//kl06kT/NjcH/WUI3sG2s88+VN6ua1fgX/8Crr8+6BYVCatYSqeJDMzxgIkEpZGrqKDV5uTJuZ8bdxuTGU4aEU3yUelXVlISirvuAm6+mQI3KyvjnYjFrElTUVZG7sH9+pFWLJ0GrrgCeP99vDz4R9i5E9hvP+ArXylOs20JWsKHjUceySyUliwJujVFQlXlxe2uqro6k/Bcrxyi2iEnEvFdqcvgHWz0KKTykfFcTeNydqp54vzzM/eprCy7hJ3xUV0tbr+dnn7/+0F/mQwsYCVMnkw/VJcuQrz8ctCtKRIq9ZSTEmv6+TIBISvhBdBAYbJxeq+Z4ClkQaSqGhPncnZWZiTj3GSxYL9kTKsAhLjllqC/TIYOQe+gw8i0aeRN/Pe/k9NTYyOpHUqaigq5aqqyEhg50j6RgUrFuW0bqY/NcX/77utt+8OOkxhhp/eaCR4rlb7d76byJNYdDEeOjNdvn0pRVSIzU6Zk7oPxfujFFIyk01izhuKJQ+PgBPYillJWBixeDPTvD/zvf8APf0hjJ7Y4sQ1Z2XJHjswuBGD0BowDbryD42yHixKF5IFWeRID8bS7qxYcv/1t7lhRFAT4NLEf3k52AUCpoMMCC1gF++1HTk977UUxzzfdFHSLQo5VJZg4O/A4jRFWncsxseGkkBrH+rkyIRvH+FfVgkO1EK+qAqqrs8KaGq+iLEEDBgC9evncXhewgLXgmGMyC6jp04E//znY9gSO3YSvqhwS56ov+S4ujLvevn2Bmprs91n4Bo+svzv9XXRP4qoqrkBlteBQjZXrrqP7137vG/Y/HUC41MMA2IvYCddcQ3b0rl2FeO21oFsTEIV4TOrnx9GBJx9nGJUTjO4YVuhvwfhDvr9L3ONfdRoaMlEILh3HzjqLDp871/9muoEFrAN27RLitNPoBxw4kJJSxAqvQkjiOpG4XVxYhTbJvLI5nCdYkkkhli7l38UL7MaK7klsuK/ptBB9+tApK1cWub02sIrYAR06UL3fvn1J43fRRc7SiZYMXtlQ4+rA47bo9sCB2U5hOuk0sGJFfO3ZYURX5Y8bx7+LF1iNFYWzYDIJbNxI8/SxxwbSaiUsYB3Sqxc5PZWXA089Bfz610G3qIjE2YbqFW4XF5ddlvtaWRlw0kn8W4QFu+xDTn8XtqdnIxsrFs6Ca9bQS0cfTU6pYYIFrAsGDyYfBAC49VbgySeDbU/RKMRjknGHvkrXO5q+k9Xv+dChlIaSE8MHj1VlHKe/Cxd4sEdVAKBdQ9DQQP+GzsEJYCenfPjFL0jf3727EG++GXRrikhcbajFQmbrTiSEqK3N3HOzIw1nxAoOJ7+X2/PZbpuNVQGA9nv1zW/Sv3/6U9CNzYV3sHkwezZw8snA1q2U6enzz4NuUZGIqw3VT4zqQdmOKJ0m+4ReOMGsJpsyhVWLQSHT7MyfD4wdaz9GbHZlDKxV8O0agt0HVGDtWnopLDVgjbCAzYOOHYFHHgEOPhh46y1gwoSYOD2xrchbzOrBpiZr+2qcE3aEFbcObEDmd7/22tz32J6eQaWCnzt3z71+4w3giy+A7t2Bww8vegttYQGbJ336AI89BnTqBPzlL5SIoqRhW5G3qHajM2Zk74imT6eJxqLINE/IAeNGs+NgV8YaItB92rw515u+rAwYM2bPPdLtr0OHZoZNmGABWwDHHw/ceSc9v+km4Omng22PbxSS7o+RM2+efDc6dGhmRzRjBgldfVGzfDk7m0UdB7uy2GMMfQJyHf0M/V33IA6lgxMATQi9xAmTLz/9KfDHPwJ77w2sXVuCG4q6OprkZa+femrRmxN5UikKqjYPvbIymmR1e2u/ftmTsf4+wBV3oorV7xqX39KqspTq/ixeDJx4Ys7xxxwDvPIKaRNHjy5C213CO1gPmDcPGD4c+Owz4JxzgNbWoFvkMaya9Jbm5lzhCgBXX52ZQOzKobGzWfhw4qMQ95A3O1OTqt/rjn4GWluB116j52F0cAJYwHpCp07Ao48CBx4IvP468KMfyefPyBL3ScFrZAuWRAK46irrY3hRE17c+Cjk4xhVCjgxNbno9y+8QJc4+GDgoIN8bHcBsID1iAMPJCHbsSP9NRc/iTxxnRT8QBXeYVyw8KImOuTjo2ClhShVb30nXvAu+r3u4BTW3SvANljP+eMfySabSADPPAN873tBt6hIWNlVGDmplNyWaryXANtbw46XPgqLFmWEdSJBwqZUFrNu7M+qsWFg7FjazMyYAUye7F+zCyLYPBelRzotRGUlZRbZd18h/vvfoFtUBLh8mnfwvYweXlabKvXMTh6Wrezbly7z7LMets9jeAfrAzt2AKecQiqMo48GVq0CunYNulUeYN5ZNTcD3boBw4bF2yvSKXa7fPYwjS6LFpFauK0to9a023ma+0NcvPUd7E7t+PBDMstpGjmXdu/ucRs9gm2wPlBeDvz5z0Dv3uRCPnFiCTg9GZ04+valx2mnkQGEswvZ48QJRmWjeuSR0rPHlRpufRRk/SEujm1OveAtbNG6/fXII8MrXAGwithP/v1vITp0IDXGnDlBt6YAZKorq0epqbUKxanqz+o+s7q4dLDqDx6qUCON2VQydWpWofWpU+mtH/844HbawDtYH/nmN4E5c+j5ddcBzz4bbHvyxqosl46qfFqpekS6wWkOYd2D0ryLATh7Vilh1R/YW1/ulT1tWtZuP+wZnHTYBuszQgCXXgrcfz/QsydleurXL+hWuURmGzRSVgbU1wPbtmXbVUrZI9INbr0nZVmedErNHhdH2NYuR7dJb96cSZMoIZ3ogP26fYnPPk/ghReAY48tYhtdwjtYn9E0Ct0ZPBjYsgU491xg+/agW+USc2xaIiEvBG60q3D+4gyy2L6rr5Yfq8rypJ9Xava4OMIxzrkYbdIXXJCb5N9Ac3oAPvs8gb32Ar7+9SK2MQ94B1skWlqAIUNIyF5yCXDvvZZ9KJwYvf8Aa0/AuHhEuiGVoryas2eTEJXt6lXaAqeeqUx08MCbtiSw05CZuF+bgAniXowYAaxY4XPbCoR3sEWiXz9g6VKaU++/H7jjjqBblAcVFTQZNDfT/1aegE48IuNon50zJ7NDle3qKyqAiy/OPmfkyPja40oZmTdtHMeEEx8PnUQCDaf+EkC4MzjpsIAtIqedlkmhePXVwH/+E2x7XOMm36qdGiyO9WWdODulUsADD2Qf889/+t82JnjiOCYAdW5u2WurV2PN1iMBhN/BCWAVcdERArjwQqq+1Ls30NQUEe1Qvo4ZMjVYXJ08ZN+7fdLA0KH0P6vW44mTvhEl3KZOvfRS4L77Mv9PmACcfHJO8o4dF1aiRw9g1y7gf/8D+vf37Rt4Au9gi4ymAQsXUh3DTZuA884Dvvwy6FY5wGmoiRmZGizfa0Ud864eoPswbFhmtxKXZANMhlQKqK3NHRPpNOlBo7aTdbsTl2ltHnwwYxoxhCy9/DIJ1169gEMP9an9HsICNgC6dAEefxzYbz/KSPKzn0Ug05PdxO/GdhRnIVJZSSFNRg83oy2WPUzjhS6Mrr1W/r4Q0fK+zyd6wEXtY2P8axScRFnABkT//qQmTiRojM2fH3SLbLCa+N2uWOMmRMyLj9bW3BWVcQfPyQbigVkYqYiSdicf7ZSLBXcUStQZYRtswMycCUyZQnVkn3sOGD486BbZYLapurWnxq0UmyzZxsiR8bRBM9mo7O1motQ38vWvcFgsYdAgmj7+9jcaRqEnuCyNjBBU3m7MGMqrecABQqxfH3SLXPLss/LcuXPm5ObajVspNs45y1iRTAqhabn9o7o62n0j376dTApRV6fMY/7RR5nb9NFH3jXXT3gHGwJaW8nP5fXXaQdbVwd06hR0qxxiFSRuTKQQR89hO49gTjQQbxYtyi61pWnAggWZ8RLlvuFD+5cvB77/fVJ+vfOOJ5f0HRawIeHddynT02efAT/9KXDnnUG3yAVG9Y4ZXYg2N8cv/CSOiwrGGdw3HLFuHWW/A2itfvfdwOmnA7/5Db3Wsyel7g4r7OQUEg47DHjoIVrE3nVXxDzzdaccvXSQEd3BIY6ew3Fz5mKcw7V/bVm3Djj8cOC44+hx9930+jPPZF47/HA6LqywgA0RP/gBcOut9HzSpIzHXCSoqADGjlUL0bgKG/YIZmTIFpwAcM018criZMGWLcCOHdbH7NiR2eGGERawIeOGG4BzzgF27qTKOxs3Bt0iG4whKLKqO8aqMXEVNrJkG0y8kSUd0UmnyfO8tjY+u9kSzcHMAjZkJBKUMeyrXwXWr6dN4a5dQbdKgSz+VReiVVV0zKxZ2StyY8GAEhtMObiZNEp0gok9Vr+rlWklnaaaqFHfzTrp16WcgzlYJ2ZGxVtvCdG9O7mkX3ll0K2RYBWCYheeEodQHTffMy73JG44/V1l40U2dqKGk+9vMVc0NalvifHR1FT8r+YU9iIOMU88QepigHa1l1wSaHOysQpBEUL+Xm0tMH586XtOuvEQZW/S0sTt72rliQ9Ez9te9f0ffpjS2LW2kh3aIrrghe1H4LhRfWw/qqkJGDzYw7Z7CKuIQ8zZZwM330zPL7+cOlJosPIKVr33z3/GI8m/m3RxcS18UOq4/V11dXFtbWl426u+/7hxlEhYVwc3Ncm/79q15PUZcVjAhpxbbgHOOIO85c49F9i8OegWtWPlFSx7b8YMCqI3E8XJww7VAmPTplxbVBzDl+JAPr+r7ok/f372uek0ZVmIEiovaSPpNOWJnTEje66YPh2YPBkQDouwhxgWsCEnkaBKTgMHUrzX+PHA7t1Bt6odK69g43v19fRFZNaIq68uPVWozJta5bQS1/ClUqeQ33XkyOyxErWKOoC1l7SRtjaqd2ucR4YMAdJp9MQWlGO75enl5ZRsIqywDTYivP46VZDYto0qW82aFXSLHGJMdm9G04AlSyg/ZCkKlFSKFhfjxmVPmDJbXNRT4zFy8vld7VJsRgnVGNCRFZU32G/X4RD8BAvxD3wPky7ZisqrumedHvZMTuxFHCEefTTjOffww0G3pp1kkhL+y7wcrbwjNS2T6LyUPWdVxRDq6oJuGRNWrLzwo4qxAID5IRv/huMPQYsAaChFDVYRR4jzzgOuv56eV1YCL78cbHts49dkjg4AGZY1LbOidVKUOaqwjZVxi0q9DEQ3VtpoMlq2LNfGbB7/7cevr12JJPoikcje5EYFFrAR47bbyESzfTswejTw8ccBNcRcLFo2SFTC5cgjo+856zQxhJUtjpNLMCrM/g1A9JMx6BnNunZ1PP5Xv9EDAHDUUUC3bkVoo8ewgI0YeijZgAHAe+8BF1ygDp3zFSdhCBUVVFFeF7K6cBk+nHawRqK0q3ObeUbmDFbK2WuY/DAvuHSBBNgvZoPGzWLRiVanfXzU/+pvAIAT93nTw8YWkaB11Ex+vPyyEF26kAljypQAGiArFq1p2XYiYyYXTaNC0vrrxnM1LTo2WDv7mJVN2uk1mPhhlfUo7HZ8c9urquz7slVRdsP4GIHnBSDEvdqlkRwfLGAjzOLFmbFWW1vkD5cJ2EQiW9DIhEhDQ7SFi9Vk5zQ1XtgnTKY46IsxuzER5gWZypHRyaI5maQ+b/4e7ePjS3QUnbFdAEK8jYGRHB+sIo4w48dncur/6EfAa68V8cObm3Pd7tPpjIpYpUJesSLa9leVeqtrV+dqPHZ8YowmgmHDrMdEmGOlVY6MTmJ3VVWm2sfHS/gGvkQ59sNHGJj4XyTHBwvYiDN9OvDtb1N87OjRwKefFumD7YSE6v2TTnInXMLmCKSa7Fpb1ZOkzLYW1gmT8R+Zg6AZ85gIa6lHq4xN+S6c28fHam04AGAY1kCbH9HxEfQWmimczZuF6NePNDOjRgnR1lakD7ayo1i9b3ee8fywVpkxq7dUaryaGvV3UKnImNJBZpNXmQj0fmI1JsKIKsa1QDX2+LO2CUCI26o+9bCxxYUFbInQ1CREeTn165tuKuIH2wkJ1ftOzgur3UmFeeFQXR2978B4h2qBaOWfENUFVzJJzk0eLhIOPZQu9Y9/eNTGAOBUiSXEAw9kSto9/nim1F3oSaXIljNwYEYNFNZ0cbK2GmlsJDvzSSeR2lhVtm/sWP/bygSHXbk6Y3k63UQQFrVvIXiU8vPDD4EDD6Rovk8/BXr08K6JxaRD0A1gvOPii6n607x5JGjXrAGOOCLoVtlgzFWcSJBtsrIyY9sxT1BBOjqo2qp6f8aM3O8AUF7Wzz8vjQmVkaNy8quvpwS6I0eSsNWFEUCLR9XCLSro1bTyYN06YMsWev7ss/R3wICMGTf0eYdlBL2FZrxl504hTjmFVCuHHy7EZ58F3SIL7NTAEyZkvzdhQnjbamWDdWKfMoZs2MXRMuFH1h80Ta4ylqmSncRThxmX7W9pyZi4VI/ycjouSrCALUE2bhSiooI65dlnF9HpyS1W8aCyCcoYZxumttq9v3Sp9bnGCdb4XaPk6MLkYrTJJxK5ceOquPCoF8LIwzmxqclauOqPpqYitN9DOEynBOndG3jsMaBzZ+CJJ4Bp04JukQKrUB+Zii2dJv13EOQblnTYYfLUkJpG75lDNnTCmA6PcYcxtGbx4ty4cVVcuC5PgOj0Az0UrbEx/GkdiwgL2BJl6FDgrrvo+S23AH/9a7DtkWIVDzpwYK5QAoC5c2kQFzs21i521W1sq/7dVIH6QLQScDBy9GQKw4c7jws3E/Z+4CZpRtwIegvN+MukSbQc3ntvId55J+jWKFCF7FRVyfVEQarP8glLcqsK55Ce0sRJXLgqPjas/cCq/7rox6WqImYBW+J8+aUQI0ZQ5zzySCE+/zzoFrnAo8EbOHYOUrIJNmrJBhhnWMWF19bK+3tNTSBNdYRHSTNKVcCyirjE6dQJePRRiil74w3KWWw2BYUWs9pVRhTUT3bqY6OtrqEhfOnwGO9Q5d+tqKDYaGM/SSSA6upMwvEwovI9WL3aXT/euNGX5gUNJ5qICfX1wCmnALt2Uf7iKVOCbpELamspdlSGMXjfL6ySS9glnjAfW19PK5zhw6Md78h4g6z/eJSsoWh4kDTjhbsbcdwVQ22Pa2oCBg/Ot6EBEPQWmiked9+dMWE+80zQrZGgip1TqYqLoUa1CjlwG78Y5tzKTPEppf5QYF7tltUbRDm+sFQPRzEOlnewMeOyy4AFC4B99wXWrqVMKaHASZYkfZWcSADXXANcdZX/O1dVujsg971EIjMfmL+DXeo8Jl7Y9S0nWhE32pMI8P6MJTju+u/gY/TEXdokHH/j97LyvXImJyb07NghxAknkBQ4+mghWluDbpFwnti/2NVn8kkeYXb0aGiwvxYTP1T9wZgw32pXG7bdr0xz4ySbk+GYtWvp63Tba5fY8W7IHRcdwgI2hqRSQvTpQ515/Hgh0mmfP9BuoKnCcVTCp1hp5FSCX1Ylx0rI6qpjrqzD6DQ05GZ2SiScLzTD1JdkJRmdLABMx9x2zloBUPa5UoEFbEz5z3+E6NCB+vasWT5+kN1ASyZzJxqrCaPYK3dz7KJxMjE+ZN/B/F2c1sFlShtZasyyMucLzTBpQ6qr5f1dlhbSvLs13YMTsUoA5CtSKrCAjTG3356RU77UXHSy0rZSleVzPT8wqqZV7T3zTOudrD75cZH1eKPKsX3nnfK8xGHewaoWx3ZjQIiccbQF+4kEdgtAiHXrivs1/ITjYGPMpEnApZeSn8X48Rn/Cs9Qlewyxq3K4ugSCXJgyud6fmCMXZS1FwCeekqe2hHIzlmsioNk4oEqx/akSZRm8OKL7dNtuk3L6RfNzSQenWAuNWkaR3/H95BGGb5++C4ccojH7QwQFrAxRtMoX/FxxwEffQScey6wfbuHH2CXIB+QTxbz58snCyfX85uKCvJgNpNOA9dem5sUI6jJjwknqgUaQH3ogQdo0aj/r8KYnCSopCSqfOFmZGPANO6f0UYBAE4/q6MfLQ2OoLfQTPC0tAjRsydpay66yGOnJ6d2R6eq0zDYMWWqMd1jWP8eDQ2sCmbk2OUetrNdhqlO7OWX2zv56Z70MpJJ0favOtFr/92BmZH9hONgGQC0EP7ud2nxPG8ecOWVHl7cTWYaJ7F9+vW6dgVaW4OJAzTG5erI4ncZRoae1WvcOHs1a10dmRXsYsWDIJWCrU5Xb7+Cxkbg+OOB7t1Jk9axlDaxQUt4JjzMnZtZND/3XAANcOMhHIY4QFmohXHHEbbdBhM+zBoZVX8Ki2OT6jsUUBHqV7+iQ889t0jtLSJsg2X2cNVVwIUX0qZs7FggmSzih5sLj6fT9H9jY/YxYSrq3Nqau/vQna6MNTL79aP/GcaM2Za6YIHceSkoBz8nVFYCLS30HWpqXDtfPfMM/T39dJ/bGQCsImay+OILYMQI4KWXqGj7f/4DlJcX4YPr6kgYmdE0mnSAjFDVNLlazUYVVTCNjcDzzwMnn0w3R5Xurr4+t/A0p0VknCIzqeh6VDMNDdQXg8Zo2gEcm4Q2bwb69KHhnEoBBx9chLYWEd7BMll06QI89hiw3340pidNcu6JXxAq70ohSLAad6yyBvntTXzppTTBXXst/b30UnW4RGtreHcbTPiRhXK1tsqP3bYt+39dy1NMbY5ZW7N8ueNQtL//nYbz0UeXnnAFwDZYRs7f/54xq9x5Z5E+dMIE50HrZjuPnzbYhgb55+rekWYP6DDby5ho4qRP+eGXYOdHUGBf/+EP6ZQpUwpvahjhHSwj5bvfBWbMoOdXXgmsXOnzB6ZSFAMoI5FQxw4mEqSS9dObctky+etPPUV/zTuOsCQCYEoHuz4l82Eo1C9B5Udg3CUXYBtua6PNLlCa9lcA6BB0A5jwUlVFJe1qa4ExY6jY8UEH+fRhsoEKZMIRgOwJRCedzlWTec2BB8pfP+CAzHNzeFFlJTByZLQKZzPhxqpPzZunFnT59D2VwP7kE2Dy5Eyo0IwZ9Nfsb2BlrmkfK41bv4aPPuqNvfcGTjzRfRMjQdBbaCbcbN0qxNe/TmqcE0+kcne+YJW8QcdprtZitA3IfG4YQoaY+JJM5h0io0SVc1s2/mpqnCd/MYyVm/FrAQgxZkx+TYwCrCJmLOnWDXj8cWCffUgTK0sR7Am6rkhH02jnavSQHDo0GNVrRQV5MhvTwmkatdlKNReEwwkTP+bNk79+7LH5X1PmdKhp8l3ykCHO0jamUsDEiXuu8TRILzxq2Mf5tzPsBC3hmWjw9NOZTdz8+R5f3K2jRBAVaVRtVBVed1o4m2EKQdYvzTvOfPuek5SObnbJhnJ8H6L3nktseHRlfu2LALyDZRxx+unAb35Dz3/+c2DNGg8v7tZRIoiKNKo2apq8GtCcOcEnwmBKH5Xvgo6577nRqlRWktpK5WCoX9+sfZKRStGYaGc5RgIAjsULOPCEvvbnRxQWsIxjrr8eGD0a2LkTOO884MMPPbpwGKrkWJFKUUS8uXJIWRl5Z5jV1tdcw3GwjHdYCUWr6jw6hWQXk8V0GxHC2eLRtBB4pl09fPoJn5S0AyALWMYxmgbcdx9wxBHA+vWUTnHnTg8ubA5B0L0TwzDw9Elp3Dj6XxeyZWXUxuZm8uw02qCuuircCwYmOtgJRfPYkVFWRoUx3Ibx6AtLpwLcCsNCYDfK9uxgR00+yvq8qBO0jpqJHm+9JUSPHmQ/+fnPPbxwdXXG0BsGu6XK7lpbS23V39M0si+Zg/6DLqvHRBs3vgnGMolVVbl9T+UroKoPZ/SM17TscWlV4MKK9jGxEicKQIh9uuwQu3YVcoPCDwtYJi+efDIzvu65x4MLhjH7kSpU4a675I4liUS2oA3CGYuJFnqmpIaG3IxJqv7npGiqse/V1MjDzKyEtcpxShZK52bxmEyKGy9+TwBCjBvn/LSowgKWyRu9zFTnzkI0NhZ4sUImE7+QTTRWHpvGSYh3rIwdsjJvRoEli/tOJGg36mTRlkwKcdll7r2LVWNRdR2XC8jBg+nUe+91dVokYQHL5E1bmxBnnkmD5ZBDhNi0qYCLqRJNqFbYdvlRvarDalev04vwBSZ+WO0Sy8qyTRDGhZtTE4pVjVaAzBwqVLm3VQ8Xi+APPsic9uGHzm9XVGEnJyZvEglKHzxoENWOPf98YPduDz9AiNzX7Jw+vK7DaqzX+fDD8jbJYK9hxgqr8Jq2tkw6QjN6/7NyUjInPzGTSFjnJlRV7lFdq2tXx4f/7W/097jjqExdqcMClimIvfemTE/dugHPPQf88pd5XmjevFzhJUS2kGpszMoEI43x86MQux53O3y4PLuNzMuSvYYZK6zCaxIJ+ULO/JpqEWcXGztzprWHvl3ojzFcLZ2m2scOF7J6cfVRoxwdHnlYwDIFc+SRFL4DAHPn0kbPFakUMHt27utGIbVoEQ1k2SRTX0/PnSasyDeFoayiyYIFQEsLVUbQJyWunsPYoQqvKSsjAWgXGqMfe9hhuf25Wzf5+ZoGVFdTX3XSNlUb7rwz+z2HC9ndu6n+K1C61XNyCFpHzZQOU6eSbWWvvYR48UUXJ6qcKqqq6H27dHC6U1GxamaqvIPZa5hxizG8xth37Gyoup22qirbLjthgnwMmMPInNDQIA/JUYX81NZa+j48/zwdtt9+QuzeXchNiw4sYBnP2L1biO9/nwbRoYcKsWWLwxNV3rrJJD1mz3buVDRmTPbrEyZkPmPpUndxhV45SjFMPqi8iGtrKfTGiUe7uSKVEO76tiyeWzVebRywrr+e3r7gAo/uTwRgAct4yscfCzFgAA2k73xHOA8klw1ku1W8+XHFFc49Mq28ILn8HBMWnAo4p16++fRtmWZmwgRnC14D3/gGvfXAA17cmGigCeHULZJhnPHqq2Qu/eILcnqaOdPhialUppg0QF7AVs4aRnTHEFl31jRr79+GhkxZvFQq93PLysiTWLepmourM4yfGMdFRQXZW087zdm5xr7rpG87bY+TsVlXR86BADZsAA4+mIbixo1Ar17OPy7KsJMT4zlHHQXccw89r64GamsdnKQLLX0SsfOENFJWBnznO/kJVwDYti3zXOUopdfc9DoMiGHsMFaPssoPrGnAmDHZTnhXX515323VKhmpFA1ou7Fp8qLXw3OGDo2PcAXATk6Mf1x3HW0pu3QR4pVXLA6Uqa2cqMH0vMAyZwz9MXWqvbOIUZVl9bkymxgnlGCKQTKZXWNY09S5gmtqcp2fFi4svP/amWz0z5Pk3j7vPHrrV7/y4d6EGBawjG/s2kV2WECIr3yF7LM5WHn+mu1PEybIE+irvJCvuILeN17HODHJkvAnk0KccYb8ev/3f85suAzjJQsXyheQiQTlxZZ5+ppfM/Z743FO/QucLHh1ByzTgnXnQ7Wix15fCkCINWv8uUVhpUPQO2imdOnQAViyBBgyBPjvf4ELLwSWLTOF/lmprSorqRSc0f70m99k/w8ATU25H55IAD/+MdmB9HJyRvuu+RoAqXutMuD87nfy111ksmEYV+jJU2RmjnQa2L499722ttxjzf4JiQTFjxt9D4x+Beb/nZhs0mnS/+pjatEiYOJErBIn43OMRS9swpCXlwHHVzr//lEnaAnPlD4vvkixsbrGNotCq+ioVtZjxrjzlnTrmck7WKYYWCXeLytTq32d5MzW+63ZRGOMpXVrskkmRUuLEE1PfyiaMFg04VgxAX8SgBCn46+iKTFEtKzeEOQdLSosYJmi8NBDmXH42GOmNwupnaqagNzWrHRTQSTfxQDDuEUl2IzjRBXipr9mVcPVheB0YrJpaRGivNz6cuWddouWlkDvatFgAcsUDd2E2a2bEG+8YXoz3yxIbnaeXlQQSSSsbbgM4zVmYSnLyiQbP8bXzNeoqaFjnC4s9d2u+XNM/zc1ObtcU5N/tytMcBwsUzR27QK+9z0qCjBoEIWf7r23gxPt4k4XLaJcqDLbkxFNo9zBlZWZ665alXl/3Ljcc6qqKMFyW1smx7DZLswwfmOOhc2Hmhqq0iME2WDnzweOPho4/njr8/RYWcDaTgvghReoUo4dTU3A4MH5fY1IEbSEZ+LFxo1UOxagWrJtbTYnOM08k0wKMWeOc5WuzDPTSo3GOYaZKKPydVDlFTZraaqr1TmPDeOSd7DZcKIJpqj07g089hjQuTN5FN92m8XBbsvP6alirNCr70ycSGPdjDFIX6+IU1FBO4fm5sJL3zGMG/Kt/GQ+V+Wt//HHuedpGvDEE3Tu++8Dn3xCKdn08ZJOU/ksr8tCliAsYJmiM2QI8Mc/0vNf/Qr4619NB+gTw6pVzjLP6NmVdBWvlZAtK8sspM0IAUydSplq3n8/o0rm7E1MEJj73axZzoWt+dymJnkt40mTcs8VAjjrLGDtWloFOyny7DYjVFwIegvNxJef/YwkXY8eQrz9dvuLZpWwTG3b0JCpBqJSfd18s1w3dcUVQlx+ub0jk66KLjSMiGHywcp5zy7sTNVnq6utPYsLebSPCVYRZ8M7WCYw5swBTjoJ+Pxz4JxzgK1vrc9VCWtadiHziy6iSgL6ynzePPku98ADc3eymkZb57vvtm6YUeXlRf5WhnGLVWKHdJrGiWonq9L8HHooaWZqa0lTU4h/qznncbs5pbU1/0uWIuxFzATKhx+S1+GGDcDokzbj0RV9kICpS9bWUoaYrl1JuJqrgaTT2ZOFptHD7jg76urI9upFBRKGcYOTijVVVeQZbMQqG5mmAZdcAjzwgPNCGrJrVFfTZ5s8m4UATj8dWL7c+hLl5cDbbwN9++bXhCjBApYJnNWrgVNOAXbuBKZpU3GD+G3mTaMwU5XpMobSyMrWaRqlWJw6Vd4AfadrPMf4ucYwIH21XhmjdG9MMNiFn8nKKLop8eiWRAJYvRrr+gzFli25b99zD3D77ZQideFCqqolo2fPeAhXAGyDZcLB/Pl6pExaPJMYlbHrGIPqreyhDQ0UpnPnnXKjj5W96fzz7bNJcagOEwR6v1P5DRjTdOabjUxm4506NXvMtNt9nWRq6tBBxCZTkx28g2VCw+WXU+z7PnunsXZsNb6y6AYas3pQfGWlfDcJZNRiTuq/mtELrlsF83ORdSZInBRLz3cHazSpGDU0qRSFtAHAiScCFRWcSMItQUt4htHZsUOIYcNoFfx1vCK2oqvcc9e4m3SbpP+UU7L/nzAhuxHJZMZDWcdpsguG8RMnObuNx8geRx8tf/2KKxxpaNhL2B28g2VCxYYNwHFHfYkPP+6M87EUSzAee3yB6+qAU0/NPkFll5Whr/g/+ABYuZJ2ql270q4UII/k2bOzd80jR7KTExMenGhZunWj/jluXK42R6XhabevorU1W0tj0tzwDtYdXA+WCRUHHQQ8uvAznHruvqjFOAzBWlyHWSTU9FquRgYOpMnBTi1mzMwEAOvXA9dcQ5ONzMlJD9V5+GF1mA4LWKbY6JnFzBi9h/XF4YIFuR7Fqv1UOp3x0E8ksG76Q9jSWk7OgSINaAngxhvx5uHn+PK1ShXewTKh5M6LVuFnDw2HhjbcoV2JE278LgXLmujZE+j7D4Nd1igsy8qA6dPJvqqv+O2KqpuprQXGj+cdLBNerOyzq1bJi1hYsA6H4HC8jR3YK+8m8Q6W4B0sE0p++sBwPPfpF3jkqS6YJO4AbgM9TJSXA2//uiv6GieX6mrKx2hWo5lzG9tRVkbOHfPn5zpWsXBlgkZX327erNayDB/uTMNjYAt6FiRcmQwsYJlQomnA1VO74JGnrI/bsQN4fvIyHIFvoCe2oK9IAlOmyHeYVtlxZEyZQteorOQSdUy4MGhi1qEvtuDY3GOSvYAeFeg5/SH0veEi+3KOjOewgGVCS+fOzo67CA8BAMqxHW/jcPRtS8ptpFb2Wt35w+gEMm0a7RLuvVdt+2KYYmPQxJA69y35jvMS+lNePh5v/74b+v7sTMvLpqFhPQ5Gg3YCzMnU3FBeTqYbhgUsU0LswF7Ygp7oiyR5B5upqMhW9xrRharZJeG++4Cf/YzsuAwTBgyaGCfq3B07gC39h6JvIgGRTmMj+qAZA9GMgXgHg/Y8fxeHYTu6OBauDz4IHHFE7uuxytRkAwtYpjTZtk3+emUl5WSUlelSsXIlC1gmPDj1nDdw/e/6YEvFRjSv64St6KE8rkMHqpORTNpf84gj2JHJDvYiZkKL05g7I2XYRcUCOnYEkF1NZ09xnXQbsHs3vaZYrme93rkzoCWUZWZlr/OxxT82rO3y5djPPgU2bsSX6IQW9JdfSIGmCfSraMOgIzpg4IGtGNjtAww8fl8MGt4T/foBr77Ksa5ewTtYpqRoQ0e0AcAuq6PK2h8O+bKgJjGMD+zT/nDGVVcB3/oWMGgQMGCAhs6d9am/G4CB3jePAcAClikxnrl/M446rVfWa1IdzeLFEJOnUBC98Vh91/t/V1OGqGOOUV5DpfvhY/lYL4+1usbbbwMTJ8rPMXLJJc53mz17kqPSjh3qY9iRyRksYJnQ4mSgm+n9tV44+GAHB153AXDByeRt3NhIITnGLDhcjo6JADJfvkLp25cEt6wknQ47MjmDBSwTWowD/c03gYsu8vgD9NCbU08FLriA41wZpp2+fVmAegELWCbU6APdd7UVx7kyEYTVueGGvYiZyLBuHautGMYMj4vwwgKWYRiGYXwgEXQDGIZhGKYUYQHLMAzDMD7AApZhGIZhfIAFLMMwDMP4AAtYhmEYhvEBFrAMwzAM4wMsYBmGYRjGB1jAMgzDMIwPsIBlGIZhGB9gAcswDMMwPsAClmEYhmF8gAUswzAMw/gAC1iGYRiG8QEWsAzDMAzjAyxgGYZhGMYHWMAyDMMwjA+wgGUYhmEYH2AByzAMwzA+wAKWYRiGYXyABSzDMAzD+MD/A/r/tJeMHxfHAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sine = {Point(math.radians(d), 5 * math.sin(math.radians(d))) for d in range(720)}\n", "plot_convex_hull(noisy(sine))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "18 of 360 points are on the convex hull\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "donut = {Point(math.sin(math.radians(d)), math.cos(math.radians(d))) for d in range(360)}\n", "\n", "plot_convex_hull(noisy(donut))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Complexity of run time and number of points on hull\n", "\n", "Now I want to examine what happens to the run time as the number of points increases, and also what happens to the number of points on the hull. The function `hull_stats` returns the mean number of points on the convex hull, and the mean run time, for `k` repetitions of a call to `convex_hull(Points(n))`. The function, `plot_hull_stats` calls `hull_stats` and plots the results." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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hBAN7NolU6AaK5VoGFL6cOhQvXYR4hfuWol77QWkpNhrS7TToYMUTz/mGN92d/mgIMtABex0DhwIPPkk8Pjjvu1PPmn50H9EkRhO4/0xAPXWB7XWSyj03rMHuOce3wRMw/AdbXLnCUyfXi8/I2rhta2XFuvtHlrfe2/LEltII1xwARAXJ4k3diYSPfywrMX71VfAkCFix9KlQEGBLJMWizidTvTu3dtuM2IG6q0Paq2XUOidnw+cey7w/ffy+rrrZBGOW27xTSpKSxOHs7nV76IFXtt6sURvdxIR53OGnj/+kMLsfftautuAU8iGDQP+/BM480zgn39kSH3UKGDNmtgdknG5XCgpKalX84uEBuqtD2qtF6v1/uADYNAgcTjbtwfefVdGpc49V5avXrBAAhkLFsjveaw4nACvbd1Yojcz1/UxeLBEEy0mqDqd3bsHljAU7SilUFJSgs6dO9ttSkxAvfVBrfVild5VVcBttwEzZsjrgw8G5szxDRA5ndFfFqkpeG3rxRK96XTq44YbgLFjZUgkO7t+ItH++we126CczrIyKZu0apUMr++3H3DppUByclA2EEIIsYh164BzzgGWLZPX48cDU6fK9CxCIhqWS9LHOefI38su87a5J4LrTCRatEiWoUxKkugrIElF990HfPihDL8TQgjRz9tvA1dcAVRUSBDg1VeBU0+12ypCLIKRTn24tbaYgJ3O664DRo+Wwu7uDEfTlBqd110nc09jDcMwkJycDIPZdFqg3vqg1noJVu/du4GbbgKee05eH3mkzNVMTw+BkVECr229tFjvsjJJJAGAzEyrzCKN0bNnSHYbcCLRunWy5GXtkhpOpwzhrFtnpWmRg8PhQEZGBpdS0wT11ge11ksweq9eDRx2mDichiGrxi1YQIezOXht66XFersjb127Au3aWWcY0UrAZ//AA2UuZ11WrZIsyVjE5XIhPz+fWZCaoN76oNZ6CVTvWbNkmtPvvwNdugBffAHcfz/QKqjZ+rEFr229tFhvDq1HBQF/Nd14oyQ0/fWX3F0DwA8/AE89Jeux//67d9sgk5siDqUUtm3bhh49ethtSkxAvfVBrfXir947dwLXXw+88oq8PuYY4I03gNTU0NsYLfDa1kuL9abTGRUE7HSed578vfXWht+zILmJEEJII+TkyLz61atlScvJk4E77oidVYRI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4IH48ccfkZycbLdpUcuCBQuwY8cOvPrqq3j33XftNieqKS4uxqZNmzBo0CCUlpbiwAMPxJo1a9CuXTu7TYs6TNNEVVUV2rZti127dmHAgAH4+eefkZKSYrdpUc1dd92FtWvXIiMjA4888ojd5kQ1nTp1wpYtW+w2g4QYRjpDyE8//YT+/fujR48eSExMxMknn4wvvvjCbrOimqOPPhqJiYl2mxETdOvWDYMGDQIAdOnSBcnJydi2bZu9RkUpTqcTbdu2BQBUVlbCNE0wXhBa1q5di9WrV+Pkk0+22xRCogY6nU2wePFinHbaaejevTsMw8D7779fb5unn34ae++9NxISEnDQQQdhyZIlnvc2btyIHj16eF6npaWhqKhIh+kRSUv1JoFhpd6//PILXC4X0tPTQ2x1ZGKF1v/88w8GDhyItLQ03HrrrejUqZMm6yMPK/SeMGECpk6dqsniyMYKvcvLy3HQQQfhyCOPxKJFizRZTnRDp7MJdu7ciYEDB+LJJ59s8P233noL48aNw1133YXly5dj6NChGDFiBPLz8wGgwUiEYRghtTmSaaneJDCs0nvr1q24+OKL8fzzz+swOyKxQusOHTrgt99+w4YNGzB79mxs2rRJl/kRR0v1/uCDD7Dvvvti33331Wl2xGLF9Z2Xl4dly5bh2WefxcUXX4zy8nJd5hOdKOIXANS8efN82g455BB1zTXX+LT169dP3X777Uoppb777jt1xhlneN678cYb1RtvvBFyW6OBYPR2s2DBAnXWWWeF2sSoIli9Kysr1dChQ9Vrr72mw8yooCXXtptrrrlGvf3226EyMaoIRu/bb79dpaWlqZ49e6qUlBSVlJSkJk+erMvkiMaK6/ukk05SP//8c6hMJDbCSGeQVFdXY9myZTjhhBN82k844QQsXboUAHDIIYfgjz/+QFFRESoqKvDpp5/ixBNPtMPciMcfvYl1+KO3UgpjxozBMcccg4suusgOM6MCf7TetGmTJ/JTXl6OxYsXo2/fvtptjQb80Xvq1KkoKChAXl4eHnnkEVx55ZW499577TA34vFH77KyMlRVVQEACgsLkZubi169emm3lYSeVnYbEKls2bIFpmmia9euPu1du3ZFSUkJACkB8eijj+Loo4+Gy+XCrbfeymzTIPFHbwA48cQT8euvv2Lnzp1IS0vDvHnzcPDBB+s2N+LxR+/vvvsOb731Fvbff3/PHK5Zs2YhOztbt7kRjT9aFxYW4vLLL4dSCkopXH/99dh///3tMDfi8fe7hFiDP3qvWrUKV199NRwOBwzDwIwZM1jlJUqh09lC6s7RVEr5tI0cORIjR47UbVbU0pzerA5gLU3pfeSRR8LlctlhVlTSlNYHHXQQVqxYYYNV0Utz3yVuxowZo8mi6KYpvQ8//HDk5OTYYRbRDIfXg6RTp05wOp317oxLS0vr3dGRlkO99UK99UGt9UK99UK9SW3odAZJXFwcDjroIMyfP9+nff78+Tj88MNtsip6od56od76oNZ6od56od6kNhxeb4IdO3bgr7/+8rzesGEDVqxYgeTkZGRkZGD8+PG46KKLMHjwYAwZMgTPP/888vPzcc0119hodeRCvfVCvfVBrfVCvfVCvYnf2JY3HwEsWLBAAaj3uOSSSzzbPPXUU6pnz54qLi5OHXjggWrRokX2GRzhUG+9UG99UGu9UG+9UG/iL1x7nRBCCCGEhBzO6SSEEEIIISGHTichhBBCCAk5dDoJIYQQQkjIodNJCCGEEEJCDp1OQgghhBAScuh0EkIIIYSQkEOnkxBCCCGEhBw6nYQQQgghJOTQ6SSERCR5eXkwDAMrVqyw2xQPq1evxmGHHYaEhAQMGjQoZMd55ZVX0KFDh5DtnxBCQgGdTkJIUIwZMwaGYeDBBx/0aX///fdhGIZNVtnLxIkT0a5dO6xZswZff/11yI5zzjnn4M8//wzoM8OHD8e4ceNCYxAhhPgBnU5CSNAkJCTgoYceQllZmd2mWEZ1dXXQn123bh2OPPJI9OzZEykpKRZa5UubNm3QpUuXkO2fEEJCAZ1OQkjQHHfccUhNTcXUqVMb3WbSpEn1hpqnT5+OzMxMz+sxY8bgjDPOwJQpU9C1a1d06NABkydPRk1NDW655RYkJycjLS0NL7/8cr39r169GocffjgSEhLQv39/LFy40Of93NxcnHzyydhrr73QtWtXXHTRRdiyZYvn/eHDh+P666/H+PHj0alTJxx//PEN9sPlcuG+++5DWloa4uPjMWjQIHz++eee9w3DwLJly3DffffBMAxMmjSpwf24j3f99dejQ4cOSElJwd133w2llGebsrIyXHzxxejYsSPatm2LESNGYO3atZ736w6vuzWeNWsWMjMz0b59e5x77rmoqKjw6Lto0SLMmDEDhmHAMAzk5eWhrKwMF1xwATp37ow2bdqgT58+mDlzZoN2E0JIS6HTSQgJGqfTiSlTpuCJJ55AYWFhi/b1zTffYOPGjVi8eDEee+wxTJo0Caeeeio6duyIH3/8Eddccw2uueYaFBQU+Hzulltuwc0334zly5fj8MMPx8iRI7F161YAQHFxMYYNG4ZBgwbhl19+weeff45NmzZh9OjRPvt49dVX0apVK3z33Xd47rnnGrRvxowZePTRR/HII4/g999/x4knnoiRI0d6nMHi4mL0798fN998M4qLizFhwoRG++o+3o8//ojHH38c06ZNw4svvuh5f8yYMfjll1/w4Ycf4vvvv4dSCieffDL27NnT6D7XrVuH999/Hx9//DE+/vhjLFq0yDP1YcaMGRgyZAiuvPJKFBcXo7i4GOnp6bjnnnuQm5uLzz77DKtWrcIzzzyDTp06NXGWCCGkBShCCAmCSy65RJ1++ulKKaUOO+wwddlllymllJo3b56q/dUyceJENXDgQJ/PTps2TfXs2dNnXz179lSmaXra+vbtq4YOHep5XVNTo9q1a6fefPNNpZRSGzZsUADUgw8+6Nlmz549Ki0tTT300ENKKaXuuecedcIJJ/gcu6CgQAFQa9asUUopNWzYMDVo0KBm+9u9e3f1wAMP+LQdfPDB6tprr/W8HjhwoJo4cWKT+xk2bJjab7/9lMvl8rTddtttar/99lNKKfXnn38qAOq7777zvL9lyxbVpk0b9fbbbyullJo5c6Zq37695/2JEyeqtm3bqvLyck/bLbfcog499FCf444dO9bHltNOO01deumlTXecEEIsgpFOQkiLeeihh/Dqq68iNzc36H30798fDof3K6lr167Izs72vHY6nUhJSUFpaanP54YMGeJ53qpVKwwePBirVq0CACxbtgwLFizAXnvt5Xn069cPgEQG3QwePLhJ28rLy7Fx40YcccQRPu1HHHGE51iBcNhhh/kkWw0ZMgRr166FaZpYtWoVWrVqhUMPPdTzfkpKCvr27dvksTIzM5GYmOh53a1bt3pa1eU///kP5syZg0GDBuHWW2/F0qVLA+4LIYT4C51OQkiLOeqoo3DiiSfizjvvrPeew+Hwma8IoMFh4tatW/u8NgyjwTaXy9WsPW6HzuVy4bTTTsOKFSt8HmvXrsVRRx3l2b5du3bN7rP2ft0opSzP1K+rlb/HCkarESNG4O+//8a4ceOwceNGHHvssU1OCyCEkJZAp5MQYgkPPvggPvroo3rRss6dO6OkpMTHmbKytuYPP/zgeV5TU4Nly5Z5opkHHnggVq5ciczMTOyzzz4+D38dTQBISkpC9+7d8e233/q0L126FPvtt1+LbHa/7tOnD5xOJ7KyslBTU4Mff/zR8/7WrVvx559/BnUsN3FxcTBNs157586dMWbMGLz++uuYPn06nn/++aCPQQghTUGnkxBiCdnZ2bjgggvwxBNP+LQPHz4cmzdvxsMPP4x169bhqaeewmeffWbZcZ966inMmzcPq1evxnXXXYeysjJcdtllAIDrrrsO27Ztw3nnnYeffvoJ69evx5dffonLLrusQQesKW655RY89NBDeOutt7BmzRrcfvvtWLFiBcaOHRuwzQUFBRg/fjzWrFmDN998E0888YRnP3369MHpp5+OK6+8Et9++y1+++03XHjhhejRowdOP/30gI/lJjMzEz/++CPy8vKwZcsWuFwu3Hvvvfjggw/w119/YeXKlfj4449b5NgSQkhT0OkkhFjGf//733rDw/vttx+efvppPPXUUxg4cCB++uknS4dwH3zwQTz00EMYOHAglixZgg8++MCTgd29e3d89913ME0TJ554IgYMGICxY8eiffv2PvNH/eHGG2/EzTffjJtvvhnZ2dn4/PPP8eGHH6JPnz4B23zxxRdj9+7dOOSQQ3DdddfhhhtuwFVXXeV5f+bMmTjooINw6qmnYsiQIVBK4dNPP603hB4IEyZM8ERSO3fujPz8fMTFxeGOO+7A/vvvj6OOOgpOpxNz5swJ+hiEENIUhmpsAhEhhBDLGT58OAYNGoTp06fbbQohhGiFkU5CCCGEEBJy6HQSQgghhJCQw+F1QgghhBASchjpJIQQQgghIYdOJyGEEEIICTl0OgkhhBBCSMih00kIIYQQQkIOnU5CCCGEEBJy6HQSQgghhJCQQ6eTEEIIIYSEHDqdhBBCCCEk5NDpJIQQQgghIef/AW5EvKWufDg/AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def hull_stats(n: int, k=40) -> tuple[float, float]:\n", " \"\"\"Run convex_hull(Points(n)) k times, return mean number of points on hull and mean run time in milliseconds.\"\"\"\n", " t0 = time.process_time()\n", " total_hull = sum(len(convex_hull(Points(n))) for _ in range(k))\n", " t1 = time.process_time()\n", " return total_hull / k, (t1 - t0) * 1000 / k\n", "\n", "def plot_hull_stats(ns: list[int]) -> None:\n", " \"\"\"A plot with two axes, for the mean hull sizes and mean run times for each n in ns.\"\"\"\n", " stats = map(hull_stats, ns)\n", " hulls, times = list(zip(*stats)) # Transpose the stats matrix\n", " fig, ax1 = plt.subplots()\n", " plt.grid(True, linestyle='--', alpha=0.6)\n", " ax2 = ax1.twinx()\n", " ax1.set_xlabel('Number of points')\n", " fig.tight_layout() # Ensures everything fits without overlapping\n", " \n", " def plot(ax, color, values, name) -> None:\n", " ax.set_xscale('log')\n", " ax.set_ylabel(name, color=color)\n", " ax.plot(ns, values, color=color, marker='o')\n", " ax.tick_params(axis='y', labelcolor=color)\n", "\n", " plot(ax1, 'blue', hulls, 'Mean number of points on hull')\n", " plot(ax2, 'red', times, 'Mean run time in milliseconds')\n", "\n", "ns = [2 ** i for i in range(19)]\n", "plot_hull_stats(ns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The number of points on the hull of ppoints sampled uniformly from a square is (roughly) a straight line on the log graph, which means it is *O*(log *n*). This agrees with the [literature](https://arxiv.org/abs/1111.5340). The [literature](https://en.wikipedia.org/wiki/Convex_hull_algorithms) also says the run time should be *O*(*n* log *n*), and just from eyeballing the plot that looks right (although it would be more convincing if we did a statistical test to verify it). The rightmost point is for sets with *n* = 218 = 262,144 points, and we compute their convex hulls in less than half a second on average (and find an average of about 33 points on the convex hull).\n", "\n", "# Conclusion\n", "\n", "The convex hull problem is an interesting exercise in algorithm design.\n", "The algorithm covered here is called [Andrew's Monotone Chain](https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain).\n", "It is a variant of the [Graham Scan](https://en.wikipedia.org/wiki/Graham_scan).\n", "You can read more from [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull_algorithms)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tests\n", "\n", "So far, everything looks good! But I would gain even more confidence if we could pass a test suite:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "editable": true, "jupyter": { "outputs_hidden": false }, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def tests() -> bool:\n", " \"\"\"Some unit tests.\"\"\"\n", " assert is_left_turn(octagon[0], octagon[1], octagon[2])\n", " assert is_left_turn(octagon[2], octagon[3], octagon[4])\n", " assert is_left_turn(octagon[1], octagon[0], octagon[7]) == False\n", " assert is_left_turn(octagon[5], octagon[6], octagon[7])\n", " assert is_left_turn(octagon[2], octagon[1], octagon[0]) == False\n", " assert is_left_turn(pacman[1], pacman[2], pacman[3])\n", " assert is_left_turn(pacman[3], pacman[4], pacman[5]) == False\n", " assert is_left_turn(Point(0, 0), Point(-1, -1), Point(2, 2)) == False\n", " \n", " A, B = Point(-2, -2), Point(0, 0)\n", " assert is_left_turn(A, B, Point(1, 3))\n", " assert is_left_turn(A, B, Point(2, 2)) == False\n", " assert is_left_turn(A, B, Point(3, 1)) == False\n", " assert is_left_turn(A, B, Point(-1, 1))\n", " assert is_left_turn(A, B, Point(-1, -4)) == False\n", " assert is_left_turn(A, B, Point(-1, -1)) == False\n", " assert is_left_turn(B, A, Point(-3, -4))\n", " assert is_left_turn(B, A, Point(-4, -3)) == False\n", " assert is_left_turn(B, A, Point(-1, -1)) == False\n", " \n", " # Tests of convex_hull\n", " assert convex_hull(octagon)== octagon\n", " assert convex_hull(donut) == convex_hull(convex_hull(donut))\n", " for n in (0, 1, 2, 3):\n", " points = Points(n)\n", " assert set(convex_hull(points)) == points\n", " collinear = {Point(x, 0) for x in range(100)}\n", " assert convex_hull(collinear) == [min(collinear), max(collinear)]\n", " P = Point(5, 5)\n", " assert convex_hull(collinear | {P}) == [min(collinear), max(collinear), P]\n", " grid1 = {Point(x, y) for x in range(10) for y in range(10)}\n", " assert convex_hull(grid1) == [Point(0, 0), Point(9, 0), Point(9, 9), Point(0, 9)]\n", "\n", " return True\n", " \n", "tests()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:base] *", "language": "python", "name": "conda-base-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.9" } }, "nbformat": 4, "nbformat_minor": 4 }