From 08e8dc71ff37c35247e75aaba17745f98d9d266a Mon Sep 17 00:00:00 2001 From: Andy Date: Sat, 29 Oct 2016 00:35:51 -0700 Subject: [PATCH] improve distribution to PyPI Now svg files, readme, unit tests, and license included in PyPI dis --- MANIFEST | 12 - MANIFEST.in | 2 + build/lib/svgpathtools/__init__.py | 19 + build/lib/svgpathtools/bezier.py | 374 +++ build/lib/svgpathtools/misctools.py | 64 + build/lib/svgpathtools/parser.py | 196 ++ build/lib/svgpathtools/path.py | 2208 +++++++++++++++++ build/lib/svgpathtools/paths2svg.py | 385 +++ build/lib/svgpathtools/pathtools.py | 14 + build/lib/svgpathtools/polytools.py | 80 + build/lib/svgpathtools/smoothing.py | 201 ++ build/lib/svgpathtools/svg2paths.py | 126 + dist/svgpathtools-1.2.5-py2.py3-none-any.whl | Bin 0 -> 56025 bytes dist/svgpathtools-1.2.5.tar.gz | Bin 0 -> 2097569 bytes setup.cfg | 5 + setup.py | 21 +- svgpathtools.egg-info/PKG-INFO | 657 +++++ svgpathtools.egg-info/SOURCES.txt | 36 + svgpathtools.egg-info/dependency_links.txt | 1 + svgpathtools.egg-info/top_level.txt | 1 + {svgpathtools/tests => test}/__init__.py | 0 {svgpathtools/tests => test}/test.svg | 0 {svgpathtools/tests => test}/test_bezier.py | 0 .../tests => test}/test_generation.py | 0 {svgpathtools/tests => test}/test_parsing.py | 0 {svgpathtools/tests => test}/test_path.py | 0 .../tests => test}/test_pathtools.py | 0 .../tests => test}/test_polytools.py | 0 28 files changed, 4387 insertions(+), 15 deletions(-) delete mode 100644 MANIFEST create mode 100644 MANIFEST.in create mode 100644 build/lib/svgpathtools/__init__.py create mode 100644 build/lib/svgpathtools/bezier.py create mode 100644 build/lib/svgpathtools/misctools.py create mode 100644 build/lib/svgpathtools/parser.py create mode 100644 build/lib/svgpathtools/path.py create mode 100644 build/lib/svgpathtools/paths2svg.py create mode 100644 build/lib/svgpathtools/pathtools.py create mode 100644 build/lib/svgpathtools/polytools.py create mode 100644 build/lib/svgpathtools/smoothing.py create mode 100644 build/lib/svgpathtools/svg2paths.py create mode 100644 dist/svgpathtools-1.2.5-py2.py3-none-any.whl create mode 100644 dist/svgpathtools-1.2.5.tar.gz create mode 100644 setup.cfg create mode 100644 svgpathtools.egg-info/PKG-INFO create mode 100644 svgpathtools.egg-info/SOURCES.txt create mode 100644 svgpathtools.egg-info/dependency_links.txt create mode 100644 svgpathtools.egg-info/top_level.txt rename {svgpathtools/tests => test}/__init__.py (100%) rename {svgpathtools/tests => test}/test.svg (100%) rename {svgpathtools/tests => test}/test_bezier.py (100%) rename {svgpathtools/tests => test}/test_generation.py (100%) rename {svgpathtools/tests => test}/test_parsing.py (100%) rename {svgpathtools/tests => test}/test_path.py (100%) rename {svgpathtools/tests => test}/test_pathtools.py (100%) rename {svgpathtools/tests => test}/test_polytools.py (100%) diff --git a/MANIFEST b/MANIFEST deleted file mode 100644 index fb4c767..0000000 --- a/MANIFEST +++ /dev/null @@ -1,12 +0,0 @@ -# file GENERATED by distutils, do NOT edit -setup.py -svgpathtools/__init__.py -svgpathtools/bezier.py -svgpathtools/misctools.py -svgpathtools/parser.py -svgpathtools/path.py -svgpathtools/paths2svg.py -svgpathtools/pathtools.py -svgpathtools/polytools.py -svgpathtools/smoothing.py -svgpathtools/svg2paths.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..b7d0cbf --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include *.svg LICENSE* +recursive-include test *.svg \ No newline at end of file diff --git a/build/lib/svgpathtools/__init__.py b/build/lib/svgpathtools/__init__.py new file mode 100644 index 0000000..a57b18d --- /dev/null +++ b/build/lib/svgpathtools/__init__.py @@ -0,0 +1,19 @@ +from .bezier import (bezier_point, bezier2polynomial, + polynomial2bezier, split_bezier, + bezier_bounding_box, bezier_intersections, + bezier_by_line_intersections) +from .path import (Path, Line, QuadraticBezier, CubicBezier, Arc, + bezier_segment, is_bezier_segment, is_path_segment, + is_bezier_path, concatpaths, poly2bez, bpoints2bezier, + closest_point_in_path, farthest_point_in_path, + path_encloses_pt, bbox2path) +from .parser import parse_path +from .paths2svg import disvg, wsvg +from .polytools import polyroots, polyroots01, rational_limit, real, imag +from .misctools import hex2rgb, rgb2hex +from .smoothing import smoothed_path, smoothed_joint, is_differentiable, kinks + +try: + from .svg2paths import svg2paths, svg2paths2 +except ImportError: + pass \ No newline at end of file diff --git a/build/lib/svgpathtools/bezier.py b/build/lib/svgpathtools/bezier.py new file mode 100644 index 0000000..b910863 --- /dev/null +++ b/build/lib/svgpathtools/bezier.py @@ -0,0 +1,374 @@ +"""This submodule contains tools that deal with generic, degree n, Bezier +curves. +Note: Bezier curves here are always represented by the tuple of their control +points given by their standard representation.""" + +# External dependencies: +from __future__ import division, absolute_import, print_function +from math import factorial as fac, ceil, log, sqrt +from numpy import poly1d + +# Internal dependencies +from .polytools import real, imag, polyroots, polyroots01 + + +# Evaluation ################################################################## + +def n_choose_k(n, k): + return fac(n)//fac(k)//fac(n-k) + + +def bernstein(n, t): + """returns a list of the Bernstein basis polynomials b_{i, n} evaluated at + t, for i =0...n""" + t1 = 1-t + return [n_choose_k(n, k) * t1**(n-k) * t**k for k in range(n+1)] + + +def bezier_point(p, t): + """Evaluates the Bezier curve given by it's control points, p, at t. + Note: Uses Horner's rule for cubic and lower order Bezier curves. + Warning: Be concerned about numerical stability when using this function + with high order curves.""" + + # begin arc support block ######################## + try: + p.large_arc + return p.point(t) + except: + pass + # end arc support block ########################## + + deg = len(p) - 1 + if deg == 3: + return p[0] + t*( + 3*(p[1] - p[0]) + t*( + 3*(p[0] + p[2]) - 6*p[1] + t*( + -p[0] + 3*(p[1] - p[2]) + p[3]))) + elif deg == 2: + return p[0] + t*( + 2*(p[1] - p[0]) + t*( + p[0] - 2*p[1] + p[2])) + elif deg == 1: + return p[0] + t*(p[1] - p[0]) + elif deg == 0: + return p[0] + else: + bern = bernstein(deg, t) + return sum(bern[k]*p[k] for k in range(deg+1)) + + +# Conversion ################################################################## + +def bezier2polynomial(p, numpy_ordering=True, return_poly1d=False): + """Converts a tuple of Bezier control points to a tuple of coefficients + of the expanded polynomial. + return_poly1d : returns a numpy.poly1d object. This makes computations + of derivatives/anti-derivatives and many other operations quite quick. + numpy_ordering : By default (to accommodate numpy) the coefficients will + be output in reverse standard order.""" + if len(p) == 4: + coeffs = (-p[0] + 3*(p[1] - p[2]) + p[3], + 3*(p[0] - 2*p[1] + p[2]), + 3*(p[1]-p[0]), + p[0]) + elif len(p) == 3: + coeffs = (p[0] - 2*p[1] + p[2], + 2*(p[1] - p[0]), + p[0]) + elif len(p) == 2: + coeffs = (p[1]-p[0], + p[0]) + elif len(p) == 1: + coeffs = p + else: + # https://en.wikipedia.org/wiki/Bezier_curve#Polynomial_form + n = len(p) + 1 + coeffs = [fac(n)//fac(n-j) * sum( + (-1)**(i+j) * p[i] / (fac(i) * fac(j-i)) for i in xrange(j+1)) + for j in range(n+1)] + if not numpy_ordering: + coeffs.reverse() + if return_poly1d: + return poly1d(coeffs) + return coeffs + + +def polynomial2bezier(poly): + """Converts a cubic or lower order Polynomial object (or a sequence of + coefficients) to a CubicBezier, QuadraticBezier, or Line object as + appropriate.""" + if isinstance(poly, poly1d): + c = poly.coeffs + else: + c = poly + order = len(c)-1 + if order == 3: + bpoints = (c[3], c[2]/3 + c[3], (c[1] + 2*c[2])/3 + c[3], + c[0] + c[1] + c[2] + c[3]) + elif order == 2: + bpoints = (c[2], c[1]/2 + c[2], c[0] + c[1] + c[2]) + elif order == 1: + bpoints = (c[1], c[0] + c[1]) + else: + raise AssertionError("This function is only implemented for linear, " + "quadratic, and cubic polynomials.") + return bpoints + + +# Curve Splitting ############################################################# + +def split_bezier(bpoints, t): + """Uses deCasteljau's recursion to split the Bezier curve at t into two + Bezier curves of the same order.""" + def split_bezier_recursion(bpoints_left_, bpoints_right_, bpoints_, t_): + if len(bpoints_) == 1: + bpoints_left_.append(bpoints_[0]) + bpoints_right_.append(bpoints_[0]) + else: + new_points = [None]*(len(bpoints_) - 1) + bpoints_left_.append(bpoints_[0]) + bpoints_right_.append(bpoints_[-1]) + for i in range(len(bpoints_) - 1): + new_points[i] = (1 - t_)*bpoints_[i] + t_*bpoints_[i + 1] + bpoints_left_, bpoints_right_ = split_bezier_recursion( + bpoints_left_, bpoints_right_, new_points, t_) + return bpoints_left_, bpoints_right_ + + bpoints_left = [] + bpoints_right = [] + bpoints_left, bpoints_right = \ + split_bezier_recursion(bpoints_left, bpoints_right, bpoints, t) + bpoints_right.reverse() + return bpoints_left, bpoints_right + + +def halve_bezier(p): + + # begin arc support block ######################## + try: + p.large_arc + return p.split(0.5) + except: + pass + # end arc support block ########################## + + if len(p) == 4: + return ([p[0], (p[0] + p[1])/2, (p[0] + 2*p[1] + p[2])/4, + (p[0] + 3*p[1] + 3*p[2] + p[3])/8], + [(p[0] + 3*p[1] + 3*p[2] + p[3])/8, + (p[1] + 2*p[2] + p[3])/4, (p[2] + p[3])/2, p[3]]) + else: + return split_bezier(p, 0.5) + + +# Bounding Boxes ############################################################## + +def bezier_real_minmax(p): + """returns the minimum and maximum for any real cubic bezier""" + local_extremizers = [0, 1] + if len(p) == 4: # cubic case + a = [p.real for p in p] + denom = a[0] - 3*a[1] + 3*a[2] - a[3] + if denom != 0: + delta = a[1]**2 - (a[0] + a[1])*a[2] + a[2]**2 + (a[0] - a[1])*a[3] + if delta >= 0: # otherwise no local extrema + sqdelta = sqrt(delta) + tau = a[0] - 2*a[1] + a[2] + r1 = (tau + sqdelta)/denom + r2 = (tau - sqdelta)/denom + if 0 < r1 < 1: + local_extremizers.append(r1) + if 0 < r2 < 1: + local_extremizers.append(r2) + local_extrema = [bezier_point(a, t) for t in local_extremizers] + return min(local_extrema), max(local_extrema) + + # find reverse standard coefficients of the derivative + dcoeffs = bezier2polynomial(a, return_poly1d=True).deriv().coeffs + + # find real roots, r, such that 0 <= r <= 1 + local_extremizers += polyroots01(dcoeffs) + local_extrema = [bezier_point(a, t) for t in local_extremizers] + return min(local_extrema), max(local_extrema) + + +def bezier_bounding_box(bez): + """returns the bounding box for the segment in the form + (xmin, xmax, ymin, ymax). + Warning: For the non-cubic case this is not particularly efficient.""" + + # begin arc support block ######################## + try: + bla = bez.large_arc + return bez.bbox() # added to support Arc objects + except: + pass + # end arc support block ########################## + + if len(bez) == 4: + xmin, xmax = bezier_real_minmax([p.real for p in bez]) + ymin, ymax = bezier_real_minmax([p.imag for p in bez]) + return xmin, xmax, ymin, ymax + poly = bezier2polynomial(bez, return_poly1d=True) + x = real(poly) + y = imag(poly) + dx = x.deriv() + dy = y.deriv() + x_extremizers = [0, 1] + polyroots(dx, realroots=True, + condition=lambda r: 0 < r < 1) + y_extremizers = [0, 1] + polyroots(dy, realroots=True, + condition=lambda r: 0 < r < 1) + x_extrema = [x(t) for t in x_extremizers] + y_extrema = [y(t) for t in y_extremizers] + return min(x_extrema), max(x_extrema), min(y_extrema), max(y_extrema) + + +def box_area(xmin, xmax, ymin, ymax): + """ + INPUT: 2-tuple of cubics (given by control points) + OUTPUT: boolean + """ + return (xmax - xmin)*(ymax - ymin) + + +def interval_intersection_width(a, b, c, d): + """returns the width of the intersection of intervals [a,b] and [c,d] + (thinking of these as intervals on the real number line)""" + return max(0, min(b, d) - max(a, c)) + + +def boxes_intersect(box1, box2): + """Determines if two rectangles, each input as a tuple + (xmin, xmax, ymin, ymax), intersect.""" + xmin1, xmax1, ymin1, ymax1 = box1 + xmin2, xmax2, ymin2, ymax2 = box2 + if interval_intersection_width(xmin1, xmax1, xmin2, xmax2) and \ + interval_intersection_width(ymin1, ymax1, ymin2, ymax2): + return True + else: + return False + + +# Intersections ############################################################### + +class ApproxSolutionSet(list): + """A class that behaves like a set but treats two elements , x and y, as + equivalent if abs(x-y) < self.tol""" + def __init__(self, tol): + self.tol = tol + + def __contains__(self, x): + for y in self: + if abs(x - y) < self.tol: + return True + return False + + def appadd(self, pt): + if pt not in self: + self.append(pt) + + +class BPair(object): + def __init__(self, bez1, bez2, t1, t2): + self.bez1 = bez1 + self.bez2 = bez2 + self.t1 = t1 # t value to get the mid point of this curve from cub1 + self.t2 = t2 # t value to get the mid point of this curve from cub2 + + +def bezier_intersections(bez1, bez2, longer_length, tol=1e-8, tol_deC=1e-8): + """INPUT: + bez1, bez2 = [P0,P1,P2,...PN], [Q0,Q1,Q2,...,PN] defining the two + Bezier curves to check for intersections between. + longer_length - the length (or an upper bound) on the longer of the two + Bezier curves. Determines the maximum iterations needed together with tol. + tol - is the smallest distance that two solutions can differ by and still + be considered distinct solutions. + OUTPUT: a list of tuples (t,s) in [0,1]x[0,1] such that + bezier_point(cubs[0],t) - bezier_point(cubs[1],s) < tol_deC + Note: This will return exactly one such tuple for each intersection + (assuming tol_deC is small enough)""" + maxits = int(ceil(1-log(tol_deC/longer_length)/log(2))) + pair_list = [BPair(bez1, bez2, 0.5, 0.5)] + intersection_list = [] + k = 0 + approx_point_set = ApproxSolutionSet(tol) + while pair_list and k < maxits: + new_pairs = [] + delta = 0.5**(k + 2) + for pair in pair_list: + bbox1 = bezier_bounding_box(pair.bez1) + bbox2 = bezier_bounding_box(pair.bez2) + if boxes_intersect(bbox1, bbox2): + if box_area(*bbox1) < tol_deC and box_area(*bbox2) < tol_deC: + point = bezier_point(bez1, pair.t1) + if point not in approx_point_set: + approx_point_set.append(point) + # this is the point in the middle of the pair + intersection_list.append((pair.t1, pair.t2)) + + # this prevents the output of redundant intersection points + for otherPair in pair_list: + if pair.bez1 == otherPair.bez1 or \ + pair.bez2 == otherPair.bez2 or \ + pair.bez1 == otherPair.bez2 or \ + pair.bez2 == otherPair.bez1: + pair_list.remove(otherPair) + else: + (c11, c12) = halve_bezier(pair.bez1) + (t11, t12) = (pair.t1 - delta, pair.t1 + delta) + (c21, c22) = halve_bezier(pair.bez2) + (t21, t22) = (pair.t2 - delta, pair.t2 + delta) + new_pairs += [BPair(c11, c21, t11, t21), + BPair(c11, c22, t11, t22), + BPair(c12, c21, t12, t21), + BPair(c12, c22, t12, t22)] + pair_list = new_pairs + k += 1 + if k >= maxits: + raise Exception("bezier_intersections has reached maximum " + "iterations without terminating... " + "either there's a problem/bug or you can fix by " + "raising the max iterations or lowering tol_deC") + return intersection_list + + +def bezier_by_line_intersections(bezier, line): + """Returns tuples (t1,t2) such that bezier.point(t1) ~= line.point(t2).""" + # The method here is to translate (shift) then rotate the complex plane so + # that line starts at the origin and proceeds along the positive real axis. + # After this transformation, the intersection points are the real roots of + # the imaginary component of the bezier for which the real component is + # between 0 and abs(line[1]-line[0])]. + assert len(line[:]) == 2 + assert line[0] != line[1] + if not any(p != bezier[0] for p in bezier): + raise ValueError("bezier is nodal, use " + "bezier_by_line_intersection(bezier[0], line) " + "instead for a bool to be returned.") + + # First let's shift the complex plane so that line starts at the origin + shifted_bezier = [z - line[0] for z in bezier] + shifted_line_end = line[1] - line[0] + line_length = abs(shifted_line_end) + + # Now let's rotate the complex plane so that line falls on the x-axis + rotation_matrix = line_length/shifted_line_end + transformed_bezier = [rotation_matrix*z for z in shifted_bezier] + + # Now all intersections should be roots of the imaginary component of + # the transformed bezier + transformed_bezier_imag = [p.imag for p in transformed_bezier] + coeffs_y = bezier2polynomial(transformed_bezier_imag) + roots_y = list(polyroots01(coeffs_y)) # returns real roots 0 <= r <= 1 + + transformed_bezier_real = [p.real for p in transformed_bezier] + intersection_list = [] + for bez_t in set(roots_y): + xval = bezier_point(transformed_bezier_real, bez_t) + if 0 <= xval <= line_length: + line_t = xval/line_length + intersection_list.append((bez_t, line_t)) + return intersection_list + diff --git a/build/lib/svgpathtools/misctools.py b/build/lib/svgpathtools/misctools.py new file mode 100644 index 0000000..787d000 --- /dev/null +++ b/build/lib/svgpathtools/misctools.py @@ -0,0 +1,64 @@ +"""This submodule contains miscellaneous tools that are used internally, but +aren't specific to SVGs or related mathematical objects.""" + +# External dependencies: +from __future__ import division, absolute_import, print_function +import os +import sys +import webbrowser + + +# stackoverflow.com/questions/214359/converting-hex-color-to-rgb-and-vice-versa +def hex2rgb(value): + """Converts a hexadeximal color string to an RGB 3-tuple + + EXAMPLE + ------- + >>> hex2rgb('#0000FF') + (0, 0, 255) + """ + value = value.lstrip('#') + lv = len(value) + return tuple(int(value[i:i+lv//3], 16) for i in range(0, lv, lv//3)) + + +# stackoverflow.com/questions/214359/converting-hex-color-to-rgb-and-vice-versa +def rgb2hex(rgb): + """Converts an RGB 3-tuple to a hexadeximal color string. + + EXAMPLE + ------- + >>> rgb2hex((0,0,255)) + '#0000FF' + """ + return ('#%02x%02x%02x' % rgb).upper() + + +def isclose(a, b, rtol=1e-5, atol=1e-8): + """This is essentially np.isclose, but slightly faster.""" + return abs(a - b) < (atol + rtol * abs(b)) + + +def open_in_browser(file_location): + """Attempt to open file located at file_location in the default web + browser.""" + + # If just the name of the file was given, check if it's in the Current + # Working Directory. + if not os.path.isfile(file_location): + file_location = os.path.join(os.getcwd(), file_location) + if not os.path.isfile(file_location): + raise IOError("\n\nFile not found.") + + # For some reason OSX requires this adjustment (tested on 10.10.4) + if sys.platform == "darwin": + file_location = "file:///"+file_location + + new = 2 # open in a new tab, if possible + webbrowser.get().open(file_location, new=new) + + +BugException = Exception("This code should never be reached. You've found a " + "bug. Please submit an issue to \n" + "https://github.com/mathandy/svgpathtools/issues" + "\nwith an easily reproducible example.") diff --git a/build/lib/svgpathtools/parser.py b/build/lib/svgpathtools/parser.py new file mode 100644 index 0000000..66147b8 --- /dev/null +++ b/build/lib/svgpathtools/parser.py @@ -0,0 +1,196 @@ +"""This submodule contains the path_parse() function used to convert SVG path +element d-strings into svgpathtools Path objects. +Note: This file was taken (nearly) as is from the svg.path module +(v 2.0).""" + +# External dependencies +from __future__ import division, absolute_import, print_function +import re + +# Internal dependencies +from .path import Path, Line, QuadraticBezier, CubicBezier, Arc + + +COMMANDS = set('MmZzLlHhVvCcSsQqTtAa') +UPPERCASE = set('MZLHVCSQTA') + +COMMAND_RE = re.compile("([MmZzLlHhVvCcSsQqTtAa])") +FLOAT_RE = re.compile("[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?") + + +def _tokenize_path(pathdef): + for x in COMMAND_RE.split(pathdef): + if x in COMMANDS: + yield x + for token in FLOAT_RE.findall(x): + yield token + + +def parse_path(pathdef, current_pos=0j): + # In the SVG specs, initial movetos are absolute, even if + # specified as 'm'. This is the default behavior here as well. + # But if you pass in a current_pos variable, the initial moveto + # will be relative to that current_pos. This is useful. + elements = list(_tokenize_path(pathdef)) + # Reverse for easy use of .pop() + elements.reverse() + + segments = Path() + start_pos = None + command = None + + while elements: + + if elements[-1] in COMMANDS: + # New command. + last_command = command # Used by S and T + command = elements.pop() + absolute = command in UPPERCASE + command = command.upper() + else: + # If this element starts with numbers, it is an implicit command + # and we don't change the command. Check that it's allowed: + if command is None: + raise ValueError("Unallowed implicit command in %s, position %s" % ( + pathdef, len(pathdef.split()) - len(elements))) + + if command == 'M': + # Moveto command. + x = elements.pop() + y = elements.pop() + pos = float(x) + float(y) * 1j + if absolute: + current_pos = pos + else: + current_pos += pos + + # when M is called, reset start_pos + # This behavior of Z is defined in svg spec: + # http://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand + start_pos = current_pos + + # Implicit moveto commands are treated as lineto commands. + # So we set command to lineto here, in case there are + # further implicit commands after this moveto. + command = 'L' + + elif command == 'Z': + # Close path + if not (current_pos == start_pos): + segments.append(Line(current_pos, start_pos)) + segments.closed = True + current_pos = start_pos + start_pos = None + command = None # You can't have implicit commands after closing. + + elif command == 'L': + x = elements.pop() + y = elements.pop() + pos = float(x) + float(y) * 1j + if not absolute: + pos += current_pos + segments.append(Line(current_pos, pos)) + current_pos = pos + + elif command == 'H': + x = elements.pop() + pos = float(x) + current_pos.imag * 1j + if not absolute: + pos += current_pos.real + segments.append(Line(current_pos, pos)) + current_pos = pos + + elif command == 'V': + y = elements.pop() + pos = current_pos.real + float(y) * 1j + if not absolute: + pos += current_pos.imag * 1j + segments.append(Line(current_pos, pos)) + current_pos = pos + + elif command == 'C': + control1 = float(elements.pop()) + float(elements.pop()) * 1j + control2 = float(elements.pop()) + float(elements.pop()) * 1j + end = float(elements.pop()) + float(elements.pop()) * 1j + + if not absolute: + control1 += current_pos + control2 += current_pos + end += current_pos + + segments.append(CubicBezier(current_pos, control1, control2, end)) + current_pos = end + + elif command == 'S': + # Smooth curve. First control point is the "reflection" of + # the second control point in the previous path. + + if last_command not in 'CS': + # If there is no previous command or if the previous command + # was not an C, c, S or s, assume the first control point is + # coincident with the current point. + control1 = current_pos + else: + # The first control point is assumed to be the reflection of + # the second control point on the previous command relative + # to the current point. + control1 = current_pos + current_pos - segments[-1].control2 + + control2 = float(elements.pop()) + float(elements.pop()) * 1j + end = float(elements.pop()) + float(elements.pop()) * 1j + + if not absolute: + control2 += current_pos + end += current_pos + + segments.append(CubicBezier(current_pos, control1, control2, end)) + current_pos = end + + elif command == 'Q': + control = float(elements.pop()) + float(elements.pop()) * 1j + end = float(elements.pop()) + float(elements.pop()) * 1j + + if not absolute: + control += current_pos + end += current_pos + + segments.append(QuadraticBezier(current_pos, control, end)) + current_pos = end + + elif command == 'T': + # Smooth curve. Control point is the "reflection" of + # the second control point in the previous path. + + if last_command not in 'QT': + # If there is no previous command or if the previous command + # was not an Q, q, T or t, assume the first control point is + # coincident with the current point. + control = current_pos + else: + # The control point is assumed to be the reflection of + # the control point on the previous command relative + # to the current point. + control = current_pos + current_pos - segments[-1].control + + end = float(elements.pop()) + float(elements.pop()) * 1j + + if not absolute: + end += current_pos + + segments.append(QuadraticBezier(current_pos, control, end)) + current_pos = end + + elif command == 'A': + radius = float(elements.pop()) + float(elements.pop()) * 1j + rotation = float(elements.pop()) + arc = float(elements.pop()) + sweep = float(elements.pop()) + end = float(elements.pop()) + float(elements.pop()) * 1j + + if not absolute: + end += current_pos + + segments.append(Arc(current_pos, radius, rotation, arc, sweep, end)) + current_pos = end + + return segments diff --git a/build/lib/svgpathtools/path.py b/build/lib/svgpathtools/path.py new file mode 100644 index 0000000..d026e3d --- /dev/null +++ b/build/lib/svgpathtools/path.py @@ -0,0 +1,2208 @@ +"""This submodule contains the class definitions of the the main five classes +svgpathtools is built around: Path, Line, QuadraticBezier, CubicBezier, and +Arc.""" + +# External dependencies +from __future__ import division, absolute_import, print_function +from math import sqrt, cos, sin, acos, degrees, radians, log, pi +from cmath import exp, sqrt as csqrt, phase +from collections import MutableSequence +from warnings import warn +from operator import itemgetter +import numpy as np +try: + from scipy.integrate import quad + _quad_available = True +except: + _quad_available = False + +# Internal dependencies +from .bezier import (bezier_intersections, bezier_bounding_box, split_bezier, + bezier_by_line_intersections, polynomial2bezier) +from .misctools import BugException +from .polytools import rational_limit, polyroots, polyroots01, imag, real + + +# Default Parameters ########################################################## + +# path segment .length() parameters for arc length computation +LENGTH_MIN_DEPTH = 5 +LENGTH_ERROR = 1e-12 +USE_SCIPY_QUAD = True # for elliptic Arc segment arc length computation + +# path segment .ilength() parameters for inverse arc length computation +ILENGTH_MIN_DEPTH = 5 +ILENGTH_ERROR = 1e-12 +ILENGTH_S_TOL = 1e-12 +ILENGTH_MAXITS = 10000 + +# compatibility/implementation related warnings and parameters +CLOSED_WARNING_ON = True +_NotImplemented4ArcException = \ + Exception("This method has not yet been implemented for Arc objects.") +# _NotImplemented4QuadraticException = \ +# Exception("This method has not yet been implemented for QuadraticBezier " +# "objects.") +_is_smooth_from_warning = \ + ("The name of this method is somewhat misleading (yet kept for " + "compatibility with scripts created using svg.path 2.0). This method " + "is meant only for d-string creation and should NOT be used to check " + "for kinks. To check a segment for differentiability, use the " + "joins_smoothly_with() method instead or the kinks() function (in " + "smoothing.py).\nTo turn off this warning, set " + "warning_on=False.") + + +# Miscellaneous ############################################################### + +def bezier_segment(*bpoints): + if len(bpoints) == 2: + return Line(*bpoints) + elif len(bpoints) == 4: + return CubicBezier(*bpoints) + elif len(bpoints) == 3: + return QuadraticBezier(*bpoints) + else: + assert len(bpoints) in (2, 3, 4) + + +def is_bezier_segment(seg): + return (isinstance(seg, Line) or + isinstance(seg, QuadraticBezier) or + isinstance(seg, CubicBezier)) + + +def is_path_segment(seg): + return is_bezier_segment(seg) or isinstance(seg, Arc) + + +def is_bezier_path(path): + """Checks that all segments in path are a Line, QuadraticBezier, or + CubicBezier object.""" + return isinstance(path, Path) and all(map(is_bezier_segment, path)) + + +def concatpaths(list_of_paths): + """Takes in a sequence of paths and returns their concatenations into a + single path (following the order of the input sequence).""" + return Path(*[seg for path in list_of_paths for seg in path]) + + +def bbox2path(xmin, xmax, ymin, ymax): + """Converts a bounding box 4-tuple to a Path object.""" + b = Line(xmin + 1j*ymin, xmax + 1j*ymin) + t = Line(xmin + 1j*ymax, xmax + 1j*ymax) + r = Line(xmax + 1j*ymin, xmax + 1j*ymax) + l = Line(xmin + 1j*ymin, xmin + 1j*ymax) + return Path(b, r, t.reversed(), l.reversed()) + + +# Conversion################################################################### + +def bpoints2bezier(bpoints): + """Converts a list of length 2, 3, or 4 to a CubicBezier, QuadraticBezier, + or Line object, respectively. + See also: poly2bez.""" + order = len(bpoints) - 1 + if order == 3: + return CubicBezier(*bpoints) + elif order == 2: + return QuadraticBezier(*bpoints) + elif order == 1: + return Line(*bpoints) + else: + assert len(bpoints) in {2, 3, 4} + + +def poly2bez(poly, return_bpoints=False): + """Converts a cubic or lower order Polynomial object (or a sequence of + coefficients) to a CubicBezier, QuadraticBezier, or Line object as + appropriate. If return_bpoints=True then this will instead only return + the control points of the corresponding Bezier curve. + Note: The inverse operation is available as a method of CubicBezier, + QuadraticBezier and Line objects.""" + bpoints = polynomial2bezier(poly) + if return_bpoints: + return bpoints + else: + return bpoints2bezier(bpoints) + + +def bez2poly(bez, numpy_ordering=True, return_poly1d=False): + """Converts a Bezier object or tuple of Bezier control points to a tuple + of coefficients of the expanded polynomial. + return_poly1d : returns a numpy.poly1d object. This makes computations + of derivatives/anti-derivatives and many other operations quite quick. + numpy_ordering : By default (to accommodate numpy) the coefficients will + be output in reverse standard order. + Note: This function is redundant thanks to the .poly() method included + with all bezier segment classes.""" + if is_bezier_segment(bez): + bez = bez.bpoints() + return bezier2polynomial(bez, + numpy_ordering=numpy_ordering, + return_poly1d=return_poly1d) + + +# Geometric#################################################################### + +def rotate(curve, degs, origin=None): + """Returns curve rotated by `degs` degrees (CCW) around the point `origin` + (a complex number). By default origin is either `curve.point(0.5)`, or in + the case that curve is an Arc object, `origin` defaults to `curve.center`. + """ + def transform(z): + return exp(1j*radians(degs))*(z - origin) + origin + + if origin == None: + if isinstance(curve, Arc): + origin = curve.center + else: + origin = curve.point(0.5) + + if isinstance(curve, Path): + return Path(*[rotate(seg, degs, origin=origin) for seg in curve]) + elif is_bezier_segment(curve): + return bpoints2bezier([transform(bpt) for bpt in curve.bpoints()]) + elif isinstance(curve, Arc): + new_start = transform(curve.start) + new_end = transform(curve.end) + new_rotation = curve.rotation + degs + return Arc(new_start, radius=curve.radius, rotation=new_rotation, + large_arc=curve.large_arc, sweep=curve.sweep, end=new_end) + else: + raise TypeError("Input `curve` should be a Path, Line, " + "QuadraticBezier, CubicBezier, or Arc object.") + + +def translate(curve, z0): + """Shifts the curve by the complex quantity z such that + translate(curve, z0).point(t) = curve.point(t) + z0""" + if isinstance(curve, Path): + return Path(*[translate(seg, z0) for seg in curve]) + elif is_bezier_segment(curve): + return bpoints2bezier([bpt + z0 for bpt in curve.bpoints()]) + elif isinstance(curve, Arc): + new_start = curve.start + z0 + new_end = curve.end + z0 + return Arc(new_start, radius=curve.radius, rotation=curve.rotation, + large_arc=curve.large_arc, sweep=curve.sweep, end=new_end) + else: + raise TypeError("Input `curve` should be a Path, Line, " + "QuadraticBezier, CubicBezier, or Arc object.") + + +def bezier_unit_tangent(seg, t): + """Returns the unit tangent of the segment at t. + + Notes + ----- + If you receive a RuntimeWarning, try the following: + >>> import numpy + >>> old_numpy_error_settings = numpy.seterr(invalid='raise') + This can be undone with: + >>> numpy.seterr(**old_numpy_error_settings) + """ + assert 0 <= t <= 1 + dseg = seg.derivative(t) + + # Note: dseg might be numpy value, use np.seterr(invalid='raise') + try: + unit_tangent = dseg/abs(dseg) + except (ZeroDivisionError, FloatingPointError): + # This may be a removable singularity, if so we just need to compute + # the limit. + # Note: limit{{dseg / abs(dseg)} = sqrt(limit{dseg**2 / abs(dseg)**2}) + dseg_poly = seg.poly().deriv() + dseg_abs_squared_poly = (real(dseg_poly) ** 2 + + imag(dseg_poly) ** 2) + try: + unit_tangent = csqrt(rational_limit(dseg_poly**2, + dseg_abs_squared_poly, t)) + except ValueError: + bef = seg.poly().deriv()(t - 1e-4) + aft = seg.poly().deriv()(t + 1e-4) + mes = ("Unit tangent appears to not be well-defined at " + "t = {}, \n".format(t) + + "seg.poly().deriv()(t - 1e-4) = {}\n".format(bef) + + "seg.poly().deriv()(t + 1e-4) = {}".format(aft)) + raise ValueError(mes) + return unit_tangent + + +def segment_curvature(self, t, use_inf=False): + """returns the curvature of the segment at t. + + Notes + ----- + If you receive a RuntimeWarning, run command + >>> old = np.seterr(invalid='raise') + This can be undone with + >>> np.seterr(**old) + """ + + dz = self.derivative(t) + ddz = self.derivative(t, n=2) + dx, dy = dz.real, dz.imag + ddx, ddy = ddz.real, ddz.imag + old_np_seterr = np.seterr(invalid='raise') + try: + kappa = abs(dx*ddy - dy*ddx)/sqrt(dx*dx + dy*dy)**3 + except (ZeroDivisionError, FloatingPointError): + # tangent vector is zero at t, use polytools to find limit + p = self.poly() + dp = p.deriv() + ddp = dp.deriv() + dx, dy = real(dp), imag(dp) + ddx, ddy = real(ddp), imag(ddp) + f2 = (dx*ddy - dy*ddx)**2 + g2 = (dx*dx + dy*dy)**3 + lim2 = rational_limit(f2, g2, t) + if lim2 < 0: # impossible, must be numerical error + return 0 + kappa = sqrt(lim2) + finally: + np.seterr(**old_np_seterr) + return kappa + + +def bezier_radialrange(seg, origin, return_all_global_extrema=False): + """returns the tuples (d_min, t_min) and (d_max, t_max) which minimize and + maximize, respectively, the distance d = |self.point(t)-origin|. + return_all_global_extrema: Multiple such t_min or t_max values can exist. + By default, this will only return one. Set return_all_global_extrema=True + to return all such global extrema.""" + + def _radius(tau): + return abs(seg.point(tau) - origin) + + shifted_seg_poly = seg.poly() - origin + r_squared = real(shifted_seg_poly) ** 2 + \ + imag(shifted_seg_poly) ** 2 + extremizers = [0, 1] + polyroots01(r_squared.deriv()) + extrema = [(_radius(t), t) for t in extremizers] + + if return_all_global_extrema: + raise NotImplementedError + else: + seg_global_min = min(extrema, key=itemgetter(0)) + seg_global_max = max(extrema, key=itemgetter(0)) + return seg_global_min, seg_global_max + + +def closest_point_in_path(pt, path): + """returns (|path.seg.point(t)-pt|, t, seg_idx) where t and seg_idx + minimize the distance between pt and curve path[idx].point(t) for 0<=t<=1 + and any seg_idx. + Warning: Multiple such global minima can exist. This will only return + one.""" + return path.radialrange(pt)[0] + + +def farthest_point_in_path(pt, path): + """returns (|path.seg.point(t)-pt|, t, seg_idx) where t and seg_idx + maximize the distance between pt and curve path[idx].point(t) for 0<=t<=1 + and any seg_idx. + :rtype : object + :param pt: + :param path: + Warning: Multiple such global maxima can exist. This will only return + one.""" + return path.radialrange(pt)[1] + + +def path_encloses_pt(pt, opt, path): + """returns true if pt is a point enclosed by path (which must be a Path + object satisfying path.isclosed==True). opt is a point you know is + NOT enclosed by path.""" + assert path.isclosed() + intersections = Path(Line(pt, opt)).intersect(path) + if len(intersections) % 2: + return True + else: + return False + + +def segment_length(curve, start, end, start_point, end_point, + error=LENGTH_ERROR, min_depth=LENGTH_MIN_DEPTH, depth=0): + """Recursively approximates the length by straight lines""" + mid = (start + end)/2 + mid_point = curve.point(mid) + length = abs(end_point - start_point) + first_half = abs(mid_point - start_point) + second_half = abs(end_point - mid_point) + + length2 = first_half + second_half + if (length2 - length > error) or (depth < min_depth): + # Calculate the length of each segment: + depth += 1 + return (segment_length(curve, start, mid, start_point, mid_point, + error, min_depth, depth) + + segment_length(curve, mid, end, mid_point, end_point, + error, min_depth, depth)) + # This is accurate enough. + return length2 + + +def inv_arclength(curve, s, s_tol=ILENGTH_S_TOL, maxits=ILENGTH_MAXITS, + error=ILENGTH_ERROR, min_depth=ILENGTH_MIN_DEPTH): + """INPUT: curve should be a CubicBezier, Line, of Path of CubicBezier + and/or Line objects. + OUTPUT: Returns a float, t, such that the arc length of curve from 0 to + t is approximately s. + s_tol - exit when |s(t) - s| < s_tol where + s(t) = seg.length(0, t, error, min_depth) and seg is either curve or, + if curve is a Path object, then seg is a segment in curve. + error - used to compute lengths of cubics and arcs + min_depth - used to compute lengths of cubics and arcs + Note: This function is not designed to be efficient.""" + + curve_length = curve.length(error=error, min_depth=min_depth) + assert curve_length > 0 + if not 0 <= s <= curve_length: + raise ValueError("s is not in interval [0, curve.length()].") + + if s == 0: + return 0 + if s == curve_length: + return 1 + + if isinstance(curve, Path): + seg_lengths = [seg.length(error=error, min_depth=min_depth) for seg in curve] + lsum = 0 + # Find which segment the point we search for is located on + for k, len_k in enumerate(seg_lengths): + if lsum <= s <= lsum + len_k: + t = inv_arclength(curve[k], s - lsum, s_tol=s_tol, maxits=maxits, error=error, min_depth=min_depth) + return curve.t2T(k, t) + lsum += len_k + return 1 + + elif isinstance(curve, Line): + return s / curve.length(error=error, min_depth=min_depth) + + elif (isinstance(curve, QuadraticBezier) or + isinstance(curve, CubicBezier) or + isinstance(curve, Arc)): + t_upper = 1 + t_lower = 0 + iteration = 0 + while iteration < maxits: + iteration += 1 + t = (t_lower + t_upper)/2 + s_t = curve.length(t1=t, error=error, min_depth=min_depth) + if abs(s_t - s) < s_tol: + return t + elif s_t < s: # t too small + t_lower = t + else: # s < s_t, t too big + t_upper = t + if t_upper == t_lower: + warn("t is as close as a float can be to the correct value, " + "but |s(t) - s| = {} > s_tol".format(abs(s_t-s))) + return t + raise Exception("Maximum iterations reached with s(t) - s = {}." + "".format(s_t - s)) + else: + raise TypeError("First argument must be a Line, QuadraticBezier, " + "CubicBezier, Arc, or Path object.") + +# Operations################################################################### + + +def crop_bezier(seg, t0, t1): + """returns a cropped copy of this segment which starts at self.point(t0) + and ends at self.point(t1).""" + assert t0 < t1 + if t0 == 0: + cropped_seg = seg.split(t1)[0] + elif t1 == 1: + cropped_seg = seg.split(t0)[1] + else: + pt1 = seg.point(t1) + + # trim off the 0 <= t < t0 part + trimmed_seg = crop_bezier(seg, t0, 1) + + # find the adjusted t1 (i.e. the t1 such that + # trimmed_seg.point(t1) ~= pt))and trim off the t1 < t <= 1 part + t1_adj = trimmed_seg.radialrange(pt1)[0][1] + cropped_seg = crop_bezier(trimmed_seg, 0, t1_adj) + return cropped_seg + + +# Main Classes ################################################################ + + +class Line(object): + def __init__(self, start, end): + self.start = start + self.end = end + + def __repr__(self): + return 'Line(start=%s, end=%s)' % (self.start, self.end) + + def __eq__(self, other): + if not isinstance(other, Line): + return NotImplemented + return self.start == other.start and self.end == other.end + + def __ne__(self, other): + if not isinstance(other, Line): + return NotImplemented + return not self == other + + def __getitem__(self, item): + return self.bpoints()[item] + + def __len__(self): + return 2 + + def joins_smoothly_with(self, previous, wrt_parameterization=False): + """Checks if this segment joins smoothly with previous segment. By + default, this only checks that this segment starts moving (at t=0) in + the same direction (and from the same positive) as previous stopped + moving (at t=1). To check if the tangent magnitudes also match, set + wrt_parameterization=True.""" + if wrt_parameterization: + return self.start == previous.end and np.isclose( + self.derivative(0), previous.derivative(1)) + else: + return self.start == previous.end and np.isclose( + self.unit_tangent(0), previous.unit_tangent(1)) + + def point(self, t): + """returns the coordinates of the Bezier curve evaluated at t.""" + distance = self.end - self.start + return self.start + distance*t + + def length(self, t0=0, t1=1, error=None, min_depth=None): + """returns the length of the line segment between t0 and t1.""" + return abs(self.end - self.start)*(t1-t0) + + def ilength(self, s, s_tol=ILENGTH_S_TOL, maxits=ILENGTH_MAXITS, + error=ILENGTH_ERROR, min_depth=ILENGTH_MIN_DEPTH): + """Returns a float, t, such that self.length(0, t) is approximately s. + See the inv_arclength() docstring for more details.""" + return inv_arclength(self, s, s_tol=s_tol, maxits=maxits, error=error, + min_depth=min_depth) + + def bpoints(self): + """returns the Bezier control points of the segment.""" + return self.start, self.end + + def poly(self, return_coeffs=False): + """returns the line as a Polynomial object.""" + p = self.bpoints() + coeffs = ([p[1] - p[0], p[0]]) + if return_coeffs: + return coeffs + else: + return np.poly1d(coeffs) + + def derivative(self, t=None, n=1): + """returns the nth derivative of the segment at t.""" + assert self.end != self.start + if n == 1: + return self.end - self.start + elif n > 1: + return 0 + else: + raise ValueError("n should be a positive integer.") + + def unit_tangent(self, t=None): + """returns the unit tangent of the segment at t.""" + assert self.end != self.start + dseg = self.end - self.start + return dseg/abs(dseg) + + def normal(self, t=None): + """returns the (right hand rule) unit normal vector to self at t.""" + return -1j*self.unit_tangent(t) + + def curvature(self, t): + """returns the curvature of the line, which is always zero.""" + return 0 + + # def icurvature(self, kappa): + # """returns a list of t-values such that 0 <= t<= 1 and + # seg.curvature(t) = kappa.""" + # if kappa: + # raise ValueError("The .icurvature() method for Line elements will " + # "return an empty list if kappa is nonzero and " + # "will raise this exception when kappa is zero as " + # "this is true at every point on the line.") + # return [] + + def reversed(self): + """returns a copy of the Line object with its orientation reversed.""" + return Line(self.end, self.start) + + def intersect(self, other_seg, tol=None): + """Finds the intersections of two segments. + returns a list of tuples (t1, t2) such that + self.point(t1) == other_seg.point(t2). + Note: This will fail if the two segments coincide for more than a + finite collection of points. + tol is not used.""" + if isinstance(other_seg, Line): + assert other_seg.end != other_seg.start and self.end != self.start + assert self != other_seg + # Solve the system [p1-p0, q1-q0]*[t1, t2]^T = q0 - p0 + # where self == Line(p0, p1) and other_seg == Line(q0, q1) + a = (self.start.real, self.end.real) + b = (self.start.imag, self.end.imag) + c = (other_seg.start.real, other_seg.end.real) + d = (other_seg.start.imag, other_seg.end.imag) + denom = ((a[1] - a[0])*(d[0] - d[1]) - + (b[1] - b[0])*(c[0] - c[1])) + if denom == 0: + return [] + t1 = (c[0]*(b[0] - d[1]) - + c[1]*(b[0] - d[0]) - + a[0]*(d[0] - d[1]))/denom + t2 = -(a[1]*(b[0] - d[0]) - + a[0]*(b[1] - d[0]) - + c[0]*(b[0] - b[1]))/denom + if 0 <= t1 <= 1 and 0 <= t2 <= 1: + return [(t1, t2)] + return [] + elif isinstance(other_seg, QuadraticBezier): + return bezier_by_line_intersections(other_seg, self) + elif isinstance(other_seg, CubicBezier): + return bezier_by_line_intersections(other_seg, self) + elif isinstance(other_seg, Arc): + t2t1s = other_seg.intersect(self) + return [(t1, t2) for t2, t1 in t2t1s] + elif isinstance(other_seg, Path): + raise TypeError( + "other_seg must be a path segment, not a Path object, use " + "Path.intersect().") + else: + raise TypeError("other_seg must be a path segment.") + + def bbox(self): + """returns the bounding box for the segment in the form + (xmin, xmax, ymin, ymax).""" + xmin = min(self.start.real, self.end.real) + xmax = max(self.start.real, self.end.real) + ymin = min(self.start.imag, self.end.imag) + ymax = max(self.start.imag, self.end.imag) + return xmin, xmax, ymin, ymax + + def cropped(self, t0, t1): + """returns a cropped copy of this segment which starts at + self.point(t0) and ends at self.point(t1).""" + return Line(self.point(t0), self.point(t1)) + + def split(self, t): + """returns two segments, whose union is this segment and which join at + self.point(t).""" + pt = self.point(t) + return Line(self.start, pt), Line(pt, self.end) + + def radialrange(self, origin, return_all_global_extrema=False): + """returns the tuples (d_min, t_min) and (d_max, t_max) which minimize + and maximize, respectively, the distance d = |self.point(t)-origin|.""" + return bezier_radialrange(self, origin, + return_all_global_extrema=return_all_global_extrema) + + def rotated(self, degs, origin=None): + """Returns a copy of self rotated by `degs` degrees (CCW) around the + point `origin` (a complex number). By default `origin` is either + `self.point(0.5)`, or in the case that self is an Arc object, + `origin` defaults to `self.center`.""" + return rotate(self, degs, origin=origin) + + def translated(self, z0): + """Returns a copy of self shifted by the complex quantity `z0` such + that self.translated(z0).point(t) = self.point(t) + z0 for any t.""" + return translate(self, z0) + + +class QuadraticBezier(object): + # For compatibility with old pickle files. + _length_info = {'length': None, 'bpoints': None} + + def __init__(self, start, control, end): + self.start = start + self.end = end + self.control = control + + # used to know if self._length needs to be updated + self._length_info = {'length': None, 'bpoints': None} + + def __repr__(self): + return 'QuadraticBezier(start=%s, control=%s, end=%s)' % ( + self.start, self.control, self.end) + + def __eq__(self, other): + if not isinstance(other, QuadraticBezier): + return NotImplemented + return self.start == other.start and self.end == other.end \ + and self.control == other.control + + def __ne__(self, other): + if not isinstance(other, QuadraticBezier): + return NotImplemented + return not self == other + + def __getitem__(self, item): + return self.bpoints()[item] + + def __len__(self): + return 3 + + def is_smooth_from(self, previous, warning_on=True): + """[Warning: The name of this method is somewhat misleading (yet kept + for compatibility with scripts created using svg.path 2.0). This + method is meant only for d string creation and should not be used to + check for kinks. To check a segment for differentiability, use the + joins_smoothly_with() method instead.]""" + if warning_on: + warn(_is_smooth_from_warning) + if isinstance(previous, QuadraticBezier): + return (self.start == previous.end and + (self.control - self.start) == ( + previous.end - previous.control)) + else: + return self.control == self.start + + def joins_smoothly_with(self, previous, wrt_parameterization=False, + error=0): + """Checks if this segment joins smoothly with previous segment. By + default, this only checks that this segment starts moving (at t=0) in + the same direction (and from the same positive) as previous stopped + moving (at t=1). To check if the tangent magnitudes also match, set + wrt_parameterization=True.""" + if wrt_parameterization: + return self.start == previous.end and abs( + self.derivative(0) - previous.derivative(1)) <= error + else: + return self.start == previous.end and abs( + self.unit_tangent(0) - previous.unit_tangent(1)) <= error + + def point(self, t): + """returns the coordinates of the Bezier curve evaluated at t.""" + return (1 - t)**2*self.start + 2*(1 - t)*t*self.control + t**2*self.end + + def length(self, t0=0, t1=1, error=None, min_depth=None): + if t0 == 1 and t1 == 0: + if self._length_info['bpoints'] == self.bpoints(): + return self._length_info['length'] + a = self.start - 2*self.control + self.end + b = 2*(self.control - self.start) + a_dot_b = a.real*b.real + a.imag*b.imag + + if abs(a) < 1e-12: + s = abs(b)*(t1 - t0) + elif abs(a_dot_b + abs(a)*abs(b)) < 1e-12: + tstar = abs(b)/(2*abs(a)) + if t1 < tstar: + return abs(a)*(t0**2 - t1**2) - abs(b)*(t0 - t1) + elif tstar < t0: + return abs(a)*(t1**2 - t0**2) - abs(b)*(t1 - t0) + else: + return abs(a)*(t1**2 + t0**2) - abs(b)*(t1 + t0) + \ + abs(b)**2/(2*abs(a)) + else: + c2 = 4*(a.real**2 + a.imag**2) + c1 = 4*a_dot_b + c0 = b.real**2 + b.imag**2 + + beta = c1/(2*c2) + gamma = c0/c2 - beta**2 + + dq1_mag = sqrt(c2*t1**2 + c1*t1 + c0) + dq0_mag = sqrt(c2*t0**2 + c1*t0 + c0) + logarand = (sqrt(c2)*(t1 + beta) + dq1_mag) / \ + (sqrt(c2)*(t0 + beta) + dq0_mag) + + s = (t1 + beta)*dq1_mag - (t0 + beta)*dq0_mag + \ + gamma*sqrt(c2)*log(logarand) + s /= 2 + + if t0 == 1 and t1 == 0: + self._length_info['length'] = s + self._length_info['bpoints'] = self.bpoints() + return self._length_info['length'] + else: + return s + + def ilength(self, s, s_tol=ILENGTH_S_TOL, maxits=ILENGTH_MAXITS, + error=ILENGTH_ERROR, min_depth=ILENGTH_MIN_DEPTH): + """Returns a float, t, such that self.length(0, t) is approximately s. + See the inv_arclength() docstring for more details.""" + return inv_arclength(self, s, s_tol=s_tol, maxits=maxits, error=error, + min_depth=min_depth) + + def bpoints(self): + """returns the Bezier control points of the segment.""" + return self.start, self.control, self.end + + def poly(self, return_coeffs=False): + """returns the quadratic as a Polynomial object.""" + p = self.bpoints() + coeffs = (p[0] - 2*p[1] + p[2], 2*(p[1] - p[0]), p[0]) + if return_coeffs: + return coeffs + else: + return np.poly1d(coeffs) + + def derivative(self, t, n=1): + """returns the nth derivative of the segment at t. + Note: Bezier curves can have points where their derivative vanishes. + If you are interested in the tangent direction, use the unit_tangent() + method instead.""" + p = self.bpoints() + if n == 1: + return 2*((p[1] - p[0])*(1 - t) + (p[2] - p[1])*t) + elif n == 2: + return 2*(p[2] - 2*p[1] + p[0]) + elif n > 2: + return 0 + else: + raise ValueError("n should be a positive integer.") + + def unit_tangent(self, t): + """returns the unit tangent vector of the segment at t (centered at + the origin and expressed as a complex number). If the tangent + vector's magnitude is zero, this method will find the limit of + self.derivative(tau)/abs(self.derivative(tau)) as tau approaches t.""" + return bezier_unit_tangent(self, t) + + def normal(self, t): + """returns the (right hand rule) unit normal vector to self at t.""" + return -1j*self.unit_tangent(t) + + def curvature(self, t): + """returns the curvature of the segment at t.""" + return segment_curvature(self, t) + + # def icurvature(self, kappa): + # """returns a list of t-values such that 0 <= t<= 1 and + # seg.curvature(t) = kappa.""" + # z = self.poly() + # x, y = real(z), imag(z) + # dx, dy = x.deriv(), y.deriv() + # ddx, ddy = dx.deriv(), dy.deriv() + # + # p = kappa**2*(dx**2 + dy**2)**3 - (dx*ddy - ddx*dy)**2 + # return polyroots01(p) + + def reversed(self): + """returns a copy of the QuadraticBezier object with its orientation + reversed.""" + new_quad = QuadraticBezier(self.end, self.control, self.start) + if self._length_info['length']: + new_quad._length_info = self._length_info + new_quad._length_info['bpoints'] = ( + self.end, self.control, self.start) + return new_quad + + def intersect(self, other_seg, tol=1e-12): + """Finds the intersections of two segments. + returns a list of tuples (t1, t2) such that + self.point(t1) == other_seg.point(t2). + Note: This will fail if the two segments coincide for more than a + finite collection of points.""" + if isinstance(other_seg, Line): + return bezier_by_line_intersections(self, other_seg) + elif isinstance(other_seg, QuadraticBezier): + assert self != other_seg + longer_length = max(self.length(), other_seg.length()) + return bezier_intersections(self, other_seg, + longer_length=longer_length, + tol=tol, tol_deC=tol) + elif isinstance(other_seg, CubicBezier): + longer_length = max(self.length(), other_seg.length()) + return bezier_intersections(self, other_seg, + longer_length=longer_length, + tol=tol, tol_deC=tol) + elif isinstance(other_seg, Arc): + t1 = other_seg.intersect(self) + return t1, t2 + elif isinstance(other_seg, Path): + raise TypeError( + "other_seg must be a path segment, not a Path object, use " + "Path.intersect().") + else: + raise TypeError("other_seg must be a path segment.") + + def bbox(self): + """returns the bounding box for the segment in the form + (xmin, xmax, ymin, ymax).""" + return bezier_bounding_box(self) + + def split(self, t): + """returns two segments, whose union is this segment and which join at + self.point(t).""" + bpoints1, bpoints2 = split_bezier(self.bpoints(), t) + return QuadraticBezier(*bpoints1), QuadraticBezier(*bpoints2) + + def cropped(self, t0, t1): + """returns a cropped copy of this segment which starts at + self.point(t0) and ends at self.point(t1).""" + return QuadraticBezier(*crop_bezier(self, t0, t1)) + + def radialrange(self, origin, return_all_global_extrema=False): + """returns the tuples (d_min, t_min) and (d_max, t_max) which minimize + and maximize, respectively, the distance d = |self.point(t)-origin|.""" + return bezier_radialrange(self, origin, + return_all_global_extrema=return_all_global_extrema) + + def rotated(self, degs, origin=None): + """Returns a copy of self rotated by `degs` degrees (CCW) around the + point `origin` (a complex number). By default `origin` is either + `self.point(0.5)`, or in the case that self is an Arc object, + `origin` defaults to `self.center`.""" + return rotate(self, degs, origin=origin) + + def translated(self, z0): + """Returns a copy of self shifted by the complex quantity `z0` such + that self.translated(z0).point(t) = self.point(t) + z0 for any t.""" + return translate(self, z0) + + +class CubicBezier(object): + # For compatibility with old pickle files. + _length_info = {'length': None, 'bpoints': None, 'error': None, + 'min_depth': None} + + def __init__(self, start, control1, control2, end): + self.start = start + self.control1 = control1 + self.control2 = control2 + self.end = end + + # used to know if self._length needs to be updated + self._length_info = {'length': None, 'bpoints': None, 'error': None, + 'min_depth': None} + + def __repr__(self): + return 'CubicBezier(start=%s, control1=%s, control2=%s, end=%s)' % ( + self.start, self.control1, self.control2, self.end) + + def __eq__(self, other): + if not isinstance(other, CubicBezier): + return NotImplemented + return self.start == other.start and self.end == other.end \ + and self.control1 == other.control1 \ + and self.control2 == other.control2 + + def __ne__(self, other): + if not isinstance(other, CubicBezier): + return NotImplemented + return not self == other + + def __getitem__(self, item): + return self.bpoints()[item] + + def __len__(self): + return 4 + + def is_smooth_from(self, previous, warning_on=True): + """[Warning: The name of this method is somewhat misleading (yet kept + for compatibility with scripts created using svg.path 2.0). This + method is meant only for d string creation and should not be used to + check for kinks. To check a segment for differentiability, use the + joins_smoothly_with() method instead.]""" + if warning_on: + warn(_is_smooth_from_warning) + if isinstance(previous, CubicBezier): + return (self.start == previous.end and + (self.control1 - self.start) == ( + previous.end - previous.control2)) + else: + return self.control1 == self.start + + def joins_smoothly_with(self, previous, wrt_parameterization=False): + """Checks if this segment joins smoothly with previous segment. By + default, this only checks that this segment starts moving (at t=0) in + the same direction (and from the same positive) as previous stopped + moving (at t=1). To check if the tangent magnitudes also match, set + wrt_parameterization=True.""" + if wrt_parameterization: + return self.start == previous.end and np.isclose( + self.derivative(0), previous.derivative(1)) + else: + return self.start == previous.end and np.isclose( + self.unit_tangent(0), previous.unit_tangent(1)) + + def point(self, t): + """Evaluate the cubic Bezier curve at t using Horner's rule.""" + # algebraically equivalent to + # P0*(1-t)**3 + 3*P1*t*(1-t)**2 + 3*P2*(1-t)*t**2 + P3*t**3 + # for (P0, P1, P2, P3) = self.bpoints() + return self.start + t*( + 3*(self.control1 - self.start) + t*( + 3*(self.start + self.control2) - 6*self.control1 + t*( + -self.start + 3*(self.control1 - self.control2) + self.end + ))) + + def length(self, t0=0, t1=1, error=LENGTH_ERROR, min_depth=LENGTH_MIN_DEPTH): + """Calculate the length of the path up to a certain position""" + if t0 == 0 and t1 == 1: + if self._length_info['bpoints'] == self.bpoints() \ + and self._length_info['error'] >= error \ + and self._length_info['min_depth'] >= min_depth: + return self._length_info['length'] + + # using scipy.integrate.quad is quick + if _quad_available: + s = quad(lambda tau: abs(self.derivative(tau)), t0, t1, + epsabs=error, limit=1000)[0] + else: + s = segment_length(self, t0, t1, self.point(t0), self.point(t1), + error, min_depth, 0) + + if t0 == 0 and t1 == 1: + self._length_info['length'] = s + self._length_info['bpoints'] = self.bpoints() + self._length_info['error'] = error + self._length_info['min_depth'] = min_depth + return self._length_info['length'] + else: + return s + + def ilength(self, s, s_tol=ILENGTH_S_TOL, maxits=ILENGTH_MAXITS, + error=ILENGTH_ERROR, min_depth=ILENGTH_MIN_DEPTH): + """Returns a float, t, such that self.length(0, t) is approximately s. + See the inv_arclength() docstring for more details.""" + return inv_arclength(self, s, s_tol=s_tol, maxits=maxits, error=error, + min_depth=min_depth) + + def bpoints(self): + """returns the Bezier control points of the segment.""" + return self.start, self.control1, self.control2, self.end + + def poly(self, return_coeffs=False): + """Returns a the cubic as a Polynomial object.""" + p = self.bpoints() + coeffs = (-p[0] + 3*(p[1] - p[2]) + p[3], + 3*(p[0] - 2*p[1] + p[2]), + 3*(-p[0] + p[1]), + p[0]) + if return_coeffs: + return coeffs + else: + return np.poly1d(coeffs) + + def derivative(self, t, n=1): + """returns the nth derivative of the segment at t. + Note: Bezier curves can have points where their derivative vanishes. + If you are interested in the tangent direction, use the unit_tangent() + method instead.""" + p = self.bpoints() + if n == 1: + return 3*(p[1] - p[0])*(1 - t)**2 + 6*(p[2] - p[1])*(1 - t)*t + 3*( + p[3] - p[2])*t**2 + elif n == 2: + return 6*( + (1 - t)*(p[2] - 2*p[1] + p[0]) + t*(p[3] - 2*p[2] + p[1])) + elif n == 3: + return 6*(p[3] - 3*(p[2] - p[1]) - p[0]) + elif n > 3: + return 0 + else: + raise ValueError("n should be a positive integer.") + + def unit_tangent(self, t): + """returns the unit tangent vector of the segment at t (centered at + the origin and expressed as a complex number). If the tangent + vector's magnitude is zero, this method will find the limit of + self.derivative(tau)/abs(self.derivative(tau)) as tau approaches t.""" + return bezier_unit_tangent(self, t) + + def normal(self, t): + """returns the (right hand rule) unit normal vector to self at t.""" + return -1j * self.unit_tangent(t) + + def curvature(self, t): + """returns the curvature of the segment at t.""" + return segment_curvature(self, t) + + # def icurvature(self, kappa): + # """returns a list of t-values such that 0 <= t<= 1 and + # seg.curvature(t) = kappa.""" + # z = self.poly() + # x, y = real(z), imag(z) + # dx, dy = x.deriv(), y.deriv() + # ddx, ddy = dx.deriv(), dy.deriv() + # + # p = kappa**2*(dx**2 + dy**2)**3 - (dx*ddy - ddx*dy)**2 + # return polyroots01(p) + + def reversed(self): + """returns a copy of the CubicBezier object with its orientation + reversed.""" + new_cub = CubicBezier(self.end, self.control2, self.control1, + self.start) + if self._length_info['length']: + new_cub._length_info = self._length_info + new_cub._length_info['bpoints'] = ( + self.end, self.control2, self.control1, self.start) + return new_cub + + def intersect(self, other_seg, tol=1e-12): + """Finds the intersections of two segments. + returns a list of tuples (t1, t2) such that + self.point(t1) == other_seg.point(t2). + Note: This will fail if the two segments coincide for more than a + finite collection of points.""" + if isinstance(other_seg, Line): + return bezier_by_line_intersections(self, other_seg) + elif (isinstance(other_seg, QuadraticBezier) or + isinstance(other_seg, CubicBezier)): + assert self != other_seg + longer_length = max(self.length(), other_seg.length()) + return bezier_intersections(self, other_seg, + longer_length=longer_length, + tol=tol, tol_deC=tol) + elif isinstance(other_seg, Arc): + t2t1s = other_seg.intersect(self) + return [(t1, t2) for t2, t1 in t2t1s] + elif isinstance(other_seg, Path): + raise TypeError( + "other_seg must be a path segment, not a Path object, use " + "Path.intersect().") + else: + raise TypeError("other_seg must be a path segment.") + + def bbox(self): + """returns the bounding box for the segment in the form + (xmin, xmax, ymin, ymax).""" + return bezier_bounding_box(self) + + def split(self, t): + """returns two segments, whose union is this segment and which join at + self.point(t).""" + bpoints1, bpoints2 = split_bezier(self.bpoints(), t) + return CubicBezier(*bpoints1), CubicBezier(*bpoints2) + + def cropped(self, t0, t1): + """returns a cropped copy of this segment which starts at + self.point(t0) and ends at self.point(t1).""" + return CubicBezier(*crop_bezier(self, t0, t1)) + + def radialrange(self, origin, return_all_global_extrema=False): + """returns the tuples (d_min, t_min) and (d_max, t_max) which minimize + and maximize, respectively, the distance d = |self.point(t)-origin|.""" + return bezier_radialrange(self, origin, + return_all_global_extrema=return_all_global_extrema) + + def rotated(self, degs, origin=None): + """Returns a copy of self rotated by `degs` degrees (CCW) around the + point `origin` (a complex number). By default `origin` is either + `self.point(0.5)`, or in the case that self is an Arc object, + `origin` defaults to `self.center`.""" + return rotate(self, degs, origin=origin) + + def translated(self, z0): + """Returns a copy of self shifted by the complex quantity `z0` such + that self.translated(z0).point(t) = self.point(t) + z0 for any t.""" + return translate(self, z0) + + +class Arc(object): + def __init__(self, start, radius, rotation, large_arc, sweep, end, + autoscale_radius=True): + """ + This should be thought of as a part of an ellipse connecting two + points on that ellipse, start and end. + Parameters + ---------- + start : complex + The start point of the large_arc. + radius : complex + rx + 1j*ry, where rx and ry are the radii of the ellipse (also + known as its semi-major and semi-minor axes, or vice-versa or if + rx < ry). + Note: If rx = 0 or ry = 0 then this arc is treated as a + straight line segment joining the endpoints. + Note: If rx or ry has a negative sign, the sign is dropped; the + absolute value is used instead. + Note: If no such ellipse exists, the radius will be scaled so + that one does (unless autoscale_radius is set to False). + rotation : float + This is the CCW angle (in degrees) from the positive x-axis of the + current coordinate system to the x-axis of the ellipse. + large_arc : bool + This is the large_arc flag. Given two points on an ellipse, + there are two elliptical arcs connecting those points, the first + going the short way around the ellipse, and the second going the + long way around the ellipse. If large_arc is 0, the shorter + elliptical large_arc will be used. If large_arc is 1, then longer + elliptical will be used. + In other words, it should be 0 for arcs spanning less than or + equal to 180 degrees and 1 for arcs spanning greater than 180 + degrees. + sweep : bool + This is the sweep flag. For any acceptable parameters start, end, + rotation, and radius, there are two ellipses with the given major + and minor axes (radii) which connect start and end. One which + connects them in a CCW fashion and one which connected them in a + CW fashion. If sweep is 1, the CCW ellipse will be used. If + sweep is 0, the CW ellipse will be used. + + end : complex + The end point of the large_arc (must be distinct from start). + + Note on CW and CCW: The notions of CW and CCW are reversed in some + sense when viewing SVGs (as the y coordinate starts at the top of the + image and increases towards the bottom). + + Derived Parameters + ------------------ + self._parameterize() sets self.center, self.theta and self.delta + for use in self.point() and other methods. If + autoscale_radius == True, then this will also scale self.radius in the + case that no ellipse exists with the given parameters (see usage + below). + + self.theta : float + This is the phase (in degrees) of self.u1transform(self.start). + It is $\theta_1$ in the official documentation and ranges from + -180 to 180. + + self.delta : float + This is the angular distance (in degrees) between the start and + end of the arc after the arc has been sent to the unit circle + through self.u1transform(). + It is $\Delta\theta$ in the official documentation and ranges from + -360 to 360; being positive when the arc travels CCW and negative + otherwise (i.e. is positive/negative when sweep == True/False). + + self.center : complex + This is the center of the arc's ellipse. + """ + + self.start = start + self.radius = abs(radius.real) + 1j*abs(radius.imag) + self.rotation = rotation + self.large_arc = bool(large_arc) + self.sweep = bool(sweep) + self.end = end + self.autoscale_radius = autoscale_radius + + # Convenience parameters + self.phi = radians(self.rotation) + self.rot_matrix = exp(1j*self.phi) + + # Derive derived parameters + self._parameterize() + + def __repr__(self): + params = (self.start, self.radius, self.rotation, + self.large_arc, self.sweep, self.end) + return ("Arc(start={}, radius={}, rotation={}, " + "large_arc={}, sweep={}, end={})".format(*params)) + + def __eq__(self, other): + if not isinstance(other, Arc): + return NotImplemented + return self.start == other.start and self.end == other.end \ + and self.radius == other.radius \ + and self.rotation == other.rotation \ + and self.large_arc == other.large_arc and self.sweep == other.sweep + + def __ne__(self, other): + if not isinstance(other, Arc): + return NotImplemented + return not self == other + + def _parameterize(self): + # start cannot be the same as end as the ellipse would + # not be well defined + assert self.start != self.end + + # See http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes + # my notation roughly follows theirs + rx = self.radius.real + ry = self.radius.imag + rx_sqd = rx*rx + ry_sqd = ry*ry + + # Transform z-> z' = x' + 1j*y' + # = self.rot_matrix**(-1)*(z - (end+start)/2) + # coordinates. This translates the ellipse so that the midpoint + # between self.end and self.start lies on the origin and rotates + # the ellipse so that the its axes align with the xy-coordinate axes. + # Note: This sends self.end to -self.start + zp1 = (1/self.rot_matrix)*(self.start - self.end)/2 + x1p, y1p = zp1.real, zp1.imag + x1p_sqd = x1p*x1p + y1p_sqd = y1p*y1p + + # Correct out of range radii + # Note: an ellipse going through start and end with radius and phi + # exists if and only if radius_check is true + radius_check = (x1p_sqd/rx_sqd) + (y1p_sqd/ry_sqd) + if radius_check > 1: + if self.autoscale_radius: + rx *= sqrt(radius_check) + ry *= sqrt(radius_check) + self.radius = rx + 1j*ry + rx_sqd = rx*rx + ry_sqd = ry*ry + else: + raise ValueError("No such elliptic arc exists.") + + # Compute c'=(c_x', c_y'), the center of the ellipse in (x', y') coords + # Noting that, in our new coord system, (x_2', y_2') = (-x_1', -x_2') + # and our ellipse is cut out by of the plane by the algebraic equation + # (x'-c_x')**2 / r_x**2 + (y'-c_y')**2 / r_y**2 = 1, + # we can find c' by solving the system of two quadratics given by + # plugging our transformed endpoints (x_1', y_1') and (x_2', y_2') + tmp = rx_sqd*y1p_sqd + ry_sqd*x1p_sqd + radicand = (rx_sqd*ry_sqd - tmp) / tmp + try: + radical = sqrt(radicand) + except ValueError: + radical = 0 + if self.large_arc == self.sweep: + cp = -radical*(rx*y1p/ry - 1j*ry*x1p/rx) + else: + cp = radical*(rx*y1p/ry - 1j*ry*x1p/rx) + + # The center in (x,y) coordinates is easy to find knowing c' + self.center = exp(1j*self.phi)*cp + (self.start + self.end)/2 + + # Now we do a second transformation, from (x', y') to (u_x, u_y) + # coordinates, which is a translation moving the center of the + # ellipse to the origin and a dilation stretching the ellipse to be + # the unit circle + u1 = (x1p - cp.real)/rx + 1j*(y1p - cp.imag)/ry # transformed start + u2 = (-x1p - cp.real)/rx + 1j*(-y1p - cp.imag)/ry # transformed end + + # Now compute theta and delta (we'll define them as we go) + # delta is the angular distance of the arc (w.r.t the circle) + # theta is the angle between the positive x'-axis and the start point + # on the circle + if u1.imag > 0: + self.theta = degrees(acos(u1.real)) + elif u1.imag < 0: + self.theta = -degrees(acos(u1.real)) + else: + if u1.real > 0: # start is on pos u_x axis + self.theta = 0 + else: # start is on neg u_x axis + # Note: This behavior disagrees with behavior documented in + # http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes + # where theta is set to 0 in this case. + self.theta = 180 + + det_uv = u1.real*u2.imag - u1.imag*u2.real + + acosand = u1.real*u2.real + u1.imag*u2.imag + if acosand > 1 or acosand < -1: + acosand = round(acosand) + if det_uv > 0: + self.delta = degrees(acos(acosand)) + elif det_uv < 0: + self.delta = -degrees(acos(acosand)) + else: + if u1.real*u2.real + u1.imag*u2.imag > 0: + # u1 == u2 + self.delta = 0 + else: + # u1 == -u2 + # Note: This behavior disagrees with behavior documented in + # http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes + # where delta is set to 0 in this case. + self.delta = 180 + + if not self.sweep and self.delta >= 0: + self.delta -= 360 + elif self.large_arc and self.delta <= 0: + self.delta += 360 + + def point(self, t): + if t == 0: + return self.start + if t == 1: + return self.end + angle = radians(self.theta + t*self.delta) + cosphi = self.rot_matrix.real + sinphi = self.rot_matrix.imag + rx = self.radius.real + ry = self.radius.imag + + # z = self.rot_matrix*(rx*cos(angle) + 1j*ry*sin(angle)) + self.center + x = rx*cosphi*cos(angle) - ry*sinphi*sin(angle) + self.center.real + y = rx*sinphi*cos(angle) + ry*cosphi*sin(angle) + self.center.imag + return complex(x, y) + + def centeriso(self, z): + """This is an isometry that translates and rotates self so that it + is centered on the origin and has its axes aligned with the xy axes.""" + return (1/self.rot_matrix)*(z - self.center) + + def icenteriso(self, zeta): + """This is an isometry, the inverse of standardiso().""" + return self.rot_matrix*zeta + self.center + + def u1transform(self, z): + """This is an affine transformation (same as used in + self._parameterize()) that sends self to the unit circle.""" + zeta = (1/self.rot_matrix)*(z - self.center) # same as centeriso(z) + x, y = real(zeta), imag(zeta) + return x/self.radius.real + 1j*y/self.radius.imag + + def iu1transform(self, zeta): + """This is an affine transformation, the inverse of + self.u1transform().""" + x = real(zeta) + y = imag(zeta) + z = x*self.radius.real + y*self.radius.imag + return self.rot_matrix*z + self.center + + def length(self, t0=0, t1=1, error=LENGTH_ERROR, min_depth=LENGTH_MIN_DEPTH): + """The length of an elliptical large_arc segment requires numerical + integration, and in that case it's simpler to just do a geometric + approximation, as for cubic bezier curves.""" + assert 0 <= t0 <= 1 and 0 <= t1 <= 1 + if _quad_available: + return quad(lambda tau: abs(self.derivative(tau)), t0, t1, + epsabs=error, limit=1000)[0] + else: + return segment_length(self, t0, t1, self.point(t0), self.point(t1), + error, min_depth, 0) + + def ilength(self, s, s_tol=ILENGTH_S_TOL, maxits=ILENGTH_MAXITS, + error=ILENGTH_ERROR, min_depth=ILENGTH_MIN_DEPTH): + """Returns a float, t, such that self.length(0, t) is approximately s. + See the inv_arclength() docstring for more details.""" + return inv_arclength(self, s, s_tol=s_tol, maxits=maxits, error=error, + min_depth=min_depth) + + def joins_smoothly_with(self, previous, wrt_parameterization=False, + error=0): + """Checks if this segment joins smoothly with previous segment. By + default, this only checks that this segment starts moving (at t=0) in + the same direction (and from the same positive) as previous stopped + moving (at t=1). To check if the tangent magnitudes also match, set + wrt_parameterization=True.""" + if wrt_parameterization: + return self.start == previous.end and abs( + self.derivative(0) - previous.derivative(1)) <= error + else: + return self.start == previous.end and abs( + self.unit_tangent(0) - previous.unit_tangent(1)) <= error + + def derivative(self, t, n=1): + """returns the nth derivative of the segment at t.""" + angle = radians(self.theta + t*self.delta) + phi = radians(self.rotation) + rx = self.radius.real + ry = self.radius.imag + k = (self.delta*2*pi/360)**n # ((d/dt)angle)**n + + if n % 4 == 0 and n > 0: + return rx*cos(phi)*cos(angle) - ry*sin(phi)*sin(angle) + 1j*( + rx*sin(phi)*cos(angle) + ry*cos(phi)*sin(angle)) + elif n % 4 == 1: + return k*(-rx*cos(phi)*sin(angle) - ry*sin(phi)*cos(angle) + 1j*( + -rx*sin(phi)*sin(angle) + ry*cos(phi)*cos(angle))) + elif n % 4 == 2: + return k*(-rx*cos(phi)*cos(angle) + ry*sin(phi)*sin(angle) + 1j*( + -rx*sin(phi)*cos(angle) - ry*cos(phi)*sin(angle))) + elif n % 4 == 3: + return k*(rx*cos(phi)*sin(angle) + ry*sin(phi)*cos(angle) + 1j*( + rx*sin(phi)*sin(angle) - ry*cos(phi)*cos(angle))) + else: + raise ValueError("n should be a positive integer.") + + def unit_tangent(self, t): + """returns the unit tangent vector of the segment at t (centered at + the origin and expressed as a complex number).""" + dseg = self.derivative(t) + return dseg/abs(dseg) + + def normal(self, t): + """returns the (right hand rule) unit normal vector to self at t.""" + return -1j*self.unit_tangent(t) + + def curvature(self, t): + """returns the curvature of the segment at t.""" + return segment_curvature(self, t) + + # def icurvature(self, kappa): + # """returns a list of t-values such that 0 <= t<= 1 and + # seg.curvature(t) = kappa.""" + # + # a, b = self.radius.real, self.radius.imag + # if kappa > min(a, b)/max(a, b)**2 or kappa <= 0: + # return [] + # if a==b: + # if kappa != 1/a: + # return [] + # else: + # raise ValueError( + # "The .icurvature() method for Arc elements with " + # "radius.real == radius.imag (i.e. circle segments) " + # "will raise this exception when kappa is 1/radius.real as " + # "this is true at every point on the circle segment.") + # + # # kappa = a*b / (a^2sin^2(tau) + b^2cos^2(tau))^(3/2), tau=2*pi*phase + # sin2 = np.poly1d([1, 0]) + # p = kappa**2*(a*sin2 + b*(1 - sin2))**3 - a*b + # sin2s = polyroots01(p) + # taus = [] + # + # for sin2 in sin2s: + # taus += [np.arcsin(sqrt(sin2)), np.arcsin(-sqrt(sin2))] + # + # # account for the other branch of arcsin + # sgn = lambda x: x/abs(x) if x else 0 + # other_taus = [sgn(tau)*np.pi - tau for tau in taus if abs(tau) != np.pi/2] + # taus = taus + other_taus + # + # # get rid of points not included in segment + # ts = [phase2t(tau) for tau in taus] + # + # return [t for t in ts if 0<=t<=1] + + + def reversed(self): + """returns a copy of the Arc object with its orientation reversed.""" + return Arc(self.end, self.radius, self.rotation, self.large_arc, + not self.sweep, self.start) + + def phase2t(self, psi): + """Given phase -pi < psi <= pi, + returns the t value such that + exp(1j*psi) = self.u1transform(self.point(t)). + """ + def _deg(rads, domain_lower_limit): + # Convert rads to degrees in [0, 360) domain + degs = degrees(rads % (2*pi)) + + # Convert to [domain_lower_limit, domain_lower_limit + 360) domain + k = domain_lower_limit // 360 + degs += k * 360 + if degs < domain_lower_limit: + degs += 360 + return degs + + if self.delta > 0: + degs = _deg(psi, domain_lower_limit=self.theta) + else: + degs = _deg(psi, domain_lower_limit=self.theta) + return (degs - self.theta)/self.delta + + + def intersect(self, other_seg, tol=1e-12): + """NOT FULLY IMPLEMENTED. Finds the intersections of two segments. + returns a list of tuples (t1, t2) such that + self.point(t1) == other_seg.point(t2). + Note: This will fail if the two segments coincide for more than a + finite collection of points.""" + + if is_bezier_segment(other_seg): + u1poly = self.u1transform(other_seg.poly()) + u1poly_mag2 = real(u1poly)**2 + imag(u1poly)**2 + t2s = polyroots01(u1poly_mag2 - 1) + t1s = [self.phase2t(phase(u1poly(t2))) for t2 in t2s] + return zip(t1s, t2s) + elif isinstance(other_seg, Arc): + # This could be made explicit to increase efficiency + longer_length = max(self.length(), other_seg.length()) + inters = bezier_intersections(self, other_seg, + longer_length=longer_length, + tol=tol, tol_deC=tol) + + # ad hoc fix for redundant solutions + if len(inters) > 2: + def keyfcn(tpair): + t1, t2 = tpair + return abs(self.point(t1) - other_seg.point(t2)) + inters.sort(key=keyfcn) + for idx in range(1, len(inters)-1): + if (abs(inters[idx][0] - inters[idx + 1][0]) + < abs(inters[idx][0] - inters[0][0])): + return [inters[0], inters[idx]] + else: + return [inters[0], inters[-1]] + return inters + else: + raise TypeError("other_seg should be a Arc, Line, " + "QuadraticBezier, or CubicBezier object.") + + def bbox(self): + """returns a bounding box for the segment in the form + (xmin, xmax, ymin, ymax).""" + # a(t) = radians(self.theta + self.delta*t) + # = (2*pi/360)*(self.theta + self.delta*t) + # x'=0: ~~~~~~~~~ + # -rx*cos(phi)*sin(a(t)) = ry*sin(phi)*cos(a(t)) + # -(rx/ry)*cot(phi)*tan(a(t)) = 1 + # a(t) = arctan(-(ry/rx)tan(phi)) + pi*k === atan_x + # y'=0: ~~~~~~~~~~ + # rx*sin(phi)*sin(a(t)) = ry*cos(phi)*cos(a(t)) + # (rx/ry)*tan(phi)*tan(a(t)) = 1 + # a(t) = arctan((ry/rx)*cot(phi)) + # atanres = arctan((ry/rx)*cot(phi)) === atan_y + # ~~~~~~~~ + # (2*pi/360)*(self.theta + self.delta*t) = atanres + pi*k + # Therfore, for both x' and y', we have... + # t = ((atan_{x/y} + pi*k)*(360/(2*pi)) - self.theta)/self.delta + # for all k s.t. 0 < t < 1 + from math import atan, tan + + if cos(self.phi) == 0: + atan_x = pi/2 + atan_y = 0 + elif sin(self.phi) == 0: + atan_x = 0 + atan_y = pi/2 + else: + rx, ry = self.radius.real, self.radius.imag + atan_x = atan(-(ry/rx)*tan(self.phi)) + atan_y = atan((ry/rx)/tan(self.phi)) + + def angle_inv(ang, k): # inverse of angle from Arc.derivative() + return ((ang + pi*k)*(360/(2*pi)) - self.theta)/self.delta + + xtrema = [self.start.real, self.end.real] + ytrema = [self.start.imag, self.end.imag] + + for k in range(-4, 5): + tx = angle_inv(atan_x, k) + ty = angle_inv(atan_y, k) + if 0 <= tx <= 1: + xtrema.append(self.point(tx).real) + if 0 <= ty <= 1: + ytrema.append(self.point(ty).imag) + xmin = max(xtrema) + return min(xtrema), max(xtrema), min(ytrema), max(ytrema) + + + def split(self, t): + """returns two segments, whose union is this segment and which join + at self.point(t).""" + return self.cropped(0, t), self.cropped(t, 1) + + def cropped(self, t0, t1): + """returns a cropped copy of this segment which starts at + self.point(t0) and ends at self.point(t1).""" + if abs(self.delta*(t1 - t0)) <= 180: + new_large_arc = 0 + else: + new_large_arc = 1 + return Arc(self.point(t0), radius=self.radius, rotation=self.rotation, + large_arc=new_large_arc, sweep=self.sweep, + end=self.point(t1), autoscale_radius=self.autoscale_radius) + + def radialrange(self, origin, return_all_global_extrema=False): + """returns the tuples (d_min, t_min) and (d_max, t_max) which minimize + and maximize, respectively, the distance, + d = |self.point(t)-origin|.""" + + u1orig = self.u1transform(origin) + if abs(u1orig) == 1: # origin lies on ellipse + t = self.phase2t(phase(u1orig)) + d_min = 0 + + # Transform to a coordinate system where the ellipse is centered + # at the origin and its axes are horizontal/vertical + zeta0 = self.centeriso(origin) + a, b = self.radius.real, self.radius.imag + x0, y0 = zeta0.real, zeta0.imag + + # Find t s.t. z'(t) + a2mb2 = (a**2 - b**2) + if u1orig.imag: # x != x0 + + coeffs = [a2mb2**2, + 2*a2mb2*b**2*y0, + (-a**4 + (2*a**2 - b**2 + y0**2)*b**2 + x0**2)*b**2, + -2*a2mb2*b**4*y0, + -b**6*y0**2] + ys = polyroots(coeffs, realroots=True, + condition=lambda r: -b <= r <= b) + xs = (a*sqrt(1 - y**2/b**2) for y in ys) + + + + ts = [self.phase2t(phase(self.u1transform(self.icenteriso( + complex(x, y))))) for x, y in zip(xs, ys)] + + else: # This case is very similar, see notes and assume instead y0!=y + b2ma2 = (b**2 - a**2) + coeffs = [b2ma2**2, + 2*b2ma2*a**2*x0, + (-b**4 + (2*b**2 - a**2 + x0**2)*a**2 + y0**2)*a**2, + -2*b2ma2*a**4*x0, + -a**6*x0**2] + xs = polyroots(coeffs, realroots=True, + condition=lambda r: -a <= r <= a) + ys = (b*sqrt(1 - x**2/a**2) for x in xs) + + ts = [self.phase2t(phase(self.u1transform(self.icenteriso( + complex(x, y))))) for x, y in zip(xs, ys)] + + raise _NotImplemented4ArcException + + def rotated(self, degs, origin=None): + """Returns a copy of self rotated by `degs` degrees (CCW) around the + point `origin` (a complex number). By default `origin` is either + `self.point(0.5)`, or in the case that self is an Arc object, + `origin` defaults to `self.center`.""" + return rotate(self, degs, origin=origin) + + def translated(self, z0): + """Returns a copy of self shifted by the complex quantity `z0` such + that self.translated(z0).point(t) = self.point(t) + z0 for any t.""" + return translate(self, z0) + + +def is_bezier_segment(x): + return (isinstance(x, Line) or + isinstance(x, QuadraticBezier) or + isinstance(x, CubicBezier)) + + +def is_path_segment(x): + return is_bezier_segment(x) or isinstance(x, Arc) + + +class Path(MutableSequence): + """A Path is a sequence of path segments""" + + # Put it here, so there is a default if unpickled. + _closed = False + _start = None + _end = None + + def __init__(self, *segments, **kw): + self._segments = list(segments) + self._length = None + self._lengths = None + if 'closed' in kw: + self.closed = kw['closed'] # DEPRECATED + if self._segments: + self._start = self._segments[0].start + self._end = self._segments[-1].end + else: + self._start = None + self._end = None + + def __getitem__(self, index): + return self._segments[index] + + def __setitem__(self, index, value): + self._segments[index] = value + self._length = None + self._start = self._segments[0].start + self._end = self._segments[-1].end + + def __delitem__(self, index): + del self._segments[index] + self._length = None + self._start = self._segments[0].start + self._end = self._segments[-1].end + + def __iter__(self): + return self._segments.__iter__() + + def __contains__(self, x): + return self._segments.__contains__(x) + + def insert(self, index, value): + self._segments.insert(index, value) + self._length = None + self._start = self._segments[0].start + self._end = self._segments[-1].end + + def reversed(self): + """returns a copy of the Path object with its orientation reversed.""" + newpath = [seg.reversed() for seg in self] + newpath.reverse() + return Path(*newpath) + + def __len__(self): + return len(self._segments) + + def __repr__(self): + return "Path({})".format( + ",\n ".join(repr(x) for x in self._segments)) + + def __eq__(self, other): + if not isinstance(other, Path): + return NotImplemented + if len(self) != len(other): + return False + for s, o in zip(self._segments, other._segments): + if not s == o: + return False + return True + + def __ne__(self, other): + if not isinstance(other, Path): + return NotImplemented + return not self == other + + def _calc_lengths(self, error=LENGTH_ERROR, min_depth=LENGTH_MIN_DEPTH): + if self._length is not None: + return + + lengths = [each.length(error=error, min_depth=min_depth) for each in + self._segments] + self._length = sum(lengths) + self._lengths = [each/self._length for each in lengths] + + def point(self, pos): + + # Shortcuts + if pos == 0.0: + return self._segments[0].point(pos) + if pos == 1.0: + return self._segments[-1].point(pos) + + self._calc_lengths() + # Find which segment the point we search for is located on: + segment_start = 0 + for index, segment in enumerate(self._segments): + segment_end = segment_start + self._lengths[index] + if segment_end >= pos: + # This is the segment! How far in on the segment is the point? + segment_pos = (pos - segment_start)/( + segment_end - segment_start) + return segment.point(segment_pos) + segment_start = segment_end + + def length(self, T0=0, T1=1, error=LENGTH_ERROR, min_depth=LENGTH_MIN_DEPTH): + self._calc_lengths(error=error, min_depth=min_depth) + if T0 == 0 and T1 == 1: + return self._length + else: + if len(self) == 1: + return self[0].length(t0=T0, t1=T1) + idx0, t0 = self.T2t(T0) + idx1, t1 = self.T2t(T1) + if idx0 == idx1: + return self[idx0].length(t0=t0, t1=t1) + return (self[idx0].length(t0=t0) + + sum(self[idx].length() for idx in range(idx0 + 1, idx1)) + + self[idx1].length(t1=t1)) + + def ilength(self, s, s_tol=ILENGTH_S_TOL, maxits=ILENGTH_MAXITS, + error=ILENGTH_ERROR, min_depth=ILENGTH_MIN_DEPTH): + """Returns a float, t, such that self.length(0, t) is approximately s. + See the inv_arclength() docstring for more details.""" + return inv_arclength(self, s, s_tol=s_tol, maxits=maxits, error=error, + min_depth=min_depth) + + def iscontinuous(self): + """Checks if a path is continuous with respect to its + parameterization.""" + return all(self[i].end == self[i+1].start for i in range(len(self) - 1)) + + def continuous_subpaths(self): + """Breaks self into its continuous components, returning a list of + continuous subpaths. + I.e. + (all(subpath.iscontinuous() for subpath in self.continuous_subpaths()) + and self == concatpaths(self.continuous_subpaths())) + ) + """ + subpaths = [] + subpath_start = 0 + for i in range(len(self) - 1): + if self[i].end != self[(i+1) % len(self)].start: + subpaths.append(Path(*self[subpath_start: i+1])) + subpath_start = i+1 + subpaths.append(Path(*self[subpath_start: len(self)])) + return subpaths + + def isclosed(self): + """This function determines if a connected path is closed.""" + assert len(self) != 0 + assert self.iscontinuous() + return self.start == self.end + + def isclosedac(self): + assert len(self) != 0 + return self.start == self.end + + def _is_closable(self): + end = self[-1].end + for segment in self: + if segment.start == end: + return True + return False + + @property + def closed(self, warning_on=CLOSED_WARNING_ON): + """The closed attribute is deprecated, please use the isclosed() + method instead. See _closed_warning for more information.""" + mes = ("This attribute is deprecated, consider using isclosed() " + "method instead.\n\nThis attribute is kept for compatibility " + "with scripts created using svg.path (v2.0). You can prevent " + "this warning in the future by setting " + "CLOSED_WARNING_ON=False.") + if warning_on: + warn(mes) + return self._closed and self._is_closable() + + @closed.setter + def closed(self, value): + value = bool(value) + if value and not self._is_closable(): + raise ValueError("End does not coincide with a segment start.") + self._closed = value + + @property + def start(self): + if not self._start: + self._start = self._segments[0].start + return self._start + + @start.setter + def start(self, pt): + self._start = pt + self._segments[0].start = pt + + @property + def end(self): + if not self._end: + self._end = self._segments[-1].end + return self._end + + @end.setter + def end(self, pt): + self._end = pt + self._segments[-1].end = pt + + def d(self, useSandT=False, use_closed_attrib=False): + """Returns a path d-string for the path object. + For an explanation of useSandT and use_closed_attrib, see the + compatibility notes in the README.""" + + if use_closed_attrib: + self_closed = self.closed(warning_on=False) + if self_closed: + segments = self[:-1] + else: + segments = self[:] + else: + self_closed = False + segments = self[:] + + current_pos = None + parts = [] + previous_segment = None + end = self[-1].end + + for segment in segments: + seg_start = segment.start + # If the start of this segment does not coincide with the end of + # the last segment or if this segment is actually the close point + # of a closed path, then we should start a new subpath here. + if current_pos != seg_start or \ + (self_closed and seg_start == end and use_closed_attrib): + parts.append('M {},{}'.format(seg_start.real, seg_start.imag)) + + if isinstance(segment, Line): + args = segment.end.real, segment.end.imag + parts.append('L {},{}'.format(*args)) + elif isinstance(segment, CubicBezier): + if useSandT and segment.is_smooth_from(previous_segment, + warning_on=False): + args = (segment.control2.real, segment.control2.imag, + segment.end.real, segment.end.imag) + parts.append('S {},{} {},{}'.format(*args)) + else: + args = (segment.control1.real, segment.control1.imag, + segment.control2.real, segment.control2.imag, + segment.end.real, segment.end.imag) + parts.append('C {},{} {},{} {},{}'.format(*args)) + elif isinstance(segment, QuadraticBezier): + if useSandT and segment.is_smooth_from(previous_segment, + warning_on=False): + args = segment.end.real, segment.end.imag + parts.append('T {},{}'.format(*args)) + else: + args = (segment.control.real, segment.control.imag, + segment.end.real, segment.end.imag) + parts.append('Q {},{} {},{}'.format(*args)) + + elif isinstance(segment, Arc): + args = (segment.radius.real, segment.radius.imag, + segment.rotation,int(segment.large_arc), + int(segment.sweep),segment.end.real, segment.end.imag) + parts.append('A {},{} {} {:d},{:d} {},{}'.format(*args)) + current_pos = segment.end + previous_segment = segment + + if self_closed: + parts.append('Z') + + return ' '.join(parts) + + def joins_smoothly_with(self, previous, wrt_parameterization=False): + """Checks if this Path object joins smoothly with previous + path/segment. By default, this only checks that this Path starts + moving (at t=0) in the same direction (and from the same positive) as + previous stopped moving (at t=1). To check if the tangent magnitudes + also match, set wrt_parameterization=True.""" + if wrt_parameterization: + return self[0].start == previous.end and self.derivative( + 0) == previous.derivative(1) + else: + return self[0].start == previous.end and self.unit_tangent( + 0) == previous.unit_tangent(1) + + def T2t(self, T): + """returns the segment index, seg_idx, and segment parameter, t, + corresponding to the path parameter T. In other words, this is the + inverse of the Path.t2T() method.""" + if T == 1: + return len(self)-1, 1 + if T == 0: + return 0, 0 + self._calc_lengths() + # Find which segment self.point(T) falls on: + T0 = 0 # the T-value the current segment starts on + for seg_idx, seg_length in enumerate(self._lengths): + T1 = T0 + seg_length # the T-value the current segment ends on + if T1 >= T: + # This is the segment! + t = (T - T0)/seg_length + return seg_idx, t + T0 = T1 + + assert 0 <= T <= 1 + raise BugException + + def t2T(self, seg, t): + """returns the path parameter T which corresponds to the segment + parameter t. In other words, for any Path object, path, and any + segment in path, seg, T(t) = path.t2T(seg, t) is the unique + reparameterization such that path.point(T(t)) == seg.point(t) for all + 0 <= t <= 1. + Input Note: seg can be a segment in the Path object or its + corresponding index.""" + self._calc_lengths() + # Accept an index or a segment for seg + if isinstance(seg, int): + seg_idx = seg + else: + try: + seg_idx = self.index(seg) + except ValueError: + assert is_path_segment(seg) or isinstance(seg, int) + raise + + segment_start = sum(self._lengths[:seg_idx]) + segment_end = segment_start + self._lengths[seg_idx] + T = (segment_end - segment_start)*t + segment_start + return T + + def derivative(self, T, n=1): + """returns the tangent vector of the Path at T (centered at the origin + and expressed as a complex number). + Note: Bezier curves can have points where their derivative vanishes. + If you are interested in the tangent direction, use unit_tangent() + method instead.""" + seg_idx, t = self.T2t(T) + seg = self._segments[seg_idx] + return seg.derivative(t, n=n)/seg.length()**n + + def unit_tangent(self, T): + """returns the unit tangent vector of the Path at T (centered at the + origin and expressed as a complex number). If the tangent vector's + magnitude is zero, this method will find the limit of + self.derivative(tau)/abs(self.derivative(tau)) as tau approaches T.""" + seg_idx, t = self.T2t(T) + return self._segments[seg_idx].unit_tangent(t) + + def normal(self, t): + """returns the (right hand rule) unit normal vector to self at t.""" + return -1j*self.unit_tangent(t) + + def curvature(self, T): + """returns the curvature of this Path object at T and outputs + float('inf') if not differentiable at T.""" + seg_idx, t = self.T2t(T) + seg = self[seg_idx] + if np.isclose(t, 0) and (seg_idx != 0 or self.end==self.start): + previous_seg_in_path = self._segments[ + (seg_idx - 1) % len(self._segments)] + if not seg.joins_smoothl_with(previous_seg_in_path): + return float('inf') + elif np.isclose(t, 1) and (seg_idx != len(self) - 1 or self.end==self.start): + next_seg_in_path = self._segments[ + (seg_idx + 1) % len(self._segments)] + if not next_seg_in_path.joins_smoothly_with(seg): + return float('inf') + dz = self.derivative(t) + ddz = self.derivative(t, n=2) + dx, dy = dz.real, dz.imag + ddx, ddy = ddz.real, ddz.imag + return abs(dx*ddy - dy*ddx)/(dx*dx + dy*dy)**1.5 + + # def icurvature(self, kappa): + # """returns a list of T-values such that 0 <= T <= 1 and + # seg.curvature(t) = kappa. + # Note: not implemented for paths containing Arc segments.""" + # assert is_bezier_path(self) + # Ts = [] + # for i, seg in enumerate(self): + # Ts += [self.t2T(i, t) for t in seg.icurvature(kappa)] + # return Ts + + def area(self): + """returns the area enclosed by this Path object. + Note: negative area results from CW (as opposed to CCW) + parameterization of the Path object.""" + assert self.isclosed() + area_enclosed = 0 + for seg in self: + x = real(seg.poly()) + dy = imag(seg.poly()).deriv() + integrand = x*dy + integral = integrand.integ() + area_enclosed += integral(1) - integral(0) + return area_enclosed + + def intersect(self, other_curve, justonemode=False, tol=1e-12): + """returns list of pairs of pairs ((T1, seg1, t1), (T2, seg2, t2)) + giving the intersection points. + If justonemode==True, then returns just the first + intersection found. + tol is used to check for redundant intersections (see comment above + the code block where tol is used). + Note: If the two path objects coincide for more than a finite set of + points, this code will fail.""" + path1 = self + if isinstance(other_curve, Path): + path2 = other_curve + else: + path2 = Path(other_curve) + assert path1 != path2 + intersection_list = [] + for seg1 in path1: + for seg2 in path2: + if justonemode and intersection_list: + return intersection_list[0] + for t1, t2 in seg1.intersect(seg2, tol=tol): + T1 = path1.t2T(seg1, t1) + T2 = path2.t2T(seg2, t2) + intersection_list.append(((T1, seg1, t1), (T2, seg2, t2))) + if justonemode and intersection_list: + return intersection_list[0] + + # Note: If the intersection takes place at a joint (point one seg ends + # and next begins in path) then intersection_list may contain a + # redundant intersection. This code block checks for and removes said + # redundancies. + if intersection_list: + pts = [seg1.point(_t1) for _T1, _seg1, _t1 in list(zip(*intersection_list))[0]] + indices2remove = [] + for ind1 in range(len(pts)): + for ind2 in range(ind1 + 1, len(pts)): + if abs(pts[ind1] - pts[ind2]) < tol: + # then there's a redundancy. Remove it. + indices2remove.append(ind2) + intersection_list = [inter for ind, inter in + enumerate(intersection_list) if + ind not in indices2remove] + return intersection_list + + def bbox(self): + """returns a bounding box for the input Path object in the form + (xmin, xmax, ymin, ymax).""" + bbs = [seg.bbox() for seg in self._segments] + xmins, xmaxs, ymins, ymaxs = zip(*bbs) + xmin = min(xmins) + xmax = max(xmaxs) + ymin = min(ymins) + ymax = max(ymaxs) + return xmin, xmax, ymin, ymax + + def cropped(self, T0, T1): + """returns a cropped copy of the path.""" + assert T0 != T1 + if T1 == 1: + seg1 = self[-1] + t_seg1 = 1 + i1 = len(self) - 1 + else: + seg1_idx, t_seg1 = self.T2t(T1) + seg1 = self[seg1_idx] + if np.isclose(t_seg1, 0): + i1 = (self.index(seg1) - 1) % len(self) + seg1 = self[i1] + t_seg1 = 1 + else: + i1 = self.index(seg1) + if T0 == 0: + seg0 = self[0] + t_seg0 = 0 + i0 = 0 + else: + seg0_idx, t_seg0 = self.T2t(T0) + seg0 = self[seg0_idx] + if np.isclose(t_seg0, 1): + i0 = (self.index(seg0) + 1) % len(self) + seg0 = self[i0] + t_seg0 = 0 + else: + i0 = self.index(seg0) + + if T0 < T1 and i0 == i1: + new_path = Path(seg0.cropped(t_seg0, t_seg1)) + else: + new_path = Path(seg0.cropped(t_seg0, 1)) + + # T1 global_max[0]: + global_max = seg_global_max + (seg_idx,) + return global_min, global_max + + def rotated(self, degs, origin=None): + """Returns a copy of self rotated by `degs` degrees (CCW) around the + point `origin` (a complex number). By default `origin` is either + `self.point(0.5)`, or in the case that self is an Arc object, + `origin` defaults to `self.center`.""" + return rotate(self, degs, origin=origin) + + def translated(self, z0): + """Returns a copy of self shifted by the complex quantity `z0` such + that self.translated(z0).point(t) = self.point(t) + z0 for any t.""" + return translate(self, z0) diff --git a/build/lib/svgpathtools/paths2svg.py b/build/lib/svgpathtools/paths2svg.py new file mode 100644 index 0000000..a4ae48b --- /dev/null +++ b/build/lib/svgpathtools/paths2svg.py @@ -0,0 +1,385 @@ +"""This submodule contains tools for creating svg files from paths and path +segments.""" + +# External dependencies: +from __future__ import division, absolute_import, print_function +from math import ceil +from os import getcwd, path as os_path, makedirs +from xml.dom.minidom import parse as md_xml_parse +from svgwrite import Drawing, text as txt +from time import time +from warnings import warn + +# Internal dependencies +from .path import Path, Line, is_path_segment +from .misctools import open_in_browser + +# Used to convert a string colors (identified by single chars) to a list. +color_dict = {'a': 'aqua', + 'b': 'blue', + 'c': 'cyan', + 'd': 'darkblue', + 'e': '', + 'f': '', + 'g': 'green', + 'h': '', + 'i': '', + 'j': '', + 'k': 'black', + 'l': 'lime', + 'm': 'magenta', + 'n': 'brown', + 'o': 'orange', + 'p': 'pink', + 'q': 'turquoise', + 'r': 'red', + 's': 'salmon', + 't': 'tan', + 'u': 'purple', + 'v': 'violet', + 'w': 'white', + 'x': '', + 'y': 'yellow', + 'z': 'azure'} + + +def str2colorlist(s, default_color=None): + color_list = [color_dict[ch] for ch in s] + if default_color: + for idx, c in enumerate(color_list): + if not c: + color_list[idx] = default_color + return color_list + + +def is3tuple(c): + return isinstance(c, tuple) and len(c) == 3 + + +def big_bounding_box(paths_n_stuff): + """Finds a BB containing a collection of paths, Bezier path segments, and + points (given as complex numbers).""" + bbs = [] + for thing in paths_n_stuff: + if is_path_segment(thing) or isinstance(thing, Path): + bbs.append(thing.bbox()) + elif isinstance(thing, complex): + bbs.append((thing.real, thing.real, thing.imag, thing.imag)) + else: + try: + complexthing = complex(thing) + bbs.append((complexthing.real, complexthing.real, + complexthing.imag, complexthing.imag)) + except ValueError: + raise TypeError( + "paths_n_stuff can only contains Path, CubicBezier, " + "QuadraticBezier, Line, and complex objects.") + xmins, xmaxs, ymins, ymaxs = zip(*bbs) + xmin = min(xmins) + xmax = max(xmaxs) + ymin = min(ymins) + ymax = max(ymaxs) + return xmin, xmax, ymin, ymax + + +def disvg(paths=None, colors=None, + filename=os_path.join(getcwd(), 'disvg_output.svg'), + stroke_widths=None, nodes=None, node_colors=None, node_radii=None, + openinbrowser=True, timestamp=False, + margin_size=0.1, mindim=600, dimensions=None, + viewbox=None, text=None, text_path=None, font_size=None, + attributes=None, svg_attributes=None): + """Takes in a list of paths and creates an SVG file containing said paths. + REQUIRED INPUTS: + :param paths - a list of paths + + OPTIONAL INPUT: + :param colors - specifies the path stroke color. By default all paths + will be black (#000000). This paramater can be input in a few ways + 1) a list of strings that will be input into the path elements stroke + attribute (so anything that is understood by the svg viewer). + 2) a string of single character colors -- e.g. setting colors='rrr' is + equivalent to setting colors=['red', 'red', 'red'] (see the + 'color_dict' dictionary above for a list of possibilities). + 3) a list of rgb 3-tuples -- e.g. colors = [(255, 0, 0), ...]. + + :param filename - the desired location/filename of the SVG file + created (by default the SVG will be stored in the current working + directory and named 'disvg_output.svg'). + + :param stroke_widths - a list of stroke_widths to use for paths + (default is 0.5% of the SVG's width or length) + + :param nodes - a list of points to draw as filled-in circles + + :param node_colors - a list of colors to use for the nodes (by default + nodes will be red) + + :param node_radii - a list of radii to use for the nodes (by default + nodes will be radius will be 1 percent of the svg's width/length) + + :param text - string or list of strings to be displayed + + :param text_path - if text is a list, then this should be a list of + path (or path segments of the same length. Note: the path must be + long enough to display the text or the text will be cropped by the svg + viewer. + + :param font_size - a single float of list of floats. + + :param openinbrowser - Set to True to automatically open the created + SVG in the user's default web browser. + + :param timestamp - if True, then the a timestamp will be appended to + the output SVG's filename. This will fix issues with rapidly opening + multiple SVGs in your browser. + + :param margin_size - The min margin (empty area framing the collection + of paths) size used for creating the canvas and background of the SVG. + + :param mindim - The minimum dimension (height or width) of the output + SVG (default is 600). + + :param dimensions - The display dimensions of the output SVG. Using + this will override the mindim parameter. + + :param viewbox - This specifies what rectangular patch of R^2 will be + viewable through the outputSVG. It should be input in the form + (min_x, min_y, width, height). This is different from the display + dimension of the svg, which can be set through mindim or dimensions. + + :param attributes - a list of dictionaries of attributes for the input + paths. Note: This will override any other conflicting settings. + + :param svg_attributes - a dictionary of attributes for output svg. + Note: This will override any other conflicting settings. + + NOTES: + -The unit of length here is assumed to be pixels in all variables. + + -If this function is used multiple times in quick succession to + display multiple SVGs (all using the default filename), the + svgviewer/browser will likely fail to load some of the SVGs in time. + To fix this, use the timestamp attribute, or give the files unique + names, or use a pause command (e.g. time.sleep(1)) between uses. + """ + + _default_relative_node_radius = 5e-3 + _default_relative_stroke_width = 1e-3 + _default_path_color = '#000000' # black + _default_node_color = '#ff0000' # red + _default_font_size = 12 + + # append directory to filename (if not included) + if os_path.dirname(filename) == '': + filename = os_path.join(getcwd(), filename) + + # append time stamp to filename + if timestamp: + fbname, fext = os_path.splitext(filename) + dirname = os_path.dirname(filename) + tstamp = str(time()).replace('.', '') + stfilename = os_path.split(fbname)[1] + '_' + tstamp + fext + filename = os_path.join(dirname, stfilename) + + # check paths and colors are set + if isinstance(paths, Path) or is_path_segment(paths): + paths = [paths] + if paths: + if not colors: + colors = [_default_path_color] * len(paths) + else: + assert len(colors) == len(paths) + if isinstance(colors, str): + colors = str2colorlist(colors, + default_color=_default_path_color) + elif isinstance(colors, list): + for idx, c in enumerate(colors): + if is3tuple(c): + colors[idx] = "rgb" + str(c) + + # check nodes and nodes_colors are set (node_radii are set later) + if nodes: + if not node_colors: + node_colors = [_default_node_color] * len(nodes) + else: + assert len(node_colors) == len(nodes) + if isinstance(node_colors, str): + node_colors = str2colorlist(node_colors, + default_color=_default_node_color) + elif isinstance(node_colors, list): + for idx, c in enumerate(node_colors): + if is3tuple(c): + node_colors[idx] = "rgb" + str(c) + + # set up the viewBox and display dimensions of the output SVG + # along the way, set stroke_widths and node_radii if not provided + assert paths or nodes + stuff2bound = [] + if viewbox: + szx, szy = viewbox[2:4] + else: + if paths: + stuff2bound += paths + if nodes: + stuff2bound += nodes + if text_path: + stuff2bound += text_path + xmin, xmax, ymin, ymax = big_bounding_box(stuff2bound) + dx = xmax - xmin + dy = ymax - ymin + + if dx == 0: + dx = 1 + if dy == 0: + dy = 1 + + # determine stroke_widths to use (if not provided) and max_stroke_width + if paths: + if not stroke_widths: + sw = max(dx, dy) * _default_relative_stroke_width + stroke_widths = [sw]*len(paths) + max_stroke_width = sw + else: + assert len(paths) == len(stroke_widths) + max_stroke_width = max(stroke_widths) + else: + max_stroke_width = 0 + + # determine node_radii to use (if not provided) and max_node_diameter + if nodes: + if not node_radii: + r = max(dx, dy) * _default_relative_node_radius + node_radii = [r]*len(nodes) + max_node_diameter = 2*r + else: + assert len(nodes) == len(node_radii) + max_node_diameter = 2*max(node_radii) + else: + max_node_diameter = 0 + + extra_space_for_style = max(max_stroke_width, max_node_diameter) + xmin -= margin_size*dx + extra_space_for_style/2 + ymin -= margin_size*dy + extra_space_for_style/2 + dx += 2*margin_size*dx + extra_space_for_style + dy += 2*margin_size*dy + extra_space_for_style + viewbox = "%s %s %s %s" % (xmin, ymin, dx, dy) + if dimensions: + szx, szy = dimensions + else: + if dx > dy: + szx = str(mindim) + 'px' + szy = str(int(ceil(mindim * dy / dx))) + 'px' + else: + szx = str(int(ceil(mindim * dx / dy))) + 'px' + szy = str(mindim) + 'px' + + # Create an SVG file + if svg_attributes: + dwg = Drawing(filename=filename, **svg_attributes) + else: + dwg = Drawing(filename=filename, size=(szx, szy), viewBox=viewbox) + + # add paths + if paths: + for i, p in enumerate(paths): + if isinstance(p, Path): + ps = p.d() + elif is_path_segment(p): + ps = Path(p).d() + else: # assume this path, p, was input as a Path d-string + ps = p + + if attributes: + good_attribs = {'d': ps} + for key in attributes[i]: + val = attributes[i][key] + if key != 'd': + try: + dwg.path(ps, **{key: val}) + good_attribs.update({key: val}) + except Exception as e: + warn(str(e)) + + dwg.add(dwg.path(**good_attribs)) + else: + dwg.add(dwg.path(ps, stroke=colors[i], + stroke_width=str(stroke_widths[i]), + fill='none')) + + # add nodes (filled in circles) + if nodes: + for i_pt, pt in enumerate([(z.real, z.imag) for z in nodes]): + dwg.add(dwg.circle(pt, node_radii[i_pt], fill=node_colors[i_pt])) + + # add texts + if text: + assert isinstance(text, str) or (isinstance(text, list) and + isinstance(text_path, list) and + len(text_path) == len(text)) + if isinstance(text, str): + text = [text] + if not font_size: + font_size = [_default_font_size] + if not text_path: + pos = complex(xmin + margin_size*dx, ymin + margin_size*dy) + text_path = [Line(pos, pos + 1).d()] + else: + if font_size: + if isinstance(font_size, list): + assert len(font_size) == len(text) + else: + font_size = [font_size] * len(text) + else: + font_size = [_default_font_size] * len(text) + for idx, s in enumerate(text): + p = text_path[idx] + if isinstance(p, Path): + ps = p.d() + elif is_path_segment(p): + ps = Path(p).d() + else: # assume this path, p, was input as a Path d-string + ps = p + + # paragraph = dwg.add(dwg.g(font_size=font_size[idx])) + # paragraph.add(dwg.textPath(ps, s)) + pathid = 'tp' + str(idx) + dwg.defs.add(dwg.path(d=ps, id=pathid)) + txter = dwg.add(dwg.text('', font_size=font_size[idx])) + txter.add(txt.TextPath('#'+pathid, s)) + + # save svg + if not os_path.exists(os_path.dirname(filename)): + makedirs(os_path.dirname(filename)) + dwg.save() + + # re-open the svg, make the xml pretty, and save it again + xmlstring = md_xml_parse(filename).toprettyxml() + with open(filename, 'w') as f: + f.write(xmlstring) + + # try to open in web browser + if openinbrowser: + try: + open_in_browser(filename) + except: + print("Failed to open output SVG in browser. SVG saved to:") + print(filename) + + +def wsvg(paths=None, colors=None, + filename=os_path.join(getcwd(), 'disvg_output.svg'), + stroke_widths=None, nodes=None, node_colors=None, node_radii=None, + openinbrowser=False, timestamp=False, + margin_size=0.1, mindim=600, dimensions=None, + viewbox=None, text=None, text_path=None, font_size=None, + attributes=None, svg_attributes=None): + """Convenience function; identical to disvg() except that + openinbrowser=False by default. See disvg() docstring for more info.""" + disvg(paths, colors=colors, filename=filename, + stroke_widths=stroke_widths, nodes=nodes, + node_colors=node_colors, node_radii=node_radii, + openinbrowser=openinbrowser, timestamp=timestamp, + margin_size=margin_size, mindim=mindim, dimensions=dimensions, + viewbox=viewbox, text=text, text_path=text_path, font_size=font_size, + attributes=attributes, svg_attributes=svg_attributes) diff --git a/build/lib/svgpathtools/pathtools.py b/build/lib/svgpathtools/pathtools.py new file mode 100644 index 0000000..2e78452 --- /dev/null +++ b/build/lib/svgpathtools/pathtools.py @@ -0,0 +1,14 @@ +"""This submodule contains additional tools for working with paths composed of +Line and CubicBezier objects. QuadraticBezier and Arc objects are only +partially supported.""" + +# External dependencies: +from __future__ import division, absolute_import, print_function + +# Internal dependencies +from .path import Path, Line, QuadraticBezier, CubicBezier, Arc + + +# Misc######################################################################### + + diff --git a/build/lib/svgpathtools/polytools.py b/build/lib/svgpathtools/polytools.py new file mode 100644 index 0000000..3fbdc22 --- /dev/null +++ b/build/lib/svgpathtools/polytools.py @@ -0,0 +1,80 @@ +"""This submodule contains tools for working with numpy.poly1d objects.""" + +# External Dependencies +from __future__ import division, absolute_import +from itertools import combinations +import numpy as np + +# Internal Dependencies +from .misctools import isclose + + +def polyroots(p, realroots=False, condition=lambda r: True): + """ + Returns the roots of a polynomial with coefficients given in p. + p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n] + INPUT: + p - Rank-1 array-like object of polynomial coefficients. + realroots - a boolean. If true, only real roots will be returned and the + condition function can be written assuming all roots are real. + condition - a boolean-valued function. Only roots satisfying this will be + returned. If realroots==True, these conditions should assume the roots + are real. + OUTPUT: + A list containing the roots of the polynomial. + NOTE: This uses np.isclose and np.roots""" + roots = np.roots(p) + if realroots: + roots = [r.real for r in roots if isclose(r.imag, 0)] + roots = [r for r in roots if condition(r)] + + duplicates = [] + for idx, (r1, r2) in enumerate(combinations(roots, 2)): + if isclose(r1, r2): + duplicates.append(idx) + return [r for idx, r in enumerate(roots) if idx not in duplicates] + + +def polyroots01(p): + """Returns the real roots between 0 and 1 of the polynomial with + coefficients given in p, + p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n] + p can also be a np.poly1d object. See polyroots for more information.""" + return polyroots(p, realroots=True, condition=lambda tval: 0 <= tval <= 1) + + +def rational_limit(f, g, t0): + """Computes the limit of the rational function (f/g)(t) + as t approaches t0.""" + assert isinstance(f, np.poly1d) and isinstance(g, np.poly1d) + assert g != np.poly1d([0]) + if g(t0) != 0: + return f(t0)/g(t0) + elif f(t0) == 0: + return rational_limit(f.deriv(), g.deriv(), t0) + else: + raise ValueError("Limit does not exist.") + + +def real(z): + try: + return np.poly1d(z.coeffs.real) + except AttributeError: + return z.real + + +def imag(z): + try: + return np.poly1d(z.coeffs.imag) + except AttributeError: + return z.imag + + +def poly_real_part(poly): + """Deprecated.""" + return np.poly1d(poly.coeffs.real) + + +def poly_imag_part(poly): + """Deprecated.""" + return np.poly1d(poly.coeffs.imag) diff --git a/build/lib/svgpathtools/smoothing.py b/build/lib/svgpathtools/smoothing.py new file mode 100644 index 0000000..424ed99 --- /dev/null +++ b/build/lib/svgpathtools/smoothing.py @@ -0,0 +1,201 @@ +"""This submodule contains functions related to smoothing paths of Bezier +curves.""" + +# External Dependencies +from __future__ import division, absolute_import, print_function + +# Internal Dependencies +from .path import Path, CubicBezier, Line +from .misctools import isclose +from .paths2svg import disvg + + +def is_differentiable(path, tol=1e-8): + for idx in range(len(path)): + u = path[(idx-1) % len(path)].unit_tangent(1) + v = path[idx].unit_tangent(0) + u_dot_v = u.real*v.real + u.imag*v.imag + if abs(u_dot_v - 1) > tol: + return False + return True + + +def kinks(path, tol=1e-8): + """returns indices of segments that start on a non-differentiable joint.""" + kink_list = [] + for idx in xrange(len(path)): + if idx == 0 and not path.isclosed(): + continue + try: + u = path[(idx - 1) % len(path)].unit_tangent(1) + v = path[idx].unit_tangent(0) + u_dot_v = u.real*v.real + u.imag*v.imag + flag = False + except ValueError: + flag = True + + if flag or abs(u_dot_v - 1) > tol: + kink_list.append(idx) + return kink_list + + +def _report_unfixable_kinks(_path, _kink_list): + mes = ("\n%s kinks have been detected at that cannot be smoothed.\n" + "To ignore these kinks and fix all others, run this function " + "again with the second argument 'ignore_unfixable_kinks=True' " + "The locations of the unfixable kinks are at the beginnings of " + "segments: %s" % (len(_kink_list), _kink_list)) + disvg(_path, nodes=[_path[idx].start for idx in _kink_list]) + raise Exception(mes) + + +def smoothed_joint(seg0, seg1, maxjointsize=3, tightness=1.99): + """ See Andy's notes on + Smoothing Bezier Paths for an explanation of the method. + Input: two segments seg0, seg1 such that seg0.end==seg1.start, and + jointsize, a positive number + + Output: seg0_trimmed, elbow, seg1_trimmed, where elbow is a cubic bezier + object that smoothly connects seg0_trimmed and seg1_trimmed. + + """ + assert seg0.end == seg1.start + assert 0 < maxjointsize + assert 0 < tightness < 2 +# sgn = lambda x:x/abs(x) + q = seg0.end + + try: v = seg0.unit_tangent(1) + except: v = seg0.unit_tangent(1 - 1e-4) + try: w = seg1.unit_tangent(0) + except: w = seg1.unit_tangent(1e-4) + + max_a = maxjointsize / 2 + a = min(max_a, min(seg1.length(), seg0.length()) / 20) + if isinstance(seg0, Line) and isinstance(seg1, Line): + ''' + Note: Letting + c(t) = elbow.point(t), v= the unit tangent of seg0 at 1, w = the + unit tangent vector of seg1 at 0, + Q = seg0.point(1) = seg1.point(0), and a,b>0 some constants. + The elbow will be the unique CubicBezier, c, such that + c(0)= Q-av, c(1)=Q+aw, c'(0) = bv, and c'(1) = bw + where a and b are derived above/below from tightness and + maxjointsize. + ''' +# det = v.imag*w.real-v.real*w.imag + # Note: + # If det is negative, the curvature of elbow is negative for all + # real t if and only if b/a > 6 + # If det is positive, the curvature of elbow is negative for all + # real t if and only if b/a < 2 + +# if det < 0: +# b = (6+tightness)*a +# elif det > 0: +# b = (2-tightness)*a +# else: +# raise Exception("seg0 and seg1 are parallel lines.") + b = (2 - tightness)*a + elbow = CubicBezier(q - a*v, q - (a - b/3)*v, q + (a - b/3)*w, q + a*w) + seg0_trimmed = Line(seg0.start, elbow.start) + seg1_trimmed = Line(elbow.end, seg1.end) + return seg0_trimmed, [elbow], seg1_trimmed + elif isinstance(seg0, Line): + ''' + Note: Letting + c(t) = elbow.point(t), v= the unit tangent of seg0 at 1, + w = the unit tangent vector of seg1 at 0, + Q = seg0.point(1) = seg1.point(0), and a,b>0 some constants. + The elbow will be the unique CubicBezier, c, such that + c(0)= Q-av, c(1)=Q, c'(0) = bv, and c'(1) = bw + where a and b are derived above/below from tightness and + maxjointsize. + ''' +# det = v.imag*w.real-v.real*w.imag + # Note: If g has the same sign as det, then the curvature of elbow is + # negative for all real t if and only if b/a < 4 + b = (4 - tightness)*a +# g = sgn(det)*b + elbow = CubicBezier(q - a*v, q + (b/3 - a)*v, q - b/3*w, q) + seg0_trimmed = Line(seg0.start, elbow.start) + return seg0_trimmed, [elbow], seg1 + elif isinstance(seg1, Line): + args = (seg1.reversed(), seg0.reversed(), maxjointsize, tightness) + rseg1_trimmed, relbow, rseg0 = smoothed_joint(*args) + elbow = relbow[0].reversed() + return seg0, [elbow], rseg1_trimmed.reversed() + else: + # find a point on each seg that is about a/2 away from joint. Make + # line between them. + t0 = seg0.ilength(seg0.length() - a/2) + t1 = seg1.ilength(a/2) + seg0_trimmed = seg0.cropped(0, t0) + seg1_trimmed = seg1.cropped(t1, 1) + seg0_line = Line(seg0_trimmed.end, q) + seg1_line = Line(q, seg1_trimmed.start) + + args = (seg0_trimmed, seg0_line, maxjointsize, tightness) + dummy, elbow0, seg0_line_trimmed = smoothed_joint(*args) + + args = (seg1_line, seg1_trimmed, maxjointsize, tightness) + seg1_line_trimmed, elbow1, dummy = smoothed_joint(*args) + + args = (seg0_line_trimmed, seg1_line_trimmed, maxjointsize, tightness) + seg0_line_trimmed, elbowq, seg1_line_trimmed = smoothed_joint(*args) + + elbow = elbow0 + [seg0_line_trimmed] + elbowq + [seg1_line_trimmed] + elbow1 + return seg0_trimmed, elbow, seg1_trimmed + + +def smoothed_path(path, maxjointsize=3, tightness=1.99, ignore_unfixable_kinks=False): + """returns a path with no non-differentiable joints.""" + if len(path) == 1: + return path + + assert path.iscontinuous() + + sharp_kinks = [] + new_path = [path[0]] + for idx in range(len(path)): + if idx == len(path)-1: + if not path.isclosed(): + continue + else: + seg1 = new_path[0] + else: + seg1 = path[idx + 1] + seg0 = new_path[-1] + + try: + unit_tangent0 = seg0.unit_tangent(1) + unit_tangent1 = seg1.unit_tangent(0) + flag = False + except ValueError: + flag = True # unit tangent not well-defined + + if not flag and isclose(unit_tangent0, unit_tangent1): # joint is already smooth + if idx != len(path)-1: + new_path.append(seg1) + continue + else: + kink_idx = (idx + 1) % len(path) # kink at start of this seg + if not flag and isclose(-unit_tangent0, unit_tangent1): + # joint is sharp 180 deg (must be fixed manually) + new_path.append(seg1) + sharp_kinks.append(kink_idx) + else: # joint is not smooth, let's smooth it. + args = (seg0, seg1, maxjointsize, tightness) + new_seg0, elbow_segs, new_seg1 = smoothed_joint(*args) + new_path[-1] = new_seg0 + new_path += elbow_segs + if idx == len(path) - 1: + new_path[0] = new_seg1 + else: + new_path.append(new_seg1) + + # If unfixable kinks were found, let the user know + if sharp_kinks and not ignore_unfixable_kinks: + _report_unfixable_kinks(path, sharp_kinks) + + return Path(*new_path) diff --git a/build/lib/svgpathtools/svg2paths.py b/build/lib/svgpathtools/svg2paths.py new file mode 100644 index 0000000..c3b66f9 --- /dev/null +++ b/build/lib/svgpathtools/svg2paths.py @@ -0,0 +1,126 @@ +"""This submodule contains tools for creating path objects from SVG files. +The main tool being the svg2paths() function.""" + +# External dependencies +from __future__ import division, absolute_import, print_function +from xml.dom.minidom import parse +from os import path as os_path, getcwd +from shutil import copyfile + +# Internal dependencies +from .parser import parse_path + + +def polyline2pathd(polyline_d): + """converts the string from a polyline d-attribute to a string for a Path + object d-attribute""" + points = polyline_d.replace(', ', ',') + points = points.replace(' ,', ',') + points = points.split() + + if points[0] == points[-1]: + closed = True + else: + closed = False + + d = 'M' + points.pop(0).replace(',', ' ') + for p in points: + d += 'L' + p.replace(',', ' ') + if closed: + d += 'z' + return d + + +def svg2paths(svg_file_location, + convert_lines_to_paths=True, + convert_polylines_to_paths=True, + convert_polygons_to_paths=True, + return_svg_attributes=False): + """ + Converts an SVG file into a list of Path objects and a list of + dictionaries containing their attributes. This currently supports + SVG Path, Line, Polyline, and Polygon elements. + :param svg_file_location: the location of the svg file + :param convert_lines_to_paths: Set to False to disclude SVG-Line objects + (converted to Paths) + :param convert_polylines_to_paths: Set to False to disclude SVG-Polyline + objects (converted to Paths) + :param convert_polygons_to_paths: Set to False to disclude SVG-Polygon + objects (converted to Paths) + :param return_svg_attributes: Set to True and a dictionary of + svg-attributes will be extracted and returned + :return: list of Path objects, list of path attribute dictionaries, and + (optionally) a dictionary of svg-attributes + + """ + if os_path.dirname(svg_file_location) == '': + svg_file_location = os_path.join(getcwd(), svg_file_location) + + # if pathless_svg: + # copyfile(svg_file_location, pathless_svg) + # doc = parse(pathless_svg) + # else: + doc = parse(svg_file_location) + + def dom2dict(element): + """Converts DOM elements to dictionaries of attributes.""" + keys = element.attributes.keys() + values = [val.value for val in element.attributes.values()] + return dict(zip(keys, values)) + + # Use minidom to extract path strings from input SVG + paths = [dom2dict(el) for el in doc.getElementsByTagName('path')] + d_strings = [el['d'] for el in paths] + attribute_dictionary_list = paths + # if pathless_svg: + # for el in doc.getElementsByTagName('path'): + # el.parentNode.removeChild(el) + + # Use minidom to extract polyline strings from input SVG, convert to + # path strings, add to list + if convert_polylines_to_paths: + plins = [dom2dict(el) for el in doc.getElementsByTagName('polyline')] + d_strings += [polyline2pathd(pl['points']) for pl in plins] + attribute_dictionary_list += plins + + # Use minidom to extract polygon strings from input SVG, convert to + # path strings, add to list + if convert_polygons_to_paths: + pgons = [dom2dict(el) for el in doc.getElementsByTagName('polygon')] + d_strings += [polyline2pathd(pg['points']) + 'z' for pg in pgons] + attribute_dictionary_list += pgons + + if convert_lines_to_paths: + lines = [dom2dict(el) for el in doc.getElementsByTagName('line')] + d_strings += [('M' + l['x1'] + ' ' + l['y1'] + + 'L' + l['x2'] + ' ' + l['y2']) for l in lines] + attribute_dictionary_list += lines + + # if pathless_svg: + # with open(pathless_svg, "wb") as f: + # doc.writexml(f) + + if return_svg_attributes: + svg_attributes = dom2dict(doc.getElementsByTagName('svg')[0]) + doc.unlink() + path_list = [parse_path(d) for d in d_strings] + return path_list, attribute_dictionary_list, svg_attributes + else: + doc.unlink() + path_list = [parse_path(d) for d in d_strings] + return path_list, attribute_dictionary_list + + +def svg2paths2(svg_file_location, + convert_lines_to_paths=True, + convert_polylines_to_paths=True, + convert_polygons_to_paths=True, + return_svg_attributes=True): + """Convenience function; identical to svg2paths() except that + return_svg_attributes=True by default. See svg2paths() docstring for more + info.""" + return svg2paths(svg_file_location=svg_file_location, + convert_lines_to_paths=convert_lines_to_paths, + convert_polylines_to_paths=convert_polylines_to_paths, + convert_polygons_to_paths=convert_polygons_to_paths, + return_svg_attributes=return_svg_attributes) diff --git a/dist/svgpathtools-1.2.5-py2.py3-none-any.whl b/dist/svgpathtools-1.2.5-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..3db636e853410f85d8b73b130c739b9c1ba29811 GIT binary patch literal 56025 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 XQIJMO{8Rt{c!-ZEVt3;?^n3MxlL%YQ literal 0 HcmV?d00001 diff --git a/dist/svgpathtools-1.2.5.tar.gz b/dist/svgpathtools-1.2.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..77fd8daa9ab33bc35e32644e44cd81e6a3a4bbe3 GIT binary patch literal 2097569 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,&{P3(3pttzMRH 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

N+nmA=aO{nxX4kj$G_Kbagz zSk8uuD!I zlxu0#r*%eu;U3)~gj;k`BTCEekJv^F%T$FKLnd-5=$Ajku-ybY5?k@R*=Z&%PXkJ{ z;Z$LB0xc-M^ut}xxIpRPG}&AVNN|lL!4u_HG4eIV@o;jZ3jK%#&BWRt{!X z+5}IMAN3L>%)t(qV*FgGVeYGOK3)Wdq&(MD1?bJFtx(Sr^bu#Ts;0cH94dGrVU{BjFjC8f#$^$Un$*jv&$^n3WvN{K;}Z4s?II zdV7#18PSnVSAGv>NIVyUEeV>CDMWci3^~6@OJYkh=}q_$ePaJ4Xl(@_lH^0|RrSu~ z+u0Ff1Hzb8HyP#$2>NP478{g9$bn+{(VV%uS^uvPkjRSWAL9(BSejs4RbV1amFu5L zRbBy*WT24=hg5|>A=N@v;Ca2YIQ04b_VuqR0FqqvXBNm?qPT&^B;J@{?wPXZp|wI5 z=)gd-Z1nXZnMobQVl-9c#AOw-G6>h^iqofv%v`C%9|#(~EwOt`pvOzIW9L2`n%6}@ zL*HJI$ji>Uz`Hxr_qnP95{bb1rOTXQiB`(Z?T4AfuM(ywuV~K55CAg;B~nV{jOf66 z1}y244k1b;i8GdYC6LX?t)dedlt^^*j8D_@hMJ5meUKh665&y>=OZpylfaScqKkZ! z?1~qFhQPeZf#jQm@Kh*hRLnrd0@wKD*(<{PkueXx*Ho1}AL5_xM{EW(EFka{T#o(K zDsnQZI82uVBH51O_dnV*mm`FME?(mS5;ij7SH464>sJrdBL)%DF6xbabGDf~#Y@HP zD>UzbT!LX~3D)RG7f#9T12Q*#=KA`kf(vM|t+G*qG$0#GRqWYkW)$*}Jq}FBjdxbo zBsTOiXyU73x)P*E@Uo=CWfcqXF%}Dvb`QwQ4#qtDnu(JGjXD9yai;u z7@&7(Aem5! z1L!RJHa@9*+UR5Fp6WcPnDY7|et#fhx>76-djtv67rM)Z{|dW2q5mXukr>6ns$Jgd ziOEGV^5T>;LZ9DD2?0Y07(~W_=HsPCSSBoP&OQSK*#v;g;4&QFll$W6SH^Bjymm@% zxVX7G9~UIJ#)ddKsVw?xCeC0i z0P7N?Im&jA5YwJ$C9EtD`OHl&Fv?iJUa!CgEJ}kpXGRT)Z%eYXaH+nY`F^62vRNqu ztE-86gUAR${L3Fuc;(#jI`sCJeD|zAk|TxAV{LA7CnUL-(JNW%B9-97CE%vkc`^|? zle8C1#l@hq^;KC5xQg)^KUD|uY%2}hGjhjicO`N0oLjSDVj57v`DK0zxM<4xEqJob zwc0NMT!iXqnb8J3S#5Jsqya7(FtfDCk{#jq6$zaITx<+teSiDWlTq#t_V;WDk-7HF zTxW?jOkgu`iv$nvLW7ZKK>($xe>hBDJHpe}kDUy8ft8%?Ey_bA?Zr+8qNA24J7a|J ztH8-%tdYB{z$xl6lIM}B$PERvL{$MH{+Hbh@1RkKPcnIm8#iXgSuE}CiC&0lM})$Uj?B?aFduBZ?GPkkm4GwI>ERm;Fe1pUmEFbI%`!qucWFpiVA=F35n6Jw48plLbxqy0cGQb~m zR9<&Ql}s_;34iosPQ#M=0wKI||0b802f2T%#{~520s`QvD8@_BSAdezsVOQ^+cfkr$9#I{DZb zhW%2<#$%G12twZ~AYhND{Zf*c0<_|_G`Zv($}0IGT5JU`1R`i(4%);?N2)$k*Y{nXk(4BaxnSgz*g54G=?IZAmen+lk zXc74~f!P=>I;KW=Cu#B&+SqReLTXJ_f>Gv=PK+vqt*dHSN-=VOF?8Izw{VHj4+$D5 zI5C}KV(@#y2_-Ik{R11*l)-W)I3f15x2nj$Wn-~|O(@i34k+mLv5RHirm6}4mOVwd z#*0goCjn9&b`_Np`$EVH0XiKAWsGH z=TCn^C==GZ@t^VO3uYE z--W6TS^UjZY~_NINXkf35}5{G&ni-MkmBGEjsOpCz(M6^9Dr=s8?!Sz zSB*InSJ6m;_{hcFXeNmXY9iW%s>JDgf*)v_P}c9P#ut6r9hkp|4;0sCk&7Q^pZNmw$5yK`%dg1T z2P98Zo~9!&=cHAy^;6FyhU6t8@M(KlfwGrbylxUDOcQRI=OV^q4U4l5h|=3lWIneN za1k3JDOM5hrtdY+hbKmBgKt(J=62zk}~hPXGY9FNtC-HZh4LL#$Eco3QEp_Nlks^4g6PRev5665XrH zgyaz~76d>(qg&`(tQH#*Ne>j?+o0caJ0dnQ>$7GAsM*+Uyws$NP3%vwp9+a@g`q{JJaWbSgvYR0+x^aN{qWU&bBf(v&Ek%?gx;!lmK zI9eWjZtQ>v)fM57T=$(vK+TqAl;L?S3pSxA^$XLQM+~`UyfI2}ZBsM2x``A|z+4di zARnfBh;Tlgb9xWf9uIQ)0J7?*FPvjHIDL%y=nj5?*+UtWJi>4nklTz#D61$vWepF; zA6vSfXGDhd{-8W7u#tFtH9WZIi}B|6(ZDf$VwmE05r!ulPqO}1-7zJ!sY zQDppR)6W+lj@ZGk)gS4=kmxd4MK)7EOmhOiDbOR$$eRO)2=T7SF#MdFJRPlf-uc zqG$gSJ8>xN=1LMD@{HDsFU&ayz(`bm^MDnpUdpTpRq6>6Ung8OAG??F72}_qRmh2u z_zKDZDH404iX@bAY&}J6Kqfp04u`gfE16}x@WSMYA}_kC@;t-FQm ze>_dDe&7b&EAOly{zHlIS5@}o2uDtlg*o^59jzjBQUCDI#}#Jh-1PghoqyPa)`uj) zg+SQ2s(5D>qP7AHchVW~WKt!l8(`iC7DlJu{bzaA*BU<fG%U7RDnUn(&2T@UIZerJ>Ppx`Z|;g{Ey#36|7QxQp&EXVXy7cgV&p^o}Y zEDTvfXzQM;7dEY%QfFF7NZdvYe1lSHGD<4_v-mlTYSEIYiZ+{0`pWA6SbMunT8trn^5_j0kwmK;6$eyAr_Gn{}{ z-Mte9`yXLO5gG~Lf#}&kZS@ctcH$(rw!ynYvP#O@{ld-zRfc&JyA@SN>}v&cfhtW? zj=aMvj%2QwmOM$?7JNtXT7C0te2+!RhMhRDYLzIkyI)MaDb_8NNCmnKmQvGt5}%2o zq*iT)-701nHZnV_cll>~0n?6=H6Ujm-H%1dtg+-vQ6}>UJBgDdWsX>{YL#gqSra3x z*xE6F-y#((&$5oY(QbaHXA z4y#1#lWumBC3(NXdjs4b-|9W^F;fqIDQ-nZ>NI4m-oLyu(BD}tb|6F~F&zbeIre-o z$qiU;2ronOL7LkaCvrKIjGSz64dpkGDbjVZy zkgjnaYBF5mG~rfATsZ3dK$MjuD&T@!9qu;nlj{K^L6ws+R4gKWOddH!w*50$prk)? zq${D|p-MXRw)aGpt?<3Z_DWzRJs{@n%PIy$WTP#sa~RbRo(UBZs@MCV-B~qAn_aBc zwQ%k2?^QpHQBx=<;w6sJI9rk@xk5DybB(zyyVdpO?}yx?cT}jusv#=hsjvFQ$I4HI zVXreZNMt0}qmR^EmHNJn^~frmCt7vGDr+-{ruSN8vrLb+)qDB^AY30&lFb8)&9PeX zdf(q+Ki;I&xDjtGNx9}`4*CrMStrzBnCUaYt$s*JXSSlMv`%x^rX-2&FJI%~iBFZN zmb>SEuPoZl1eBq~imONvb2ir6=AQ?LwYa+*4wfN{}*B zii)>8i?c_ZgGCazxn$N4R$jx`XBFTp^TP)#$3Ao4HsH>cNy*(P?L(1?t)HC?Z^b~13KAiljn1_P`%R?DWdg`FqpCNuUeVuA` z7M>wj?7_HWK7nh@lCh!en(*}^A#dlu%ZbmOPI<)0&WM^WS0I`j=EB&_fv;ha*|GzX z1e-ySK`(5SpnDN8V3qvS_KYgWL*2%N73^o0O&am9TIOBE2D4-t%;;^toG5Cf!l*Y} zaFjU-6Y}?}xKp=0RwClQc;;jc*TVLwPnC46d(cY!-wqlu$(h2A2_oT8*Zwwo==WLR zs+1YllKFU(_b@^9AQvM#a)K*YHYC}8k{7FGQONTBbN90_v#}*ZYP{Ein?Qm2ppwi$ z?@cokql^=(q@JDKHv7*mpG;9bpD|Bl4q~BqG{+%rj zc|b+jZa03DHq&>cfjxxtxCbbiK~+zY+cr1&J_$=!fe!4KYsV?< zL)maz0Gi83PR7cgo}M3rEEGpTi?^+S`8&aVCLDG#%Z(HrR^?DlaOPwgM#pTmb9X(B zHwLb%UM7lUKhef&zhf{<&63=0*z|oCB#4xRntgA*QWJ(e&;yU`1yp-ai)-I1`l55v zqO_}XTfE5eTBg!xKE$cEl|dj%58&}+w>|Q*DF(2c$R_U?j5RqC4;l%b$1AxQ20P!~ zMOUN~@Si+mwz*u&?I9zpsrD`2R!9zV($}fs5>v%yRO z9@e!xQ=fnJ*p04?g}}7tx%9+KD>1N4drF8+IW%yBnvRHCyM=R!7{obBe5o! z7}Qc-ueCeLDL^n6VB)(RGRdl0r4t3?HPFMT9*_q=<|Gdx#5LP0EfDmmuMN(3j5aOM z!yB#E>c0lN(T^OQ13i4dy79s+X}_aXX+fQ4>8XTn>_>O>p~*hoD&)ETSlA8)HXfN3 zc;Ri}_Ze@Vz%Keemqze~2ix<96TNriy;VsD+7=rLuQi=F%s=FOE}^>&l@ZlvFG(;Y zsf0xg@G`|TAAQbbDkdIwj@XO4g6{0V;(58hHOVYi-7L-Ynk;Tjn$uqo`Y;-m{ZMTT zpt^wW86aTwabIS|!i7XX*FBmsIyPtG4Yu6EHP0I*QUFPddfZ23H)u$UC|^d-v{GJ` z9wdgCWtBUeUGvE*Grf__X}-1l1Ut5y15`qzo%6*;R z(6SE0@OCnSao7`n^M<8O;EdO5;rjXrAMII1e8%i3-nrPW&45AdW*8cWPh3v-e8*p| z=gfv@aZfh_1H2E(rt8g>X@!xaIjsUB;_G+=Yg6>-*+>Cq8+{j$_9o%9E;mLKSiKQF z`Y?%u!~Ztm(rPCJn`y({YQP|k>oLlqd%IG*BYB7ieg7yGf2MR zPZ}HNr$vB&ceg~tDk=6WF%j@~IABc4>&7(qavq}|bwnj+?*xvQ;E_Wf?4v&3rNa;e ztAxFfL-k(DNvdEPwpsE~i8Ifc+=O0krI`$wYLR6qbsD&qz^H z@oVsU@8wD(XFjx}N6#t%nyDu|noOzHj)qaPt)Tf%_joDm(2mBTH-WsK>`#XMgc}W2 zO;+(^LZTm8CDQtAvd)0&?$3<3)RE#w!#U$}Z@QWC$MIBSsD(FdN2?^*LGyaTu)7Fg z_2f!7)Xw`L1)XeZP2Mk2g;{8*%@evItvpVS zR#;_v%GNWBjJstU1ymOh&fOWTKM88XjuBO4O!Nxc6SoqNF#&iB)g`wMQ}+WnvH};QEdnh&ma3ywk54ss~N|~tse}1@RdVeBWd{{k(d^3TJ-i4+By%PS@GV`$FKwaS^z4rGKf$+yr82gx zQjZSPGB0xVE=0n=`4n8fpE%>1JAAoV;^0g=(gXrMr5u%@h!%+k+A^Z0>JCDCemZlO_ ztE7>WrT0uv+8_z0u*#yU5$IW>FlluWAmD4E2r_xhDp^xJ&wAi%$=cbuaAMSA_(Uhj zDrs7bRUcuI!xm@HAk;FGm_2VU>|=KW$XxPR#np7Tcz=XN1pDSWQvERD<#PhS;=Ko8 zV+Wvi8SR>_9EUWt`(A;9L5>}pxyZF(uksClw_yw7bQItAj5nv zSJVV|wVX+yt;{K&KlWZvgfsHXa)3umg6iu56tSgjKsRVZ?q`^Iy`QzVkRgeXZiedQ zuGh~H%4h*!mf&^tESrqn^5+J2k|GnFBf49KonNCXFaw_%5Lw0|9N?cnnTR2N7K@l{ z#!EkhkjV5BoE?B!1RakIjW0{HrG#?;vry8{LpnAR$_RZ4zN|Kdkzs%uxjB?dCmoW- zTk?$Q-_wQ0$z+j+@BPZov#s-(!4e@7*&X65kbKd$Pf- zHc+kf37?l9YREl@?BK_O&3ru7MphenxGdG+W7+@jM_Y_9aU^S#G=lZXV4HJcVW6kdJfX1muJA4_&&*x#k+uj*;p^Wf$(V> zY1QgoZ0<9-{i>6m@AQ3HHR@+P&r5zF&2LKMLK`}4M%IT%WPrlu-vbZZ>FMU>B;)X2 zxy+XW4{N4x?xARE(<1!7d@X5LdQP%RG{yZgN)TX40^47V+DzY=?l|OpB5%E~z9*7j zu7@tB?!RjkB?&G+${|}`GM0~3A<(FHUet(aa*PVo>=Y)J>lcs0bB_4H5eQg1o;|w+ zTA-L<1QV4g72IQ~N5lffc81kN$m>9^zcMI|=5tXX1E~hJ`80Com*|4!M%BI?S1x7R zlP?X1FM>3|puASxUMC+v^p`Q&FdvoUx|#Of#s9_I&=}~fL{|CV>?vRM{vw3l@yMKZ zHcZT4FLUP@$u@!kJ4o>2T=VjJK5lZcwNRrP8|2vV6aAB22e*4h6N6V?+btrChCZLk29MS)5-v{%wPNy9iG#Vl-5lj371wpBCsNn(TkGKs!8wnY*#YS z>ZmneJWL0T7v?eb7nOzW?Ho6a*rNpD*7aVCo&zCcQe2fj)&7FC5HEAQsey3?g@>f$ zg?}CHO=hf+TFq1)FHr7?EGk=`9S1b*7A+sP#WexFliw7R`pG8v_s;yvBrFxH^v)6O z{J4QA9O5p(%13VE>A!e3oXZ5dL=~U}e7Kjfb{7|(eEvn%$XpDgZ5h*;0aXsFr zKco1E4J3ZC6|s(F=r?eMY4*iAG!3X90dgJCR(mc*CFZw;GYqTrir}*S^7GV=kc%y= z^95&(KRU$^@?REGAL^tfIfcwf)$A z1HDA8;#SvqDq&+FF}^Z%l*Bp>{`!&m?jpIJ010B1X#Gd#yZ<0&aJC18R6yOT{g;S| z6LHh~m$ka+Mt$X%!--*pM8ad07+5&EFA|d!k-Lli0>$cr)awh={D42Bx3-9wk1UfH zI?A&Q;l~!IO50nP)QcpAD&6fJkfu-^uauW7N(A||Aq7r#BiOjxxAg<)H6h+nWut`H z{t@(I*E{?&Xp0%!-CywQ-E>X%^vmk~QsKUhzgXCXQiP{OGv1GpS9t_I8ixCLWG3H( z_RV}bs-JN4FP;M-TjDwY%jP9>5Q<*4%2w(7Q4EQgr8$Yu9-wMmd6{8Ha<7>2PWOQA z^aKo?t{qW!OvJ_t-YS3@Ec>rY%Z2r1S>>@HEA$7eBd87A<}`qx=(XH0(dFg0W}9SH ztnj1%60O`!t>9qQ#7^Rf%iMofsa@HlM)fX+10dH6nPxX4+)HfgU8x2h#rIm;><|W~ z)%)BMb6;OTH9JD~yAP@gYq7szY{phoWiM6s>gTDoiQGO!?vT4|p zs8qi$-S`K8gGAQjBh#`WrtZ;6XeA-GzaLL9>OED0L#!{?oY^(Vv#7FFCimfmsWbC} z77^G~!Yau{KQD;=7?{D@$(HZaHT?%#+m*d1e~_Cx!b3926T=PAEQJ|Vn{iN?D6HWI z%P3PXz^G(d(t>yq{0={cyg_p7?gDwQo%zey{~Y8Mxu~pL_gDCV%eWbl*_5QF-se8B zgFk4%y^K!@E-C}_^8Ki0qMHeE4QMK`s+EpAL~D$|Sj5Gml8ikWNd4#w&73fcAJc%6 zlY~G%4BE@VOzmt5_8;LQBQjaZG*zR~=s#@MB6J4Z0Y%y$>z!Yfy8&VELT^cu=8DTK zT;W$$uJxluA%p$c42K7qpMK3Bdx^QxvC0v)Xyo~E zgUC_D2xryD<~;;HYz;@O1K>Kas9Wx9eeaC!oZ#%oMJ0K5j#mY@2+pX=MMdF&_B{Sx z>;p_VS4l1^G8zsCS!F}PSKF*YHpLoJv&t602qn>{fP(z5v&zLgj|ADy(~$+UzBl&j zi^d0Y$@{Fni%-(a(CFdg{DifVpu?7DCmMk98@*-ZJk#eAnG|`V1U+fvaQG9k?V;P> z_p37fpp6pb)BES#r8v`vK4rY0d0?_l4QP0RE86tOlnuXTjPG>IQtpHL58NUT#UP(X z5SYj7qnm{syHDKbF=mTAgsd*oY>;>LK%e6FD3P>(j2dJGM2IZ<^wa+B79Qc?T{^KN zGAxjmiKQsuru6^s4R|+WhjXEWG5p|>)}yQtr-r<7CtpGQphkW#>C8t~GNY}*Y7;&W ztUNgMdV$$RwKBo{0)@cnfcRmMxPd-pTz$WBf1$%+fu7bzw>!PhkI$(ZRl=iCGw}Qi z03Jr@k?#ysMTJYTN_=L?jT2TMLhpE71l^Qqn7ftmjC{;cCYP{Edeu72=Eutwt)uFf zk38^c{QUjndk8xiS(tk{g~>DPY1lP_aDT!|z(|H&2-nFl0M*IYA@zErT_M&$zUe)K ztr<_&!({p3Lq@+ebWn9NMoYf-{v-^nc*4my?In`$ql(^{e+#@5f5K#k9GRQgh|KI_ zv}u)nIQ^gzRdN_;Xzt*f-qRiHxF=3*L`Zx%wN$J8m$qG_%9x_*)PZ2?Y-a|z6OWOB z?Oze+iqwnWAQb9MVfZpoi8ZTTvE6Z5Kf)8(%x*uj@wc@7J$Epp;SdjSCjh6_w#0OM zbAk%hDvb=X((<+3>2%eg>BtsR?GT>AHN>`VZ6pi1wmwtGBzsTQ}O2lkY(QYdvNmUVVN%xMZXJ7J}E zt)oe$os2y2jq6-mDV){&sq<4MBtD3vwEGzEMV`O-g=WhV$Pl()@{LzWoV23R5yu8h zk!02#KYb&!eHu(r<&k22WZ#e5$+#w!ex;m04TXvwH?e>T-+#%QbO2PR!euZ?>}2g`KR)b z!@LEs2YnAZ%TnGaCfv4xNopcR318wAHnIw8Wx_hO%HVnAA?pYnC48R;0jWdU>!T5C z(Fb>cHifi+B*uEoSWc`6fm@Twh$gVgUJypid+jnZ z6Q`+IQTTfqamadr*Ni`623E8o!71F@#CxxseBY{5p}B`f)_`e-p5S|e$Sv$Gn4uw0|E<XF zIU9ZtM5CZV31%uOM4`%gk#=hfa3})wmfQa3rTMKRFBX-+-D1ti0HLU6t&!d;H*_<5 zC|~|PKt&no`%(tph%}<%O_e=Vaf(Rwegr<%d)97d7I1AaF3`mizI|P_jYV_%u%eOK|2fF3aUr!?RZLm ztR;-r$uvq&5&J?gR7BhqtE}|n#K849acta+{y`ij@Auk+;K`12Zc_+XR9k}}7JAep zTWYWoZbkYh3jj{X{LDk^E$U;dj1`z%OO`Fookt9RS? zInl_o2+u{+i==-7uxt_9%rOQ-0sc#C9|V&=zC4z3KMnaApg-x8qvFT|P*|G@n-}ki z>4|Mwz7!hLVZ|C&fwExW$&-~Wchdihc+aD2DA0QP1e-*1b{Dk;DPZPvLRi-Qtta9? z0H36VK<&-HhXtU~-9A=X3GYu--XRpi6S7MAo)C427|%C8zBBSntB90KqG}Z=vRY4X zYuc8TMphqr*2lJaFI9Pev@H$qjqGxc)e}oTcU<5HWFL0JOu*(6WJa!dw85R;2}Y|{g}HU*$wj!T}isL%!G@e z&b#?W$RB?YT01)5v|Ox`Tuc)zJEf%69-0nIP$%aW60GyJM5f`4se$pt>NxgmqjuQ2 zVA!XiP88W+Lgf#DW*hG7J%7&*bc1;%rb(*Gs=7`em8!-C(Bs4$Xk0Agj;Ty~Q;^9WMye>HcJKP6Wk?pfYys8jc8p47)nUD0A8U1wU*=6qSM^i0DtIGr7p zPRh9%+HB0V7%r*OyCS`;yn#>U+HT@Oc`oA9P0QXFM_M$%f#L)cNz_Hp>N12HBQ@3g z3(y^^uZpw~5Zn;ONkRrd_cvE#@ycgae5uK(j z*A9EvH$OC(@gsvz45z{DKM*=8((JTaU^p8o9=kj|JOAc9@y^VBb_A-wq2^*-ToSbj z9B4i(I@1oKP#h6by$6e_mhj=(@g^~^5~g{Nj3272H{fMFaUX+1AnEoGjnQv7%>J8z zoMILI+vyLSEZ_*N9#<+-Z`wcmk;T!Gs@z)v;`IEJ{heT;FYV1!m?oFg$DHKR&RO}J z;5<;93O&;C578WCOfl;a)FuPAzRnwW6KF@5I#8RH6w5i*4_Qt?YbUdrNG!T{iJ2qS z5-44Lq|KrH{ChKYGO>`!$171(eW>%_^q#4Jkqgi=nfjmaj~z}p0E4Y!l|c`hupc}e z**8sUX_=e-8g8VlYWY6m70_!F!@J+I$qt~xRFKk%qP7~l@bKWk2HFW)CMGK2cJE(> zyNR->TZPcjR6}?WvqtLh#cXSRlGohCTXxV7Y)TX3df&!gtjG0lXl4Zy)kFf zj_e^&nsjtVGM0EU6WoaVFHo9yUB_nq-WVLp&}9Y=6QJHIPo;9t#k%AIvq^Fiw#N3u zbo-#S3RvO;$XTC;r5m4P{I!B?o|U6M4U055_Kj8xBK^B~ys8I3$vQ4FU;+Q0}I?t<@Hur7~}kI^2tnxl4eCq#9Cnnu5!Rbx;& ztXt*MJN@acNXG8*Y(bHY+<9f%0vkxKiN)THYC~gNQ%;KI78e(C7ipFx^_H0_V(7dO zS`3qaR}mvwS9+?@h}|pZQxZqDtYu(P{~@nqfL?=yc`#&*xGG>?!`A*J%taz^M0`Bu z8h6Kc0-_1*i>J+xYRyAgw~!#rdt>p$nU89XXlUZOq6($^^b|0c2#{r=Ez&GG3v}d0 zk6c|ig`E?eOjhGR9V8DgCX(Lq2)1G7oKxl>x|-tvA+QRz7k!QWLsz4`?Z&(!*k;hV zGy4E-;lSl%cE8EgJovuzlO>u3T3A(SpS*?WgXJ1`9bp?&#KRbl1 zmzKsVWRiYUCsCNhi=rv|@uxpjyg=oJUDjrB>l0uSCld*zAS;*OMQZ91Z!Yd}b9$$# z90kl{d%{n*+uPcQw5}(Y5OY8ITZBbPtelw0cm`$_PWn9|1Sf;w5fPiigg11Ml1q3WnzU;iqkE@d-5>R zB=1B9_8|0U3)6j=Xt0EL`!$1Dd4KkqTN)_Qon%P2QW7hWXPovZ(XFX{u7RZFmVglR zV{D=T3yhwg$1 zh9NJOnC$ux(frcoJ}Z}1h3zA{f^wcYDt$85MvaV%FQfu;o{6#T{(6vv)z)Je#E#nOB zW@G}6+~&Z1bN@)rwC~#tASFm%(GZX1Ov|drCB@Nv+FkfLLkJgQEehx)P<0|&o~z{k zlT5jHKqui70}yy5=S>pM8c~HJW~(--kz*GCgz6i2h<;-l`u;1|D;v z{4VH2RfLj(mF%wkd;E-BM8teXoOi>BY16i6+*(Ae)Y*d#xskW^%tWhhol*1^i%;k=Q+Aaa}G=_uq2S&b2_T6GIU8jiNcXIZA$Yt^d zn!pOskb|~$$}gFO+|Nv?$qY0kXQ@Y^t4i+4v+@S}u;I1wpoJipCtl?-6Ag)Q|702p z5I4r}OvVK`l9F9A_ZV6EqFX#zd7*%^)R5>;zj=OMg35|rxj|`Zl>ISKKIDiaH z2kt!3a|7^p*9$jAj2;PUDA}#S#EWNujYZHM?*s2sIwVFi94A5Z?Rk>vFm-U2 zer9s%^lkL=GZwS2n>EmocsHRH?yTZy>EzHzVw8A(l8V6RzXcHczZ643-GQr512g-G+&0MiE*q&3E|8toRGWs^!5YGgZby- zv`P8B7c8tQiHZWkdS-2N37Q?c1GhL4NbULKBEz2kiaTC{IT7Q083oZibCJ^DqRJqS z-0nv{9tdQSXa}m1-Qdgk&<=zR>F^}MYs_pPEL2vRB``bLfog1@HoTv!A5k6uL7*Cu zbKOPcB?2%2MX6gQD#E>=*}G+p_|Rg0EOJ$>CbFT}V;D7n#qImzrB(P>IyT`Vvn{Oh zJ$SH?W_9v7%F0#iG0Vs*kuv0-J-RX7{}Lpq3Q+ox;<;aR!aZ=`9~jG@FhdWK)gx$*BAk$EP@MEw%#8(E3k&p=J6eFud37XJOQFPN? ztzIk!h8C;ZIDhFQvpYO4auG44Lmp}meawb`#!pZCr!#j*1~F1obVR`?tRCdaQ+cmlPB9kH zEbKo_3|pGCVIQA?Ff5UZ_kR*c{@})yq;DjPiBv4C5pe=wdsZCo&!|FoXOi@)cg@`e zD4lRaqezkqi-2MZ2MM6!5)jt+FFQsM@?my@iy214%%EQkpfrx}c{ASko=EQh%rIqA zX$A*2_y|H1@2&tr?BgO&EfOoihwS*s2z}Mftp0c^F|M*peSAqdXexzJ$V>!TRPqGf zZSdwEB9rvIoeu&_IHCXj6n7{PFc+_KIB;65-u(w@GI$5nW9F~yj{^sZQfOo18xK;9zLK5i z2+UzcPMQoiQUcmi0ArDC78EV#5sdF``ORQzn(Ir9RecmL7+;gX~Rcran*&|M-lfx{=5La5yIM>0r zm6RSo6XUM?!|rE?ALLSXR)7_>L1rQv6<+wC$!0rQglut4xydTvZhfy58UHdQewl-u zi3oj&mwq;@vY#_d82}E?ioi^fr0DzWjjYnaz2_IXb4#v6Pd_wa8SFPmrV3JFCpM)0 zf)KG|62CNqR9F?kjTf;K5BZAp1UFdJG$1r9KKsP^dgd}IM z%D#8TEKC~gv1-ihNQDbMU-q5ny_Qg?lG@L}6fcYzEUceNzND<37dT0J2VY+D2oFcO zJk=XkNor47!5nPMS@V3aU34_IZL`33FuI7R8y#+Xd&{G__Gr=FC#3pw- z(3w?uE};@x-1j4>9uV$#kdfb8_hrQ*wgO8Q=sy}ZByNqYBCegP-l!6C$r6 z-sWo|lFZd#knAEIANifdLR)3dUkEJ*9OSq&nS%FqHM3K(upm;bDnIlv8~iq2G%m51 zJX?YcsP6p@3n3EUuYQ4Tv051ve(#k$Bo|m}YeaPUGMZsg^AgeTp5Uv%gJPSBYJ^C+?SH>VkMjvp6QZl%m$m)em36)-O0S^YE3=qZ< zI$SHG%Hx$}t5=dsIUJAuD1zQG4DBI@N%h4H zE{boPsgXf1Acsesl>^jA?$JGtW&X47dlGiO`VfFT7V5(lFErceZ36*VIo0KLF8b_V zt$QZ{@ZJIFQ(pFZfulmoPY?jBKGX8R!ObziC*cx}9KS|J50cw{ckUl?3RXMboth78 zp~C~Iv9+o`G`q?K;T2L!o47+VH}F5?LlK)JL1BlEri{O#EdD$qF^r-w5Pm58h{kxt zVbniue?jmgKM~`|eChT~o%$#7&UwK&`_XVwm(l>c*LD#8G-PCe=`z~l-ip)DTaZa{ zuKMNiM>n@d5o4=ciANk>(8^cP|7cqC=zZ_INk#&?7JNT8db50w4D3;g{+QK*$o5U^ zKn|a~Bz^v@ABqWHTVD|(0R2~s^oiJDJ}yCqTt|_uHjT~qN^+i)5en#ZdS&I{bI=peZ~M*r0o z4sN7%R`FmVXM9+R!>F`y@gtHXRHmk)YGFKr6N^8Psux>Q3zq3)4BUAFprAC&C8kd> zGzw=WhS_Z+y62`l=e-nlC4jbRbKY#Ro zsKS3ksx`BEH(d8hA_$o(X*y&dj;!8e&)o`;%Sn~s9>NtK_m_hNx^7;}EK1020&$rD z-mMHd4^}6X<`xZ{%>oV*d% z!8d@|;><9~XSLD3<>gYp%xRgmAK7flrvkE%JV(G3b!FjbzEd}uzio+r2GD=Czmw(-ggtGF#$ z+FDj|UXu41uZ4szdoru4-G{IY8pxeyYXq;tp=3jPBqz~(Mk?CB@(`9}a52*0jbSh? zQ?*xC3Hq6K$f-hPLMPS}G|6Cu>0GyZ-==blW)UgMAqv4Fs(6y?9{m#PFTHt-Rjt<; zH8GQ1&Sdn)XZo1m-YfV4EYTh#9^$pM|LN84gl@9wBy4?oVX*v)NJx$$2S5{d@6Mj8 z`qUcFdUA`9Pv9u9NDGG{(t9aw+{HQ0YGJ%ovQcvs&JI&!Znd+~LE#;m5CWmFCM>@v z`z73k@hIY$h8wXAFF3X`oHR3fnxhy;ePG{KiNIMq(MUM*IAq>6CEi&j;YdUqhb=bi z69?O3W<m&_ zj7m^e2>GaDsaecF9;1@M5OeBVmB9_Nsr?w0j5G!r5=$dH$ljKSM8vyvN%o4@iXp1m zoxnMK5E)FrNU~502?w!9JgOCtYD3Xung}NN%Q!?l*u*A~pna>1+wR!`Z0f^QBBj4O z`eSv`ti3z!l2vYNmVss!li5cySkfdpH#7INh>4#z@yy~Bf$J4VVjS4%P;hdL;9yxq z_XQPz^pch+NdgqAK|_L_F{O-H;i%GuM|YH9XHJnLeHzfbZ4}B}B5#zZJ!6Ns{UZt1iO$s6oh3ChhJi9+_Ww(c zNkk()3gt%n-+Mrmc|wz2^FZ`$YdJ?0tGy49Fb@~cL5Q^_$j%kVbYj+oQ1ZA6$gU!7 zFrf8;Bng~B)hq=$Tr_#YWw%+4atbsvXHtyK4>GBN4LPz^H1a@1vPcpm{;FoNkng|ZJoU(9K;C@6fco1#(p_jH5XqP= zTAumXU@;>$W1AvcXtn^4K&h01Bc!Ne`c>!>TUObY-X|HfGjv8Avpxm6E* zG9!iioz8cf`B3lBY_Zz>8s7$#`NXjb*mLCv%GNA@LBCIEVw?BZPq%3x4 z2{I-edF+hxr#-E4 z=P_+l*>mUugNc$$uzb;`Mf&0732yWUfY#n#wJI?SZm+wdyV0w^J~BK{X5KYf!(_jw z$Y8=XW7$FZAZxgRmTUF(k#PW&;!^-^J;#ocvZEOhqI7nGHC*wtoi|OP^FR4oW%IJ3 zv=tDSst8HOlcPj+A}so{r!~bx7kUgMX~L-9X8j=~)$q#ZZF<9y*X%cbSoj5ILVuCt zBDZ{`$J6L{O%QfCC)k?y+8uWg3m7B{0|QQQf$wJdHO@78;q9$#3=vv^=_Hx{O$M9X zW6C#3ikC7; zV~X3JhJ=l86Mv1~3Axa{gjZG>Q?bn%R*B935<{)9rLGdM!%BTGy##!+XwmxH{;5VJ z7vhy?8q9%c49bjnA{IhhOZ^_>h1z}8iKHY(K2P$7i`{-;Qsb|ZBf`p z@HPZpT4FyrJd!1{S9*NKCG4Oj4c7R-27N=1kf@S2I?I)C$r|3-)*pSBNV{l*lGBGE zcy1}u1eYL`AM+>ex_=xR3yb)&jeC0pNcO#WQzYbasCDR&ax+fD_s>lB?!>c*8|CTP zU^EOHdkBkYR}#?i6mq;-W#A}Y_b8@okMhX-q7q(-*S!yho(&IldxRi=tPj#+nhabf zLUrT-sY_B=eZDF)H_Tq^saFY#X8vcDC;-l~<;Quvcg2hk1)LFRN{UNxci{sd=GUs( z7~eNum2QpsWlOHZKjAW)VmDrA==AJHlL07eyo z&Y}W!gFOK_A#giXD~EAtdmu-)#pGaG zZNPH(`MnfHG?=7r6>C2kl27^1GE+4Rfw7&4uWD|wB{@1Ntx**aMF9764Ky#;5v1DV zgz)=04wmzcAr%%hDxH%&+|pV>`;GC|Dh3ylv!By}3?=$#!Li+DAOFD|+5aHz3RW%I zl`t`%JA=SE*bBvKf#O39PF4}_-j!FlE8PdvNVCegaS+BqioXf#y>nW5W|U_7N%ikV z)Qur#|6XgTG3T!!*?zQP#-D$N%q-}mR__;wBql~dv@%fG1{jI{B7Z?m+Lk^n7+~99 zp$8Q6C^bt*;UR#)ig}09*+*VB zn!MUg^YJ;S$Zoms3dw|QRhEmgemKVuC{bO07kZfLdnHOK$Zl%~RF+7_`&F&y6C=QO ztI(%Pm_~axBjf@`y^JWb{lWtIpp01Bxpj+B*&P`X<5}ilKe3yz*aa*l8L9b*^%=W^ zM@w^b*WvNcjU0hJLkC}%3Gi1|Atljkl3&%KF(04j@kc#yvOe2WJj z)2bHxQ3Nm^l(FL{AmiF9i!3JUXKG~Y-3ir@DZ9x3`o^Wy(nPLRHT}BY?B2p0n|XQ#RNt zE2<4~e#vx~>Rpa#L%^=_ZQuOi^%ya5Ha!AdyHlMGDD!a_N#MmnY1NZR%^r|$r@IF@ zE19yIZc@j5>E3s^-m z((j)UOxeb1XXM#R!xDl(q-@h+J<9jw(PCI4x=(e*R0crrK6ii|mNn2xIHc)zh_qfm zOMk@eVV)5jOK8;N`r=6_7$!=IUK#XPf&$9-{!tu`{GJmE=)#nKPzc8Dh3BZ)LH&Xp`w>*xei0FD-#Fm~ z{&kXS{-rXHbcuVMh3~Zk4oi=4jlB6j1c8iGST2zLp!8{pSuaLIp)3b9NO!C(<6nPp zM9q)m1RYi+>x1eDN5s?UOWE_>b#t!vib@5EWs>kpKogYZ`NBb32Ls$Kj;1K~hejlQ zos=?*3?J92zr2$BWFew$$alR56B;P7fE8&j_aoqwq>7XUFw+ZQ8Tjm2-37cdUn|d~ zXFLo01zFGFUpYy=u1ArU!5&8d=rNxgH_5{r5>i^st)R*z;1J-FRaA+PWRD0}T%SzR zU(5}j0C*Y}8EcTZ^1~Z4kGM-#mEd}qEtlLzbDli`tPc7s`s^1 zWm^9DhHxw)bx3d>L6TT6ONc~d+$9zvw}HxfIYjpvf}$+}u1u-vX}#PfgL(ij2i}#` z*)Ki!o@dDu4jQVtSZI;I_u2-8UYWdjR|nc7L#VKWbJiq?1Ar@;+_ySj%#?{nh@7n& zNwm@;!I_q1nmM^LCX#f9wQ1AiOiOqb$wpR51S=3GexO2C&a6Xpe2@}9^e?emWbSSu zhtu=|0ut*36_R9ka3V@+-7LWOKYy`WwB8*H2g7w^Z_KfxPMiC1`&?_rA-Nr=a{l;6 zc|wOgQSE-<{f8p#sP|cGFfLTZKA9AG^t}?nUaX>*CTI7hxD9%&P1bb8?~nqT;5T;N z{6*DwW(>!(J9{Q1z-ja)hyxPq-6i7c&5Xot*R|wpfsB;qNI9!Ilvws8v0{QCg#BgK zp+3UdysR?)V_W)of#_g#4@zPs>xFFaA5E|YE#z3er*5B7>xKJq&SRJooK_k_=cRd? zYJGY@-bZL|$Igi}k%Rmo?1qEWN*ou?`d^meI!OG6)y`3;=a~c3%M4!K6t;>!V5Zp) zA|U+egvS!=#y~K~UYwZ0e@;=7IOI^>@Au~tc2H5)vOyn=vO9UB>%F$v@xL1^X{%Vw zzFPW=z`Wb&dm3FV8pw~ZHv%Zj>b((2qb$K<-NdYXx$WURjX$W%(8C-V2duaQ1%5H) zBkf%ltCXMh3ktm-3HP}CQiEe?%C46{I!TFWq_s(7#ZCR?9F_>ui3|?eqCi%>Xy^R6 ze}L2O0Vja0lN+`4ADi!<2PZNqi^$MOjd<02J>qQPk&FqrYWw|O7;B?N@ohHR9Pu%< z;DvqkJ$aTsFHnjwA!xZFHeR+XK|NN{(6F(7@v_5iwA=qK0$bMb5KL9!x5k1A_J7*t(uQbr0=8L8LN)1 z0HP}JYk19%W5?5--APoxd);y?BvFo>y8FFXsi@qGNbvfL&t3!x()$@QQ+dEiQ_7fY zoBZI+tafNTJM+K^(Eg0P%t9=wWJeX7+a|G2$(Zg>x|YX=o| zO>Xjt`Gq@i|2sGp>~3JD-pBI>beFt~1_Kv;mRM9xOE8oYvjKP+jX_UnDlNgti-P^p z*mg9@(H>y9y7R(75wd`nqO_Zaw*i33%N3R6T{(60SmhGCt6qO>DNJ#9(>%qZ;`n0} z(|`DzDr2o#y|-c)_#D*{Q|myRV$nsrxF4(uR_=X7SN>e`08xbQ{$5*9>{PV(R&CLo z_9!*jn$e5z0H5B~{;s|wu4VZ3bd|_Nw@PvhhyD^(IAN&$xzdG}e~gp^@__k}0T6p^ ztDk_5;4IVOK^XwMV2MS=GrSXA#Z-ZQ0C_QjPaz>jLkIO3A>T93JLGu6r*6p<39UFb z6Cjf~+~HI9c+OxKxo=8#e+^`+faw_K9n)(-3kGeKNDus|5fOYCd?3AMM<(@@#=*A| z`S$%|Of<*UsJ6)wCSteHrIE_F)&4;}WoB^lmpA-c`)3gliym%5Xr56ViawCL3qAEl zUV-evOVSkDb=sB;Nd$-n3n=ZWIH9L#7xdClMev3Qp^5!A z(fPAkoYl=4_}+Uw{$x4Vqt!mDf-eank18X2n$$I_cPT;pH-xPY?Ib`oOH`X2i4#>0 zR(IdJBN!YjN+pr2h@QpV3)l3%S&QoZ5m2R9{~{!nE5ewml1;&2hpgbho^lPXNZY`w z!i3RWxWJxr!u!H1iwuwOO)~jMU{6t*M~nwfl?H&ayFh++bnf1?zkjyzC?90hf;AoF z+4g8VZ?_X^}I9iv`I60D@uFTd76H^Ii(0puvOmF^_+qG#u{?QC*1gc$f$B6f*{CC@reQ_~;i4Y^k%Q5wa0`hBB32l{w*PkyDCt(8gZr z@`nz@w;)glN9bivNRChHe8QhPIGW~EqqHJWE1pJ9wt@_kJ<>ng$Ro?{B)_|Jg5J(Qd z7J;+lZ~ct%Bn7lZ2__9{0MMeW9*87H_$4>WZ!-sIwGP|P1jt2Gnksn_d;17936gI7(LzfBJ#Ca6QBB^+0CUGXnPfBL$79w`H*w?c zrAng-VR*h4B1*NtBD8eSb8EqPpvo~G0+UoyQaX)yjA8}x1<_|%<$Oh0&5UYcPd3R1 zkV*=SZYNiLngma-|ki%Wcuj92bgfdr~pB@>|}o5k)oNz^64qKl9S4hM02 zaq25rx4^97#3O+b%~uo|iHbBkR%sj&QJyay1o@CMaDQR zoZkiFPMRk@prz(hov=JmWmrQh!IDeLy2^c!-xNlACg1$J1h5}MaGKjGs-UYd0S1^9 z`6)1iEaDeh0Y*aC$MPN1Bc&k-{ zuke@WC)QB2P@D)R9V)VIw{mqN$!1{Nl1qwRB7AIKyAW(>GzFKm%As*uLABx425S>s z()%^m6`d2Rq5YabY~Yf9Vny7*ZwZcz8Tc3EQH0e-D`ge`QQ@+{zkhVcY2cuSixNlR zvRXI#j6U;yoess)I2l~1*NAU|p#aj9pfVFVj&x|o$cJjMWQt5vG%S922H@TbaD_@l< z0j5%`ALPwE>C0x#JK9)*e$8|acH$!fpGjk~Yh%Z^#xU4U9&6{<~%$5wg{-BE{t@eD_w< z@I#gcY*8TKtVyqW7d03xtWjn|-_ONge6N2uJT_|{+*Noe!&MfcSMAbD zMC5@MCCa1)D3U6Y=zAwZR)#I=c{h}yTd5mP#s*vpn;G%q$;{S53fKa$q*cB)Lr1fE ze{Dv@aOu0?AuP`8t*a0U*^>rew1VHIYn#;xO5|=^j|kBTm_FsmF6a0DVvNaPrO?#gk)zsl&VAQdlX+HM9Dfqx{_7I0QZ0)=i4~bC9^Ewnc3{zI@YOn z+fNY^Mip!0)ZhA4@OwY{&3))bv&_~RH)7>KV>#_7t&ip)be7@}s9=BKjV zdrvFPq9$fsxO=>98l6VAqE_j1bjG1?i?<{x`R6L7!T=jjO<*v@{C*WKFnSG@1LJ+D z#xTOerjXFPiGaWxhe?dK{+Rb;T2&l0LO92cmSzPq9MEVN zp8QbQqxlO#gnB!!gojd%DyUbOqy&4`7 z+d~tOh=jbCwxmyH(H_t8R8F6OD|uN(hs}dGUkgEjd+fxmlSjE&yLHwMRbHMi>VGS4Nse`iSbuMLq5hPMfs^nh|`mEWB zBjA!-vjytYZQu9a8EFxNo0h20&hHoc4?2KMqT$ge>hu0Njpt}|59!BjVT*zK#EmsV zTuN_|b}h2iKz*{ioY@|9axq*Xt5u|uEEnh3(xhd({iaAm;F9`IHZ8H9-=`{6G^(g~ z?{yz%2V|*;_0a5z>jVd-uPUm{t2pRc1G7sWSH6EwX`LMU*p+8z7(XQz9uA^V zClNT^%}aZoVTOC+%@GC<49UNKbR(_m?$g$>O14ZgLTN`MmnQ@6$m(3fEUA+JD!!+C ze|Sv&Y(O(Je4i;M_(6dH<%x*yYriJ>G)98Gr7TbEBo91G7!yZ-fKb8m)VvvMGM#zP z2GzV{26PKVT|#)7o_E`YG9j104+Gci`45xloe)#4k+U2?Vjj;Q_5u3f5IHw-$S1PM znKj&33^e`ID%@O>uJfId-`-_g8VaFk@|fGmDFz*r`;kP9j(-#e+>_(Z@d&#DlG=_$ zP9PP?AhX)BO5%T-R)KkylQi&ZzM3M8Es~RSGggt6Lz{bFc23&IDwJ#DNk$HQ5N#b} z==r~}GroC(jRXQcoBUBf1(UUwG2I>XGm_t)WCOK*k}%KC zlJR{Mfwkal%@?lEd~}A|Kskx8yUY1W{Jd)Ff{fEDU3wm|?NQ?C!r?#@$_dn+t3Ki8 zCiF-fv09MI-(UB!+_71npbBp78o=6Sd$e|tPQ^e^Rzq@!PI(OZ>D)m+5=%7l!AzXy zx9oT|hY4d_0wn_S^s3W;*(NW5wF)PQnUY!%@KaLS8z*?kz* z&;CY`4M3Dbb))+(c9Ru~$x;r88;ubHwJf3;MktsgYo}MNOI@xe@k^X;vbukoYtl3AI-c0L7^X@7heBGaI279n z!3hyAjJG*CZ1I^)$?mAc7iB~!)spOGGNCW?P;58dfhztuQf)z5<-HM*TYks(G+Ii&ddmEbwu|;U25+Ee# zRRL3TQms~nB$vdOeFii(sm4Mw@6*``jrsuDkSn{))zI~I7&)3cn|?Co*Hxit3~Z!Q4KcGqcS!DMq#8gY7vFNtQne8vdYr z(v8>Nqcs4z5TAZJSvF&;DFxG1d4gn9`bOh+kfvo7$|Gz1lg(8`lv{l8L`}re^Rdx6 zo6=^W?Mc-P;GOOw1bO$?q^%o}Ogxa-ryg|rUd;SKJs_Ef1LorgGxhMRW7|X2FpjR@ zmqF0#eb|-Yh0?7DZMc7EXeF@p!UB?6AWtN{>@(mMf8L1K-bZ7xN&K+V$VrG{5Om3Q zqSyBmF?lC=Zj8WSGJ3H4^M{pY-!Ou7$#+UfXnkC1<05AZ(j{r+Q0#tS=`&P<9IG%` z_6xNBOz~PKy-T`WJ^;sg?~K3gUZf%bIqmR7ujlcfK{(NriYjq__o%cVclzEYO;l5G zFbUJy{0h^;H%yL0jUzr^G>5e;sxUA{`xOc+S=`OrSh}f-yj-uE1<3r!|=aaQZ zm)`lx`LURBQn3Z@Rx3OH@BKo^1;8-Q#97{bPzNphgvUZ8r?=Q(53=Q}KYTRfN%U4F zVV5`)^7n%*U}m!HC5Qz;&JoLJRUh?m%Qcey`$#w(iwjrAkw$tK802|4mLKQ27}&?Y ziT?ln%S3GBLO>uVYkDkisV9+6i?aDybresW(0tg==#aQ z`sx1psi)6#?aYO5b^l1t8i>08Ea|78*!uTcfRuzN7lD*vdmIn*yoi$}@5*&$s?|d`Znn54uP-A3e5Zis~iN7K9q-I1{y(jD@9rh3}7ConVz5_+(IMy{>j&SDCWJ`5|i~tl@^AY zvotS}PorqYDtr<$%^prUObT+}Ns+t%11i`vMGYMcRg5A>*}Fsd7i*bN!~O~IL!iOU zwAQO?rwqWDz)89vi4&5xOm1U_RI~=Mnb!Vj&N` zk4L5`CQf4ykkLmQlkL(@ixJ8(PW8y~sJ3CsM|@->TB_26WA(!)GM*oiCE3<6%LQKM zszIqg!`rOF*4RHbvY)Zle2?P1+cttHieN3r?BgMm30d6I07ObIAjdz09uA>0zCcFy z;UQ!_b06UcbhBpwCDDD&3~slV&whdcYJrjsq2Y7rm46gr1vZ>16$H@xbv!#_k>IvU z03|gxKVoamuCrY+xRvNBUWyrTHAcwQbKk9o@?iYlc;Uk$UDqmS`bLIJR+)}L3tT~r zT;!NOTPI;e_c1c%f2c%9ySu(;zQi|2QeI1DBuRwPdz6@rmF{l7gGG7Y6!Z4}5tC_i z-FH60jO59iV^a;Ijh@R%W+YN=qWGVkw9>-v9?zJabuaBi`7$0O{+6j6Xh#Sp{t7=A zD^fCfYE0IMOGz6z$i6+9V+T#}A!-n}l0fi)I z<*tF{$4e$qe~X~4(dj2kss233#LRqh5EpV5W|Z?elu<1#1*x*>XoVXRgpL8j_Y-p|ymYS13ea^SU?6%}OHoWNx{QMB84f=6Q`XZJWlokD#08of= z+`(q#XCztbZWP?u`_?Pv2QGX94IjplWQNRHrLTI;WfF z4!DT%(uSdHyeJFzPtaVy06VfLz$E{RtGHVNG@nO?;>G~~ej z(nr8`{kX-`nd2K#a`tj0Urk1p=|5f_p#M+(_cFkN2V^Md|7dh~~ZFEz3k6q>j zxskXU#AXjn++g$aaJS0&bks!L3pE~)^rjfZjl*o^<4aCBshwXBNFvjpbJj0{#&mW# z+g9N&b@rJVZiCX7u66J42B|klXULm(j~<9c-6dZdYkM);nJ}X+%@C-xC!v=ug%0p;&8Af(Gj~mIzg(&h z0bK6^V3aIyH(%{xi;b#=;3FpyALh!tq$|bkky-`La3hAtH1e>;`lyOJG7veiZgf5eHmA;^PP$UKi1zW3dBL*3Ox7xMchd*BQ2)d#T>$StC@o#27?Vd&Id7v_aBy?^Pt4!LsbtA zpSK!x!XL62b)Ns4RRXC-P0l<};%17a+|5GwWf=?if&_;{H*X*EQwU1UO$|Vii2%>} z7AQmaWDml8_ae;MjM}8Co_vLagep=}l*T1dhFHxLSBONpK!E#ZKoSws?gtLE(Reou zYqS6zeq6|OY+mRh9D2fu17^sdOAh$M65lPI9Z#!>`Y><&;v5O$Bs$tE=Ylpe*a$8$ zUf;XA#5>=ckEre>r-E`UQqYU!z=IWKWrt~qfz%HhRTA;I<{p^1vC|h<@BtYWuVlipzA3VB}1F^&J6hIlM2{!|unN?$> z%Znw&KuD)C*mLqyI3>msM{AoHKf@iU-iuM*>V-MsY4nL0G4?J8P z&z@us(y8uYH8hSE#|E;WU=9u@CA+&(yU zq+w4fi-gG$nw{}a6JL^farFcs5DQNxBv9SALN@A7Lg4)-N-{Mj@priOi~lV1T}kBo z@qh1^4OK(3-NfgC+~SWbTn!=Njz?n#`KIPTfY>eNq2-HrW(syfZX94?LLrHZ0LBLf zl8nUt0}Hby`c5DM4JGfnn-wk0EMcAi`7v^KX?eNwrx_jC0s_eVtUZ)9p8E+KBZ_qY zP+HE6vq#3q!zUSlq>Hb-FHvKVKz~=4Kmbm653zs&7AAjmb}@{4f*}mGhYn`nh%UPY z0+28K9)90HySccKKUpQ1PJ`M*3zK|;^I6&+`t6bi1hf5#QZLO<)tp0Q+yKQ<5N8Cr zQ+F|3&;7{49B_c8$4l?MK}U7Je^y@Z3c_Z?WMANQJa#Y>Kl8kT@`s<|#c`vinF5_o zR6)nF(SPh1Aqkx5bngCWs-G6~_sKwtR`!H!g8pUJKm=BN?_UNz&Om_$ zCbOC-^H(A83*bN?{)(ED{%{bJjMcsU{>7zm67CQ9K!YUS6hYPD>6oN&-RlOn2Rg9& zcYpEhnGvb#mfI@IK{|+!Zo&Ri`}3_5xr8bAk1D);KnA?=`^U@-x>k>jQ3=pu*hbZ~ zzW#t4MJfTIyVNQ;x|6UifE(TTx*G5MZSht0hYjYj#Krl)dyk<9CRMP$*Yd~EQ|(qc zG!p949|Z(EK3}X=?DXxOnMqhA9p&x@;++Xz>?Lz4m!}IJt#?;XwXnqBUHpTOO!5M7 z;@#>N%~|UoJD6n$=%mHi0)F$y4(?{+ABzOoGN<~XgYV;lX?3-#dlA>$LkHjgn?&(t z6>(~Lo#xQ&RaPP1neNsytK`RUK~a0xonaNZw;{7QaaJ zvC5wKq$a}{ScWr`MfDbm;?TgD@TFn{%dHSUn175qmeQk~u(TIc@1MbzWQ78aa} zs!FqC6o7`r1{M!z#>a!BvmH&W^>R>D6J z%srCjBsityOFukSJKBnfzFRTxy58a-Nsdl^(i!hJb3$`8tdguoqxeBE;qcrK0*+;% z?-#0^RLChzhcm~q+GJ@ZVG)j{;r<}9hS21=BOl0;#|OCsx7sye;;;+-9*%OuNg&L^DjqS`{gYL)L(Rsu zN&|xBrDhd(7oFs76~zZi?U_8vdpv}N(BicqthwlVR{5$B*7I#}jH6@m7>%%z$RB5a zPjxYq>bZr-_IK|mGw-bqqs>!;iQTXuffl|&-f5?4p4f6+j(Q)2tD$H_ae$g5iIk3m zXBX_r4s7eHSdUkE0B%6n=z8gCdw=hx_#sJXn1OMIveKfzy9F%JjN0+iMnq04KbBV^sD+_RzT}F=;x@t5(3qepPX!{qKbR%4f6YFSoMu*t{n+7{ zi?C9zz(ZrkqowkolaupU=~PR)uCSiMbM6 zoc%vNLEn8!7yn&0H~~z1*hz52L?OgG0~L;woG#X{LKT$GuExu-`)ssLSABX#LiyR)|~NLgH|x%CR!37AdrI= zKxKxu`}L*OlBfTi~3P3Nq-aa zVf9n!n=^Vg(d^av0wfzFIK5Bw=;ka=euaH;51=xqHJM^rB|*a|fnX*Nl)9t5YEdHH zRuGjDv)*$~-1h9c*!FC3WF23KJjvXHA}p9WQWA!p0IJ zr0DY`6?r+An-5J1D3NJxP?0AL?=SzNVKWHx*$OH$YLwdYn`9z(w>n*-5(8FdmuW3? zM@}*)+3UE4dTlI3n^A6V0~-{7_KwL zYQGa8NdgryMbM2wZQV!ndnuh%)aUWWbdCw<+<7jAanPriBzgesd+VH6#QkoXUghHJ>7IrO8HMtT?_#TTBC9O;cc%f` z2w4SkUd5d%$>59ovTwjr4a;q_W*~T_T|z8bR#7z(coQ(;jkocI<|RWFJTC`@K?4#y$x@HYluQ>h|;*M%p=x0-_k3PG`Ly6^$@J z%hf9KHNaKB{uZ%)s8X!bJ~{LC>o~?C1skg-hq#i&S6^QZS0`AYCN9{s{E6r)`IE5D zl}XDXW^S4pQdBv3L!*u=1}FL(uTKbZnbf!ysNuT_Nw2-l%j&80L=lX{mzgespA;YE z8x#M9qx}5fl%PHC2DHU%0kkqHer?{3%4E1wp{0e7FkZW<;(sI05?G*G+Nr_5Wwodq z94D&yHt)rqR8#sS2;gOpqFAdy5gw|OZ6aas#~ZAKiTp0$`}NB29e41qT4kSrSN-+x zO}9Z;5=3G6JY=I~_1=lo!K>Ae1d+R+SXo7~K)<}o{auoRa*%Zh5e{c-AcN_+j8qX0 zgpY(xFYkJtIXo=t<5OZlM3x{h7-YzO48QS-qzRj;HnQt82pv~HDYFzmEK5?E@3pXN!H5Jgc$k}=-7`j9*!o)lfjj@{d1Eys zIm9ju!Msc{g@(MLTf?*C?jP+dF2^sG1s)R#A0H*E&E))q9&r$C=;uh^75RH;2PgT} z8DoK_$q$E?_y4S&Tb3(1t}G{1t5)z$&VOP}Gl0q(K;LtJsI_d=sFN8a&jdwtCQ}4`Q^N@6pMvEde81YmMa)FM4wCF-8^__cK12^fKQW(t;TjKJX%j0pglV{#YD#4`|wNb zE3yJYXV94jxVN)OeJD=E4|nbVro7#>P}o#BI4aLN;gghaZC&4x3;3OCjxOwuW2 zy%>S!T}XS|c_JEg9wt0V=AAw^_S3=8oegQgGD2KB%6J+Ye&>vZv+!&lX3ss*4{{53 zsX^wYLC1daRXf_K;uG~&nY^;onm>x9iF2GfP|D)s`LdsmQ0Z$*bOXIR4Wmr0(J&c; zV3rc-U6L(M-aZXPb~=(wksukZ zJY#%QtSrnY6JnwQP1{iogf2bRl{u1BdEW3rCt!CQr@o)yZtH|#!9eXwum#(vr?&%2 zeV_F!__{EFlQQGhn7i+j--@x>-d1_2$1MbN*P!4MPjw&N?MVc&GL!i^tlmQ(a`yy5 z(!(H=ko12Ex(gH7Lyvy?Vhg7re0mUd?k)24kOF;=h*oo$?#*A{pQHP~6Z~zFqb9qq z`ShL5tmlN}BI_mH^$9%hy(3+!Ta`Yvl6)g0(m}M?-Wp*jEyZ}qS=oW!Rb~jf1%gPl z$a;)O2ERLt!yNpzpS1Ug9U*ij7`aSjl9??MgJ{Yw99dHfyq@o=cafEM!pyApjiBi< z`?!V{{%DrnVrPUX^7I1mgu>fE5#cD}Vm{X=b8hTtc)*kXR5709D3G0EjF{-CAr0kb zDtQaAQ{+yg3nR*Q8LIWwKT-F+no7`J!QkFf+ITTe(F5FUg>XOnoK8_`Lod@1HIG2q z67Opt@Cn#^S7R`&Vp72l_*C^`diZXo)gA{bIR$33hiwwkpw*#QExQaYM(r%=!>Yka z_enT^6i8fc@kxQaV8Kc&R8w-rjFK%FuKK#U$A1J#Q1{i?2dZ?oc?v$zBirB|ycu3iu_5LE0ZTbLa_nv*Wt+TnBE}vB5``&*uRz%jSHE{PBI~#d;k|Qv zplo4%l!z9^dcy8>s3#U>3mX1C_}G-$o?!YZ%9fPtFO~C^{yXaf3^h@xJQCwaNq#z1_n=5?Ve5p@E#G0l|Q?r+0{b3F)r^v+d-Pom8m{ zdSpN{B?bd{hAfqOF8oY|G3yeP%IuVgqnz2YyCR+cFgvBHr2;|3b6FvY(bp%g7HIkX zcAp2Ua3XIqJHXWz5MF7##Kh!G8m$CX9Kh__vS@y~jV*|?+7xrbSrJEkQz*5?dt=@+ zXKJJHxpDp@-$tY?hz<4(>lx?_F2CQeRRZ-#hB8y-<2OXnYSE<~NrAE)$rGz$?gB?U zJzzYRBTlzZFc?#UGvf<>X2VaProUI*4o2khjEeW5Y^-VEXkjYuOzRfr=rE#-QbibN zuRon(HJs%H2FjFWq;+?)-}7{m8H^Le;$3X)i|l9kVLFLOk&N z^-Hbzk!H$`MqfS}yO@1Qf`&t5@xw-3QlVKqw-B=d+}OBP^z3^-q~by@d?Yy{7Gmp7 zdew^);F52&=Apv!kb_kD!UjM@wSc0SEX zaQ5fl#*)L+2-cC+`%4HuEf1)OJ^<}xLSgUf%Fg4ZW)zPwjhld$H&lT2LJU4xuI%AP zKw-)3ncuJ4nTo-*w@Skb4D1W~U|dJMVo+g80713zBPw#VkF`Px2Z@Qf8eptJSKWN+ zY>o34(f)l)}VX$3slP=~EFTe*cH<~yAUqGP0=&fwNA=Z?a3`9SK*eI)= z{mhpsAndF<>jgVF=&gnie)()-X9Zbz#+Mgg^f*Zt$KXI7Wd24uE=blMzZj4W&hEUc;qYX>fFW_&AYCcv$9%J-PFyOI?bZ@*Pl$9|9aeo;s zcrT9O&?c%yg!;63bE`;`x-0>qtf($VjA*cV+^4q=!DZ2Ks>B`>vN+LzeLjV0Ji6tJ z&~WyLblR$1aGeh%XvNlm;Kz^HIz!M!vXbao_AgPA40!CYGFP_)(l4_pLm~48Vzvbj zGfywK%5!~bn-#f=R~ms;iE5R%d-r0^Dq9(%$sZT+9$Y4CS(Uj;;)M>3%=En1&)tzv z5wiu6aqXG(%KC|l1bvRkRiM55Jfa{@2Edy=iXY2=i68*PDd^@peHDqT`cHc#fFVwy zF@;_wh^ss&CvJ@lRYmFq8@2{~T)j=0fRnm>IUOt)~kL2z`&YV)dLY$U~vc>4c(YuOGJsMTw5sjE;+)wpB z5^7YD{@%}hXBatgXM%^j*i`-#&3;yK7BWTKfm{V1JhP92)W!vH#otS#l=t5wL>s>u zI94{jR+&IA1S}c(PU<%zlYpvrpIhYx!sD0eEQnJuDt`{p#Q9R{?{fh|>#|yz_U=ea zBmSO^5Lm$_HWkmx6TR<1x1;Xp#j1u{bdZ_nPec(z!zMO$m~`{24sCoGQe>mD?ID9T zt4yy5Jz_Ij{q{){i+45rG(Ol5J;OumdlgwT92--pl!OzeQ`9J~3d_`wcKvTS+w8+>E8m zfi*A(ZFhfg5af~QsG3~VZYsifd@3w5lYz*Ve7dn<-fiBGqe5207G+)yF&Z6rY|>q@ z*D%Qti^`)5SMB5Apkg8QC!nbs@k-<$i42;gT5k3aoc6oj#z%bOV0~{*<{{HiDUK{X zUrMu@d_h3GM1yd3_4+tCh%&hQSQ7~UVAQ)qtG|tca!x zezWIkQ6(?=o8s;OpR%BHQY=wz%vGDQs#NbYpJrVCS^@B|3y0iOyx}Ym-d-%N&>?W} z%RS}#+A9$(9ID89g?(xjonk|%8r6IC5><|o5A^B%ygBv0*Xm%$Lb0uqjyA~uj4A_w zfg`nvKE>^U-zKYsPO@2{S!IC4B9Osv2!dU&Vvg7napJ^8pMlo6926LmH!S;fFjs0J zw^)29T)pJUOE*P}46`$<9e44Lu0~;>d6tdKs8)E!1Fx3w(+Qcq1hUfuDN)Ql$*3^S zIgMI0n2juH4qcz#77ps(Bl*W$Fm)>pl|v_p{KW^krxQ$jyabYYgMl(J96 zvHDyf-P*?leF%0kM12O@REhqG95&>0_*qt4CD5jD^TKzHfg|YJRXQnCG*MkXV6b~M zor>|EFy|`F`|>>z8ugiSI5gPOoQuIL&5x>&Y5Otat%5{dM^;h(Gp7Z0g3+}Yb@%0; zqlSi{>?6GtF9X|vd{cLiiskXZI@#{E_y$|@uG@$0r$xLAiw!0`ga9o>AXFQFYH$8Q^n+_SwW4ZLK0*2;2&Hnr z&dGQ65j!&A#|5F3|2#neri#h@K8%45LMWws5giH|jO6f4x;HXN*_ROHJF^;D$H0*= zk~U_>(FCH%=()nC5J8GkfVO*9k-X9-Y=IypRvvZ6tJ3)1zH*v%kESYrDe+P$Q)VDY z?>a(Wzh|Un2c8)dydS*Dpjxq-Mv-R>F?8P$LCV&4MjMSHDeLr7hXhhZ4`sgJs^%C2 za{~7P&F+=) z`^lv8?lS^IdcWrbZ1lXp2&0LHaX_Q@{uX`mK1lwYVG&$%4yQ;h#MNY_c++tz3~Le5~aP-NVt2Cl4YQ!R}^*Jd?xI zuN?;O_9@>JjDrx-u%blo(oQeuJuB}2tR$!fX!L$LjP2fY^Io?ukVBH_WSV)_uSz!& zRba7tuT7*8`AhYrwt%?NokH<@_WN^|oOuQ`vO+iNgtFdq)3y&Hpdg8&X1;%T$)8LV z2p$)jd1A1*EnwM3uBu-pNn={RI&2P)Ly$*;bh z7*8C6NVqlWO)1k0)B=008KyXKpJ-w*?}qw>eOf1i3KOB#Zx9d=BXak6d|zzvMTH83 ztI_px9EgLi^YxG?3s852X?UpuA=nlf7FD`X8=ZY_ONFDOU=tNOf&3)mfxSwVUiE>y zHkh|DoF8vH%wvP7z(w*+*cWfXh56?VL zdL%Bz-9*WAQ0H#?&@e&*by@~IDUU%?%bI)aDt6(>pUo<2XZQQT2_^7#&G%Y}n(T;1 zazX)4mx!R}Xh!BM;`be#P{S-{zVv>j6(k=Ua8hgGvbMIedJGEy)nc_F4I-%QohI)^ zz)>hbp@bt;8ZLPf#fV16et<&n!iW>-%M)<>Q0fJql!X0-ayQo*j9iSDCE!q%)zN}G z%(fby!+k`_^HiM2PBXSllfAKYIFX$kYCru0d3r{7O%tyitDHAdYQvF!7!MBY0@~*m z4Kd#jJ`%;<92V2KNKIL1b_j%4jvl)eV{%`dgIWO4I;SKRSvP$s$M%*H+11g_%XLTTF<-0um`Q#TVh;} zGQL|SlWTMSiYi&sCfjXEpOfwF4E8TAt$VEj$|%7By{GQUel{CktU8DrxCiWb(KL>U zjjc5B=qyWC$0GC-;=m9;UkpBBv!;b#W2CBkXgr;|m=&=UptK zjLk>DKFM7BVn54d;XZqKUIptDS~gK+(M0_S)+NRIvVY%JKMt)sf$j+JnD+3=N%LeaxO<~uU>CliY2Qa&Cw_baG4iD#kX$@160$-Y zZf0}cfi$b3xK2YldJbe*gZa`qqg(A{<>JGODs60L!~U_%XXt_?qgMeSR6U@z!aNVt zkvM$qYOpgw<128TXg%)#5`PcL$MAZ(+&|{Q4E|aO@R?F{w(4Ui&66Gp{{8&PMrDwM zV39Nh^k+F7p;zcH8ZtQ%$1tVtQANn9=B``SbG$+~$<*ck>j@w#h@I@Spw}fv9w8n{ zcYZ;i1YZI&a!}NXn_GdfWUYY#l0a!Jcz2Ovm$|S{!s8_ z-ZIFeirWx*lV8pW{)2Y^>weapl)ub zS7G)6aE>wwWmynAIhPqwln8Sg9|ica+|9$-Z1o?*94pD`Qmgn%?v{1bu>LvK6v@dt z)$RWk_fq+j=_xZyAljZQknX@wiNR56}Z;}_0_9c@O#bXLA$emz`xT{gKvn zm5)5Q$L&Tt%Av_BGE-bDJBRQ``JEB;%eFB(RGHxHpttg;j$UJ-0`?%)JTBAxXrdrb`R}+Rc2=|maeB@^nY1^&dCo7U|HxZ~A zK0>+gA6TvG4FnsSc8z1MyiY*|K1@TfN8SHZ+32b*@1KRp=E&l{-j)Zc0^x`IPsc4wr_MHUczZi|B)y&g^nhaQ#2U28$z zBrl3?Qv#Lw{sU(Cvn&lwgY1p2TsiHBuxnkef|WCt7VWtFop zsW&aEhDAtamyIb9yCn3RjT@3Vwg*;uT-}R*Cj0pl7R=<`Dxs)o0<&t;SwZ0-8&hOC zlf|f#L5OEjCTBGZWV{apNsNCj`(??Q>o`lB4=c^Zd_Uz9gYLqshXpwi(}i@a&0q_Ek8{in<%XQNzVLmZpu3;nsqE`ks$f`}n%Evp>ao#{mtX-Op>bXX0Ge7>ov%AkCv zsB|6NB&)WkF5KMn-1Si*z_vIH+{axtP{87S*(8M{$)*k>`mJ$!RTx)!9*9v^F=t@_l_ICW9JSiNgM z4UPE#&P3w{uc>=R<_S9=p_%ye4ueHTW{$8`72NvJ#GS~UGK+|JH(eCRU$rVX#5Dwv>tHpSj7oCE`GVU|B^-$}p$|z|z>&=Y&wu*+!5rO9UVF zM_*(c8K;kV^&tNjG=p3f_8!}*tlmo)VHBrWrU6H|Xx@2~6aA-tNdzTt z{O-uh`^mctUgasFle(A*P}5NI1?}7#ieQWd4|06>vxKMZAW+^P>iF%sSm-$PAH0&x zaZJn4sIpL=RE7}pDHkHzo-T^}-w4&F*93EhyU?$fq((c6P0WWxiRyh*wWowueliiD zMQjKnS<`va$B!*%&Xi{gf^dLf4j@5Ni57Zd-d4)c?XY&l_z_J*z8T%{Vq*^)P_p;wlo`_=zGztji?81M>b1)H4+XUJgtJ9qQJo6L# zncMG8dhX-2BQ>E~U{JF(X7%ob zgFqrFlBQm-2^@jHgxSE^GF8sLuuA?A$@h){hh~-ds`ZexJX6R@^OQ<34q(rjkV)+M zXx|xXSRLr@#{7Yd#raejyJ&tFEtP$qwXN~g{@lGcdmlW0&wK5F4TQWfAd^Lqc2a2_ z@Yiwgw`mpNvthVdMK&{o3BynZ=+jJ}7>#5IyF~C?1#}J(=T%iNb3L2y|;``h`StTb7_M}DfUGA;?Y>OXq1YC3$kr3VGa6Xc8;~7ryp)5!{Dm%2f zQjqa;Do&Fli8gg5MWZN+%YImJDc@wg8oK%qt4BY*pRhVJ5=0tphm9Q4s-u-|)XWc9F+ zCN&cmb_2@$e6mPh52@opip0-MKHCEw)1;j8Qc1D7U)T3MUBw6m6iy?m1)>Oh)JHnL z2P(ra;W^Sd!=~7u@s|{XE`z9=ZHi?e9$rPH7hB;SuT`h}7C=GAhsP}o25ekT0ML$~ z8yT>qX&6*NhC`No2xZI_aK?iLX}ZVzpa2vR4g4i3k|5f9?dA_YbRPL~{eui3CBpK# zrzez<`<3oML6RN6leJpXF-;7VRWvFOYk*^Wfs*bgSdW~DM$HUg+}>n}BNVfG&(wE~ zOW&{KIYLkDPY_`>?je)_*WMs}fvky+yOywfOtC$mtglazbI(92UrAp8q z5dih}Gro7mS)e<5e3v|~GhP6?ymuxKMpWjAxpxMk!S1Aoa9$PJC}+d-^V{Pi9c&@E zI1i4zOm8O6=u`j6*T;2D%kI9DAI!KiAy_kDkhpLVF}5GfxRA&^1L)W=YTY&Ap^j;z z5<_^behe<^c|2l#3&zbzWxSs%S>EeaWwvYrx~WR@_!1Xb?G$j%-0|8Ha;N@Yi|t{t z84jW&_@tHmUNMaP>mE?Xfl72`oFhQk`(dIF51wNIdvxk6l2*~s5C_kZ{`#ZTuzUv(aDcSD@cfZ|7D`ro#)c;9r#F3awXDre<|D~mt$ff%p9-HCb zy)P6B32em64o^9&^ls7k^&mD@1IqRb=%C}z>^ZQDh`sODCc`ic_du84qsj&XsN{UG z;zrci=hyc+1fZAmfW+u}J1u#ubl!nn^&hVI!`DrV;dA*wEYluyn0u{k(U*9~+2Xa5 z2@vdY5sXYhgaiv88jIuQpzu36^d^)MyL9^jiSO6U-f;z3aS_`I8U7`#klI^ZS+O4+ zFuE~5F`Wg$2d;;JGFC>88E;haM39B(!J3Wr2-MpTS3I#5`DA30dk_=8bPs%QFiO1U z*wEL;nYBLVaDh-qpU7&_e$*aRn0XvQ$q8P(E5?I>ekNz!e@^2!PA7+8kXJ>+h(hiJ zcJVIt?3N!Fm~g=RRPm$W;)I{EGKGk%h#chlu#2oUDd;IO$&CnPiTl(CqP3eZdWRmD zFs|S(-tU4h|NUf^fUYT)s(`~8HYs_;O8(qDe#l`uclJXH;}%1M5opB`;m+&fh&knv zND^2^4<94b5y>c$3V=n2Dkip%C(X+@;$hC9CeVrv}Nf}nNTw<1euVlGZ5 zAV6aFR!}mmR%a!3z1MOPZ5?G$4q05j@1-M!&d3da@DtCm`}^{#2(Bo@83?VLd%d-< z{jkDDB9d$x{6tJh>p_LxH86S#dSbWv@FC|}AKnT?#PwpA|V5B+|I zi#b|n)eb!3y=45q7d?jIjO}LN5qa#BzLV9C^Nv_rt4?vVcW9^?QE>d|#3M47i6O}ub_bs7%;sotcxM6=x;kC&FIkGLQ925loErS<7l89P-_sFyn zGtBiu8~HXT;S5$g>aH;9#sNKq=#MW|U60XMa3m$C0hg#2C`u z1hBv(eJ17wQ~zjXq&h-)41*26#nK=13pDdbn)rK7+2S7hVx52MPZ zD3JVx!&dMkFyg6x>O3<+52kP@oodMhI=fmjg>6@4)kOG~y#SfQi`|vqEp%+0 z_#?5-9NC%eyG(5%RB#vSi@UvN%lpk2nP?cSUSkqE@kZhJ4UN{_WMz7q;av53r(jA==6%zE9CY*Gog!|U(s^NjK-(*`Xxr+!~e%!%d%!3G4di0`N?8O4!PU-YLP7y=ky#BW(<+8ve((FWL{I^qF5>$D+TAZN zBj8tX>&e)%%H9b!#Ulzgqb&tO>hwgSxMHb+LT30Ckv3G(nDbDY|A7XpE4NBkM2D94 zg9bBN+#rQF;LjI-f-{T&l(l4sgF@YJr z{C+})ifb~;{u%*v@3jQ@4BBm0IT_Z+|3W)5?e9$qd~k;|6F^`vc6`8;7E#8)BY4E% z`AN+w0q^VnaTzE`Mi=A>h>-#Q100FjJ3$AZsEH!z5IZ-6yRSVA!o3(t=#ak1hLxdA zZvH?hEJwC0_q;=AoUnukiKtR7}T=tYA3hp40^wt1@TogSXF0TCRN zvw5=2hVWEh*^pKcJXl{f=z|M7ET$*m801)GbwQK5Ysa*T-D9#%d|+S*gG^$r-hD1o zlLS?Wu_($jDSl*(ef4`U?cJR`yYq19LHCLw;A}3?HIUrM@L=ifKOQkdCHTG;Nrz)? zS&s`$n%Dg+rd8r+{8^6+j01}KFGWHC@sT~;2jNj##o99Djm^XRv5V&v`8^hq$P@PU zqlh#*{H)cc38M6(OaMa!n=q8j}fcJ=kepq0(K;C;O5_y7@?6n{Ugj}x7 zl`5p9IWmwFEb#qW=_thSy_W)d=kHa~M1J=ziYjkKwD$c#yeCm6T>OL|0bXH8$XjRy)B7L?ApmFs;$q@+T7%c(0E* zj!c8bc7bMV^&^lSI8joKlpE3Qy;WMFs8cgG7y&AoUaT=zp}+_&&gvwhVs2LS=`0dM zRonj;2C0xsFfIgE{Lmx#Fs((}J}yfLS3eCDkG(=1Td9 zi;!0m=xc&w_Jdq9e)?>42P+BX*1U>e{MHg z1dVYNndlRS-x5>_uZ~vCvWmm+{?;GHvbociY#=TjJXAGNiIRwif$-bvht6u`eRfp#-46;r4o`?m%w&oo z=sduKq(4QGAP_ufk5YMzEn}=rmB}TUQ;%@T!HM}pRCzwn9FdUbN6H4ha*Ll}qX(e` zaBwg=-C9-e&em;Zl}`|qPO(bI8J}eq>u0QH-xdv@S_zb+0WgZWYs+et;+8}*8UPmFAfWUQZ6&4X#(f$CI z6(F~VY& z6gQ@)ZSp=*q*6sh@FiY7lJDebTI0lldE-$iRZ10Nt`>Vutdk{Skeafg!U|L+dXb)M z29;ytK}d8z#cA~}?suP*q(P3vjS*r4N->NofZ!VsUJkw3AP73O$}mJB@B>)l#vn9S zPBOhhki9b@lo;q}@C0JnW=D2THZ$$H#a#!Tc{*q*k6$Tcx z_<{f$Jbc}cPsz^meoC+u1^^zONd0@{%lic5e3?}z&-D>e!FA#1Buh5%%O7m2q^W)y zwCePG=fK6JHUZ0Kbr1JRThuXQN*1V<07`@FCYDXAM9QBWV1-+sp_9RL#OpYJTFQaJQn+#OoG_ z<bXzCG!yJ)Oue{(qp3 z>FNN@d`x#N!ss&+lZ?swK7h`T77qvLt5FRMNN&=RlB-5wEpxhsvvOzB@Ug*Z#6V)8Mhei7aMcOQhI;N+Lk@mqU ztF{k+G7qaxHue5(#wM8o4PGN1!Qw{#4^Mgb!=!3~`aaMVzl}&EM`) z5BlA2v|t&tYkfr9NsIa(-tNZ{q~nE!cDyqs3llT&njGX#RP)nzOd{)Oq`J=nBnC9C zCmxpUa&jklh6T+S7u-yar@2Z@tOBA8$(e`f_^~Tl5|mC+1bIN4;~^%uoa!b2l{kAl zg6kcYI46=IKLS`x)bmLc4STk^%(Mt3@%^}}MzD7b`;NNT#m8}3gAdwv7Fyge$|f@6i3=Cl4;sX zH=*Zi0*}-)00t&Ju`{iF2X`>5Y$UDTl~&}!$d9u!ahOg% zUvL)5X~kC=)L;y$J1GxrM$nng5j5iajL})&U+08B#-1}(vZ>d8Y*FEp)qr`cxIgZf zn6E{i0XGdru}IL$9IBOnHpS^&v&>J$^E1%AUr_=sGVtRy-=O z0?=9AUw+02(4cVBU0lWnaiGWv){x(dypHRwG5&7QHR-(PGn+UbGb3_% zSX`!6`^fG4RqxXaw^tdlWyevrg5pgH)&{<7ZPX9M!RH`5uMYVep!_C1P`%OgcH z{72XmudN)@p0-WOB>dwsgZul5QR{KylQK!`7>ytRUIHR8d%VFK*W&#mWZfE7bI+mQ zZ*(>kAQK%#wGg+^QrW@Cj_$(!iE_a%h$g$-is-rm?I%i)RpY zUZf}Y%Y9XajQJg4FSg}0-kg`wIdjDtblw%|nEg$kK^)Srqll`2xQ&OABxQRmlmMZN z#_Dd>W)^c}&Cv`^nY6tK&v4LwJmjq)_ZE%@EjP)TZPIs- z43!jbv;ZgFH+!rWLU~4xNc28ULcZAVh6ABJ|CQdS!l8mMPXhwY*l4F{eIm_|Er3!& z8eJ)ja;c>0AzGB<6M0|t`^h@c0#4%f5$*?w| zkWchKgd~!Q7Dc8mHIw;eNESP|Q6yRhpTKwsNf;M|mx#e7`jDWF`V>11(g`K8I)VF~ zwVqH2_0EdJJP2KP3q96r7PR5BYL`Ulo{2Q?Nt+m4BIXK8F1-c;_gSs<@^}2+@vmvG z_gVGSSo+LN0s(a^fd${dQ)8KWw~~^J(0D$~Dr*)bK?3%y@|Ba_H=agpR>P*ZtXn5T zD+T$@HUSZq;$54WwItt_tlm2d{O%W3+9K?^pJ2{VlqtZqdXC0m+Mgy4FEo0SVBK;w z!O^r*#K#Di5VmQx00{46J&7M(1L)RGnk^CC>y5BncqT~R8X#PvPiAg;bT=8o?OT?> zR#g%{y(8D(#L|}_+(Qsg%POk9k7)ZK;a1#_r9IjsI*Hlrw_qEX%)(O)Sxwu*x7>x< z()3_n|CFKk&_k<6M5sAK49Cw;b4o@Q)(?5LjITsaJvHl=Qp4jIpTK<@)e}$}bh6~7 zqUDGx(^CW7ej3|N^Oa8-)-7YQ3@BE*OV&0sA5pi>ZSi@uM`V-OfSXlm={u>W=!x$` zfVC!gwRFkRL5!@Tucd#ntzsqa3E5HQe9wsYvpG>ErTow;fAVRRE0|ycXG>G4{j}8| z%Si%J32-Bk^gB=SJw5isU&|Gycdh)?;u`^i*D`W`B4DxgKBf8nIfN)jl~6J$;^k@B z=`&2$Wc*fwRc8B;aHj{+{1PMw8?*c_9b|d>S2=*sa!@{Ai7;L&#DLoV< zQm!2s-6|3lEyH{+0>0>P`)gT-56=DbvnP`2AcF zlbKMrS5Usd>|{tIRZcF%o1;`Z zFKN#M*zQ(YOItFFbZs`{{J&|nKwo&OEzs5*eJp9|5Mt+|J=dSn^uVm);AruFb)Cre z@=U4-IF>9oRML!azWu9KQf=>bw*w%H&xM24&pOK?a!W6DT!;KG=ha?v8 z1<8$wW8pJcB#WEY&NC77pQ1;h^0Tpl7D_s#uIiE$6OEV|$Cix_>)%OpB|J@K)G zpq*bF0Voj8|J@JS0ajxXd|XGq9~B%RV3%6OU4B+=8slI%tfCa-u=D7PsFk-mfEh_P zoKKQwD7%Fg+j)doB;t7x`UIyM>vjSWd!NAsu|MNFH;jBIt1R*#kGMx?1Vvdt-&N7g zLEdWn;TaF7sv!s#%qU4%&!tZs%SIJp74!$uOXJZQS)HZ;(?eQ1B+BoXD=^VhRzac% zEhe{pJcvFt5kvX>67@JlJWJTN0yb)7Cui;m#b$r+1Q!+3!bx_Y2@Tdl|u@t8aUBd(a+j%QQ3v>!-gCSvQrBeoYt#G+cN*7tvKFn43DYUHK*D^eQDKWr4ltDImt=nww zIGLYg@25G5eMR@vgSr^*~3@zQsdgRUj{<DS4WVMJq7Se&sB-ki~ zG%W^TXnZ8L(ypeXnkh{nvFnVx(>!teC@a&SkUe}d&_%W)=j|a4Ld-zUHF}m~5%=KP zA+koz@G*_P7vU7yO5X&vbXIYaf^}Yjd!-?O|1v|ih`HpAtw6SpRJW9j@50;$kk_JN zj5Ubh$GG&nsFmck;%hsxJ2?g|)Ay4Ti{hvqpN#ua4?H_xhzhblTRa@1?|tR)+= zDI$PWEbBBEqGb*pqgb@T+rI*i9m4j1M zQRJ~)c8mD^nXEm$;9V;i8;C1qCQb)9gx%Y?>J#l$s|0Q#H_Mn#`gTAA9(|Qe{1LH5 zm=-vUYi_Z6{~*Art2}@pXSXI1wi{P_^5D+%sxtyAg2?Eq+xm~yf<)8%DBz^dS3oG( zB$2Sxd@XqeWbpYp(k{i%np8uqr4Cf&Lo%+#7%`&Vt?@t>J6H0cwRaeyoCN*xxP_q1 zl1=ZsfhiBe#%`V);B?HWB6~kI#Pwv9vbS``C1Ta2&=xHLoCTf#p$NRBe@z0-iYX%x z%B3J^3;*0Emwn{$WjZfD9=%pVR7tZ&ijc9toC%9FABy+$G#n;Ffzgye8)KW@wOUp& zGMPn8w~`Hh09Fsj`hCvJIL0bPZf62k?}K86wm=?V(TC4=O5YV^wc3)JH+a^8SUpzJ z*}z|x6mh^dM3M($6=LzdFkWW*-P|5zm+FvKj8L)>L7!^d>$H+c3X}Z=P1A zVb{@%Wgo*Rdck3~N=UD*_9Pt~ZCHd_0!f81QbyRr*yUgXzk42zI*cpseh|XnL$7sH z#2TRC7U_QX!Wl_*fa!3b!b85Nn@KWU`eRMd%bSvkz@RF>>B-aK!taEM3?AmR1wT+W zJwPHf=mD%x%cI$W() zBwr;sFRN@k%>dn2=}`fQ?~kyxF?b9ABzV+hZCFN zq<#uZ9uR4`CTszp)wBQ-7!$?Q*t0J%zmibN`0WqrhUBJnJ3Pl~jX1&}N)+56#5fNi z_f;4uAogGf6b1Sm5?O7E?GKpX0g3T6!}ghG`m~(|pe64i4k3h2FE{Bltf1(HU=MW; z;CGhhX;G3~i4HM4O?tx4iX@@lN1vPm-xQq&Hl9rmD(mFl5&Viy8q)>wJku%%0i?`3 zs`tX){Ozo8G>sZddaf6&tR@LGw&28DZD9aeWG)bJO^fhHcAB0LetXFIypZVt;{&cS zQc^UIK^JFaU{Li0MKCskb5sT97X$|NZi%5gtf+Q*6Uz-c{TZ}JJ$&o8%KMuM$Su+` z8JnK0@?aw;n-f1xmcxW8LM_=?qy57;7^G7i#rN`CSzX&9-o55Too;lbCm!`kkwgX2 zY`2Q8pS89`m3GIF)Gq3D@EmO+VpFJuU{`(OG!jI?)X3LDsv1ODPOFu$r4x%BLVr*k zFy4=}Q~u%1y^GuZbv(f=iKYi4bB}Wcamjbry#z2?t%Q=e&Bg)|QMK5^X7m+kRL`t- zXyOQ2n>d2qS=PuCn zFk^*HLY0rEvV+8=C+>8Z7w1~T0fqT9?%Nr-Q|=GG|ELnHKsqP5Do)}6(?;BV8c~Sw zni3~CY!4Jqv9m#GzsV{ix?Z5^{k5e3_pIKZMD_;r8Gxn?J{X7O@8x{iR-ovJLtw=# zk?MzehAch+bX}n7T{{thyQ`gMXfT^ULP`1lkZFV!AC*4AK(H3NRoI0!|J-5l01ZbN zGY1U8CJD(+1RDNHHqIv96{0D+w)x!S%vl|fu|VpN`g2MsS$@lBw!V3Du`s+NuP4*I8{}EaGuBR z2eI?BVE<1pE4jv288F4HLr;~V>2x868TW_^BMbrO02nF5aDr#bpphYaR7vIkjG44b zN0*q^d~KH;!+`toOo=6NV~TR_5ZA_DG5M-&;_Al(4lTPK`|I&3kB1>rja-hyP)%4GCyIL(8xjuIZNE=!1 zad1j3rJGcD=+r2F?5@yk2eA~%-hF80n*wYPLDyf)dGoZ4zNYA(t{z=rsokEEpYgX` zYUr5BDySKag1ZW4I0cn#O@`-ZY#rj?~*ypt_C&Ar$G zTB1hWIgJQ`r0nEFnllZCy1$)fr#MoNvppgQs4|PCDb}r`<$`$oUJIqh03>;&q!4qC z$v1m<6@+$7;DP+-lCb{eA9^2g_)WN$Fv{NlLMxv?7_|bIKdfzJro><&c*yD|K7SCR zIy9zmN{X!3Pc=X~C=7*YCA##Cp<5iNMO_WNX-L z0s=jTwh1r?@0G+w;0p=fD0*;?5BpU;5>@{m7EMR^?fpIMDoF$n-YCnljDYtYfVJuJ zD$z$0Dos1)eSJ_z=%-n&KwS8!vwClD`pGGKe)PR4FloBJrV1Mo)C69Jca7Y0v! z1QN??CE4&EC-X|a8)F-?J7}aRKb|mHU-UNI73>$mBkmm6doBC54`OGt+6ee4`4s1| z;L0Hlz00ITrSRovg)rw{NcY3D`k7jB-d%gpLVQcqBB?U4)-bGORqW7|A&7FjsN?GI zwaXEQjLpsA-2x)F_MgGv|F)r^x9HkqW z%2U=xz<(Up1dfv8aWAX&icDKijSs^%7s&dzAai^trz(m<4oc{3sX8g=C^<}-V($~l z%0340!0;6d6h(!`zOlYX2)+;lkEn)=G-6hL{1jpUP(ZK0iN$H7{nb(0>hIA-z%y-0 ztJ(v5n83qP)JqMWapd;HWVa>EZW>H@wlYPIRh$c5O`h~ zUB0$Mn;lS59fP4IbCWi3O>~Y03cv^vTJI+}_S@v3m7t1xvhk1z$5J*2?dxev7w$))32>hmdh2nuvIem z_={h4tKIZ5Rfl5cyC|IeAn)5?>`tmS=+KROuS5js^iIYUH6Xhps@$>+-;n};9;$ba z1y%bLAGy*#QgkTJOwwfXC*O4&SQ6uMs^nqOugOyo`EbNi@cbidxss9= zi%m2ai2)b^2c-{!s=wu_PNfQ0bD%@-R*NJ4$`hfiG0ymb4z1W-Baz3`7cC?JiVX)zpeckEy}1{Du#w9i)lS`a>3 zT&r|Yo;i(Ea2~u1eOf~PtU}cK@{EL72br{y)i5@W=*(XN=C<9ak!{>Da zKqcIDZ&>B%4+1o+^**Ez{irD)bYZ!>H&n?k1Ryh{yFm{HCVqB4!Vqr~2zsxnEg+O` zj%|vlhDw(mrwCBQ81#bkwb;cg3e*6E^3pzoDK-r$V~jljw4#~e*PQ*lZ-zVE6hA@qKEUl4)_b)aQI=KTypDCOB_{$w18Dx+u0OmhT<4Eb34A8-tpa40yW*{GX@-z7rF`1gnlXN+H;MI}Nolj{?boxx3nPStpJ6ID zU>`oiktEy?mIa_JETvRQdH7m9h7cawcuFNgM2-*#PLK#_K_+~i>>C|;C?WR zt$h*niM*DUe2yIMQ;M-rBc&Xj0{U(`GjHTj2zv+5aSW|R>=_(gj&>}dWBpH?;vmPfu!ltOQoVF2WRK_o~HEH@DNuH?6 zz!1(H-DuDw+si6l%8>{>rapJO^|9O>QJ%|eg%Q(FIz=B-x=pe(%`G-f5D*`Xogpi+ zIifsyK%nG#MD;@2D!U1*B$E&xnbqOU{F75d%E9c6KOZt3Gy>z^;Cz;Dr~D1bV5j0J zAZUEEo}i=)mLOzvk2_z`IO&JbQVP5PgE_{i#J?R`olcW>#MaW^;jD~sAwZt)Mb872 zPvoI6L|1@3`53?0zC`R7|9S%1V3@t^)6T?hlRQQS0@oDdYBotA;cZPGfhA>l^^dP%tL8 zo2wCFVX?}62_$HNSSp`IQk4ycH)DM~X0SSosF(#=at3*Zv*?_Xa%o4eCW$%1mS$E9gs#fop2Tk1b!&XpG2tS5W$hZw|I=;8Zz}^T*%NIOOWUqw7 zr>*9r;gzoUrUfJ{MEJ?#;HOX_Do8?z+08+DNFwcpO!J5dS!~qSON&?8xk`QjiecKVuWZ!aD7SYWJSA=sF7bi zC#R284o<67KN^Ye!r*iVG_i9ag_$`5=(^gI#~~3j>%H6jWJWalBSJGbEZYSTPde6k z_A-ft=Kca0UW2H4fSSf&XX~^kg?Ly6hQ{8cf2ky7Uv@8bE}WsC7GGCz(~nb4ae!WTPsLNW(;$YFW!r9s@4*U3BuHzmry=( zDYB1YK_Ca^BMT$6J#2Gm!ObH>l0aWZA}|h9QOQ{a{%f(?weO_nYlpd=X+gF6na@0W z0+hchp_{aluB*HT5jC;S0M*$SRjVX$ytH>TqJ!=OqQzil-ktS*P6o641PX(B!3<_5 zO~esIge?_h-W!2lgv`vTPw_`?{xsPR;gy`%3Zl1?npk9NjJ+N-lU(=`fpcMcSb!o+ zKr>lVz9fi3ZXRG`kwH-ut-52~b%(39heSfSmv^JZ;h`p*S#~H>q;B=TC-`kWHNKtP zA!L2cDhM8q9VOY!T&ys61B|Iy^}fX^qV;rw`$@zY2MNz2`QQ> z`Q0w7Ul0mR;z>f45@~dG>JRJ&X=ro`#;y$7HN8Hq@?5!Z>M6h39eq{0axWxRGW>|& zin*OxE~9U&4bf-|&^t#e5VaM}h5$=C_9|qfifW-?0clndkTO_FZZi#2gj%d|s0=r{ zwHj80yS5I_@g?Av^gBupm2e|1H_8Hg$h#>1*r%@NT2y$j6Mjh(KDbrKm35$O=Nq7_ z9V)G!ujS-@7mZH<;?}^q-!(HOcHc!~2;?MTgfN*H`XQY-8mubZmRqG;fFmNSgNQZG zKFcbjU3I-tT{PPlZ&ZNgG8iO0(0Uw5r^Y~G75!|71g^}ydOwxcR8pR zww0_H0xa!k?9f5sydag3RjdTwlD1h5DAqxrLnH!}w!mA`(J8Us(;(oSz%YL$-jeNo z?@2*My*R_wE#H#fKnpJ&t%t7r@dTq1-0P;7mH=f^WT%0;R1q}aJ?_pQ%;cun{Id#7 zeym89#@_%(*dc7U%gUfiBp^+n$53wA9O8kEA`=(e$P6*OK-+v|d7cpJh!9(Ulw`TC zK2~vnlL)jj?hZ)A24>g0?KP|Xz2cBLFcnil;R>_56 zq_+=u0x14BLteUC4!+XC<7cn-g)j z6krB^C}i^vM0Sd-8_QY5M3BxzzW0zO&YOqL20x*itsq2x9_ji12@%PX?R zoe--+2}d<%F4k9sub+e3^PH48>)G@MY;v#=%uJBRs|_e{+P!3yayJc#g?=tfh(($i zAV#u}Ab$7ZkO@fHai#?2sz&Y|u(zLma8WiL(d z^?kJTXBIC6y7&b!-nYMzF#>3Swj`fGLf&T~Pp#ie2`gYuc>);ersGRbH_9#?ap*Au z7&&a*zG??Hz5*3W(^{uq!~$WBXRP~40A|$11FdH^47U2Onr~>aD+%pCM?Of=!B*EQ z56bpj&iM7|y4*!=h;?L)fHLPXi-Wou|zbyhk=+Uj{lsE3PQ2 z-0ptf&seGw>5v@(8(N+xitaLWByh!~Nz-&eG+qI)goi;~ z@qNbOeVkUSw&_1wG0`k+J9s=YyJU=<=^aSxkdFlH(fbPi!h;nf^OVX4^e}aMAYFuO^fU0{Q~eMeuaLq} zC8c0}$z)uZdg?hZZ07z#l07AeqJ-&q!uvxRlQRx}A%Kl+*4IPUh7^mqpBlhMJPV

va7hq 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