{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Short description of the problem"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have a torus of arbitrary (non-convex polygonal) cross-section.\n",
    "We consider a semi-line (called LOS, for Line of Sight from now on) define by a starting point and a normalized vector.\n",
    "We want to compute the intersections of that semi-line with the torus.\n",
    "\n",
    "In particular, we want the first entry point inside the torus (PIn), the first exit point (POut), and for the exit point, we also want the index of the polygon (cross-section) segment on which it stands and the normalized vector to that segment at POut.\n",
    "When the starting point already lies inside the torus, there is no PIn.\n",
    "\n",
    "That computation should be done for a large number of LOS ($10^{5-6}$), and for cross-section polygons comprising 50-500 segments."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mathematical solutions and algorithm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The mathematical formulation can be found in , as well as all necessary derivations.\n",
    "Here is a summary of the subsequent algorithm:\n",
    "\n",
    "If $(O,\\underline{e}_R,\\underline{e}_{\\phi},\\underline{e}_Z)$ is a direct orthonormal cylindrical referential, to which the associated cartesian referential is $(O,\\underline{e}_X,\\underline{e}_Y,\\underline{e}_Z)$, the inputs of the function are:\n",
    "\n",
    "* Ds (3,Nl) np.ndarray of floats : an array containing the 3D (X,Y,Z) coordinates of the Nl starting points\n",
    "* us (3,Nl) np.ndarray of floats : an array containing the 3D (X,Y,Z) coordinates of the Nl normalized vectors\n",
    "* VPoly (2,Ns+1) np.ndarray of floats : an array containing the 2D (R,Z) coordinates of the Ns+1 points defining the Ns segments defining the cross-section polygon of the torus vessel\n",
    "* VIn (2,Ns) np.ndarray of floats : an array containing the 2D (R,Z) coordinates of the Ns vectors perpendicular to the Ns segments and oriented inwards\n",
    "\n",
    "For one LOS and one segment, let's find the parameter k such that $\\underline{DM}=k\\underline{u}$ where M is any intersection between the semi-line and the cone defined by the considered segment. If there are several intersections, their k values will be used to determine which ones are first along the line. To determine if an intersection is a PIn (entry) or a POut (exit), we compute the sign of the scalar product between $\\underline{u}$ and the local normalized vector perpendicular to the segment and oriented inwards (entry=positive).\n",
    "\n",
    "Then, introducing (see for details):\n",
    "* $u_{ii,//}\\cdot D_{ii,//} = us[0,ii]*Ds[0,ii]+us[1,ii]*Ds[1,ii]$\n",
    "* $u_{ii,//}^2 = us[0,ii]^2+us[1,ii]^2$\n",
    "* $D_{ii,//}^2 = Ds[0,ii]^2+Ds[1,ii]^2$\n",
    "\n",
    "Then, the basic algorithm is, for each LOS defined by index ii (Ds[:,ii],us[:,ii]) and for any segment of index jj (VPoly[:,jj:jj+2]) is:\n",
    "\n",
    "* if us[2,ii]==0, then, introducing:\n",
    "   * $q = \\frac{Ds[2,ii]-VPoly[1,jj]}{VPoly[1,jj+1]-VPoly[1,jj]}$ \n",
    "   * $C = q^2(VPoly[0,jj+1]-VPoly[0,jj])^2 + 2qVPoly[0,jj](VPoly[0,jj+1]-VPoly[0,jj]) + VPoly[0,jj]$\n",
    "\n",
    "   There are solution only if:\n",
    "      * VPoly[1,jj+1] != VPoly[1,jj]\n",
    "      * $q \\in [0;1[$\n",
    "      * $\\delta = (u_{ii,//}\\cdot D_{ii,//})^2 - u_{ii,//}^2(D_{ii,//}^2-C) > 0$\n",
    "   \n",
    "   And the solutions are $k_{1,2} = \\frac{-u_{ii,//}\\cdot D_{ii,//} \\pm \\sqrt{\\delta}}{u_{ii,//}^2}$ (valid only if $\\geq0$, because semi-line)\n",
    "\n",
    "* if us[2,ii]!=0, then, introducing:\n",
    "   * $A = (VPoly[0,jj+1]-VPoly[0,jj])^2 - \\frac{(VPoly[1,jj+1]-VPoly[1,jj])^2}{us[2,ii]^2}u_{ii,//}^2$\n",
    "   * $B = VPoly[0,jj](VPoly[0,jj+1]-VPoly[0,jj]) + \\frac{VPoly[1,jj+1]-VPoly[1,jj]}{us[2,ii]}\\frac{Ds[2,ii]-VPoly[1,jj]}{us[2,ii]}u_{ii,//}^2 - \\frac{VPoly[1,jj+1]-VPoly[1,jj]}{us[2,ii]}u_{ii,//}\\cdot D_{ii,//}$\n",
    "   * $C = -\\left(\\frac{Ds[2,ii]-VPoly[1,jj]}{us[2,ii]}\\right)^2u_{ii,//}^2 + 2\\frac{Ds[2,ii]-VPoly[1,jj]}{us[2,ii]}u_{ii,//}\\cdot D_{ii,//} - D_{ii,//}^2 + VPoly[0,jj]^2$\n",
    "   \n",
    "   There are solution only if:\n",
    "      * A = 0 and B != 0:\n",
    "           * $q = -\\frac{C}{2B}$ must be $\\in [0;1[$\n",
    "           * $k = q\\frac{VPoly[1,jj+1]-VPoly[1,jj]}{us[2,ii]} - \\frac{Ds[1,ii]-VPoly[1,jj]}{us[2,ii]}$ must be $\\geq0$\n",
    "      * A != 0:\n",
    "           * $B^2$ must be > $AC$\n",
    "           * $q_{1,2} = \\frac{-B \\pm \\sqrt{B^2-AC}}{A}$ must be $\\in [0;1[$\n",
    "           * $k_{1,2} = q_{1,2}\\frac{VPoly[1,jj+1]-VPoly[1,jj]}{us[2,ii]} - \\frac{Ds[1,ii]-VPoly[1,jj]}{us[2,ii]}$ must be $\\geq0$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Safeguard"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For solutions to be valid, they have to:\n",
    "* lie on a given segment (cf.: $\\in [0;1[$)\n",
    "* lie on the semi-line (cf. $k\\geq0$)\n",
    "* In addition, they have to be located on the good side of the torus (no crossing through the center)\n",
    "\n",
    "The first two conditions are met by the previous algorithm, the last one is enforced (on demand according to keyword argument Forbid) by excluding all solution in an angular sector opposite the sector the semi-line starting point.\n",
    "\n",
    "In the following, in additon to the (Ds,us,VPoly,VIn) positional arguments, all functions also take a set of keyword arguments specifying in particular:\n",
    "* Forbid=True (default)\n",
    "* Margins and numeric tolerance values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Function versions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Naive Python version with for loop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def Calc_LOS_PInOut_python(Ds, us, VPoly, vIn,\n",
    "                           Forbid=True, RMin=None, EpsUz=1.e-9, EpsVz=1.e-9, EpsA=1.e-9, EpsB=1.e-9):\n",
    "    \n",
    "    ################\n",
    "    # Prepare input\n",
    "    RMin = 0.95*min(np.min(VPoly[0,:]),np.min(np.hypot(Ds[0,:],Ds[1,:]))) if RMin is None else RMin\n",
    "    \n",
    "    ################\n",
    "    # Prepare output\n",
    "    Nl, Ns = Ds.shape[1], vIn.shape[1]\n",
    "    SIn, SOut = np.nan*np.ones((3,Nl),dtype=float), np.nan*np.ones((3,Nl),dtype=float)\n",
    "    VPerp, indOut = np.nan*np.ones((3,Nl),dtype=float), np.nan*np.ones((Nl,),dtype=int)\n",
    "    \n",
    "    ################\n",
    "    # Compute\n",
    "    for ii in range(0,Nl):\n",
    "        upscaDp = us[0,ii]*Ds[0,ii] + us[1,ii]*Ds[1,ii]\n",
    "        upar2 = us[0,ii]**2 + us[1,ii]**2\n",
    "        Dpar2 = Ds[0,ii]**2 + Ds[1,ii]**2\n",
    "        # Prepare in case Forbid is True\n",
    "        if Forbid:\n",
    "            # Compute coordinates of the 2 points where the tangents touch the inner circle\n",
    "            R2 = Ds[0,ii]**2 + Ds[1,ii]**2\n",
    "            L = np.sqrt(R2-RMin**2)\n",
    "            S1X = (RMin**2*Ds[0,ii]+RMin*Ds[1,ii]*L)/R2\n",
    "            S1Y = (RMin**2*Ds[1,ii]-RMin*Ds[0,ii]*L)/R2\n",
    "            S2X = (RMin**2*Ds[0,ii]-RMin*Ds[1,ii]*L)/R2\n",
    "            S2Y = (RMin**2*Ds[1,ii]+RMin*Ds[0,ii]*L)/R2\n",
    "        \n",
    "        # Compute all solutions\n",
    "        # Set tolerance value for us[2,ii]\n",
    "        # EpsUz is the tolerated DZ across 50m (max Tokamak size)\n",
    "        Crit = EpsUz*np.sqrt(upar2)/50.\n",
    "        kout, kin, indout = np.inf, np.inf, None\n",
    "        # Case with horizontal semi-line\n",
    "        if np.abs(us[2,ii])<Crit:\n",
    "            for jj in range(0,Ns):\n",
    "                # Solutions exist only in the case with non-horizontal segment (i.e.: cone, not plane)\n",
    "                if np.abs(vIn[1,jj])>EpsVz:\n",
    "                    q = (Ds[2,ii]-VPoly[1,jj])/(VPoly[1,jj+1]-VPoly[1,jj])\n",
    "                    # The intersection must stand on the segment \n",
    "                    if q>=0 and q<1:\n",
    "                        C = q**2*(VPoly[0,jj+1]-VPoly[0,jj])**2 + 2.*q*VPoly[0,jj]*(VPoly[0,jj+1]-VPoly[0,jj]) + VPoly[0,jj]**2\n",
    "                        delta = upscaDp**2 - upar2*(Dpar2-C)\n",
    "                        if delta>0.:\n",
    "                            sqd = np.sqrt(delta)\n",
    "                            # The intersection must be on the semi-line (i.e.: k>=0)\n",
    "                            # First solution\n",
    "                            if -upscaDp - sqd >=0:\n",
    "                                k = (-upscaDp - sqd)/upar2\n",
    "                                sol = Ds[:,ii] + k*us[:,ii]\n",
    "                                if Forbid:\n",
    "                                    sca0 = (sol[0]-S1X)*Ds[0,ii] + (sol[1]-S1Y)*Ds[1,ii]\n",
    "                                    sca1 = (sol[0]-S1X)*S1X + (sol[1]-S1Y)*S1Y\n",
    "                                    sca2 = (sol[0]-S2X)*S2X + (sol[1]-S2Y)*S2Y\n",
    "                                if not Forbid or (Forbid and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                    # Get the normalized perpendicular vector at intersection\n",
    "                                    phi = np.arctan2(sol[1],sol[0])\n",
    "                                    # Get the scalar product to determine entry or exit point\n",
    "                                    sca = np.cos(phi)*vIn[0,jj]*us[0,ii] + np.sin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                    if sca<=0 and k<kout:\n",
    "                                        kout = k\n",
    "                                        indout = jj\n",
    "                                        #print 1, k\n",
    "                                    elif sca>=0 and k<min(kin,kout):\n",
    "                                        kin = k\n",
    "                                        #print 2, k\n",
    "                                    \n",
    "                            # Second solution\n",
    "                            if -upscaDp + sqd >=0:\n",
    "                                k = (-upscaDp + sqd)/upar2\n",
    "                                sol = Ds[:,ii] + k*us[:,ii]\n",
    "                                if Forbid:\n",
    "                                    sca0 = (sol[0]-S1X)*Ds[0,ii] + (sol[1]-S1Y)*Ds[1,ii]\n",
    "                                    sca1 = (sol[0]-S1X)*S1X + (sol[1]-S1Y)*S1Y\n",
    "                                    sca2 = (sol[0]-S2X)*S2X + (sol[1]-S2Y)*S2Y\n",
    "                                if not Forbid or (Forbid and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                    # Get the normalized perpendicular vector at intersection\n",
    "                                    phi = np.arctan2(sol[1],sol[0])\n",
    "                                    # Get the scalar product to determine entry or exit point\n",
    "                                    sca = np.cos(phi)*vIn[0,jj]*us[0,ii] + np.sin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                    if sca<=0 and k<kout:\n",
    "                                        kout = k\n",
    "                                        indout = jj\n",
    "                                        #print 3, k\n",
    "                                    elif sca>=0 and k<min(kin,kout):\n",
    "                                        kin = k\n",
    "                                        #print 4, k\n",
    "                                        \n",
    "        # More general non-horizontal semi-line case\n",
    "        else:\n",
    "            for jj in range(Ns):\n",
    "                v0, v1 = VPoly[0,jj+1]-VPoly[0,jj], VPoly[1,jj+1]-VPoly[1,jj]\n",
    "                A = v0**2 - upar2*(v1/us[2,ii])**2\n",
    "                B = VPoly[0,jj]*v0 + v1*(Ds[2,ii]-VPoly[1,jj])*upar2/us[2,ii]**2 - upscaDp*v1/us[2,ii]\n",
    "                C = -upar2*(Ds[2,ii]-VPoly[1,jj])**2/us[2,ii]**2 + 2.*upscaDp*(Ds[2,ii]-VPoly[1,jj])/us[2,ii] - Dpar2 + VPoly[0,jj]**2              \n",
    "               \n",
    "                if np.abs(A)<EpsA and np.abs(B)>EpsB:\n",
    "                    q = -C/(2.*B)\n",
    "                    if q>=0. and q<1.:\n",
    "                        k = (q*v1 - (Ds[2,ii]-VPoly[2,jj]))/us[2,ii]\n",
    "                        if k>=0:\n",
    "                            sol = Ds[:,ii] + k*us[:,ii]\n",
    "                            if Forbid:\n",
    "                                sca0 = (sol[0]-S1X)*Ds[0,ii] + (sol[1]-S1Y)*Ds[1,ii]\n",
    "                                sca1 = (sol[0]-S1X)*S1X + (sol[1]-S1Y)*S1Y\n",
    "                                sca2 = (sol[0]-S2X)*S2X + (sol[1]-S2Y)*S2Y\n",
    "                                #print 1, k, kout, sca0, sca1, sca2\n",
    "                                if sca0<0 and sca1<0 and sca2<0:\n",
    "                                    continue\n",
    "                            # Get the normalized perpendicular vector at intersection\n",
    "                            phi = np.arctan2(sol[1],sol[0])\n",
    "                            # Get the scalar product to determine entry or exit point\n",
    "                            sca = np.cos(phi)*vIn[0,jj]*us[0,ii] + np.sin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                            if sca<=0 and k<kout:\n",
    "                                kout = k\n",
    "                                indout = jj\n",
    "                                #print 5, k\n",
    "                            elif sca>=0 and k<min(kin,kout):\n",
    "                                kin = k\n",
    "                                #print 6, k\n",
    "                                \n",
    "                elif np.abs(A)>EpsA and B**2>A*C:\n",
    "                    sqd = np.sqrt(B**2-A*C)\n",
    "                    # First solution\n",
    "                    q = (-B + sqd)/A\n",
    "                    if q>=0. and q<1.:\n",
    "                        k = (q*v1 - (Ds[2,ii]-VPoly[1,jj]))/us[2,ii]\n",
    "                        if k>=0.:\n",
    "                            sol = Ds[:,ii] + k*us[:,ii]\n",
    "                            if Forbid:\n",
    "                                sca0 = (sol[0]-S1X)*Ds[0,ii] + (sol[1]-S1Y)*Ds[1,ii]\n",
    "                                sca1 = (sol[0]-S1X)*S1X + (sol[1]-S1Y)*S1Y\n",
    "                                sca2 = (sol[0]-S2X)*S2X + (sol[1]-S2Y)*S2Y\n",
    "                                #print 2, k, kout, sca0, sca1, sca2\n",
    "                            if not Forbid or (Forbid and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                # Get the normalized perpendicular vector at intersection\n",
    "                                phi = np.arctan2(sol[1],sol[0])\n",
    "                                # Get the scalar product to determine entry or exit point\n",
    "                                sca = np.cos(phi)*vIn[0,jj]*us[0,ii] + np.sin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                if sca<=0 and k<kout:\n",
    "                                    kout = k\n",
    "                                    indout = jj\n",
    "                                    #print 7, k, q, A, B, C, sqd\n",
    "                                elif sca>=0 and k<min(kin,kout):\n",
    "                                    kin = k\n",
    "                                    #print 8, k, jj\n",
    "                            \n",
    "                    # Second solution\n",
    "                    q = (-B - sqd)/A\n",
    "                    if q>=0. and q<1.:\n",
    "                        k = (q*v1 - (Ds[2,ii]-VPoly[1,jj]))/us[2,ii]\n",
    "                        \n",
    "                        if k>=0.:\n",
    "                            sol = Ds[:,ii] + k*us[:,ii]\n",
    "                            if Forbid:\n",
    "                                sca0 = (sol[0]-S1X)*Ds[0,ii] + (sol[1]-S1Y)*Ds[1,ii]\n",
    "                                sca1 = (sol[0]-S1X)*S1X + (sol[1]-S1Y)*S1Y\n",
    "                                sca2 = (sol[0]-S2X)*S2X + (sol[1]-S2Y)*S2Y\n",
    "                                #print 3, k, kout, sca0, sca1, sca2\n",
    "                            if not Forbid or (Forbid and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                # Get the normalized perpendicular vector at intersection\n",
    "                                phi = np.arctan2(sol[1],sol[0])\n",
    "                                # Get the scalar product to determine entry or exit point\n",
    "                                sca = np.cos(phi)*vIn[0,jj]*us[0,ii] + np.sin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                if sca<=0 and k<kout:\n",
    "                                    kout = k\n",
    "                                    indout = jj\n",
    "                                    #print 9, k, jj\n",
    "                                elif sca>=0 and k<min(kin,kout):\n",
    "                                    kin = k\n",
    "                                    #print 10, k, q, A, B, C, sqd, v0, v1, jj\n",
    "\n",
    "        if indout is not None:\n",
    "            indOut[ii] = indout\n",
    "            SOut[:,ii] = Ds[:,ii] + kout*us[:,ii]\n",
    "            phi = np.arctan2(SOut[1,ii],SOut[0,ii])\n",
    "            VPerp[:,ii] = np.cos(phi)*vIn[0,indout], np.sin(phi)*vIn[0,indout], vIn[1,indout]\n",
    "        if kin<kout:\n",
    "            SIn[:,ii] = Ds[:,ii] + kin*us[:,ii]\n",
    "    return SIn, SOut, VPerp, indOut\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Numpy version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "def Calc_LOS_PInOut_numpy1(Ds, us, VPoly, vIn,\n",
    "                          Forbid=True, RMin=None, EpsUz=1.e-6, EpsVz=1.e-9, EpsA=1.e-9, EpsB=1.e-9):\n",
    "\n",
    "    # Prepare inputs\n",
    "    RMin = 0.95*min(np.min(VPoly[0,:]),np.min(np.hypot(Ds[0,:],Ds[1,:]))) if RMin is None else RMin\n",
    "    \n",
    "    # Pre-define useful quantities\n",
    "    Cs = VPoly[:,:-1]\n",
    "    vs = VPoly[:,1:]-VPoly[:,:-1]\n",
    "    upscaDp = us[0,:]*Ds[0,:] + us[1,:]*Ds[1,:]\n",
    "    upar2 = us[0,:]**2 + us[1,:]**2\n",
    "    Dpar2 = Ds[0,:]**2 + Ds[1,:]**2\n",
    "    MaxErr = 20.\n",
    "    NL, NS = Ds.shape[1], vIn.shape[1]\n",
    "\n",
    "    Ds0, Ds1, Ds2 = np.tile(Ds[0,:],(NS,1)).T, np.tile(Ds[1,:],(NS,1)).T, np.tile(Ds[2,:],(NS,1)).T\n",
    "    us0, us1, us2 = np.tile(us[0,:],(NS,1)).T, np.tile(us[1,:],(NS,1)).T, np.tile(us[2,:],(NS,1)).T\n",
    "    Cs0, Cs1 = np.tile(Cs[0,:],(NL,1)), np.tile(Cs[1,:],(NL,1))\n",
    "    vs0, vs1 = np.tile(vs[0,:],(NL,1)), np.tile(vs[1,:],(NL,1))\n",
    "    upscaDpF = np.tile(upscaDp,(NS,1)).T\n",
    "    upar2F = np.tile(upar2,(NS,1)).T\n",
    "    Dpar2F = np.tile(Dpar2,(NS,1)).T\n",
    "\n",
    "    ########################\n",
    "    # Find all intersections\n",
    "    # 1st dim = LOS\n",
    "    # 2nd dim = VPoly\n",
    "    ########################\n",
    "\n",
    "    ###########################\n",
    "    # Start with horizontal LOS\n",
    "\n",
    "    # Prepare arrays\n",
    "    # q, sqd = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    sqd = np.nan*np.ones((NL,NS))   # Test\n",
    "    k0, k1 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    \n",
    "    Crit = EpsUz*np.sqrt(upar2F)/MaxErr\n",
    "    # Compute quasi-horizontal LOS\n",
    "    ind01 = np.abs(us2) < Crit      # Consider quasi-horizontal cases to avoid near-zero divisions otherwise, EpsUz is the tolerated DZ across 50m (max Tokamak size)\n",
    "    ind01[ind01] = np.abs(vs1[ind01])>EpsVz\n",
    "    q = (Ds2[ind01]-Cs1[ind01])/vs1[ind01]\n",
    "    ii = (q>=0) & (q<1)\n",
    "    ind01[ind01], q = ii, q[ii]\n",
    "    C = q**2*vs0[ind01]**2 + 2.*q*Cs0[ind01]*vs0[ind01] + Cs0[ind01]**2\n",
    "    delta = upscaDpF[ind01]**2 - upar2F[ind01]*(Dpar2F[ind01]-C)\n",
    "    ind01[ind01] = delta>0.\n",
    "    sqd[ind01] = np.sqrt(delta)\n",
    "    ind02 = np.copy(ind01)\n",
    "    ind01[ind01] = (-upscaDpF[ind01] - sqd[ind01]) >= 0.\n",
    "    ind02[ind02] = (-upscaDpF[ind02] + sqd[ind02]) >= 0.\n",
    "    k0[ind01] = (-upscaDpF[ind01] - sqd[ind01])/upar2F[ind01]\n",
    "    k1[ind02] = (-upscaDpF[ind02] + sqd[ind02])/upar2F[ind02]\n",
    "    print 'A',k0[ind01], np.any(ind01,axis=0).nonzero()[0], q, C, sqd[ind01]\n",
    "    print 'A',k1[ind02], np.any(ind02,axis=0).nonzero()[0], q\n",
    "    del q, C, delta, sqd\n",
    "    \n",
    "    # Prepare quantities for general cases\n",
    "    q, q1, q2 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    # Compute general cases\n",
    "    Au2 = vs0**2*us2**2 - upar2F*vs1**2\n",
    "    Bu2 = Cs0*vs0*us2**2 + vs1*(Ds2-Cs1)*upar2F - upscaDpF*vs1*us2\n",
    "    Cu2 = -upar2F*(Ds2-Cs1)**2 + 2.*upscaDpF*(Ds2-Cs1)*us2 + (Cs0**2 - Dpar2F)*us2**2\n",
    "\n",
    "    ind1 = (np.abs(us2) >= Crit) & (np.abs(Au2)<EpsA*us2**2) & (np.abs(Bu2)>EpsB*us2**2)\n",
    "    q[ind1] = -Cu2[ind1]/(2.*Bu2[ind1])\n",
    "    ind1[ind1] = (q[ind1]>=0) & (q[ind1]<1)\n",
    "    kk = (q[ind1]*vs1[ind1] - (Ds2[ind1]-Cs1[ind1]))/us2[ind1]\n",
    "    ind1[ind1] = kk>=0.\n",
    "    k0[ind1] = kk[kk>=0.]\n",
    "    print 'B',k0[ind1], q[ind1]\n",
    "    del q, kk, upscaDpF, upar2F, Dpar2F\n",
    "    \n",
    "    ind21 = (np.abs(us2) >= Crit) & (np.abs(Au2)>=EpsA*us2**2) & (Bu2**2>Au2*Cu2)\n",
    "    sqd = np.sqrt(Bu2[ind21]**2-Au2[ind21]*Cu2[ind21])\n",
    "    q1[ind21] = (-Bu2[ind21] + sqd)/Au2[ind21]\n",
    "    q2[ind21] = (-Bu2[ind21] - sqd)/Au2[ind21]\n",
    "    ind22 = np.copy(ind21)\n",
    "    ind21[ind21] = (q1[ind21]>=0) & (q1[ind21]<1.)\n",
    "    ind22[ind22] = (q2[ind22]>=0) & (q2[ind22]<1.)\n",
    "    kk0 = (q1[ind21]*vs1[ind21] - (Ds2[ind21]-Cs1[ind21]))/us2[ind21]\n",
    "    kk1 = (q2[ind22]*vs1[ind22] - (Ds2[ind22]-Cs1[ind22]))/us2[ind22]\n",
    "    ind21[ind21] = kk0>=0.\n",
    "    ind22[ind22] = kk1>=0.\n",
    "    k0[ind21] = kk0[kk0>=0.]\n",
    "    k1[ind22] = kk1[kk1>=0.]\n",
    "    print 'C',k0[ind21], q1[ind21], Au2[ind21], Bu2[ind21], Cu2[ind21]\n",
    "    print 'C',k1[ind22], q2[ind22], Au2[ind22], Bu2[ind22], Cu2[ind22]\n",
    "    del Au2, Bu2, Cu2, sqd, q1, q2, kk0, kk1, Cs0, Cs1, vs0, vs1\n",
    "\n",
    "    # Compute associated solutions\n",
    "    S00, S01, S02 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    S10, S11, S12 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    Ind1, Ind2 = [ind01,ind1,ind21], [ind02,ind22]\n",
    "    for ii in range(0,len(Ind1)):\n",
    "        S00[Ind1[ii]] = Ds0[Ind1[ii]] + k0[Ind1[ii]]*us0[Ind1[ii]]\n",
    "        S01[Ind1[ii]] = Ds1[Ind1[ii]] + k0[Ind1[ii]]*us1[Ind1[ii]]\n",
    "        S02[Ind1[ii]] = Ds2[Ind1[ii]] + k0[Ind1[ii]]*us2[Ind1[ii]]\n",
    "    for ii in range(0,len(Ind2)):\n",
    "        S10[Ind2[ii]] = Ds0[Ind2[ii]] + k1[Ind2[ii]]*us0[Ind2[ii]]\n",
    "        S11[Ind2[ii]] = Ds1[Ind2[ii]] + k1[Ind2[ii]]*us1[Ind2[ii]]\n",
    "        S12[Ind2[ii]] = Ds2[Ind2[ii]] + k1[Ind2[ii]]*us2[Ind2[ii]]\n",
    "    Ind0 = ind01 | ind1 | ind21\n",
    "    Ind1 = ind02 | ind22\n",
    "    del ind01, ind1, ind21, ind02, ind22\n",
    "\n",
    "    # Eliminate solution in forbidden area\n",
    "\n",
    "    RMin = 0.95*min(np.nanmin(VPoly[0,:]), np.nanmin(np.hypot(Ds[0,:],Ds[1,:]))) if RMin is None else RMin\n",
    "    RMax = 1.05*np.nanmax(VPoly[0,:])\n",
    "    ZMin, ZMax = np.nanmin(VPoly[1,:])-0.05*np.abs(np.nanmin(VPoly[1,:])), np.nanmax(VPoly[1,:])+0.05*np.abs(np.nanmax(VPoly[1,:]))\n",
    "    RS0, RS1 = np.hypot(S00,S01), np.hypot(S10,S11)\n",
    "    iin0, iin1 = ~np.isnan(RS0), ~np.isnan(RS1)\n",
    "    RS0, RS1 = RS0[iin0], RS1[iin1]\n",
    "    \n",
    "    inderr0 = (RS0<RMin) | (RS0>RMax)\n",
    "    inderr1 = (RS1<RMin) | (RS1>RMax)\n",
    "    assert inderr0.sum()==0 and inderr1.sum()==0, \"Some solutions ({0} in S0 and {1} in S1) are way too far({2})/close({3}) !\".format(inderr0.sum(),inderr1.sum(),RMax,RMin)+str(RS0)+\" \"+str(RS1)+\"  \"+str(k0[Ind0n])+\"  \"+str(k1[Ind1n])\n",
    "    inderr0 = (S02<ZMin) | (S02>ZMax)\n",
    "    inderr1 = (S12<ZMin) | (S12>ZMax)\n",
    "    assert inderr0.sum()==0 and inderr1.sum()==0, \"Some solutions ({0} in S0 and {1} in S1) are way too high({0})/low({1}) !\".format(inderr0.sum(),inderr1.sum(),ZMax,ZMin)+str(S0[2,:])+\"  \"+str(S1[2,:])\n",
    "    \n",
    "    if Forbid:\n",
    "        # This criterion is the same for both solution k0 and k1\n",
    "        Ind = Ind0 | Ind1\n",
    "        # Prepare useful quantities\n",
    "        R2, L = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "        S1X, S1Y = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "        S2X, S2Y = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "        # Add a little bit of margin to the major radius, just in case\n",
    "        R2[Ind] = Ds0[Ind]**2+Ds1[Ind]**2\n",
    "        L[Ind] = np.sqrt(R2[Ind]-RMin**2)\n",
    "        # Compute coordinates of the 2 points where the tangents touch the inner circle\n",
    "        S1X[Ind] = (RMin**2*Ds0[Ind]+RMin*Ds1[Ind]*L[Ind])/R2[Ind]\n",
    "        S1Y[Ind] = (RMin**2*Ds1[Ind]-RMin*Ds0[Ind]*L[Ind])/R2[Ind]\n",
    "        S2X[Ind] = (RMin**2*Ds0[Ind]-RMin*Ds1[Ind]*L[Ind])/R2[Ind]\n",
    "        S2Y[Ind] = (RMin**2*Ds1[Ind]+RMin*Ds0[Ind]*L[Ind])/R2[Ind]\n",
    "        # Check solutiona are on the good side of the 3 planes\n",
    "        indout = (S00[Ind0]-S1X[Ind0])*Ds0[Ind0] + (S01[Ind0]-S1Y[Ind0])*Ds1[Ind0] < 0.\n",
    "        indout = indout & ((S00[Ind0]-S1X[Ind0])*S1X[Ind0] + (S01[Ind0]-S1Y[Ind0])*S1Y[Ind0] < 0.)\n",
    "        indout = indout & ((S00[Ind0]-S2X[Ind0])*S2X[Ind0] + (S01[Ind0]-S2Y[Ind0])*S2Y[Ind0] < 0.)\n",
    "        Ind0[Ind0] = ~indout\n",
    "        indout = (S10[Ind1]-S1X[Ind1])*Ds0[Ind1] + (S11[Ind1]-S1Y[Ind1])*Ds1[Ind1] < 0.\n",
    "        indout = indout & ((S10[Ind1]-S1X[Ind1])*S1X[Ind1] + (S11[Ind1]-S1Y[Ind1])*S1Y[Ind1] < 0.)\n",
    "        indout = indout & ((S10[Ind1]-S2X[Ind1])*S2X[Ind1] + (S11[Ind1]-S2Y[Ind1])*S2Y[Ind1] < 0.)\n",
    "        Ind1[Ind1] = ~indout\n",
    "        del Ind, R2, L, S1X, S1Y, S2X, S2Y, indout\n",
    "\n",
    "    # Identify the POut (if any) and PIn (if any)\n",
    "    VIn0, VIn1 = np.tile(vIn[0,:],(NL,1)), np.tile(vIn[1,:],(NL,1))\n",
    "\n",
    "    sca0, sca1 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    sca0[Ind0] = us0[Ind0]*VIn0[Ind0]*np.cos(np.arctan2(S01[Ind0],S00[Ind0])) + us1[Ind0]*VIn0[Ind0]*np.sin(np.arctan2(S01[Ind0],S00[Ind0])) + us2[Ind0]*VIn1[Ind0]\n",
    "    sca1[Ind1] = us0[Ind1]*VIn0[Ind1]*np.cos(np.arctan2(S11[Ind1],S10[Ind1])) + us1[Ind1]*VIn0[Ind1]*np.sin(np.arctan2(S11[Ind1],S10[Ind1])) + us2[Ind1]*VIn1[Ind1]\n",
    "    ind0out, ind1out = np.copy(Ind0), np.copy(Ind1)\n",
    "    ind0out[ind0out] = sca0[ind0out]<0.\n",
    "    ind1out[ind1out] = sca1[ind1out]<0.\n",
    "    kk0, kk1 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    kk0[ind0out], kk1[ind1out] = k0[ind0out], k1[ind1out]\n",
    "    kk = np.fmin(kk0,kk1)\n",
    "    kout = np.nanmin(kk,axis=1)\n",
    "    SOut = Ds + kout[np.newaxis,:]*us\n",
    "    indOut = np.nan*np.ones((NL,))\n",
    "    indok = ~np.isnan(kout)\n",
    "    indOut[indok] = np.nanargmin(kk[indok,:],axis=1)\n",
    "    phi = np.arctan2(SOut[1,indok],SOut[0,indok])\n",
    "    VPerp = np.nan*np.ones((3,NL),dtype=float)\n",
    "    VPerp[:,indok] = np.array([np.cos(phi)*vIn[0,indOut[indok].astype(int)], np.sin(phi)*vIn[0,indOut[indok].astype(int)], vIn[1,indOut[indok].astype(int)]])\n",
    "    \n",
    "    ind0in, ind1in = np.copy(Ind0), np.copy(Ind1)\n",
    "    ind0in[ind0in] = sca0[ind0in]>0.\n",
    "    ind1in[ind1in] = sca1[ind1in]>0.\n",
    "    ind0in[ind0in] = k0[ind0in] < (np.tile(kout,(NS,1)).T)[ind0in]\n",
    "    ind1in[ind1in] = k1[ind1in] < (np.tile(kout,(NS,1)).T)[ind1in]\n",
    "    kk0, kk1 = np.nan*np.ones((NL,NS)), np.nan*np.ones((NL,NS))\n",
    "    kk0[ind0in], kk1[ind1in] = k0[ind0in], k1[ind1in]\n",
    "    kk = np.fmin(kk0,kk1)\n",
    "    SIn = Ds + np.nanmin(kk,axis=1)[np.newaxis,:]*us\n",
    "    \n",
    "    return SIn, SOut, VPerp, indOut\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cython version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The cython extension is already loaded. To reload it, use:\n",
      "  %reload_ext cython\n"
     ]
    }
   ],
   "source": [
    "%load_ext cython"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!DOCTYPE html>\n",
       "<!-- Generated by Cython 0.25.2 -->\n",
       "<html>\n",
       "<head>\n",
       "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
       "    <title>Cython: _cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c.pyx</title>\n",
       "    <style type=\"text/css\">\n",
       "    \n",
       "body.cython { font-family: courier; font-size: 12; }\n",
       "\n",
       ".cython.tag  {  }\n",
       ".cython.line { margin: 0em }\n",
       ".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n",
       "\n",
       ".cython.line .run { background-color: #B0FFB0; }\n",
       ".cython.line .mis { background-color: #FFB0B0; }\n",
       ".cython.code.run  { border-left: 8px solid #B0FFB0; }\n",
       ".cython.code.mis  { border-left: 8px solid #FFB0B0; }\n",
       "\n",
       ".cython.code .py_c_api  { color: red; }\n",
       ".cython.code .py_macro_api  { color: #FF7000; }\n",
       ".cython.code .pyx_c_api  { color: #FF3000; }\n",
       ".cython.code .pyx_macro_api  { color: #FF7000; }\n",
       ".cython.code .refnanny  { color: #FFA000; }\n",
       ".cython.code .trace  { color: #FFA000; }\n",
       ".cython.code .error_goto  { color: #FFA000; }\n",
       "\n",
       ".cython.code .coerce  { color: #008000; border: 1px dotted #008000 }\n",
       ".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n",
       ".cython.code .c_attr  { color: #0000FF; }\n",
       ".cython.code .py_call { color: #FF0000; font-weight: bold; }\n",
       ".cython.code .c_call  { color: #0000FF; }\n",
       "\n",
       ".cython.score-0 {background-color: #FFFFff;}\n",
       ".cython.score-1 {background-color: #FFFFe7;}\n",
       ".cython.score-2 {background-color: #FFFFd4;}\n",
       ".cython.score-3 {background-color: #FFFFc4;}\n",
       ".cython.score-4 {background-color: #FFFFb6;}\n",
       ".cython.score-5 {background-color: #FFFFaa;}\n",
       ".cython.score-6 {background-color: #FFFF9f;}\n",
       ".cython.score-7 {background-color: #FFFF96;}\n",
       ".cython.score-8 {background-color: #FFFF8d;}\n",
       ".cython.score-9 {background-color: #FFFF86;}\n",
       ".cython.score-10 {background-color: #FFFF7f;}\n",
       ".cython.score-11 {background-color: #FFFF79;}\n",
       ".cython.score-12 {background-color: #FFFF73;}\n",
       ".cython.score-13 {background-color: #FFFF6e;}\n",
       ".cython.score-14 {background-color: #FFFF6a;}\n",
       ".cython.score-15 {background-color: #FFFF66;}\n",
       ".cython.score-16 {background-color: #FFFF62;}\n",
       ".cython.score-17 {background-color: #FFFF5e;}\n",
       ".cython.score-18 {background-color: #FFFF5b;}\n",
       ".cython.score-19 {background-color: #FFFF57;}\n",
       ".cython.score-20 {background-color: #FFFF55;}\n",
       ".cython.score-21 {background-color: #FFFF52;}\n",
       ".cython.score-22 {background-color: #FFFF4f;}\n",
       ".cython.score-23 {background-color: #FFFF4d;}\n",
       ".cython.score-24 {background-color: #FFFF4b;}\n",
       ".cython.score-25 {background-color: #FFFF48;}\n",
       ".cython.score-26 {background-color: #FFFF46;}\n",
       ".cython.score-27 {background-color: #FFFF44;}\n",
       ".cython.score-28 {background-color: #FFFF43;}\n",
       ".cython.score-29 {background-color: #FFFF41;}\n",
       ".cython.score-30 {background-color: #FFFF3f;}\n",
       ".cython.score-31 {background-color: #FFFF3e;}\n",
       ".cython.score-32 {background-color: #FFFF3c;}\n",
       ".cython.score-33 {background-color: #FFFF3b;}\n",
       ".cython.score-34 {background-color: #FFFF39;}\n",
       ".cython.score-35 {background-color: #FFFF38;}\n",
       ".cython.score-36 {background-color: #FFFF37;}\n",
       ".cython.score-37 {background-color: #FFFF36;}\n",
       ".cython.score-38 {background-color: #FFFF35;}\n",
       ".cython.score-39 {background-color: #FFFF34;}\n",
       ".cython.score-40 {background-color: #FFFF33;}\n",
       ".cython.score-41 {background-color: #FFFF32;}\n",
       ".cython.score-42 {background-color: #FFFF31;}\n",
       ".cython.score-43 {background-color: #FFFF30;}\n",
       ".cython.score-44 {background-color: #FFFF2f;}\n",
       ".cython.score-45 {background-color: #FFFF2e;}\n",
       ".cython.score-46 {background-color: #FFFF2d;}\n",
       ".cython.score-47 {background-color: #FFFF2c;}\n",
       ".cython.score-48 {background-color: #FFFF2b;}\n",
       ".cython.score-49 {background-color: #FFFF2b;}\n",
       ".cython.score-50 {background-color: #FFFF2a;}\n",
       ".cython.score-51 {background-color: #FFFF29;}\n",
       ".cython.score-52 {background-color: #FFFF29;}\n",
       ".cython.score-53 {background-color: #FFFF28;}\n",
       ".cython.score-54 {background-color: #FFFF27;}\n",
       ".cython.score-55 {background-color: #FFFF27;}\n",
       ".cython.score-56 {background-color: #FFFF26;}\n",
       ".cython.score-57 {background-color: #FFFF26;}\n",
       ".cython.score-58 {background-color: #FFFF25;}\n",
       ".cython.score-59 {background-color: #FFFF24;}\n",
       ".cython.score-60 {background-color: #FFFF24;}\n",
       ".cython.score-61 {background-color: #FFFF23;}\n",
       ".cython.score-62 {background-color: #FFFF23;}\n",
       ".cython.score-63 {background-color: #FFFF22;}\n",
       ".cython.score-64 {background-color: #FFFF22;}\n",
       ".cython.score-65 {background-color: #FFFF22;}\n",
       ".cython.score-66 {background-color: #FFFF21;}\n",
       ".cython.score-67 {background-color: #FFFF21;}\n",
       ".cython.score-68 {background-color: #FFFF20;}\n",
       ".cython.score-69 {background-color: #FFFF20;}\n",
       ".cython.score-70 {background-color: #FFFF1f;}\n",
       ".cython.score-71 {background-color: #FFFF1f;}\n",
       ".cython.score-72 {background-color: #FFFF1f;}\n",
       ".cython.score-73 {background-color: #FFFF1e;}\n",
       ".cython.score-74 {background-color: #FFFF1e;}\n",
       ".cython.score-75 {background-color: #FFFF1e;}\n",
       ".cython.score-76 {background-color: #FFFF1d;}\n",
       ".cython.score-77 {background-color: #FFFF1d;}\n",
       ".cython.score-78 {background-color: #FFFF1c;}\n",
       ".cython.score-79 {background-color: #FFFF1c;}\n",
       ".cython.score-80 {background-color: #FFFF1c;}\n",
       ".cython.score-81 {background-color: #FFFF1c;}\n",
       ".cython.score-82 {background-color: #FFFF1b;}\n",
       ".cython.score-83 {background-color: #FFFF1b;}\n",
       ".cython.score-84 {background-color: #FFFF1b;}\n",
       ".cython.score-85 {background-color: #FFFF1a;}\n",
       ".cython.score-86 {background-color: #FFFF1a;}\n",
       ".cython.score-87 {background-color: #FFFF1a;}\n",
       ".cython.score-88 {background-color: #FFFF1a;}\n",
       ".cython.score-89 {background-color: #FFFF19;}\n",
       ".cython.score-90 {background-color: #FFFF19;}\n",
       ".cython.score-91 {background-color: #FFFF19;}\n",
       ".cython.score-92 {background-color: #FFFF19;}\n",
       ".cython.score-93 {background-color: #FFFF18;}\n",
       ".cython.score-94 {background-color: #FFFF18;}\n",
       ".cython.score-95 {background-color: #FFFF18;}\n",
       ".cython.score-96 {background-color: #FFFF18;}\n",
       ".cython.score-97 {background-color: #FFFF17;}\n",
       ".cython.score-98 {background-color: #FFFF17;}\n",
       ".cython.score-99 {background-color: #FFFF17;}\n",
       ".cython.score-100 {background-color: #FFFF17;}\n",
       ".cython.score-101 {background-color: #FFFF16;}\n",
       ".cython.score-102 {background-color: #FFFF16;}\n",
       ".cython.score-103 {background-color: #FFFF16;}\n",
       ".cython.score-104 {background-color: #FFFF16;}\n",
       ".cython.score-105 {background-color: #FFFF16;}\n",
       ".cython.score-106 {background-color: #FFFF15;}\n",
       ".cython.score-107 {background-color: #FFFF15;}\n",
       ".cython.score-108 {background-color: #FFFF15;}\n",
       ".cython.score-109 {background-color: #FFFF15;}\n",
       ".cython.score-110 {background-color: #FFFF15;}\n",
       ".cython.score-111 {background-color: #FFFF15;}\n",
       ".cython.score-112 {background-color: #FFFF14;}\n",
       ".cython.score-113 {background-color: #FFFF14;}\n",
       ".cython.score-114 {background-color: #FFFF14;}\n",
       ".cython.score-115 {background-color: #FFFF14;}\n",
       ".cython.score-116 {background-color: #FFFF14;}\n",
       ".cython.score-117 {background-color: #FFFF14;}\n",
       ".cython.score-118 {background-color: #FFFF13;}\n",
       ".cython.score-119 {background-color: #FFFF13;}\n",
       ".cython.score-120 {background-color: #FFFF13;}\n",
       ".cython.score-121 {background-color: #FFFF13;}\n",
       ".cython.score-122 {background-color: #FFFF13;}\n",
       ".cython.score-123 {background-color: #FFFF13;}\n",
       ".cython.score-124 {background-color: #FFFF13;}\n",
       ".cython.score-125 {background-color: #FFFF12;}\n",
       ".cython.score-126 {background-color: #FFFF12;}\n",
       ".cython.score-127 {background-color: #FFFF12;}\n",
       ".cython.score-128 {background-color: #FFFF12;}\n",
       ".cython.score-129 {background-color: #FFFF12;}\n",
       ".cython.score-130 {background-color: #FFFF12;}\n",
       ".cython.score-131 {background-color: #FFFF12;}\n",
       ".cython.score-132 {background-color: #FFFF11;}\n",
       ".cython.score-133 {background-color: #FFFF11;}\n",
       ".cython.score-134 {background-color: #FFFF11;}\n",
       ".cython.score-135 {background-color: #FFFF11;}\n",
       ".cython.score-136 {background-color: #FFFF11;}\n",
       ".cython.score-137 {background-color: #FFFF11;}\n",
       ".cython.score-138 {background-color: #FFFF11;}\n",
       ".cython.score-139 {background-color: #FFFF11;}\n",
       ".cython.score-140 {background-color: #FFFF11;}\n",
       ".cython.score-141 {background-color: #FFFF10;}\n",
       ".cython.score-142 {background-color: #FFFF10;}\n",
       ".cython.score-143 {background-color: #FFFF10;}\n",
       ".cython.score-144 {background-color: #FFFF10;}\n",
       ".cython.score-145 {background-color: #FFFF10;}\n",
       ".cython.score-146 {background-color: #FFFF10;}\n",
       ".cython.score-147 {background-color: #FFFF10;}\n",
       ".cython.score-148 {background-color: #FFFF10;}\n",
       ".cython.score-149 {background-color: #FFFF10;}\n",
       ".cython.score-150 {background-color: #FFFF0f;}\n",
       ".cython.score-151 {background-color: #FFFF0f;}\n",
       ".cython.score-152 {background-color: #FFFF0f;}\n",
       ".cython.score-153 {background-color: #FFFF0f;}\n",
       ".cython.score-154 {background-color: #FFFF0f;}\n",
       ".cython.score-155 {background-color: #FFFF0f;}\n",
       ".cython.score-156 {background-color: #FFFF0f;}\n",
       ".cython.score-157 {background-color: #FFFF0f;}\n",
       ".cython.score-158 {background-color: #FFFF0f;}\n",
       ".cython.score-159 {background-color: #FFFF0f;}\n",
       ".cython.score-160 {background-color: #FFFF0f;}\n",
       ".cython.score-161 {background-color: #FFFF0e;}\n",
       ".cython.score-162 {background-color: #FFFF0e;}\n",
       ".cython.score-163 {background-color: #FFFF0e;}\n",
       ".cython.score-164 {background-color: #FFFF0e;}\n",
       ".cython.score-165 {background-color: #FFFF0e;}\n",
       ".cython.score-166 {background-color: #FFFF0e;}\n",
       ".cython.score-167 {background-color: #FFFF0e;}\n",
       ".cython.score-168 {background-color: #FFFF0e;}\n",
       ".cython.score-169 {background-color: #FFFF0e;}\n",
       ".cython.score-170 {background-color: #FFFF0e;}\n",
       ".cython.score-171 {background-color: #FFFF0e;}\n",
       ".cython.score-172 {background-color: #FFFF0e;}\n",
       ".cython.score-173 {background-color: #FFFF0d;}\n",
       ".cython.score-174 {background-color: #FFFF0d;}\n",
       ".cython.score-175 {background-color: #FFFF0d;}\n",
       ".cython.score-176 {background-color: #FFFF0d;}\n",
       ".cython.score-177 {background-color: #FFFF0d;}\n",
       ".cython.score-178 {background-color: #FFFF0d;}\n",
       ".cython.score-179 {background-color: #FFFF0d;}\n",
       ".cython.score-180 {background-color: #FFFF0d;}\n",
       ".cython.score-181 {background-color: #FFFF0d;}\n",
       ".cython.score-182 {background-color: #FFFF0d;}\n",
       ".cython.score-183 {background-color: #FFFF0d;}\n",
       ".cython.score-184 {background-color: #FFFF0d;}\n",
       ".cython.score-185 {background-color: #FFFF0d;}\n",
       ".cython.score-186 {background-color: #FFFF0d;}\n",
       ".cython.score-187 {background-color: #FFFF0c;}\n",
       ".cython.score-188 {background-color: #FFFF0c;}\n",
       ".cython.score-189 {background-color: #FFFF0c;}\n",
       ".cython.score-190 {background-color: #FFFF0c;}\n",
       ".cython.score-191 {background-color: #FFFF0c;}\n",
       ".cython.score-192 {background-color: #FFFF0c;}\n",
       ".cython.score-193 {background-color: #FFFF0c;}\n",
       ".cython.score-194 {background-color: #FFFF0c;}\n",
       ".cython.score-195 {background-color: #FFFF0c;}\n",
       ".cython.score-196 {background-color: #FFFF0c;}\n",
       ".cython.score-197 {background-color: #FFFF0c;}\n",
       ".cython.score-198 {background-color: #FFFF0c;}\n",
       ".cython.score-199 {background-color: #FFFF0c;}\n",
       ".cython.score-200 {background-color: #FFFF0c;}\n",
       ".cython.score-201 {background-color: #FFFF0c;}\n",
       ".cython.score-202 {background-color: #FFFF0c;}\n",
       ".cython.score-203 {background-color: #FFFF0b;}\n",
       ".cython.score-204 {background-color: #FFFF0b;}\n",
       ".cython.score-205 {background-color: #FFFF0b;}\n",
       ".cython.score-206 {background-color: #FFFF0b;}\n",
       ".cython.score-207 {background-color: #FFFF0b;}\n",
       ".cython.score-208 {background-color: #FFFF0b;}\n",
       ".cython.score-209 {background-color: #FFFF0b;}\n",
       ".cython.score-210 {background-color: #FFFF0b;}\n",
       ".cython.score-211 {background-color: #FFFF0b;}\n",
       ".cython.score-212 {background-color: #FFFF0b;}\n",
       ".cython.score-213 {background-color: #FFFF0b;}\n",
       ".cython.score-214 {background-color: #FFFF0b;}\n",
       ".cython.score-215 {background-color: #FFFF0b;}\n",
       ".cython.score-216 {background-color: #FFFF0b;}\n",
       ".cython.score-217 {background-color: #FFFF0b;}\n",
       ".cython.score-218 {background-color: #FFFF0b;}\n",
       ".cython.score-219 {background-color: #FFFF0b;}\n",
       ".cython.score-220 {background-color: #FFFF0b;}\n",
       ".cython.score-221 {background-color: #FFFF0b;}\n",
       ".cython.score-222 {background-color: #FFFF0a;}\n",
       ".cython.score-223 {background-color: #FFFF0a;}\n",
       ".cython.score-224 {background-color: #FFFF0a;}\n",
       ".cython.score-225 {background-color: #FFFF0a;}\n",
       ".cython.score-226 {background-color: #FFFF0a;}\n",
       ".cython.score-227 {background-color: #FFFF0a;}\n",
       ".cython.score-228 {background-color: #FFFF0a;}\n",
       ".cython.score-229 {background-color: #FFFF0a;}\n",
       ".cython.score-230 {background-color: #FFFF0a;}\n",
       ".cython.score-231 {background-color: #FFFF0a;}\n",
       ".cython.score-232 {background-color: #FFFF0a;}\n",
       ".cython.score-233 {background-color: #FFFF0a;}\n",
       ".cython.score-234 {background-color: #FFFF0a;}\n",
       ".cython.score-235 {background-color: #FFFF0a;}\n",
       ".cython.score-236 {background-color: #FFFF0a;}\n",
       ".cython.score-237 {background-color: #FFFF0a;}\n",
       ".cython.score-238 {background-color: #FFFF0a;}\n",
       ".cython.score-239 {background-color: #FFFF0a;}\n",
       ".cython.score-240 {background-color: #FFFF0a;}\n",
       ".cython.score-241 {background-color: #FFFF0a;}\n",
       ".cython.score-242 {background-color: #FFFF0a;}\n",
       ".cython.score-243 {background-color: #FFFF0a;}\n",
       ".cython.score-244 {background-color: #FFFF0a;}\n",
       ".cython.score-245 {background-color: #FFFF0a;}\n",
       ".cython.score-246 {background-color: #FFFF09;}\n",
       ".cython.score-247 {background-color: #FFFF09;}\n",
       ".cython.score-248 {background-color: #FFFF09;}\n",
       ".cython.score-249 {background-color: #FFFF09;}\n",
       ".cython.score-250 {background-color: #FFFF09;}\n",
       ".cython.score-251 {background-color: #FFFF09;}\n",
       ".cython.score-252 {background-color: #FFFF09;}\n",
       ".cython.score-253 {background-color: #FFFF09;}\n",
       ".cython.score-254 {background-color: #FFFF09;}\n",
       ".cython .hll { background-color: #ffffcc }\n",
       ".cython  { background: #f8f8f8; }\n",
       ".cython .c { color: #408080; font-style: italic } /* Comment */\n",
       ".cython .err { border: 1px solid #FF0000 } /* Error */\n",
       ".cython .k { color: #008000; font-weight: bold } /* Keyword */\n",
       ".cython .o { color: #666666 } /* Operator */\n",
       ".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
       ".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
       ".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n",
       ".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
       ".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
       ".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
       ".cython .gd { color: #A00000 } /* Generic.Deleted */\n",
       ".cython .ge { font-style: italic } /* Generic.Emph */\n",
       ".cython .gr { color: #FF0000 } /* Generic.Error */\n",
       ".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
       ".cython .gi { color: #00A000 } /* Generic.Inserted */\n",
       ".cython .go { color: #888888 } /* Generic.Output */\n",
       ".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
       ".cython .gs { font-weight: bold } /* Generic.Strong */\n",
       ".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
       ".cython .gt { color: #0044DD } /* Generic.Traceback */\n",
       ".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
       ".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
       ".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
       ".cython .kp { color: #008000 } /* Keyword.Pseudo */\n",
       ".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
       ".cython .kt { color: #B00040 } /* Keyword.Type */\n",
       ".cython .m { color: #666666 } /* Literal.Number */\n",
       ".cython .s { color: #BA2121 } /* Literal.String */\n",
       ".cython .na { color: #7D9029 } /* Name.Attribute */\n",
       ".cython .nb { color: #008000 } /* Name.Builtin */\n",
       ".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
       ".cython .no { color: #880000 } /* Name.Constant */\n",
       ".cython .nd { color: #AA22FF } /* Name.Decorator */\n",
       ".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
       ".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
       ".cython .nf { color: #0000FF } /* Name.Function */\n",
       ".cython .nl { color: #A0A000 } /* Name.Label */\n",
       ".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
       ".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
       ".cython .nv { color: #19177C } /* Name.Variable */\n",
       ".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
       ".cython .w { color: #bbbbbb } /* Text.Whitespace */\n",
       ".cython .mb { color: #666666 } /* Literal.Number.Bin */\n",
       ".cython .mf { color: #666666 } /* Literal.Number.Float */\n",
       ".cython .mh { color: #666666 } /* Literal.Number.Hex */\n",
       ".cython .mi { color: #666666 } /* Literal.Number.Integer */\n",
       ".cython .mo { color: #666666 } /* Literal.Number.Oct */\n",
       ".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
       ".cython .sc { color: #BA2121 } /* Literal.String.Char */\n",
       ".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
       ".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n",
       ".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
       ".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
       ".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
       ".cython .sx { color: #008000 } /* Literal.String.Other */\n",
       ".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n",
       ".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n",
       ".cython .ss { color: #19177C } /* Literal.String.Symbol */\n",
       ".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
       ".cython .vc { color: #19177C } /* Name.Variable.Class */\n",
       ".cython .vg { color: #19177C } /* Name.Variable.Global */\n",
       ".cython .vi { color: #19177C } /* Name.Variable.Instance */\n",
       ".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
       "    </style>\n",
       "    <script>\n",
       "    function toggleDiv(id) {\n",
       "        theDiv = id.nextElementSibling\n",
       "        if (theDiv.style.display != 'block') theDiv.style.display = 'block';\n",
       "        else theDiv.style.display = 'none';\n",
       "    }\n",
       "    </script>\n",
       "</head>\n",
       "<body class=\"cython\">\n",
       "<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.25.2</span></p>\n",
       "<p>\n",
       "    <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n",
       "    Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n",
       "</p>\n",
       "<div class=\"cython\"><pre class=\"cython line score-11\" onclick='toggleDiv(this)'>+<span class=\"\">001</span>: <span class=\"k\">cimport</span> <span class=\"nn\">cython</span></pre>\n",
       "<pre class='cython code score-11 '>  __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_test, __pyx_t_1) &lt; 0) __PYX_ERR(0, 1, __pyx_L1_error)\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "</pre><pre class=\"cython line score-8\" onclick='toggleDiv(this)'>+<span class=\"\">002</span>: <span class=\"k\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n",
       "<pre class='cython code score-8 '>  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_np, __pyx_t_1) &lt; 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">003</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">cnp</span></pre>\n",
       "<pre class=\"cython line score-8\" onclick='toggleDiv(this)'>+<span class=\"\">004</span>: <span class=\"k\">import</span> <span class=\"nn\">math</span></pre>\n",
       "<pre class='cython code score-8 '>  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_math, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_math, __pyx_t_1) &lt; 0) __PYX_ERR(0, 4, __pyx_L1_error)\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">005</span>: <span class=\"k\">from</span> <span class=\"nn\">cpython</span> <span class=\"k\">cimport</span> <span class=\"nb\">bool</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">006</span>: <span class=\"k\">from</span> <span class=\"nn\">libc.math</span> <span class=\"k\">cimport</span> <span class=\"n\">sqrt</span> <span class=\"k\">as</span> <span class=\"n\">Csqrt</span><span class=\"p\">,</span> <span class=\"n\">cos</span> <span class=\"k\">as</span> <span class=\"n\">Ccos</span><span class=\"p\">,</span> <span class=\"n\">sin</span> <span class=\"k\">as</span> <span class=\"n\">Csin</span><span class=\"p\">,</span> <span class=\"n\">atan2</span> <span class=\"k\">as</span> <span class=\"n\">Catan2</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">007</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">008</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">cdivision</span><span class=\"p\">(</span><span class=\"bp\">True</span><span class=\"p\">)</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">009</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">wraparound</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">010</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">boundscheck</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n",
       "<pre class=\"cython line score-49\" onclick='toggleDiv(this)'>+<span class=\"\">011</span>: <span class=\"k\">def</span> <span class=\"nf\">Calc_LOS_PInOut_cython</span><span class=\"p\">(</span><span class=\"n\">double</span> <span class=\"p\">[:,::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">Ds</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"p\">[:,::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">us</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"p\">[:,::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">VPoly</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"p\">[:,::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">vIn</span><span class=\"p\">,</span></pre>\n",
       "<pre class='cython code score-49 '>/* Python wrapper */\n",
       "static PyObject *__pyx_pw_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_1Calc_LOS_PInOut_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
       "static PyMethodDef __pyx_mdef_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_1Calc_LOS_PInOut_cython = {\"Calc_LOS_PInOut_cython\", (PyCFunction)__pyx_pw_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_1Calc_LOS_PInOut_cython, METH_VARARGS|METH_KEYWORDS, 0};\n",
       "static PyObject *__pyx_pw_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_1Calc_LOS_PInOut_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
       "  __Pyx_memviewslice __pyx_v_Ds = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  __Pyx_memviewslice __pyx_v_us = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  __Pyx_memviewslice __pyx_v_VPoly = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  __Pyx_memviewslice __pyx_v_vIn = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  PyBoolObject *__pyx_v_Forbid = 0;\n",
       "  PyObject *__pyx_v_RMin = 0;\n",
       "  double __pyx_v_EpsUz;\n",
       "  double __pyx_v_EpsVz;\n",
       "  double __pyx_v_EpsA;\n",
       "  double __pyx_v_EpsB;\n",
       "  PyObject *__pyx_r = 0;\n",
       "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
       "  <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"Calc_LOS_PInOut_cython (wrapper)\", 0);\n",
       "  {\n",
       "    static PyObject **__pyx_pyargnames[] = {&amp;__pyx_n_s_Ds,&amp;__pyx_n_s_us,&amp;__pyx_n_s_VPoly,&amp;__pyx_n_s_vIn,&amp;__pyx_n_s_Forbid,&amp;__pyx_n_s_RMin,&amp;__pyx_n_s_EpsUz,&amp;__pyx_n_s_EpsVz,&amp;__pyx_n_s_EpsA,&amp;__pyx_n_s_EpsB,0};\n",
       "    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};\n",
       "/* … */\n",
       "  /* function exit code */\n",
       "  goto __pyx_L0;\n",
       "  __pyx_L1_error:;\n",
       "  __pyx_r = NULL;\n",
       "  __pyx_L0:;\n",
       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
       "  return __pyx_r;\n",
       "}\n",
       "\n",
       "static PyObject *__pyx_pf_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_Calc_LOS_PInOut_cython(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_Ds, __Pyx_memviewslice __pyx_v_us, __Pyx_memviewslice __pyx_v_VPoly, __Pyx_memviewslice __pyx_v_vIn, PyBoolObject *__pyx_v_Forbid, PyObject *__pyx_v_RMin, double __pyx_v_EpsUz, double __pyx_v_EpsVz, double __pyx_v_EpsA, double __pyx_v_EpsB) {\n",
       "  int __pyx_v_ii;\n",
       "  int __pyx_v_jj;\n",
       "  int __pyx_v_Nl;\n",
       "  int __pyx_v_Ns;\n",
       "  double __pyx_v_Rmin;\n",
       "  double __pyx_v_upscaDp;\n",
       "  double __pyx_v_upar2;\n",
       "  double __pyx_v_Dpar2;\n",
       "  double __pyx_v_Crit2;\n",
       "  double __pyx_v_kout;\n",
       "  double __pyx_v_kin;\n",
       "  int __pyx_v_indout;\n",
       "  int __pyx_v_Done;\n",
       "  double __pyx_v_L;\n",
       "  double __pyx_v_S1X;\n",
       "  double __pyx_v_S1Y;\n",
       "  double __pyx_v_S2X;\n",
       "  double __pyx_v_S2Y;\n",
       "  double __pyx_v_sca;\n",
       "  double __pyx_v_sca0;\n",
       "  double __pyx_v_sca1;\n",
       "  double __pyx_v_sca2;\n",
       "  double __pyx_v_q;\n",
       "  double __pyx_v_C;\n",
       "  double __pyx_v_delta;\n",
       "  double __pyx_v_sqd;\n",
       "  double __pyx_v_k;\n",
       "  double __pyx_v_sol0;\n",
       "  double __pyx_v_sol1;\n",
       "  double __pyx_v_v0;\n",
       "  double __pyx_v_v1;\n",
       "  double __pyx_v_A;\n",
       "  double __pyx_v_B;\n",
       "  int __pyx_v_Forbidbis;\n",
       "  int __pyx_v_Forbid0;\n",
       "  PyArrayObject *__pyx_v_SIn_ = 0;\n",
       "  PyArrayObject *__pyx_v_SOut_ = 0;\n",
       "  PyArrayObject *__pyx_v_VPerp_ = 0;\n",
       "  PyArrayObject *__pyx_v_indOut_ = 0;\n",
       "  __Pyx_memviewslice __pyx_v_SIn = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  __Pyx_memviewslice __pyx_v_SOut = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  __Pyx_memviewslice __pyx_v_VPerp = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  __Pyx_memviewslice __pyx_v_indOut = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
       "  double __pyx_v_phi;\n",
       "  __Pyx_LocalBuf_ND __pyx_pybuffernd_SIn_;\n",
       "  __Pyx_Buffer __pyx_pybuffer_SIn_;\n",
       "  __Pyx_LocalBuf_ND __pyx_pybuffernd_SOut_;\n",
       "  __Pyx_Buffer __pyx_pybuffer_SOut_;\n",
       "  __Pyx_LocalBuf_ND __pyx_pybuffernd_VPerp_;\n",
       "  __Pyx_Buffer __pyx_pybuffer_VPerp_;\n",
       "  __Pyx_LocalBuf_ND __pyx_pybuffernd_indOut_;\n",
       "  __Pyx_Buffer __pyx_pybuffer_indOut_;\n",
       "  PyObject *__pyx_r = NULL;\n",
       "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
       "  <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"Calc_LOS_PInOut_cython\", 0);\n",
       "  __pyx_pybuffer_SIn_.pybuffer.buf = NULL;\n",
       "  __pyx_pybuffer_SIn_.refcount = 0;\n",
       "  __pyx_pybuffernd_SIn_.data = NULL;\n",
       "  __pyx_pybuffernd_SIn_.rcbuffer = &amp;__pyx_pybuffer_SIn_;\n",
       "  __pyx_pybuffer_SOut_.pybuffer.buf = NULL;\n",
       "  __pyx_pybuffer_SOut_.refcount = 0;\n",
       "  __pyx_pybuffernd_SOut_.data = NULL;\n",
       "  __pyx_pybuffernd_SOut_.rcbuffer = &amp;__pyx_pybuffer_SOut_;\n",
       "  __pyx_pybuffer_VPerp_.pybuffer.buf = NULL;\n",
       "  __pyx_pybuffer_VPerp_.refcount = 0;\n",
       "  __pyx_pybuffernd_VPerp_.data = NULL;\n",
       "  __pyx_pybuffernd_VPerp_.rcbuffer = &amp;__pyx_pybuffer_VPerp_;\n",
       "  __pyx_pybuffer_indOut_.pybuffer.buf = NULL;\n",
       "  __pyx_pybuffer_indOut_.refcount = 0;\n",
       "  __pyx_pybuffernd_indOut_.data = NULL;\n",
       "  __pyx_pybuffernd_indOut_.rcbuffer = &amp;__pyx_pybuffer_indOut_;\n",
       "/* … */\n",
       "  /* function exit code */\n",
       "  __pyx_L1_error:;\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_t_10, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_t_11, 1);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_14);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_16);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_254);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_255);\n",
       "  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
       "    __Pyx_PyThreadState_declare\n",
       "    __Pyx_PyThreadState_assign\n",
       "    <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&amp;__pyx_type, &amp;__pyx_value, &amp;__pyx_tb);\n",
       "    <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer);\n",
       "    <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer);\n",
       "    <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer);\n",
       "    <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_indOut_.rcbuffer-&gt;pybuffer);\n",
       "  <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n",
       "  <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c.Calc_LOS_PInOut_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __pyx_r = NULL;\n",
       "  goto __pyx_L2;\n",
       "  __pyx_L0:;\n",
       "  <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer);\n",
       "  <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer);\n",
       "  <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer);\n",
       "  <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&amp;__pyx_pybuffernd_indOut_.rcbuffer-&gt;pybuffer);\n",
       "  __pyx_L2:;\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_SIn_);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_SOut_);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_VPerp_);\n",
       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_indOut_);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_SIn, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_SOut, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_VPerp, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_indOut, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_Ds, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_us, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_VPoly, 1);\n",
       "  __PYX_XDEC_MEMVIEW(&amp;__pyx_v_vIn, 1);\n",
       "  <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n",
       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
       "  return __pyx_r;\n",
       "}\n",
       "/* … */\n",
       "  __pyx_tuple__23 = <span class='py_c_api'>PyTuple_Pack</span>(54, __pyx_n_s_Ds, __pyx_n_s_us, __pyx_n_s_VPoly, __pyx_n_s_vIn, __pyx_n_s_Forbid, __pyx_n_s_RMin, __pyx_n_s_EpsUz, __pyx_n_s_EpsVz, __pyx_n_s_EpsA, __pyx_n_s_EpsB, __pyx_n_s_ii, __pyx_n_s_jj, __pyx_n_s_Nl, __pyx_n_s_Ns, __pyx_n_s_Rmin, __pyx_n_s_upscaDp, __pyx_n_s_upar2, __pyx_n_s_Dpar2, __pyx_n_s_Crit2, __pyx_n_s_kout, __pyx_n_s_kin, __pyx_n_s_indout, __pyx_n_s_Done, __pyx_n_s_L, __pyx_n_s_S1X, __pyx_n_s_S1Y, __pyx_n_s_S2X, __pyx_n_s_S2Y, __pyx_n_s_sca, __pyx_n_s_sca0, __pyx_n_s_sca1, __pyx_n_s_sca2, __pyx_n_s_q, __pyx_n_s_C, __pyx_n_s_delta, __pyx_n_s_sqd, __pyx_n_s_k, __pyx_n_s_sol0, __pyx_n_s_sol1, __pyx_n_s_v0, __pyx_n_s_v1, __pyx_n_s_A, __pyx_n_s_B, __pyx_n_s_Forbidbis, __pyx_n_s_Forbid0, __pyx_n_s_SIn, __pyx_n_s_SOut, __pyx_n_s_VPerp, __pyx_n_s_indOut, __pyx_n_s_SIn_2, __pyx_n_s_SOut_2, __pyx_n_s_VPerp_2, __pyx_n_s_indOut_2, __pyx_n_s_phi); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 11, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__23);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__23);\n",
       "/* … */\n",
       "  __pyx_t_1 = PyCFunction_NewEx(&amp;__pyx_mdef_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_1Calc_LOS_PInOut_cython, NULL, __pyx_n_s_cython_magic_163cfc3d2ce7aad39b); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_Calc_LOS_PInOut_cython, __pyx_t_1) &lt; 0) __PYX_ERR(0, 11, __pyx_L1_error)\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_codeobj__24 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(10, 0, 54, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Home_DV226270_cache_ipython_cyt, __pyx_n_s_Calc_LOS_PInOut_cython, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 11, __pyx_L1_error)\n",
       "</pre><pre class=\"cython line score-140\" onclick='toggleDiv(this)'>+<span class=\"\">012</span>:                            <span class=\"nb\">bool</span> <span class=\"n\">Forbid</span><span class=\"o\">=</span><span class=\"bp\">True</span><span class=\"p\">,</span> <span class=\"n\">RMin</span><span class=\"o\">=</span><span class=\"bp\">None</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"n\">EpsUz</span><span class=\"o\">=</span><span class=\"mf\">1.e-6</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"n\">EpsVz</span><span class=\"o\">=</span><span class=\"mf\">1.e-9</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"n\">EpsA</span><span class=\"o\">=</span><span class=\"mf\">1.e-9</span><span class=\"p\">,</span> <span class=\"n\">double</span> <span class=\"n\">EpsB</span><span class=\"o\">=</span><span class=\"mf\">1.e-9</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-140 '>    values[4] = (PyObject *)((PyBoolObject *)Py_True);\n",
       "    values[5] = ((PyObject *)Py_None);\n",
       "    if (unlikely(__pyx_kwds)) {\n",
       "      Py_ssize_t kw_args;\n",
       "      const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n",
       "      switch (pos_args) {\n",
       "        case 10: values[9] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 9);\n",
       "        case  9: values[8] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 8);\n",
       "        case  8: values[7] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 7);\n",
       "        case  7: values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n",
       "        case  6: values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n",
       "        case  5: values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n",
       "        case  4: values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n",
       "        case  3: values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n",
       "        case  2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
       "        case  1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
       "        case  0: break;\n",
       "        default: goto __pyx_L5_argtuple_error;\n",
       "      }\n",
       "      kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n",
       "      switch (pos_args) {\n",
       "        case  0:\n",
       "        if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_Ds)) != 0)) kw_args--;\n",
       "        else goto __pyx_L5_argtuple_error;\n",
       "        case  1:\n",
       "        if (likely((values[1] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_us)) != 0)) kw_args--;\n",
       "        else {\n",
       "          <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"Calc_LOS_PInOut_cython\", 0, 4, 10, 1); __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "        }\n",
       "        case  2:\n",
       "        if (likely((values[2] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_VPoly)) != 0)) kw_args--;\n",
       "        else {\n",
       "          <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"Calc_LOS_PInOut_cython\", 0, 4, 10, 2); __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "        }\n",
       "        case  3:\n",
       "        if (likely((values[3] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_vIn)) != 0)) kw_args--;\n",
       "        else {\n",
       "          <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"Calc_LOS_PInOut_cython\", 0, 4, 10, 3); __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "        }\n",
       "        case  4:\n",
       "        if (kw_args &gt; 0) {\n",
       "          PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_Forbid);\n",
       "          if (value) { values[4] = value; kw_args--; }\n",
       "        }\n",
       "        case  5:\n",
       "        if (kw_args &gt; 0) {\n",
       "          PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_RMin);\n",
       "          if (value) { values[5] = value; kw_args--; }\n",
       "        }\n",
       "        case  6:\n",
       "        if (kw_args &gt; 0) {\n",
       "          PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_EpsUz);\n",
       "          if (value) { values[6] = value; kw_args--; }\n",
       "        }\n",
       "        case  7:\n",
       "        if (kw_args &gt; 0) {\n",
       "          PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_EpsVz);\n",
       "          if (value) { values[7] = value; kw_args--; }\n",
       "        }\n",
       "        case  8:\n",
       "        if (kw_args &gt; 0) {\n",
       "          PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_EpsA);\n",
       "          if (value) { values[8] = value; kw_args--; }\n",
       "        }\n",
       "        case  9:\n",
       "        if (kw_args &gt; 0) {\n",
       "          PyObject* value = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_EpsB);\n",
       "          if (value) { values[9] = value; kw_args--; }\n",
       "        }\n",
       "      }\n",
       "      if (unlikely(kw_args &gt; 0)) {\n",
       "        if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"Calc_LOS_PInOut_cython\") &lt; 0)) __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "      }\n",
       "    } else {\n",
       "      switch (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)) {\n",
       "        case 10: values[9] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 9);\n",
       "        case  9: values[8] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 8);\n",
       "        case  8: values[7] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 7);\n",
       "        case  7: values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n",
       "        case  6: values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n",
       "        case  5: values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n",
       "        case  4: values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n",
       "        values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n",
       "        values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
       "        values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
       "        break;\n",
       "        default: goto __pyx_L5_argtuple_error;\n",
       "      }\n",
       "    }\n",
       "    __pyx_v_Ds = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(values[0]); if (unlikely(!__pyx_v_Ds.memview)) __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "    __pyx_v_us = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(values[1]); if (unlikely(!__pyx_v_us.memview)) __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "    __pyx_v_VPoly = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(values[2]); if (unlikely(!__pyx_v_VPoly.memview)) __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "    __pyx_v_vIn = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(values[3]); if (unlikely(!__pyx_v_vIn.memview)) __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "    __pyx_v_Forbid = ((PyBoolObject *)values[4]);\n",
       "    __pyx_v_RMin = values[5];\n",
       "    if (values[6]) {\n",
       "      __pyx_v_EpsUz = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[6]); if (unlikely((__pyx_v_EpsUz == (double)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 12, __pyx_L3_error)\n",
       "    } else {\n",
       "      __pyx_v_EpsUz = ((double)1.e-6);\n",
       "    }\n",
       "    if (values[7]) {\n",
       "      __pyx_v_EpsVz = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[7]); if (unlikely((__pyx_v_EpsVz == (double)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 12, __pyx_L3_error)\n",
       "    } else {\n",
       "      __pyx_v_EpsVz = ((double)1.e-9);\n",
       "    }\n",
       "    if (values[8]) {\n",
       "      __pyx_v_EpsA = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[8]); if (unlikely((__pyx_v_EpsA == (double)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 12, __pyx_L3_error)\n",
       "    } else {\n",
       "      __pyx_v_EpsA = ((double)1.e-9);\n",
       "    }\n",
       "    if (values[9]) {\n",
       "      __pyx_v_EpsB = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[9]); if (unlikely((__pyx_v_EpsB == (double)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 12, __pyx_L3_error)\n",
       "    } else {\n",
       "      __pyx_v_EpsB = ((double)1.e-9);\n",
       "    }\n",
       "  }\n",
       "  goto __pyx_L4_argument_unpacking_done;\n",
       "  __pyx_L5_argtuple_error:;\n",
       "  <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"Calc_LOS_PInOut_cython\", 0, 4, 10, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); __PYX_ERR(0, 11, __pyx_L3_error)\n",
       "  __pyx_L3_error:;\n",
       "  <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c.Calc_LOS_PInOut_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
       "  return NULL;\n",
       "  __pyx_L4_argument_unpacking_done:;\n",
       "  if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_Forbid), __pyx_ptype_7cpython_4bool_bool, 1, \"Forbid\", 0))) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __pyx_r = __pyx_pf_46_cython_magic_163cfc3d2ce7aad39b88b29178aa2d8c_Calc_LOS_PInOut_cython(__pyx_self, __pyx_v_Ds, __pyx_v_us, __pyx_v_VPoly, __pyx_v_vIn, __pyx_v_Forbid, __pyx_v_RMin, __pyx_v_EpsUz, __pyx_v_EpsVz, __pyx_v_EpsA, __pyx_v_EpsB);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">013</span>: </pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">014</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">ii</span><span class=\"p\">,</span> <span class=\"nf\">jj</span><span class=\"p\">,</span> <span class=\"nf\">Nl</span><span class=\"o\">=</span><span class=\"n\">Ds</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">],</span> <span class=\"n\">Ns</span><span class=\"o\">=</span><span class=\"n\">vIn</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>  __pyx_v_Nl = (__pyx_v_Ds.shape[1]);\n",
       "  __pyx_v_Ns = (__pyx_v_vIn.shape[1]);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">015</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">Rmin</span><span class=\"p\">,</span> <span class=\"nf\">upscaDp</span><span class=\"p\">,</span> <span class=\"nf\">upar2</span><span class=\"p\">,</span> <span class=\"nf\">Dpar2</span><span class=\"p\">,</span> <span class=\"nf\">Crit2</span><span class=\"p\">,</span> <span class=\"nf\">kout</span><span class=\"p\">,</span> <span class=\"nf\">kin</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">016</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">indout</span><span class=\"p\">,</span> <span class=\"nf\">Done</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">017</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">L</span><span class=\"p\">,</span> <span class=\"nf\">S1X</span><span class=\"p\">,</span> <span class=\"nf\">S1Y</span><span class=\"p\">,</span> <span class=\"nf\">S2X</span><span class=\"p\">,</span> <span class=\"nf\">S2Y</span><span class=\"p\">,</span> <span class=\"nf\">sca</span><span class=\"p\">,</span> <span class=\"nf\">sca0</span><span class=\"p\">,</span> <span class=\"nf\">sca1</span><span class=\"p\">,</span> <span class=\"nf\">sca2</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">018</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">q</span><span class=\"p\">,</span> <span class=\"nf\">C</span><span class=\"p\">,</span> <span class=\"nf\">delta</span><span class=\"p\">,</span> <span class=\"nf\">sqd</span><span class=\"p\">,</span> <span class=\"nf\">k</span><span class=\"p\">,</span> <span class=\"nf\">sol0</span><span class=\"p\">,</span> <span class=\"nf\">sol1</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">019</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">double</span> <span class=\"nf\">v0</span><span class=\"p\">,</span> <span class=\"nf\">v1</span><span class=\"p\">,</span> <span class=\"nf\">A</span><span class=\"p\">,</span> <span class=\"nf\">B</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">020</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">Forbidbis</span><span class=\"p\">,</span> <span class=\"nf\">Forbid0</span></pre>\n",
       "<pre class=\"cython line score-142\" onclick='toggleDiv(this)'>+<span class=\"\">021</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">cnp</span>.<span class=\"kt\">ndarray</span>[<span class=\"nf\">double</span><span class=\"p\">,</span><span class=\"nf\">ndim</span><span class=\"o\">=</span><span class=\"mf\">2</span><span class=\"p\">]</span> <span class=\"n\">SIn_</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">nan</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">((</span><span class=\"mf\">3</span><span class=\"p\">,</span><span class=\"n\">Nl</span><span class=\"p\">)),</span> <span class=\"n\">SOut_</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">nan</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">((</span><span class=\"mf\">3</span><span class=\"p\">,</span><span class=\"n\">Nl</span><span class=\"p\">))</span></pre>\n",
       "<pre class='cython code score-142 '>  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_nan); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_3 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_Nl); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_3);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_int_3);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_t_3);\n",
       "  __pyx_t_3 = 0;\n",
       "  __pyx_t_3 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_4))) {\n",
       "    __pyx_t_3 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_4);\n",
       "    if (likely(__pyx_t_3)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_4);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_4, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_3) {\n",
       "    __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_4)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_t_5};\n",
       "      __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_4)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_t_5};\n",
       "      __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0+1, __pyx_t_5);\n",
       "      __pyx_t_5 = 0;\n",
       "      __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  if (!(likely(((__pyx_t_4) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);\n",
       "  {\n",
       "    __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
       "    if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&amp;__pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_t_7, &amp;__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
       "      __pyx_v_SIn_ = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer.buf = NULL;\n",
       "      __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "    } else {__pyx_pybuffernd_SIn_.diminfo[0].strides = __pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer.strides[0]; __pyx_pybuffernd_SIn_.diminfo[0].shape = __pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer.shape[0]; __pyx_pybuffernd_SIn_.diminfo[1].strides = __pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer.strides[1]; __pyx_pybuffernd_SIn_.diminfo[1].shape = __pyx_pybuffernd_SIn_.rcbuffer-&gt;pybuffer.shape[1];\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_7 = 0;\n",
       "  __pyx_v_SIn_ = ((PyArrayObject *)__pyx_t_4);\n",
       "  __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_nan); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "  __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s_ones); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_Nl); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "  __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_3);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_int_3);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_t_2);\n",
       "  __pyx_t_2 = 0;\n",
       "  __pyx_t_2 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_6))) {\n",
       "    __pyx_t_2 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_6);\n",
       "    if (likely(__pyx_t_2)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_6);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_2);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_6, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_2) {\n",
       "    __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_6)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_5};\n",
       "      __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_6)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_5};\n",
       "      __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0+1, __pyx_t_5);\n",
       "      __pyx_t_5 = 0;\n",
       "      __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_6, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __pyx_t_6 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  if (!(likely(((__pyx_t_6) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "  __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);\n",
       "  {\n",
       "    __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
       "    if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&amp;__pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_t_7, &amp;__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
       "      __pyx_v_SOut_ = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer.buf = NULL;\n",
       "      __PYX_ERR(0, 21, __pyx_L1_error)\n",
       "    } else {__pyx_pybuffernd_SOut_.diminfo[0].strides = __pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer.strides[0]; __pyx_pybuffernd_SOut_.diminfo[0].shape = __pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer.shape[0]; __pyx_pybuffernd_SOut_.diminfo[1].strides = __pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer.strides[1]; __pyx_pybuffernd_SOut_.diminfo[1].shape = __pyx_pybuffernd_SOut_.rcbuffer-&gt;pybuffer.shape[1];\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_7 = 0;\n",
       "  __pyx_v_SOut_ = ((PyArrayObject *)__pyx_t_6);\n",
       "  __pyx_t_6 = 0;\n",
       "</pre><pre class=\"cython line score-71\" onclick='toggleDiv(this)'>+<span class=\"\">022</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">cnp</span>.<span class=\"kt\">ndarray</span>[<span class=\"nf\">double</span><span class=\"p\">,</span><span class=\"nf\">ndim</span><span class=\"o\">=</span><span class=\"mf\">2</span><span class=\"p\">]</span> <span class=\"n\">VPerp_</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">nan</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">((</span><span class=\"mf\">3</span><span class=\"p\">,</span><span class=\"n\">Nl</span><span class=\"p\">))</span></pre>\n",
       "<pre class='cython code score-71 '>  __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_6, __pyx_n_s_nan); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_ones); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_Nl); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "  __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_3);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_int_3);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_t_1);\n",
       "  __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_3))) {\n",
       "    __pyx_t_1 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_3);\n",
       "    if (likely(__pyx_t_1)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_3, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_1) {\n",
       "    __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_3)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_1, __pyx_t_5};\n",
       "      __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_3)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_1, __pyx_t_5};\n",
       "      __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1); __pyx_t_1 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0+1, __pyx_t_5);\n",
       "      __pyx_t_5 = 0;\n",
       "      __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __pyx_t_3 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  if (!(likely(((__pyx_t_3) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "  __pyx_t_8 = ((PyArrayObject *)__pyx_t_3);\n",
       "  {\n",
       "    __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
       "    if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&amp;__pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_t_8, &amp;__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
       "      __pyx_v_VPerp_ = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer.buf = NULL;\n",
       "      __PYX_ERR(0, 22, __pyx_L1_error)\n",
       "    } else {__pyx_pybuffernd_VPerp_.diminfo[0].strides = __pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer.strides[0]; __pyx_pybuffernd_VPerp_.diminfo[0].shape = __pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer.shape[0]; __pyx_pybuffernd_VPerp_.diminfo[1].strides = __pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer.strides[1]; __pyx_pybuffernd_VPerp_.diminfo[1].shape = __pyx_pybuffernd_VPerp_.rcbuffer-&gt;pybuffer.shape[1];\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_8 = 0;\n",
       "  __pyx_v_VPerp_ = ((PyArrayObject *)__pyx_t_3);\n",
       "  __pyx_t_3 = 0;\n",
       "</pre><pre class=\"cython line score-69\" onclick='toggleDiv(this)'>+<span class=\"\">023</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">cnp</span>.<span class=\"kt\">ndarray</span>[<span class=\"nf\">double</span><span class=\"p\">,</span><span class=\"nf\">ndim</span><span class=\"o\">=</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">indOut_</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">nan</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">((</span><span class=\"n\">Nl</span><span class=\"p\">,))</span></pre>\n",
       "<pre class='cython code score-69 '>  __pyx_t_3 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_3, __pyx_n_s_nan); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_ones); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_Nl); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_t_4);\n",
       "  __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_2))) {\n",
       "    __pyx_t_4 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_2);\n",
       "    if (likely(__pyx_t_4)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_2);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_4);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_2, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_4) {\n",
       "    __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_2)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_5};\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_2)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_5};\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_4); __pyx_t_4 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0+1, __pyx_t_5);\n",
       "      __pyx_t_5 = 0;\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_t_2 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_t_6, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "  __pyx_t_9 = ((PyArrayObject *)__pyx_t_2);\n",
       "  {\n",
       "    __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
       "    if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&amp;__pyx_pybuffernd_indOut_.rcbuffer-&gt;pybuffer, (PyObject*)__pyx_t_9, &amp;__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
       "      __pyx_v_indOut_ = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_indOut_.rcbuffer-&gt;pybuffer.buf = NULL;\n",
       "      __PYX_ERR(0, 23, __pyx_L1_error)\n",
       "    } else {__pyx_pybuffernd_indOut_.diminfo[0].strides = __pyx_pybuffernd_indOut_.rcbuffer-&gt;pybuffer.strides[0]; __pyx_pybuffernd_indOut_.diminfo[0].shape = __pyx_pybuffernd_indOut_.rcbuffer-&gt;pybuffer.shape[0];\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_9 = 0;\n",
       "  __pyx_v_indOut_ = ((PyArrayObject *)__pyx_t_2);\n",
       "  __pyx_t_2 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">024</span>: </pre>\n",
       "<pre class=\"cython line score-6\" onclick='toggleDiv(this)'>+<span class=\"\">025</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">double</span>[<span class=\"p\">:,::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">SIn</span><span class=\"o\">=</span><span class=\"n\">SIn_</span><span class=\"p\">,</span> <span class=\"n\">SOut</span><span class=\"o\">=</span><span class=\"n\">SOut_</span><span class=\"p\">,</span> <span class=\"n\">VPerp</span><span class=\"o\">=</span><span class=\"n\">VPerp_</span></pre>\n",
       "<pre class='cython code score-6 '>  __pyx_t_10 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(((PyObject *)__pyx_v_SIn_));\n",
       "  if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 25, __pyx_L1_error)\n",
       "  __pyx_v_SIn = __pyx_t_10;\n",
       "  __pyx_t_10.memview = NULL;\n",
       "  __pyx_t_10.data = NULL;\n",
       "  __pyx_t_10 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(((PyObject *)__pyx_v_SOut_));\n",
       "  if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 25, __pyx_L1_error)\n",
       "  __pyx_v_SOut = __pyx_t_10;\n",
       "  __pyx_t_10.memview = NULL;\n",
       "  __pyx_t_10.data = NULL;\n",
       "  __pyx_t_10 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_d_dc_double</span>(((PyObject *)__pyx_v_VPerp_));\n",
       "  if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 25, __pyx_L1_error)\n",
       "  __pyx_v_VPerp = __pyx_t_10;\n",
       "  __pyx_t_10.memview = NULL;\n",
       "  __pyx_t_10.data = NULL;\n",
       "</pre><pre class=\"cython line score-2\" onclick='toggleDiv(this)'>+<span class=\"\">026</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">double</span>[<span class=\"p\">::</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"n\">indOut</span><span class=\"o\">=</span><span class=\"n\">indOut_</span></pre>\n",
       "<pre class='cython code score-2 '>  __pyx_t_11 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dc_double</span>(((PyObject *)__pyx_v_indOut_));\n",
       "  if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 26, __pyx_L1_error)\n",
       "  __pyx_v_indOut = __pyx_t_11;\n",
       "  __pyx_t_11.memview = NULL;\n",
       "  __pyx_t_11.data = NULL;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">027</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">028</span>:     <span class=\"c\">################</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">029</span>:     <span class=\"c\"># Prepare input</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">030</span>:     <span class=\"k\">if</span> <span class=\"n\">RMin</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>  __pyx_t_12 = (__pyx_v_RMin == Py_None);\n",
       "  __pyx_t_13 = (__pyx_t_12 != 0);\n",
       "  if (__pyx_t_13) {\n",
       "/* … */\n",
       "    goto __pyx_L3;\n",
       "  }\n",
       "</pre><pre class=\"cython line score-176\" onclick='toggleDiv(this)'>+<span class=\"\">031</span>:         <span class=\"n\">Rmin</span> <span class=\"o\">=</span> <span class=\"mf\">0.95</span><span class=\"o\">*</span><span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">min</span><span class=\"p\">(</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,:]),</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">min</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">hypot</span><span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,:],</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,:])))</span></pre>\n",
       "<pre class='cython code score-176 '>    __pyx_t_3 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "    __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_3, __pyx_n_s_min); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "    __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_hypot); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "    __pyx_t_11.data = __pyx_v_Ds.data;\n",
       "    __pyx_t_11.memview = __pyx_v_Ds.memview;\n",
       "    __PYX_INC_MEMVIEW(&amp;__pyx_t_11, 0);\n",
       "    {\n",
       "    Py_ssize_t __pyx_tmp_idx = 0;\n",
       "    Py_ssize_t __pyx_tmp_shape = __pyx_v_Ds.shape[0];\n",
       "    Py_ssize_t __pyx_tmp_stride = __pyx_v_Ds.strides[0];\n",
       "    if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0))\n",
       "        __pyx_tmp_idx += __pyx_tmp_shape;\n",
       "    if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0 || __pyx_tmp_idx &gt;= __pyx_tmp_shape)) {\n",
       "        <span class='py_c_api'>PyErr_SetString</span>(PyExc_IndexError, \"Index out of bounds (axis 0)\");\n",
       "        __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    }\n",
       "        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;\n",
       "}\n",
       "\n",
       "__pyx_t_11.shape[0] = __pyx_v_Ds.shape[1];\n",
       "__pyx_t_11.strides[0] = __pyx_v_Ds.strides[1];\n",
       "    __pyx_t_11.suboffsets[0] = -1;\n",
       "\n",
       "__pyx_t_1 = __pyx_memoryview_fromslice(__pyx_t_11, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "    __PYX_XDEC_MEMVIEW(&amp;__pyx_t_11, 1);\n",
       "    __pyx_t_11.memview = NULL;\n",
       "    __pyx_t_11.data = NULL;\n",
       "    __pyx_t_11.data = __pyx_v_Ds.data;\n",
       "    __pyx_t_11.memview = __pyx_v_Ds.memview;\n",
       "    __PYX_INC_MEMVIEW(&amp;__pyx_t_11, 0);\n",
       "    {\n",
       "    Py_ssize_t __pyx_tmp_idx = 1;\n",
       "    Py_ssize_t __pyx_tmp_shape = __pyx_v_Ds.shape[0];\n",
       "    Py_ssize_t __pyx_tmp_stride = __pyx_v_Ds.strides[0];\n",
       "    if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0))\n",
       "        __pyx_tmp_idx += __pyx_tmp_shape;\n",
       "    if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0 || __pyx_tmp_idx &gt;= __pyx_tmp_shape)) {\n",
       "        <span class='py_c_api'>PyErr_SetString</span>(PyExc_IndexError, \"Index out of bounds (axis 0)\");\n",
       "        __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    }\n",
       "        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;\n",
       "}\n",
       "\n",
       "__pyx_t_11.shape[0] = __pyx_v_Ds.shape[1];\n",
       "__pyx_t_11.strides[0] = __pyx_v_Ds.strides[1];\n",
       "    __pyx_t_11.suboffsets[0] = -1;\n",
       "\n",
       "__pyx_t_4 = __pyx_memoryview_fromslice(__pyx_t_11, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "    __PYX_XDEC_MEMVIEW(&amp;__pyx_t_11, 1);\n",
       "    __pyx_t_11.memview = NULL;\n",
       "    __pyx_t_11.data = NULL;\n",
       "    __pyx_t_14 = NULL;\n",
       "    __pyx_t_15 = 0;\n",
       "    if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_5))) {\n",
       "      __pyx_t_14 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_5);\n",
       "      if (likely(__pyx_t_14)) {\n",
       "        PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_5);\n",
       "        <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_14);\n",
       "        <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_5, function);\n",
       "        __pyx_t_15 = 1;\n",
       "      }\n",
       "    }\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_5)) {\n",
       "      PyObject *__pyx_temp[3] = {__pyx_t_14, __pyx_t_1, __pyx_t_4};\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_5, __pyx_temp+1-__pyx_t_15, 2+__pyx_t_15); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_14); __pyx_t_14 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_5)) {\n",
       "      PyObject *__pyx_temp[3] = {__pyx_t_14, __pyx_t_1, __pyx_t_4};\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_5, __pyx_temp+1-__pyx_t_15, 2+__pyx_t_15); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_14); __pyx_t_14 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_16 = <span class='py_c_api'>PyTuple_New</span>(2+__pyx_t_15); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "      if (__pyx_t_14) {\n",
       "        <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_14); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0, __pyx_t_14); __pyx_t_14 = NULL;\n",
       "      }\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0+__pyx_t_15, __pyx_t_1);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 1+__pyx_t_15, __pyx_t_4);\n",
       "      __pyx_t_1 = 0;\n",
       "      __pyx_t_4 = 0;\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_5, __pyx_t_16, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "    }\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "    __pyx_t_5 = NULL;\n",
       "    if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_6))) {\n",
       "      __pyx_t_5 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_6);\n",
       "      if (likely(__pyx_t_5)) {\n",
       "        PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_6);\n",
       "        <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_5);\n",
       "        <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_6, function);\n",
       "      }\n",
       "    }\n",
       "    if (!__pyx_t_5) {\n",
       "      __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_6, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "    } else {\n",
       "      #if CYTHON_FAST_PYCALL\n",
       "      if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_6)) {\n",
       "        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3};\n",
       "        __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "      } else\n",
       "      #endif\n",
       "      #if CYTHON_FAST_PYCCALL\n",
       "      if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_6)) {\n",
       "        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3};\n",
       "        __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "      } else\n",
       "      #endif\n",
       "      {\n",
       "        __pyx_t_16 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "        <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0, __pyx_t_5); __pyx_t_5 = NULL;\n",
       "        <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "        <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0+1, __pyx_t_3);\n",
       "        __pyx_t_3 = 0;\n",
       "        __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_6, __pyx_t_16, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "      }\n",
       "    }\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    __pyx_t_16 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "    __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_16, __pyx_n_s_min); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "    __pyx_t_11.data = __pyx_v_VPoly.data;\n",
       "    __pyx_t_11.memview = __pyx_v_VPoly.memview;\n",
       "    __PYX_INC_MEMVIEW(&amp;__pyx_t_11, 0);\n",
       "    {\n",
       "    Py_ssize_t __pyx_tmp_idx = 0;\n",
       "    Py_ssize_t __pyx_tmp_shape = __pyx_v_VPoly.shape[0];\n",
       "    Py_ssize_t __pyx_tmp_stride = __pyx_v_VPoly.strides[0];\n",
       "    if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0))\n",
       "        __pyx_tmp_idx += __pyx_tmp_shape;\n",
       "    if (0 &amp;&amp; (__pyx_tmp_idx &lt; 0 || __pyx_tmp_idx &gt;= __pyx_tmp_shape)) {\n",
       "        <span class='py_c_api'>PyErr_SetString</span>(PyExc_IndexError, \"Index out of bounds (axis 0)\");\n",
       "        __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    }\n",
       "        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;\n",
       "}\n",
       "\n",
       "__pyx_t_11.shape[0] = __pyx_v_VPoly.shape[1];\n",
       "__pyx_t_11.strides[0] = __pyx_v_VPoly.strides[1];\n",
       "    __pyx_t_11.suboffsets[0] = -1;\n",
       "\n",
       "__pyx_t_16 = __pyx_memoryview_fromslice(__pyx_t_11, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "    __PYX_XDEC_MEMVIEW(&amp;__pyx_t_11, 1);\n",
       "    __pyx_t_11.memview = NULL;\n",
       "    __pyx_t_11.data = NULL;\n",
       "    __pyx_t_5 = NULL;\n",
       "    if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_3))) {\n",
       "      __pyx_t_5 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_3);\n",
       "      if (likely(__pyx_t_5)) {\n",
       "        PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_3);\n",
       "        <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_5);\n",
       "        <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_3, function);\n",
       "      }\n",
       "    }\n",
       "    if (!__pyx_t_5) {\n",
       "      __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_3, __pyx_t_16); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "    } else {\n",
       "      #if CYTHON_FAST_PYCALL\n",
       "      if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_3)) {\n",
       "        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_16};\n",
       "        __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "      } else\n",
       "      #endif\n",
       "      #if CYTHON_FAST_PYCCALL\n",
       "      if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_3)) {\n",
       "        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_16};\n",
       "        __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "      } else\n",
       "      #endif\n",
       "      {\n",
       "        __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "        <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_5); __pyx_t_5 = NULL;\n",
       "        <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_16);\n",
       "        <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0+1, __pyx_t_16);\n",
       "        __pyx_t_16 = 0;\n",
       "        __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "        <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "        <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "      }\n",
       "    }\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    __pyx_t_4 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_2, __pyx_t_6, Py_LT); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    __pyx_t_13 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_4); if (unlikely(__pyx_t_13 &lt; 0)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    if (__pyx_t_13) {\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_2);\n",
       "      __pyx_t_3 = __pyx_t_2;\n",
       "    } else {\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_6);\n",
       "      __pyx_t_3 = __pyx_t_6;\n",
       "    }\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "    __pyx_t_2 = <span class='py_c_api'>PyNumber_Multiply</span>(__pyx_float_0_95, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    __pyx_t_17 = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(__pyx_t_2); if (unlikely((__pyx_t_17 == (double)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 31, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "    __pyx_v_Rmin = __pyx_t_17;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">032</span>:     <span class=\"k\">else</span><span class=\"p\">:</span></pre>\n",
       "<pre class=\"cython line score-10\" onclick='toggleDiv(this)'>+<span class=\"\">033</span>:         <span class=\"n\">Rmin</span> <span class=\"o\">=</span> <span class=\"n\">RMin</span></pre>\n",
       "<pre class='cython code score-10 '>  /*else*/ {\n",
       "    __pyx_t_17 = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(__pyx_v_RMin); if (unlikely((__pyx_t_17 == (double)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 33, __pyx_L1_error)\n",
       "    __pyx_v_Rmin = __pyx_t_17;\n",
       "  }\n",
       "  __pyx_L3:;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">034</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">035</span>:     <span class=\"c\">################</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">036</span>:     <span class=\"c\"># Compute</span></pre>\n",
       "<pre class=\"cython line score-2\" onclick='toggleDiv(this)'>+<span class=\"\">037</span>:     <span class=\"k\">if</span> <span class=\"n\">Forbid</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-2 '>  __pyx_t_13 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(((PyObject *)__pyx_v_Forbid)); if (unlikely(__pyx_t_13 &lt; 0)) __PYX_ERR(0, 37, __pyx_L1_error)\n",
       "  if (__pyx_t_13) {\n",
       "/* … */\n",
       "    goto __pyx_L4;\n",
       "  }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">038</span>:         <span class=\"n\">Forbid0</span><span class=\"p\">,</span> <span class=\"n\">Forbidbis</span> <span class=\"o\">=</span> <span class=\"mf\">1</span><span class=\"p\">,</span> <span class=\"mf\">1</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_15 = 1;\n",
       "    __pyx_t_18 = 1;\n",
       "    __pyx_v_Forbid0 = __pyx_t_15;\n",
       "    __pyx_v_Forbidbis = __pyx_t_18;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">039</span>:     <span class=\"k\">else</span><span class=\"p\">:</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">040</span>:         <span class=\"n\">Forbid0</span><span class=\"p\">,</span> <span class=\"n\">Forbidbis</span> <span class=\"o\">=</span> <span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"mf\">0</span></pre>\n",
       "<pre class='cython code score-0 '>  /*else*/ {\n",
       "    __pyx_t_18 = 0;\n",
       "    __pyx_t_15 = 0;\n",
       "    __pyx_v_Forbid0 = __pyx_t_18;\n",
       "    __pyx_v_Forbidbis = __pyx_t_15;\n",
       "  }\n",
       "  __pyx_L4:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">041</span>:     <span class=\"k\">for</span> <span class=\"n\">ii</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">Nl</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>  __pyx_t_15 = __pyx_v_Nl;\n",
       "  for (__pyx_t_18 = 0; __pyx_t_18 &lt; __pyx_t_15; __pyx_t_18+=1) {\n",
       "    __pyx_v_ii = __pyx_t_18;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">042</span>:         <span class=\"n\">upscaDp</span> <span class=\"o\">=</span> <span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_19 = 0;\n",
       "    __pyx_t_20 = __pyx_v_ii;\n",
       "    __pyx_t_21 = 0;\n",
       "    __pyx_t_22 = __pyx_v_ii;\n",
       "    __pyx_t_23 = 1;\n",
       "    __pyx_t_24 = __pyx_v_ii;\n",
       "    __pyx_t_25 = 1;\n",
       "    __pyx_t_26 = __pyx_v_ii;\n",
       "    __pyx_v_upscaDp = (((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_19 * __pyx_v_us.strides[0]) )) + __pyx_t_20)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_21 * __pyx_v_Ds.strides[0]) )) + __pyx_t_22)) )))) + ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_23 * __pyx_v_us.strides[0]) )) + __pyx_t_24)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_25 * __pyx_v_Ds.strides[0]) )) + __pyx_t_26)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">043</span>:         <span class=\"n\">upar2</span> <span class=\"o\">=</span> <span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">+</span> <span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_27 = 0;\n",
       "    __pyx_t_28 = __pyx_v_ii;\n",
       "    __pyx_t_29 = 1;\n",
       "    __pyx_t_30 = __pyx_v_ii;\n",
       "    __pyx_v_upar2 = (pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_27 * __pyx_v_us.strides[0]) )) + __pyx_t_28)) ))), 2.0) + pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_29 * __pyx_v_us.strides[0]) )) + __pyx_t_30)) ))), 2.0));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">044</span>:         <span class=\"n\">Dpar2</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">+</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_31 = 0;\n",
       "    __pyx_t_32 = __pyx_v_ii;\n",
       "    __pyx_t_33 = 1;\n",
       "    __pyx_t_34 = __pyx_v_ii;\n",
       "    __pyx_v_Dpar2 = (pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_31 * __pyx_v_Ds.strides[0]) )) + __pyx_t_32)) ))), 2.0) + pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_33 * __pyx_v_Ds.strides[0]) )) + __pyx_t_34)) ))), 2.0));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">045</span>:         <span class=\"c\"># Prepare in case Forbid is True</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">046</span>:         <span class=\"k\">if</span> <span class=\"n\">Forbid0</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">Dpar2</span><span class=\"o\">&gt;</span><span class=\"mf\">0</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_12 = (__pyx_v_Forbid0 != 0);\n",
       "    if (__pyx_t_12) {\n",
       "    } else {\n",
       "      __pyx_t_13 = __pyx_t_12;\n",
       "      goto __pyx_L8_bool_binop_done;\n",
       "    }\n",
       "    __pyx_t_12 = ((!((__pyx_v_Dpar2 &gt; 0.0) != 0)) != 0);\n",
       "    __pyx_t_13 = __pyx_t_12;\n",
       "    __pyx_L8_bool_binop_done:;\n",
       "    if (__pyx_t_13) {\n",
       "/* … */\n",
       "    }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">047</span>:             <span class=\"n\">Forbidbis</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_v_Forbidbis = 0;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">048</span>:         <span class=\"k\">if</span> <span class=\"n\">Forbidbis</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_13 = (__pyx_v_Forbidbis != 0);\n",
       "    if (__pyx_t_13) {\n",
       "/* … */\n",
       "    }\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">049</span>:             <span class=\"c\"># Compute coordinates of the 2 points where the tangents touch the inner circle</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">050</span>:             <span class=\"n\">L</span> <span class=\"o\">=</span> <span class=\"n\">Csqrt</span><span class=\"p\">(</span><span class=\"n\">Dpar2</span><span class=\"o\">-</span><span class=\"n\">Rmin</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_v_L = sqrt((__pyx_v_Dpar2 - pow(__pyx_v_Rmin, 2.0)));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">051</span>:             <span class=\"n\">S1X</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Rmin</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"n\">Rmin</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">L</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">Dpar2</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_35 = 0;\n",
       "      __pyx_t_36 = __pyx_v_ii;\n",
       "      __pyx_t_37 = 1;\n",
       "      __pyx_t_38 = __pyx_v_ii;\n",
       "      __pyx_v_S1X = (((pow(__pyx_v_Rmin, 2.0) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_35 * __pyx_v_Ds.strides[0]) )) + __pyx_t_36)) )))) + ((__pyx_v_Rmin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_37 * __pyx_v_Ds.strides[0]) )) + __pyx_t_38)) )))) * __pyx_v_L)) / __pyx_v_Dpar2);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">052</span>:             <span class=\"n\">S1Y</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Rmin</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">Rmin</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">L</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">Dpar2</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_39 = 1;\n",
       "      __pyx_t_40 = __pyx_v_ii;\n",
       "      __pyx_t_41 = 0;\n",
       "      __pyx_t_42 = __pyx_v_ii;\n",
       "      __pyx_v_S1Y = (((pow(__pyx_v_Rmin, 2.0) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_39 * __pyx_v_Ds.strides[0]) )) + __pyx_t_40)) )))) - ((__pyx_v_Rmin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_41 * __pyx_v_Ds.strides[0]) )) + __pyx_t_42)) )))) * __pyx_v_L)) / __pyx_v_Dpar2);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">053</span>:             <span class=\"n\">S2X</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Rmin</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">Rmin</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">L</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">Dpar2</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_43 = 0;\n",
       "      __pyx_t_44 = __pyx_v_ii;\n",
       "      __pyx_t_45 = 1;\n",
       "      __pyx_t_46 = __pyx_v_ii;\n",
       "      __pyx_v_S2X = (((pow(__pyx_v_Rmin, 2.0) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_43 * __pyx_v_Ds.strides[0]) )) + __pyx_t_44)) )))) - ((__pyx_v_Rmin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_45 * __pyx_v_Ds.strides[0]) )) + __pyx_t_46)) )))) * __pyx_v_L)) / __pyx_v_Dpar2);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">054</span>:             <span class=\"n\">S2Y</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Rmin</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"n\">Rmin</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">L</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">Dpar2</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_47 = 1;\n",
       "      __pyx_t_48 = __pyx_v_ii;\n",
       "      __pyx_t_49 = 0;\n",
       "      __pyx_t_50 = __pyx_v_ii;\n",
       "      __pyx_v_S2Y = (((pow(__pyx_v_Rmin, 2.0) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_47 * __pyx_v_Ds.strides[0]) )) + __pyx_t_48)) )))) + ((__pyx_v_Rmin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_49 * __pyx_v_Ds.strides[0]) )) + __pyx_t_50)) )))) * __pyx_v_L)) / __pyx_v_Dpar2);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">055</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">056</span>:         <span class=\"c\"># Compute all solutions</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">057</span>:         <span class=\"c\"># Set tolerance value for us[2,ii]</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">058</span>:         <span class=\"c\"># EpsUz is the tolerated DZ across 20m (max Tokamak size)</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">059</span>:         <span class=\"n\">Crit2</span> <span class=\"o\">=</span> <span class=\"n\">EpsUz</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">*</span><span class=\"n\">upar2</span><span class=\"o\">/</span><span class=\"mf\">400.</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_v_Crit2 = ((pow(__pyx_v_EpsUz, 2.0) * __pyx_v_upar2) / 400.);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">060</span>:         <span class=\"n\">kout</span><span class=\"p\">,</span> <span class=\"n\">kin</span><span class=\"p\">,</span> <span class=\"n\">Done</span> <span class=\"o\">=</span> <span class=\"mf\">1.e12</span><span class=\"p\">,</span> <span class=\"mf\">1e12</span><span class=\"p\">,</span> <span class=\"mf\">0</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_17 = 1.e12;\n",
       "    __pyx_t_51 = 1e12;\n",
       "    __pyx_t_52 = 0;\n",
       "    __pyx_v_kout = __pyx_t_17;\n",
       "    __pyx_v_kin = __pyx_t_51;\n",
       "    __pyx_v_Done = __pyx_t_52;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">061</span>:         <span class=\"c\"># Case with horizontal semi-line</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">062</span>:         <span class=\"k\">if</span> <span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">&lt;</span><span class=\"n\">Crit2</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_53 = 2;\n",
       "    __pyx_t_54 = __pyx_v_ii;\n",
       "    __pyx_t_13 = ((pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_53 * __pyx_v_us.strides[0]) )) + __pyx_t_54)) ))), 2.0) &lt; __pyx_v_Crit2) != 0);\n",
       "    if (__pyx_t_13) {\n",
       "/* … */\n",
       "      goto __pyx_L11;\n",
       "    }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">063</span>:             <span class=\"k\">for</span> <span class=\"n\">jj</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">Ns</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_52 = __pyx_v_Ns;\n",
       "      for (__pyx_t_55 = 0; __pyx_t_55 &lt; __pyx_t_52; __pyx_t_55+=1) {\n",
       "        __pyx_v_jj = __pyx_t_55;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">064</span>:                 <span class=\"c\"># Solutions exist only in the case with non-horizontal segment (i.e.: cone, not plane)</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">065</span>:                 <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"o\">+</span><span class=\"mf\">1</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">&gt;</span><span class=\"n\">EpsVz</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_56 = 1;\n",
       "        __pyx_t_57 = (__pyx_v_jj + 1);\n",
       "        __pyx_t_58 = 1;\n",
       "        __pyx_t_59 = __pyx_v_jj;\n",
       "        __pyx_t_13 = ((pow(((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_56 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_57)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_58 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_59)) )))), 2.0) &gt; pow(__pyx_v_EpsVz, 2.0)) != 0);\n",
       "        if (__pyx_t_13) {\n",
       "/* … */\n",
       "        }\n",
       "      }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">066</span>:                     <span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span><span class=\"o\">/</span><span class=\"p\">(</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"o\">+</span><span class=\"mf\">1</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_t_60 = 2;\n",
       "          __pyx_t_61 = __pyx_v_ii;\n",
       "          __pyx_t_62 = 1;\n",
       "          __pyx_t_63 = __pyx_v_jj;\n",
       "          __pyx_t_64 = 1;\n",
       "          __pyx_t_65 = (__pyx_v_jj + 1);\n",
       "          __pyx_t_66 = 1;\n",
       "          __pyx_t_67 = __pyx_v_jj;\n",
       "          __pyx_v_q = (((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_60 * __pyx_v_Ds.strides[0]) )) + __pyx_t_61)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_62 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_63)) )))) / ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_64 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_65)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_66 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_67)) )))));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">067</span>:                     <span class=\"c\"># The intersection must stand on the segment </span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">068</span>:                     <span class=\"k\">if</span> <span class=\"n\">q</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">q</span><span class=\"o\">&lt;</span><span class=\"mf\">1</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_t_12 = ((__pyx_v_q &gt;= 0.0) != 0);\n",
       "          if (__pyx_t_12) {\n",
       "          } else {\n",
       "            __pyx_t_13 = __pyx_t_12;\n",
       "            goto __pyx_L16_bool_binop_done;\n",
       "          }\n",
       "          __pyx_t_12 = ((__pyx_v_q &lt; 1.0) != 0);\n",
       "          __pyx_t_13 = __pyx_t_12;\n",
       "          __pyx_L16_bool_binop_done:;\n",
       "          if (__pyx_t_13) {\n",
       "/* … */\n",
       "          }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">069</span>:                         <span class=\"n\">C</span> <span class=\"o\">=</span> <span class=\"n\">q</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"o\">+</span><span class=\"mf\">1</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">+</span> <span class=\"mf\">2.</span><span class=\"o\">*</span><span class=\"n\">q</span><span class=\"o\">*</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"o\">+</span><span class=\"mf\">1</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span> <span class=\"o\">+</span> <span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_68 = 0;\n",
       "            __pyx_t_69 = (__pyx_v_jj + 1);\n",
       "            __pyx_t_70 = 0;\n",
       "            __pyx_t_71 = __pyx_v_jj;\n",
       "            __pyx_t_72 = 0;\n",
       "            __pyx_t_73 = __pyx_v_jj;\n",
       "            __pyx_t_74 = 0;\n",
       "            __pyx_t_75 = (__pyx_v_jj + 1);\n",
       "            __pyx_t_76 = 0;\n",
       "            __pyx_t_77 = __pyx_v_jj;\n",
       "            __pyx_t_78 = 0;\n",
       "            __pyx_t_79 = __pyx_v_jj;\n",
       "            __pyx_v_C = (((pow(__pyx_v_q, 2.0) * pow(((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_68 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_69)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_70 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_71)) )))), 2.0)) + (((2. * __pyx_v_q) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_72 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_73)) )))) * ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_74 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_75)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_76 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_77)) )))))) + pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_78 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_79)) ))), 2.0));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">070</span>:                         <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">upscaDp</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">-</span> <span class=\"n\">upar2</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">Dpar2</span><span class=\"o\">-</span><span class=\"n\">C</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_v_delta = (pow(__pyx_v_upscaDp, 2.0) - (__pyx_v_upar2 * (__pyx_v_Dpar2 - __pyx_v_C)));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">071</span>:                         <span class=\"k\">if</span> <span class=\"n\">delta</span><span class=\"o\">&gt;</span><span class=\"mf\">0.</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_13 = ((__pyx_v_delta &gt; 0.) != 0);\n",
       "            if (__pyx_t_13) {\n",
       "/* … */\n",
       "            }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">072</span>:                             <span class=\"n\">sqd</span> <span class=\"o\">=</span> <span class=\"n\">Csqrt</span><span class=\"p\">(</span><span class=\"n\">delta</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_v_sqd = sqrt(__pyx_v_delta);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">073</span>:                             <span class=\"c\"># The intersection must be on the semi-line (i.e.: k&gt;=0)</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">074</span>:                             <span class=\"c\"># First solution</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">075</span>:                             <span class=\"k\">if</span> <span class=\"o\">-</span><span class=\"n\">upscaDp</span> <span class=\"o\">-</span> <span class=\"n\">sqd</span> <span class=\"o\">&gt;=</span><span class=\"mf\">0</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_13 = ((((-__pyx_v_upscaDp) - __pyx_v_sqd) &gt;= 0.0) != 0);\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">076</span>:                                 <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">upscaDp</span> <span class=\"o\">-</span> <span class=\"n\">sqd</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">upar2</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_k = (((-__pyx_v_upscaDp) - __pyx_v_sqd) / __pyx_v_upar2);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">077</span>:                                 <span class=\"n\">sol0</span><span class=\"p\">,</span> <span class=\"n\">sol1</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">],</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_80 = 0;\n",
       "                __pyx_t_81 = __pyx_v_ii;\n",
       "                __pyx_t_82 = 0;\n",
       "                __pyx_t_83 = __pyx_v_ii;\n",
       "                __pyx_t_51 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_80 * __pyx_v_Ds.strides[0]) )) + __pyx_t_81)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_82 * __pyx_v_us.strides[0]) )) + __pyx_t_83)) )))));\n",
       "                __pyx_t_84 = 1;\n",
       "                __pyx_t_85 = __pyx_v_ii;\n",
       "                __pyx_t_86 = 1;\n",
       "                __pyx_t_87 = __pyx_v_ii;\n",
       "                __pyx_t_17 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_84 * __pyx_v_Ds.strides[0]) )) + __pyx_t_85)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_86 * __pyx_v_us.strides[0]) )) + __pyx_t_87)) )))));\n",
       "                __pyx_v_sol0 = __pyx_t_51;\n",
       "                __pyx_v_sol1 = __pyx_t_17;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">078</span>:                                 <span class=\"k\">if</span> <span class=\"n\">Forbidbis</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_13 = (__pyx_v_Forbidbis != 0);\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">079</span>:                                     <span class=\"n\">sca0</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_88 = 0;\n",
       "                  __pyx_t_89 = __pyx_v_ii;\n",
       "                  __pyx_t_90 = 1;\n",
       "                  __pyx_t_91 = __pyx_v_ii;\n",
       "                  __pyx_v_sca0 = (((__pyx_v_sol0 - __pyx_v_S1X) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_88 * __pyx_v_Ds.strides[0]) )) + __pyx_t_89)) )))) + ((__pyx_v_sol1 - __pyx_v_S1Y) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_90 * __pyx_v_Ds.strides[0]) )) + __pyx_t_91)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">080</span>:                                     <span class=\"n\">sca1</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1Y</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_sca1 = (((__pyx_v_sol0 - __pyx_v_S1X) * __pyx_v_S1X) + ((__pyx_v_sol1 - __pyx_v_S1Y) * __pyx_v_S1Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">081</span>:                                     <span class=\"n\">sca2</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S2X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S2Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2Y</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_sca2 = (((__pyx_v_sol0 - __pyx_v_S2X) * __pyx_v_S2X) + ((__pyx_v_sol1 - __pyx_v_S2Y) * __pyx_v_S2Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">082</span>:                                 <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">Forbidbis</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">Forbidbis</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">sca0</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca1</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca2</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span><span class=\"p\">)):</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_12 = ((!(__pyx_v_Forbidbis != 0)) != 0);\n",
       "                if (!__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  goto __pyx_L22_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = (__pyx_v_Forbidbis != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  goto __pyx_L22_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_92 = ((__pyx_v_sca0 &lt; 0.0) != 0);\n",
       "                if (__pyx_t_92) {\n",
       "                } else {\n",
       "                  __pyx_t_12 = __pyx_t_92;\n",
       "                  goto __pyx_L25_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_92 = ((__pyx_v_sca1 &lt; 0.0) != 0);\n",
       "                if (__pyx_t_92) {\n",
       "                } else {\n",
       "                  __pyx_t_12 = __pyx_t_92;\n",
       "                  goto __pyx_L25_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_92 = ((__pyx_v_sca2 &lt; 0.0) != 0);\n",
       "                __pyx_t_12 = __pyx_t_92;\n",
       "                __pyx_L25_bool_binop_done:;\n",
       "                __pyx_t_92 = ((!__pyx_t_12) != 0);\n",
       "                __pyx_t_13 = __pyx_t_92;\n",
       "                __pyx_L22_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">083</span>:                                     <span class=\"c\"># Get the normalized perpendicular vector at intersection</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">084</span>:                                     <span class=\"n\">phi</span> <span class=\"o\">=</span> <span class=\"n\">Catan2</span><span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"p\">,</span><span class=\"n\">sol0</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_phi = atan2(__pyx_v_sol1, __pyx_v_sol0);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">085</span>:                                     <span class=\"c\"># Get the scalar product to determine entry or exit point</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">086</span>:                                     <span class=\"n\">sca</span> <span class=\"o\">=</span> <span class=\"n\">Ccos</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">Csin</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_93 = 0;\n",
       "                  __pyx_t_94 = __pyx_v_jj;\n",
       "                  __pyx_t_95 = 0;\n",
       "                  __pyx_t_96 = __pyx_v_ii;\n",
       "                  __pyx_t_97 = 0;\n",
       "                  __pyx_t_98 = __pyx_v_jj;\n",
       "                  __pyx_t_99 = 1;\n",
       "                  __pyx_t_100 = __pyx_v_ii;\n",
       "                  __pyx_t_101 = 1;\n",
       "                  __pyx_t_102 = __pyx_v_jj;\n",
       "                  __pyx_t_103 = 2;\n",
       "                  __pyx_t_104 = __pyx_v_ii;\n",
       "                  __pyx_v_sca = ((((cos(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_93 * __pyx_v_vIn.strides[0]) )) + __pyx_t_94)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_95 * __pyx_v_us.strides[0]) )) + __pyx_t_96)) )))) + ((sin(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_97 * __pyx_v_vIn.strides[0]) )) + __pyx_t_98)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_99 * __pyx_v_us.strides[0]) )) + __pyx_t_100)) ))))) + ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_101 * __pyx_v_vIn.strides[0]) )) + __pyx_t_102)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_103 * __pyx_v_us.strides[0]) )) + __pyx_t_104)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">087</span>:                                     <span class=\"k\">if</span> <span class=\"n\">sca</span><span class=\"o\">&lt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"n\">kout</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_92 = ((__pyx_v_sca &lt;= 0.0) != 0);\n",
       "                  if (__pyx_t_92) {\n",
       "                  } else {\n",
       "                    __pyx_t_13 = __pyx_t_92;\n",
       "                    goto __pyx_L29_bool_binop_done;\n",
       "                  }\n",
       "                  __pyx_t_92 = ((__pyx_v_k &lt; __pyx_v_kout) != 0);\n",
       "                  __pyx_t_13 = __pyx_t_92;\n",
       "                  __pyx_L29_bool_binop_done:;\n",
       "                  if (__pyx_t_13) {\n",
       "/* … */\n",
       "                    goto __pyx_L28;\n",
       "                  }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">088</span>:                                         <span class=\"n\">kout</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_kout = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">089</span>:                                         <span class=\"n\">indout</span> <span class=\"o\">=</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_indout = __pyx_v_jj;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">090</span>:                                         <span class=\"n\">Done</span> <span class=\"o\">=</span> <span class=\"mf\">1</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_Done = 1;\n",
       "</pre><pre class=\"cython line score-16\" onclick='toggleDiv(this)'>+<span class=\"\">091</span>:                                         <span class=\"k\">print</span> <span class=\"mf\">1</span><span class=\"p\">,</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-16 '>                    __pyx_t_2 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 91, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                    __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 91, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                    <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_1);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_1);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_int_1);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_t_2);\n",
       "                    __pyx_t_2 = 0;\n",
       "                    if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_3, 1) &lt; 0) __PYX_ERR(0, 91, __pyx_L1_error)\n",
       "                    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">092</span>:                                     <span class=\"k\">elif</span> <span class=\"n\">sca</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">kin</span><span class=\"p\">,</span><span class=\"n\">kout</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_92 = ((__pyx_v_sca &gt;= 0.0) != 0);\n",
       "                  if (__pyx_t_92) {\n",
       "                  } else {\n",
       "                    __pyx_t_13 = __pyx_t_92;\n",
       "                    goto __pyx_L31_bool_binop_done;\n",
       "                  }\n",
       "                  __pyx_t_17 = __pyx_v_kout;\n",
       "                  __pyx_t_51 = __pyx_v_kin;\n",
       "                  if (((__pyx_t_17 &lt; __pyx_t_51) != 0)) {\n",
       "                    __pyx_t_105 = __pyx_t_17;\n",
       "                  } else {\n",
       "                    __pyx_t_105 = __pyx_t_51;\n",
       "                  }\n",
       "                  __pyx_t_92 = ((__pyx_v_k &lt; __pyx_t_105) != 0);\n",
       "                  __pyx_t_13 = __pyx_t_92;\n",
       "                  __pyx_L31_bool_binop_done:;\n",
       "                  if (__pyx_t_13) {\n",
       "/* … */\n",
       "                  }\n",
       "                  __pyx_L28:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">093</span>:                                         <span class=\"n\">kin</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_kin = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-16\" onclick='toggleDiv(this)'>+<span class=\"\">094</span>:                                         <span class=\"k\">print</span> <span class=\"mf\">2</span><span class=\"p\">,</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-16 '>                    __pyx_t_3 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 94, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                    __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                    <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_2);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_2);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_int_2);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_t_3);\n",
       "                    __pyx_t_3 = 0;\n",
       "                    if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_2, 1) &lt; 0) __PYX_ERR(0, 94, __pyx_L1_error)\n",
       "                    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">095</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">096</span>:                             <span class=\"c\"># Second solution</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">097</span>:                             <span class=\"k\">if</span> <span class=\"o\">-</span><span class=\"n\">upscaDp</span> <span class=\"o\">+</span> <span class=\"n\">sqd</span> <span class=\"o\">&gt;=</span><span class=\"mf\">0</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_13 = ((((-__pyx_v_upscaDp) + __pyx_v_sqd) &gt;= 0.0) != 0);\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">098</span>:                                 <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">upscaDp</span> <span class=\"o\">+</span> <span class=\"n\">sqd</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">upar2</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_k = (((-__pyx_v_upscaDp) + __pyx_v_sqd) / __pyx_v_upar2);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">099</span>:                                 <span class=\"n\">sol0</span><span class=\"p\">,</span> <span class=\"n\">sol1</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">],</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_106 = 0;\n",
       "                __pyx_t_107 = __pyx_v_ii;\n",
       "                __pyx_t_108 = 0;\n",
       "                __pyx_t_109 = __pyx_v_ii;\n",
       "                __pyx_t_105 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_106 * __pyx_v_Ds.strides[0]) )) + __pyx_t_107)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_108 * __pyx_v_us.strides[0]) )) + __pyx_t_109)) )))));\n",
       "                __pyx_t_110 = 1;\n",
       "                __pyx_t_111 = __pyx_v_ii;\n",
       "                __pyx_t_112 = 1;\n",
       "                __pyx_t_113 = __pyx_v_ii;\n",
       "                __pyx_t_17 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_110 * __pyx_v_Ds.strides[0]) )) + __pyx_t_111)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_112 * __pyx_v_us.strides[0]) )) + __pyx_t_113)) )))));\n",
       "                __pyx_v_sol0 = __pyx_t_105;\n",
       "                __pyx_v_sol1 = __pyx_t_17;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">100</span>:                                 <span class=\"k\">if</span> <span class=\"n\">Forbidbis</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_13 = (__pyx_v_Forbidbis != 0);\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">101</span>:                                     <span class=\"n\">sca0</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_114 = 0;\n",
       "                  __pyx_t_115 = __pyx_v_ii;\n",
       "                  __pyx_t_116 = 1;\n",
       "                  __pyx_t_117 = __pyx_v_ii;\n",
       "                  __pyx_v_sca0 = (((__pyx_v_sol0 - __pyx_v_S1X) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_114 * __pyx_v_Ds.strides[0]) )) + __pyx_t_115)) )))) + ((__pyx_v_sol1 - __pyx_v_S1Y) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_116 * __pyx_v_Ds.strides[0]) )) + __pyx_t_117)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">102</span>:                                     <span class=\"n\">sca1</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1Y</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_sca1 = (((__pyx_v_sol0 - __pyx_v_S1X) * __pyx_v_S1X) + ((__pyx_v_sol1 - __pyx_v_S1Y) * __pyx_v_S1Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">103</span>:                                     <span class=\"n\">sca2</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S2X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S2Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2Y</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_sca2 = (((__pyx_v_sol0 - __pyx_v_S2X) * __pyx_v_S2X) + ((__pyx_v_sol1 - __pyx_v_S2Y) * __pyx_v_S2Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">104</span>:                                 <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">Forbidbis</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">Forbidbis</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">sca0</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca1</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca2</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span><span class=\"p\">)):</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_92 = ((!(__pyx_v_Forbidbis != 0)) != 0);\n",
       "                if (!__pyx_t_92) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_92;\n",
       "                  goto __pyx_L36_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_92 = (__pyx_v_Forbidbis != 0);\n",
       "                if (__pyx_t_92) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_92;\n",
       "                  goto __pyx_L36_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_sca0 &lt; 0.0) != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_92 = __pyx_t_12;\n",
       "                  goto __pyx_L39_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_sca1 &lt; 0.0) != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_92 = __pyx_t_12;\n",
       "                  goto __pyx_L39_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_sca2 &lt; 0.0) != 0);\n",
       "                __pyx_t_92 = __pyx_t_12;\n",
       "                __pyx_L39_bool_binop_done:;\n",
       "                __pyx_t_12 = ((!__pyx_t_92) != 0);\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                __pyx_L36_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">105</span>:                                     <span class=\"c\"># Get the normalized perpendicular vector at intersection</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">106</span>:                                     <span class=\"n\">phi</span> <span class=\"o\">=</span> <span class=\"n\">Catan2</span><span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"p\">,</span><span class=\"n\">sol0</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_phi = atan2(__pyx_v_sol1, __pyx_v_sol0);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">107</span>:                                     <span class=\"c\"># Get the scalar product to determine entry or exit point</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">108</span>:                                     <span class=\"n\">sca</span> <span class=\"o\">=</span> <span class=\"n\">Ccos</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">Csin</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_118 = 0;\n",
       "                  __pyx_t_119 = __pyx_v_jj;\n",
       "                  __pyx_t_120 = 0;\n",
       "                  __pyx_t_121 = __pyx_v_ii;\n",
       "                  __pyx_t_122 = 0;\n",
       "                  __pyx_t_123 = __pyx_v_jj;\n",
       "                  __pyx_t_124 = 1;\n",
       "                  __pyx_t_125 = __pyx_v_ii;\n",
       "                  __pyx_t_126 = 1;\n",
       "                  __pyx_t_127 = __pyx_v_jj;\n",
       "                  __pyx_t_128 = 2;\n",
       "                  __pyx_t_129 = __pyx_v_ii;\n",
       "                  __pyx_v_sca = ((((cos(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_118 * __pyx_v_vIn.strides[0]) )) + __pyx_t_119)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_120 * __pyx_v_us.strides[0]) )) + __pyx_t_121)) )))) + ((sin(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_122 * __pyx_v_vIn.strides[0]) )) + __pyx_t_123)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_124 * __pyx_v_us.strides[0]) )) + __pyx_t_125)) ))))) + ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_126 * __pyx_v_vIn.strides[0]) )) + __pyx_t_127)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_128 * __pyx_v_us.strides[0]) )) + __pyx_t_129)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">109</span>:                                     <span class=\"k\">if</span> <span class=\"n\">sca</span><span class=\"o\">&lt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"n\">kout</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_12 = ((__pyx_v_sca &lt;= 0.0) != 0);\n",
       "                  if (__pyx_t_12) {\n",
       "                  } else {\n",
       "                    __pyx_t_13 = __pyx_t_12;\n",
       "                    goto __pyx_L43_bool_binop_done;\n",
       "                  }\n",
       "                  __pyx_t_12 = ((__pyx_v_k &lt; __pyx_v_kout) != 0);\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  __pyx_L43_bool_binop_done:;\n",
       "                  if (__pyx_t_13) {\n",
       "/* … */\n",
       "                    goto __pyx_L42;\n",
       "                  }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">110</span>:                                         <span class=\"n\">kout</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_kout = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">111</span>:                                         <span class=\"n\">indout</span> <span class=\"o\">=</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_indout = __pyx_v_jj;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">112</span>:                                         <span class=\"n\">Done</span> <span class=\"o\">=</span> <span class=\"mf\">1</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_Done = 1;\n",
       "</pre><pre class=\"cython line score-16\" onclick='toggleDiv(this)'>+<span class=\"\">113</span>:                                         <span class=\"k\">print</span> <span class=\"mf\">3</span><span class=\"p\">,</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-16 '>                    __pyx_t_2 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 113, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                    __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 113, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                    <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_3);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_int_3);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_t_2);\n",
       "                    __pyx_t_2 = 0;\n",
       "                    if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_3, 1) &lt; 0) __PYX_ERR(0, 113, __pyx_L1_error)\n",
       "                    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">114</span>:                                     <span class=\"k\">elif</span> <span class=\"n\">sca</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">kin</span><span class=\"p\">,</span><span class=\"n\">kout</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_t_12 = ((__pyx_v_sca &gt;= 0.0) != 0);\n",
       "                  if (__pyx_t_12) {\n",
       "                  } else {\n",
       "                    __pyx_t_13 = __pyx_t_12;\n",
       "                    goto __pyx_L45_bool_binop_done;\n",
       "                  }\n",
       "                  __pyx_t_17 = __pyx_v_kout;\n",
       "                  __pyx_t_105 = __pyx_v_kin;\n",
       "                  if (((__pyx_t_17 &lt; __pyx_t_105) != 0)) {\n",
       "                    __pyx_t_51 = __pyx_t_17;\n",
       "                  } else {\n",
       "                    __pyx_t_51 = __pyx_t_105;\n",
       "                  }\n",
       "                  __pyx_t_12 = ((__pyx_v_k &lt; __pyx_t_51) != 0);\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  __pyx_L45_bool_binop_done:;\n",
       "                  if (__pyx_t_13) {\n",
       "/* … */\n",
       "                  }\n",
       "                  __pyx_L42:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">115</span>:                                         <span class=\"n\">kin</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                    __pyx_v_kin = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-16\" onclick='toggleDiv(this)'>+<span class=\"\">116</span>:                                         <span class=\"k\">print</span> <span class=\"mf\">4</span><span class=\"p\">,</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-16 '>                    __pyx_t_3 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 116, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                    __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 116, __pyx_L1_error)\n",
       "                    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                    <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_4);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_4);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_int_4);\n",
       "                    <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "                    <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_t_3);\n",
       "                    __pyx_t_3 = 0;\n",
       "                    if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_2, 1) &lt; 0) __PYX_ERR(0, 116, __pyx_L1_error)\n",
       "                    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">117</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">118</span>:         <span class=\"c\"># More general non-horizontal semi-line case</span></pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">119</span>:         <span class=\"k\">else</span><span class=\"p\">:</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">120</span>:             <span class=\"k\">for</span> <span class=\"n\">jj</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">Ns</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>    /*else*/ {\n",
       "      __pyx_t_52 = __pyx_v_Ns;\n",
       "      for (__pyx_t_55 = 0; __pyx_t_55 &lt; __pyx_t_52; __pyx_t_55+=1) {\n",
       "        __pyx_v_jj = __pyx_t_55;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">121</span>:                 <span class=\"n\">v0</span><span class=\"p\">,</span> <span class=\"n\">v1</span> <span class=\"o\">=</span> <span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"o\">+</span><span class=\"mf\">1</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">],</span> <span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"o\">+</span><span class=\"mf\">1</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_130 = 0;\n",
       "        __pyx_t_131 = (__pyx_v_jj + 1);\n",
       "        __pyx_t_132 = 0;\n",
       "        __pyx_t_133 = __pyx_v_jj;\n",
       "        __pyx_t_51 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_130 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_131)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_132 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_133)) ))));\n",
       "        __pyx_t_134 = 1;\n",
       "        __pyx_t_135 = (__pyx_v_jj + 1);\n",
       "        __pyx_t_136 = 1;\n",
       "        __pyx_t_137 = __pyx_v_jj;\n",
       "        __pyx_t_17 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_134 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_135)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_136 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_137)) ))));\n",
       "        __pyx_v_v0 = __pyx_t_51;\n",
       "        __pyx_v_v1 = __pyx_t_17;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">122</span>:                 <span class=\"n\">A</span> <span class=\"o\">=</span> <span class=\"n\">v0</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">-</span> <span class=\"n\">upar2</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">v1</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">])</span><span class=\"o\">**</span><span class=\"mf\">2</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_138 = 2;\n",
       "        __pyx_t_139 = __pyx_v_ii;\n",
       "        __pyx_v_A = (pow(__pyx_v_v0, 2.0) - (__pyx_v_upar2 * pow((__pyx_v_v1 / (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_138 * __pyx_v_us.strides[0]) )) + __pyx_t_139)) )))), 2.0)));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">123</span>:                 <span class=\"n\">B</span> <span class=\"o\">=</span> <span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">v0</span> <span class=\"o\">+</span> <span class=\"n\">v1</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span><span class=\"o\">*</span><span class=\"n\">upar2</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">-</span> <span class=\"n\">upscaDp</span><span class=\"o\">*</span><span class=\"n\">v1</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_140 = 0;\n",
       "        __pyx_t_141 = __pyx_v_jj;\n",
       "        __pyx_t_142 = 2;\n",
       "        __pyx_t_143 = __pyx_v_ii;\n",
       "        __pyx_t_144 = 1;\n",
       "        __pyx_t_145 = __pyx_v_jj;\n",
       "        __pyx_t_146 = 2;\n",
       "        __pyx_t_147 = __pyx_v_ii;\n",
       "        __pyx_t_148 = 2;\n",
       "        __pyx_t_149 = __pyx_v_ii;\n",
       "        __pyx_v_B = ((((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_140 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_141)) ))) * __pyx_v_v0) + (((__pyx_v_v1 * ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_142 * __pyx_v_Ds.strides[0]) )) + __pyx_t_143)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_144 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_145)) ))))) * __pyx_v_upar2) / pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_146 * __pyx_v_us.strides[0]) )) + __pyx_t_147)) ))), 2.0))) - ((__pyx_v_upscaDp * __pyx_v_v1) / (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_148 * __pyx_v_us.strides[0]) )) + __pyx_t_149)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">124</span>:                 <span class=\"n\">C</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">upar2</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"o\">+</span> <span class=\"mf\">2.</span><span class=\"o\">*</span><span class=\"n\">upscaDp</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">])</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">Dpar2</span> <span class=\"o\">+</span> <span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">**</span><span class=\"mf\">2</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_150 = 2;\n",
       "        __pyx_t_151 = __pyx_v_ii;\n",
       "        __pyx_t_152 = 1;\n",
       "        __pyx_t_153 = __pyx_v_jj;\n",
       "        __pyx_t_154 = 2;\n",
       "        __pyx_t_155 = __pyx_v_ii;\n",
       "        __pyx_t_156 = 2;\n",
       "        __pyx_t_157 = __pyx_v_ii;\n",
       "        __pyx_t_158 = 1;\n",
       "        __pyx_t_159 = __pyx_v_jj;\n",
       "        __pyx_t_160 = 2;\n",
       "        __pyx_t_161 = __pyx_v_ii;\n",
       "        __pyx_t_162 = 0;\n",
       "        __pyx_t_163 = __pyx_v_jj;\n",
       "        __pyx_v_C = ((((((-__pyx_v_upar2) * pow(((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_150 * __pyx_v_Ds.strides[0]) )) + __pyx_t_151)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_152 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_153)) )))), 2.0)) / pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_154 * __pyx_v_us.strides[0]) )) + __pyx_t_155)) ))), 2.0)) + (((2. * __pyx_v_upscaDp) * ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_156 * __pyx_v_Ds.strides[0]) )) + __pyx_t_157)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_158 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_159)) ))))) / (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_160 * __pyx_v_us.strides[0]) )) + __pyx_t_161)) ))))) - __pyx_v_Dpar2) + pow((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_162 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_163)) ))), 2.0));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">125</span>: </pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">126</span>:                 <span class=\"k\">if</span> <span class=\"n\">A</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">&lt;</span><span class=\"n\">EpsA</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"ow\">and</span> <span class=\"n\">B</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">&gt;</span><span class=\"n\">EpsB</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_12 = ((pow(__pyx_v_A, 2.0) &lt; pow(__pyx_v_EpsA, 2.0)) != 0);\n",
       "        if (__pyx_t_12) {\n",
       "        } else {\n",
       "          __pyx_t_13 = __pyx_t_12;\n",
       "          goto __pyx_L50_bool_binop_done;\n",
       "        }\n",
       "        __pyx_t_12 = ((pow(__pyx_v_B, 2.0) &gt; pow(__pyx_v_EpsB, 2.0)) != 0);\n",
       "        __pyx_t_13 = __pyx_t_12;\n",
       "        __pyx_L50_bool_binop_done:;\n",
       "        if (__pyx_t_13) {\n",
       "/* … */\n",
       "          goto __pyx_L49;\n",
       "        }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">127</span>:                     <span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">C</span><span class=\"o\">/</span><span class=\"p\">(</span><span class=\"mf\">2.</span><span class=\"o\">*</span><span class=\"n\">B</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_v_q = ((-__pyx_v_C) / (2. * __pyx_v_B));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">128</span>:                     <span class=\"k\">if</span> <span class=\"n\">q</span><span class=\"o\">&gt;=</span><span class=\"mf\">0.</span> <span class=\"ow\">and</span> <span class=\"n\">q</span><span class=\"o\">&lt;</span><span class=\"mf\">1.</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_t_12 = ((__pyx_v_q &gt;= 0.) != 0);\n",
       "          if (__pyx_t_12) {\n",
       "          } else {\n",
       "            __pyx_t_13 = __pyx_t_12;\n",
       "            goto __pyx_L53_bool_binop_done;\n",
       "          }\n",
       "          __pyx_t_12 = ((__pyx_v_q &lt; 1.) != 0);\n",
       "          __pyx_t_13 = __pyx_t_12;\n",
       "          __pyx_L53_bool_binop_done:;\n",
       "          if (__pyx_t_13) {\n",
       "/* … */\n",
       "          }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">129</span>:                         <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">q</span><span class=\"o\">*</span><span class=\"n\">v1</span> <span class=\"o\">-</span> <span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]))</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_164 = 2;\n",
       "            __pyx_t_165 = __pyx_v_ii;\n",
       "            __pyx_t_166 = 2;\n",
       "            __pyx_t_167 = __pyx_v_jj;\n",
       "            __pyx_t_168 = 2;\n",
       "            __pyx_t_169 = __pyx_v_ii;\n",
       "            __pyx_v_k = (((__pyx_v_q * __pyx_v_v1) - ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_164 * __pyx_v_Ds.strides[0]) )) + __pyx_t_165)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_166 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_167)) ))))) / (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_168 * __pyx_v_us.strides[0]) )) + __pyx_t_169)) ))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">130</span>:                         <span class=\"k\">if</span> <span class=\"n\">k</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_13 = ((__pyx_v_k &gt;= 0.0) != 0);\n",
       "            if (__pyx_t_13) {\n",
       "/* … */\n",
       "            }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">131</span>:                             <span class=\"n\">sol0</span><span class=\"p\">,</span> <span class=\"n\">sol1</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">],</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_170 = 0;\n",
       "              __pyx_t_171 = __pyx_v_ii;\n",
       "              __pyx_t_172 = 0;\n",
       "              __pyx_t_173 = __pyx_v_ii;\n",
       "              __pyx_t_17 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_170 * __pyx_v_Ds.strides[0]) )) + __pyx_t_171)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_172 * __pyx_v_us.strides[0]) )) + __pyx_t_173)) )))));\n",
       "              __pyx_t_174 = 1;\n",
       "              __pyx_t_175 = __pyx_v_ii;\n",
       "              __pyx_t_176 = 1;\n",
       "              __pyx_t_177 = __pyx_v_ii;\n",
       "              __pyx_t_51 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_174 * __pyx_v_Ds.strides[0]) )) + __pyx_t_175)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_176 * __pyx_v_us.strides[0]) )) + __pyx_t_177)) )))));\n",
       "              __pyx_v_sol0 = __pyx_t_17;\n",
       "              __pyx_v_sol1 = __pyx_t_51;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">132</span>:                             <span class=\"k\">if</span> <span class=\"n\">Forbidbis</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_13 = (__pyx_v_Forbidbis != 0);\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">133</span>:                                 <span class=\"n\">sca0</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_178 = 0;\n",
       "                __pyx_t_179 = __pyx_v_ii;\n",
       "                __pyx_t_180 = 1;\n",
       "                __pyx_t_181 = __pyx_v_ii;\n",
       "                __pyx_v_sca0 = (((__pyx_v_sol0 - __pyx_v_S1X) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_178 * __pyx_v_Ds.strides[0]) )) + __pyx_t_179)) )))) + ((__pyx_v_sol1 - __pyx_v_S1Y) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_180 * __pyx_v_Ds.strides[0]) )) + __pyx_t_181)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">134</span>:                                 <span class=\"n\">sca1</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1Y</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_sca1 = (((__pyx_v_sol0 - __pyx_v_S1X) * __pyx_v_S1X) + ((__pyx_v_sol1 - __pyx_v_S1Y) * __pyx_v_S1Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">135</span>:                                 <span class=\"n\">sca2</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S2X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S2Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2Y</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_sca2 = (((__pyx_v_sol0 - __pyx_v_S2X) * __pyx_v_S2X) + ((__pyx_v_sol1 - __pyx_v_S2Y) * __pyx_v_S2Y));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">136</span>:                                 <span class=\"c\">#print 1, k, kout, sca0, sca1, sca2</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">137</span>:                                 <span class=\"k\">if</span> <span class=\"n\">sca0</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca1</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca2</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_12 = ((__pyx_v_sca0 &lt; 0.0) != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  goto __pyx_L58_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_sca1 &lt; 0.0) != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  goto __pyx_L58_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_sca2 &lt; 0.0) != 0);\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                __pyx_L58_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">138</span>:                                     <span class=\"k\">continue</span></pre>\n",
       "<pre class='cython code score-0 '>                  goto __pyx_L47_continue;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">139</span>:                             <span class=\"c\"># Get the normalized perpendicular vector at intersection</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">140</span>:                             <span class=\"n\">phi</span> <span class=\"o\">=</span> <span class=\"n\">Catan2</span><span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"p\">,</span><span class=\"n\">sol0</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_v_phi = atan2(__pyx_v_sol1, __pyx_v_sol0);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">141</span>:                             <span class=\"c\"># Get the scalar product to determine entry or exit point</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">142</span>:                             <span class=\"n\">sca</span> <span class=\"o\">=</span> <span class=\"n\">Ccos</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">Csin</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_182 = 0;\n",
       "              __pyx_t_183 = __pyx_v_jj;\n",
       "              __pyx_t_184 = 0;\n",
       "              __pyx_t_185 = __pyx_v_ii;\n",
       "              __pyx_t_186 = 0;\n",
       "              __pyx_t_187 = __pyx_v_jj;\n",
       "              __pyx_t_188 = 1;\n",
       "              __pyx_t_189 = __pyx_v_ii;\n",
       "              __pyx_t_190 = 1;\n",
       "              __pyx_t_191 = __pyx_v_jj;\n",
       "              __pyx_t_192 = 2;\n",
       "              __pyx_t_193 = __pyx_v_ii;\n",
       "              __pyx_v_sca = ((((cos(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_182 * __pyx_v_vIn.strides[0]) )) + __pyx_t_183)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_184 * __pyx_v_us.strides[0]) )) + __pyx_t_185)) )))) + ((sin(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_186 * __pyx_v_vIn.strides[0]) )) + __pyx_t_187)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_188 * __pyx_v_us.strides[0]) )) + __pyx_t_189)) ))))) + ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_190 * __pyx_v_vIn.strides[0]) )) + __pyx_t_191)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_192 * __pyx_v_us.strides[0]) )) + __pyx_t_193)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">143</span>:                             <span class=\"k\">if</span> <span class=\"n\">sca</span><span class=\"o\">&lt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"n\">kout</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_12 = ((__pyx_v_sca &lt;= 0.0) != 0);\n",
       "              if (__pyx_t_12) {\n",
       "              } else {\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                goto __pyx_L62_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_12 = ((__pyx_v_k &lt; __pyx_v_kout) != 0);\n",
       "              __pyx_t_13 = __pyx_t_12;\n",
       "              __pyx_L62_bool_binop_done:;\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "                goto __pyx_L61;\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">144</span>:                                 <span class=\"n\">kout</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_kout = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">145</span>:                                 <span class=\"n\">indout</span> <span class=\"o\">=</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_indout = __pyx_v_jj;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">146</span>:                                 <span class=\"n\">Done</span> <span class=\"o\">=</span> <span class=\"mf\">1</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_Done = 1;\n",
       "</pre><pre class=\"cython line score-16\" onclick='toggleDiv(this)'>+<span class=\"\">147</span>:                                 <span class=\"k\">print</span> <span class=\"mf\">5</span><span class=\"p\">,</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-16 '>                __pyx_t_2 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 147, __pyx_L1_error)\n",
       "                <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error)\n",
       "                <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_5);\n",
       "                <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_5);\n",
       "                <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_int_5);\n",
       "                <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n",
       "                <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_t_2);\n",
       "                __pyx_t_2 = 0;\n",
       "                if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_3, 1) &lt; 0) __PYX_ERR(0, 147, __pyx_L1_error)\n",
       "                <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">148</span>:                             <span class=\"k\">elif</span> <span class=\"n\">sca</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">kin</span><span class=\"p\">,</span><span class=\"n\">kout</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_12 = ((__pyx_v_sca &gt;= 0.0) != 0);\n",
       "              if (__pyx_t_12) {\n",
       "              } else {\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                goto __pyx_L64_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_51 = __pyx_v_kout;\n",
       "              __pyx_t_17 = __pyx_v_kin;\n",
       "              if (((__pyx_t_51 &lt; __pyx_t_17) != 0)) {\n",
       "                __pyx_t_105 = __pyx_t_51;\n",
       "              } else {\n",
       "                __pyx_t_105 = __pyx_t_17;\n",
       "              }\n",
       "              __pyx_t_12 = ((__pyx_v_k &lt; __pyx_t_105) != 0);\n",
       "              __pyx_t_13 = __pyx_t_12;\n",
       "              __pyx_L64_bool_binop_done:;\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "              __pyx_L61:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">149</span>:                                 <span class=\"n\">kin</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_kin = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-16\" onclick='toggleDiv(this)'>+<span class=\"\">150</span>:                                 <span class=\"k\">print</span> <span class=\"mf\">6</span><span class=\"p\">,</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-16 '>                __pyx_t_3 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 150, __pyx_L1_error)\n",
       "                <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error)\n",
       "                <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_6);\n",
       "                <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_6);\n",
       "                <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_int_6);\n",
       "                <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "                <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_t_3);\n",
       "                __pyx_t_3 = 0;\n",
       "                if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_2, 1) &lt; 0) __PYX_ERR(0, 150, __pyx_L1_error)\n",
       "                <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">151</span>: </pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">152</span>:                 <span class=\"k\">elif</span> <span class=\"n\">A</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">&gt;=</span><span class=\"n\">EpsA</span><span class=\"o\">**</span><span class=\"mf\">2</span> <span class=\"ow\">and</span> <span class=\"n\">B</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">&gt;</span><span class=\"n\">A</span><span class=\"o\">*</span><span class=\"n\">C</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>        __pyx_t_12 = ((pow(__pyx_v_A, 2.0) &gt;= pow(__pyx_v_EpsA, 2.0)) != 0);\n",
       "        if (__pyx_t_12) {\n",
       "        } else {\n",
       "          __pyx_t_13 = __pyx_t_12;\n",
       "          goto __pyx_L66_bool_binop_done;\n",
       "        }\n",
       "        __pyx_t_12 = ((pow(__pyx_v_B, 2.0) &gt; (__pyx_v_A * __pyx_v_C)) != 0);\n",
       "        __pyx_t_13 = __pyx_t_12;\n",
       "        __pyx_L66_bool_binop_done:;\n",
       "        if (__pyx_t_13) {\n",
       "/* … */\n",
       "        }\n",
       "        __pyx_L49:;\n",
       "        __pyx_L47_continue:;\n",
       "      }\n",
       "    }\n",
       "    __pyx_L11:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">153</span>:                     <span class=\"n\">sqd</span> <span class=\"o\">=</span> <span class=\"n\">Csqrt</span><span class=\"p\">(</span><span class=\"n\">B</span><span class=\"o\">**</span><span class=\"mf\">2</span><span class=\"o\">-</span><span class=\"n\">A</span><span class=\"o\">*</span><span class=\"n\">C</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_v_sqd = sqrt((pow(__pyx_v_B, 2.0) - (__pyx_v_A * __pyx_v_C)));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">154</span>:                     <span class=\"c\"># First solution</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">155</span>:                     <span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">B</span> <span class=\"o\">+</span> <span class=\"n\">sqd</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">A</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_v_q = (((-__pyx_v_B) + __pyx_v_sqd) / __pyx_v_A);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">156</span>:                     <span class=\"k\">if</span> <span class=\"n\">q</span><span class=\"o\">&gt;=</span><span class=\"mf\">0.</span> <span class=\"ow\">and</span> <span class=\"n\">q</span><span class=\"o\">&lt;</span><span class=\"mf\">1.</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_t_12 = ((__pyx_v_q &gt;= 0.) != 0);\n",
       "          if (__pyx_t_12) {\n",
       "          } else {\n",
       "            __pyx_t_13 = __pyx_t_12;\n",
       "            goto __pyx_L69_bool_binop_done;\n",
       "          }\n",
       "          __pyx_t_12 = ((__pyx_v_q &lt; 1.) != 0);\n",
       "          __pyx_t_13 = __pyx_t_12;\n",
       "          __pyx_L69_bool_binop_done:;\n",
       "          if (__pyx_t_13) {\n",
       "/* … */\n",
       "          }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">157</span>:                         <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">q</span><span class=\"o\">*</span><span class=\"n\">v1</span> <span class=\"o\">-</span> <span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]))</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_194 = 2;\n",
       "            __pyx_t_195 = __pyx_v_ii;\n",
       "            __pyx_t_196 = 1;\n",
       "            __pyx_t_197 = __pyx_v_jj;\n",
       "            __pyx_t_198 = 2;\n",
       "            __pyx_t_199 = __pyx_v_ii;\n",
       "            __pyx_v_k = (((__pyx_v_q * __pyx_v_v1) - ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_194 * __pyx_v_Ds.strides[0]) )) + __pyx_t_195)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_196 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_197)) ))))) / (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_198 * __pyx_v_us.strides[0]) )) + __pyx_t_199)) ))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">158</span>:                         <span class=\"k\">if</span> <span class=\"n\">k</span><span class=\"o\">&gt;=</span><span class=\"mf\">0.</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_13 = ((__pyx_v_k &gt;= 0.) != 0);\n",
       "            if (__pyx_t_13) {\n",
       "/* … */\n",
       "            }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">159</span>:                             <span class=\"n\">sol0</span><span class=\"p\">,</span> <span class=\"n\">sol1</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">],</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_200 = 0;\n",
       "              __pyx_t_201 = __pyx_v_ii;\n",
       "              __pyx_t_202 = 0;\n",
       "              __pyx_t_203 = __pyx_v_ii;\n",
       "              __pyx_t_105 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_200 * __pyx_v_Ds.strides[0]) )) + __pyx_t_201)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_202 * __pyx_v_us.strides[0]) )) + __pyx_t_203)) )))));\n",
       "              __pyx_t_204 = 1;\n",
       "              __pyx_t_205 = __pyx_v_ii;\n",
       "              __pyx_t_206 = 1;\n",
       "              __pyx_t_207 = __pyx_v_ii;\n",
       "              __pyx_t_51 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_204 * __pyx_v_Ds.strides[0]) )) + __pyx_t_205)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_206 * __pyx_v_us.strides[0]) )) + __pyx_t_207)) )))));\n",
       "              __pyx_v_sol0 = __pyx_t_105;\n",
       "              __pyx_v_sol1 = __pyx_t_51;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">160</span>:                             <span class=\"k\">if</span> <span class=\"n\">Forbidbis</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_13 = (__pyx_v_Forbidbis != 0);\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">161</span>:                                 <span class=\"n\">sca0</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_208 = 0;\n",
       "                __pyx_t_209 = __pyx_v_ii;\n",
       "                __pyx_t_210 = 1;\n",
       "                __pyx_t_211 = __pyx_v_ii;\n",
       "                __pyx_v_sca0 = (((__pyx_v_sol0 - __pyx_v_S1X) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_208 * __pyx_v_Ds.strides[0]) )) + __pyx_t_209)) )))) + ((__pyx_v_sol1 - __pyx_v_S1Y) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_210 * __pyx_v_Ds.strides[0]) )) + __pyx_t_211)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">162</span>:                                 <span class=\"n\">sca1</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1Y</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_sca1 = (((__pyx_v_sol0 - __pyx_v_S1X) * __pyx_v_S1X) + ((__pyx_v_sol1 - __pyx_v_S1Y) * __pyx_v_S1Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">163</span>:                                 <span class=\"n\">sca2</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S2X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S2Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2Y</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_sca2 = (((__pyx_v_sol0 - __pyx_v_S2X) * __pyx_v_S2X) + ((__pyx_v_sol1 - __pyx_v_S2Y) * __pyx_v_S2Y));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">164</span>:                                 <span class=\"c\">#print 2, k, kout, sca0, sca1, sca2</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">165</span>:                             <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">Forbidbis</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">Forbidbis</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">sca0</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca1</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca2</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span><span class=\"p\">)):</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_12 = ((!(__pyx_v_Forbidbis != 0)) != 0);\n",
       "              if (!__pyx_t_12) {\n",
       "              } else {\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                goto __pyx_L74_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_12 = (__pyx_v_Forbidbis != 0);\n",
       "              if (__pyx_t_12) {\n",
       "              } else {\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                goto __pyx_L74_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_92 = ((__pyx_v_sca0 &lt; 0.0) != 0);\n",
       "              if (__pyx_t_92) {\n",
       "              } else {\n",
       "                __pyx_t_12 = __pyx_t_92;\n",
       "                goto __pyx_L77_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_92 = ((__pyx_v_sca1 &lt; 0.0) != 0);\n",
       "              if (__pyx_t_92) {\n",
       "              } else {\n",
       "                __pyx_t_12 = __pyx_t_92;\n",
       "                goto __pyx_L77_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_92 = ((__pyx_v_sca2 &lt; 0.0) != 0);\n",
       "              __pyx_t_12 = __pyx_t_92;\n",
       "              __pyx_L77_bool_binop_done:;\n",
       "              __pyx_t_92 = ((!__pyx_t_12) != 0);\n",
       "              __pyx_t_13 = __pyx_t_92;\n",
       "              __pyx_L74_bool_binop_done:;\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">166</span>:                                 <span class=\"c\"># Get the normalized perpendicular vector at intersection</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">167</span>:                                 <span class=\"n\">phi</span> <span class=\"o\">=</span> <span class=\"n\">Catan2</span><span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"p\">,</span><span class=\"n\">sol0</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_phi = atan2(__pyx_v_sol1, __pyx_v_sol0);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">168</span>:                                 <span class=\"c\"># Get the scalar product to determine entry or exit point</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">169</span>:                                 <span class=\"n\">sca</span> <span class=\"o\">=</span> <span class=\"n\">Ccos</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">Csin</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_212 = 0;\n",
       "                __pyx_t_213 = __pyx_v_jj;\n",
       "                __pyx_t_214 = 0;\n",
       "                __pyx_t_215 = __pyx_v_ii;\n",
       "                __pyx_t_216 = 0;\n",
       "                __pyx_t_217 = __pyx_v_jj;\n",
       "                __pyx_t_218 = 1;\n",
       "                __pyx_t_219 = __pyx_v_ii;\n",
       "                __pyx_t_220 = 1;\n",
       "                __pyx_t_221 = __pyx_v_jj;\n",
       "                __pyx_t_222 = 2;\n",
       "                __pyx_t_223 = __pyx_v_ii;\n",
       "                __pyx_v_sca = ((((cos(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_212 * __pyx_v_vIn.strides[0]) )) + __pyx_t_213)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_214 * __pyx_v_us.strides[0]) )) + __pyx_t_215)) )))) + ((sin(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_216 * __pyx_v_vIn.strides[0]) )) + __pyx_t_217)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_218 * __pyx_v_us.strides[0]) )) + __pyx_t_219)) ))))) + ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_220 * __pyx_v_vIn.strides[0]) )) + __pyx_t_221)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_222 * __pyx_v_us.strides[0]) )) + __pyx_t_223)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">170</span>:                                 <span class=\"k\">if</span> <span class=\"n\">sca</span><span class=\"o\">&lt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"n\">kout</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_92 = ((__pyx_v_sca &lt;= 0.0) != 0);\n",
       "                if (__pyx_t_92) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_92;\n",
       "                  goto __pyx_L81_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_92 = ((__pyx_v_k &lt; __pyx_v_kout) != 0);\n",
       "                __pyx_t_13 = __pyx_t_92;\n",
       "                __pyx_L81_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                  goto __pyx_L80;\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">171</span>:                                     <span class=\"n\">kout</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_kout = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">172</span>:                                     <span class=\"n\">indout</span> <span class=\"o\">=</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_indout = __pyx_v_jj;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">173</span>:                                     <span class=\"n\">Done</span> <span class=\"o\">=</span> <span class=\"mf\">1</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_Done = 1;\n",
       "</pre><pre class=\"cython line score-46\" onclick='toggleDiv(this)'>+<span class=\"\">174</span>:                                     <span class=\"k\">print</span> <span class=\"mf\">7</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">q</span><span class=\"p\">,</span> <span class=\"n\">A</span><span class=\"p\">,</span> <span class=\"n\">B</span><span class=\"p\">,</span> <span class=\"n\">C</span><span class=\"p\">,</span> <span class=\"n\">sqd</span></pre>\n",
       "<pre class='cython code score-46 '>                  __pyx_t_2 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                  __pyx_t_3 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_q); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                  __pyx_t_6 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_A); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "                  __pyx_t_4 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_B); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "                  __pyx_t_16 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_C); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "                  __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_sqd); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "                  __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "                  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_7);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_7);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_int_7);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_t_2);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 2, __pyx_t_3);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 3, __pyx_t_6);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 4, __pyx_t_4);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_16);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 5, __pyx_t_16);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 6, __pyx_t_5);\n",
       "                  __pyx_t_2 = 0;\n",
       "                  __pyx_t_3 = 0;\n",
       "                  __pyx_t_6 = 0;\n",
       "                  __pyx_t_4 = 0;\n",
       "                  __pyx_t_16 = 0;\n",
       "                  __pyx_t_5 = 0;\n",
       "                  if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_1, 1) &lt; 0) __PYX_ERR(0, 174, __pyx_L1_error)\n",
       "                  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">175</span>:                                 <span class=\"k\">elif</span> <span class=\"n\">sca</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">kin</span><span class=\"p\">,</span><span class=\"n\">kout</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_92 = ((__pyx_v_sca &gt;= 0.0) != 0);\n",
       "                if (__pyx_t_92) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_92;\n",
       "                  goto __pyx_L83_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_51 = __pyx_v_kout;\n",
       "                __pyx_t_105 = __pyx_v_kin;\n",
       "                if (((__pyx_t_51 &lt; __pyx_t_105) != 0)) {\n",
       "                  __pyx_t_17 = __pyx_t_51;\n",
       "                } else {\n",
       "                  __pyx_t_17 = __pyx_t_105;\n",
       "                }\n",
       "                __pyx_t_92 = ((__pyx_v_k &lt; __pyx_t_17) != 0);\n",
       "                __pyx_t_13 = __pyx_t_92;\n",
       "                __pyx_L83_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "                __pyx_L80:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">176</span>:                                     <span class=\"n\">kin</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_kin = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-19\" onclick='toggleDiv(this)'>+<span class=\"\">177</span>:                                     <span class=\"k\">print</span> <span class=\"mf\">8</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-19 '>                  __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 177, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "                  __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_jj); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 177, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "                  __pyx_t_16 = <span class='py_c_api'>PyTuple_New</span>(3); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 177, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "                  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_8);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_8);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0, __pyx_int_8);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 1, __pyx_t_1);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 2, __pyx_t_5);\n",
       "                  __pyx_t_1 = 0;\n",
       "                  __pyx_t_5 = 0;\n",
       "                  if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_16, 1) &lt; 0) __PYX_ERR(0, 177, __pyx_L1_error)\n",
       "                  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">178</span>: </pre>\n",
       "<pre class=\"cython line score-0\">&#xA0;<span class=\"\">179</span>:                     <span class=\"c\"># Second solution</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">180</span>:                     <span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">B</span> <span class=\"o\">-</span> <span class=\"n\">sqd</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">A</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_v_q = (((-__pyx_v_B) - __pyx_v_sqd) / __pyx_v_A);\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">181</span>:                     <span class=\"k\">if</span> <span class=\"n\">q</span><span class=\"o\">&gt;=</span><span class=\"mf\">0.</span> <span class=\"ow\">and</span> <span class=\"n\">q</span><span class=\"o\">&lt;</span><span class=\"mf\">1.</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>          __pyx_t_92 = ((__pyx_v_q &gt;= 0.) != 0);\n",
       "          if (__pyx_t_92) {\n",
       "          } else {\n",
       "            __pyx_t_13 = __pyx_t_92;\n",
       "            goto __pyx_L86_bool_binop_done;\n",
       "          }\n",
       "          __pyx_t_92 = ((__pyx_v_q &lt; 1.) != 0);\n",
       "          __pyx_t_13 = __pyx_t_92;\n",
       "          __pyx_L86_bool_binop_done:;\n",
       "          if (__pyx_t_13) {\n",
       "/* … */\n",
       "          }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">182</span>:                         <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">q</span><span class=\"o\">*</span><span class=\"n\">v1</span> <span class=\"o\">-</span> <span class=\"p\">(</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span><span class=\"o\">-</span><span class=\"n\">VPoly</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]))</span><span class=\"o\">/</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_224 = 2;\n",
       "            __pyx_t_225 = __pyx_v_ii;\n",
       "            __pyx_t_226 = 1;\n",
       "            __pyx_t_227 = __pyx_v_jj;\n",
       "            __pyx_t_228 = 2;\n",
       "            __pyx_t_229 = __pyx_v_ii;\n",
       "            __pyx_v_k = (((__pyx_v_q * __pyx_v_v1) - ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_224 * __pyx_v_Ds.strides[0]) )) + __pyx_t_225)) ))) - (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPoly.data + __pyx_t_226 * __pyx_v_VPoly.strides[0]) )) + __pyx_t_227)) ))))) / (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_228 * __pyx_v_us.strides[0]) )) + __pyx_t_229)) ))));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">183</span>: </pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">184</span>:                         <span class=\"k\">if</span> <span class=\"n\">k</span><span class=\"o\">&gt;=</span><span class=\"mf\">0.</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>            __pyx_t_13 = ((__pyx_v_k &gt;= 0.) != 0);\n",
       "            if (__pyx_t_13) {\n",
       "/* … */\n",
       "            }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">185</span>:                             <span class=\"n\">sol0</span><span class=\"p\">,</span> <span class=\"n\">sol1</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">],</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_230 = 0;\n",
       "              __pyx_t_231 = __pyx_v_ii;\n",
       "              __pyx_t_232 = 0;\n",
       "              __pyx_t_233 = __pyx_v_ii;\n",
       "              __pyx_t_17 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_230 * __pyx_v_Ds.strides[0]) )) + __pyx_t_231)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_232 * __pyx_v_us.strides[0]) )) + __pyx_t_233)) )))));\n",
       "              __pyx_t_234 = 1;\n",
       "              __pyx_t_235 = __pyx_v_ii;\n",
       "              __pyx_t_236 = 1;\n",
       "              __pyx_t_237 = __pyx_v_ii;\n",
       "              __pyx_t_51 = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_234 * __pyx_v_Ds.strides[0]) )) + __pyx_t_235)) ))) + (__pyx_v_k * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_236 * __pyx_v_us.strides[0]) )) + __pyx_t_237)) )))));\n",
       "              __pyx_v_sol0 = __pyx_t_17;\n",
       "              __pyx_v_sol1 = __pyx_t_51;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">186</span>:                             <span class=\"k\">if</span> <span class=\"n\">Forbidbis</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_13 = (__pyx_v_Forbidbis != 0);\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">187</span>:                                 <span class=\"n\">sca0</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_238 = 0;\n",
       "                __pyx_t_239 = __pyx_v_ii;\n",
       "                __pyx_t_240 = 1;\n",
       "                __pyx_t_241 = __pyx_v_ii;\n",
       "                __pyx_v_sca0 = (((__pyx_v_sol0 - __pyx_v_S1X) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_238 * __pyx_v_Ds.strides[0]) )) + __pyx_t_239)) )))) + ((__pyx_v_sol1 - __pyx_v_S1Y) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_240 * __pyx_v_Ds.strides[0]) )) + __pyx_t_241)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">188</span>:                                 <span class=\"n\">sca1</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S1X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S1Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S1Y</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_sca1 = (((__pyx_v_sol0 - __pyx_v_S1X) * __pyx_v_S1X) + ((__pyx_v_sol1 - __pyx_v_S1Y) * __pyx_v_S1Y));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">189</span>:                                 <span class=\"n\">sca2</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">sol0</span><span class=\"o\">-</span><span class=\"n\">S2X</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2X</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"o\">-</span><span class=\"n\">S2Y</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">S2Y</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_sca2 = (((__pyx_v_sol0 - __pyx_v_S2X) * __pyx_v_S2X) + ((__pyx_v_sol1 - __pyx_v_S2Y) * __pyx_v_S2Y));\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">190</span>:                                 <span class=\"c\">#print 3, k, kout, sca0, sca1, sca2</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">191</span>:                             <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">Forbidbis</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">Forbidbis</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">sca0</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca1</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">sca2</span><span class=\"o\">&lt;</span><span class=\"mf\">0</span><span class=\"p\">)):</span></pre>\n",
       "<pre class='cython code score-0 '>              __pyx_t_92 = ((!(__pyx_v_Forbidbis != 0)) != 0);\n",
       "              if (!__pyx_t_92) {\n",
       "              } else {\n",
       "                __pyx_t_13 = __pyx_t_92;\n",
       "                goto __pyx_L91_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_92 = (__pyx_v_Forbidbis != 0);\n",
       "              if (__pyx_t_92) {\n",
       "              } else {\n",
       "                __pyx_t_13 = __pyx_t_92;\n",
       "                goto __pyx_L91_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_12 = ((__pyx_v_sca0 &lt; 0.0) != 0);\n",
       "              if (__pyx_t_12) {\n",
       "              } else {\n",
       "                __pyx_t_92 = __pyx_t_12;\n",
       "                goto __pyx_L94_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_12 = ((__pyx_v_sca1 &lt; 0.0) != 0);\n",
       "              if (__pyx_t_12) {\n",
       "              } else {\n",
       "                __pyx_t_92 = __pyx_t_12;\n",
       "                goto __pyx_L94_bool_binop_done;\n",
       "              }\n",
       "              __pyx_t_12 = ((__pyx_v_sca2 &lt; 0.0) != 0);\n",
       "              __pyx_t_92 = __pyx_t_12;\n",
       "              __pyx_L94_bool_binop_done:;\n",
       "              __pyx_t_12 = ((!__pyx_t_92) != 0);\n",
       "              __pyx_t_13 = __pyx_t_12;\n",
       "              __pyx_L91_bool_binop_done:;\n",
       "              if (__pyx_t_13) {\n",
       "/* … */\n",
       "              }\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">192</span>:                                 <span class=\"c\"># Get the normalized perpendicular vector at intersection</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">193</span>:                                 <span class=\"n\">phi</span> <span class=\"o\">=</span> <span class=\"n\">Catan2</span><span class=\"p\">(</span><span class=\"n\">sol1</span><span class=\"p\">,</span><span class=\"n\">sol0</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_v_phi = atan2(__pyx_v_sol1, __pyx_v_sol0);\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">194</span>:                                 <span class=\"c\"># Get the scalar product to determine entry or exit point</span></pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">195</span>:                                 <span class=\"n\">sca</span> <span class=\"o\">=</span> <span class=\"n\">Ccos</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">Csin</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">jj</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_242 = 0;\n",
       "                __pyx_t_243 = __pyx_v_jj;\n",
       "                __pyx_t_244 = 0;\n",
       "                __pyx_t_245 = __pyx_v_ii;\n",
       "                __pyx_t_246 = 0;\n",
       "                __pyx_t_247 = __pyx_v_jj;\n",
       "                __pyx_t_248 = 1;\n",
       "                __pyx_t_249 = __pyx_v_ii;\n",
       "                __pyx_t_250 = 1;\n",
       "                __pyx_t_251 = __pyx_v_jj;\n",
       "                __pyx_t_252 = 2;\n",
       "                __pyx_t_253 = __pyx_v_ii;\n",
       "                __pyx_v_sca = ((((cos(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_242 * __pyx_v_vIn.strides[0]) )) + __pyx_t_243)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_244 * __pyx_v_us.strides[0]) )) + __pyx_t_245)) )))) + ((sin(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_246 * __pyx_v_vIn.strides[0]) )) + __pyx_t_247)) )))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_248 * __pyx_v_us.strides[0]) )) + __pyx_t_249)) ))))) + ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_250 * __pyx_v_vIn.strides[0]) )) + __pyx_t_251)) ))) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_252 * __pyx_v_us.strides[0]) )) + __pyx_t_253)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">196</span>:                                 <span class=\"k\">if</span> <span class=\"n\">sca</span><span class=\"o\">&lt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"n\">kout</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_12 = ((__pyx_v_sca &lt;= 0.0) != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  goto __pyx_L98_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_k &lt; __pyx_v_kout) != 0);\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                __pyx_L98_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                  goto __pyx_L97;\n",
       "                }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">197</span>:                                     <span class=\"n\">kout</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_kout = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">198</span>:                                     <span class=\"n\">indout</span> <span class=\"o\">=</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_indout = __pyx_v_jj;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">199</span>:                                     <span class=\"n\">Done</span> <span class=\"o\">=</span> <span class=\"mf\">1</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_Done = 1;\n",
       "</pre><pre class=\"cython line score-19\" onclick='toggleDiv(this)'>+<span class=\"\">200</span>:                                     <span class=\"k\">print</span> <span class=\"mf\">9</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-19 '>                  __pyx_t_16 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 200, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "                  __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_jj); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 200, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "                  __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 200, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "                  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_9);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_9);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_int_9);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_16);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_t_16);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 2, __pyx_t_5);\n",
       "                  __pyx_t_16 = 0;\n",
       "                  __pyx_t_5 = 0;\n",
       "                  if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_1, 1) &lt; 0) __PYX_ERR(0, 200, __pyx_L1_error)\n",
       "                  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">201</span>:                                 <span class=\"k\">elif</span> <span class=\"n\">sca</span><span class=\"o\">&gt;=</span><span class=\"mf\">0</span> <span class=\"ow\">and</span> <span class=\"n\">k</span><span class=\"o\">&lt;</span><span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">kin</span><span class=\"p\">,</span><span class=\"n\">kout</span><span class=\"p\">):</span></pre>\n",
       "<pre class='cython code score-0 '>                __pyx_t_12 = ((__pyx_v_sca &gt;= 0.0) != 0);\n",
       "                if (__pyx_t_12) {\n",
       "                } else {\n",
       "                  __pyx_t_13 = __pyx_t_12;\n",
       "                  goto __pyx_L100_bool_binop_done;\n",
       "                }\n",
       "                __pyx_t_51 = __pyx_v_kout;\n",
       "                __pyx_t_17 = __pyx_v_kin;\n",
       "                if (((__pyx_t_51 &lt; __pyx_t_17) != 0)) {\n",
       "                  __pyx_t_105 = __pyx_t_51;\n",
       "                } else {\n",
       "                  __pyx_t_105 = __pyx_t_17;\n",
       "                }\n",
       "                __pyx_t_12 = ((__pyx_v_k &lt; __pyx_t_105) != 0);\n",
       "                __pyx_t_13 = __pyx_t_12;\n",
       "                __pyx_L100_bool_binop_done:;\n",
       "                if (__pyx_t_13) {\n",
       "/* … */\n",
       "                }\n",
       "                __pyx_L97:;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">202</span>:                                     <span class=\"n\">kin</span> <span class=\"o\">=</span> <span class=\"n\">k</span></pre>\n",
       "<pre class='cython code score-0 '>                  __pyx_v_kin = __pyx_v_k;\n",
       "</pre><pre class=\"cython line score-61\" onclick='toggleDiv(this)'>+<span class=\"\">203</span>:                                     <span class=\"k\">print</span> <span class=\"mf\">10</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">q</span><span class=\"p\">,</span> <span class=\"n\">A</span><span class=\"p\">,</span> <span class=\"n\">B</span><span class=\"p\">,</span> <span class=\"n\">C</span><span class=\"p\">,</span> <span class=\"n\">sqd</span><span class=\"p\">,</span> <span class=\"n\">v0</span><span class=\"p\">,</span> <span class=\"n\">v1</span><span class=\"p\">,</span> <span class=\"n\">jj</span></pre>\n",
       "<pre class='cython code score-61 '>                  __pyx_t_1 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_k); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
       "                  __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_q); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n",
       "                  __pyx_t_16 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_A); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "                  __pyx_t_4 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_B); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "                  __pyx_t_6 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_C); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "                  __pyx_t_3 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_sqd); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "                  __pyx_t_2 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_v0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
       "                  __pyx_t_14 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_v1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_14);\n",
       "                  __pyx_t_254 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_jj); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "                  __pyx_t_255 = <span class='py_c_api'>PyTuple_New</span>(10); if (unlikely(!__pyx_t_255)) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_255);\n",
       "                  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_10);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_10);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 0, __pyx_int_10);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 1, __pyx_t_1);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_5);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 2, __pyx_t_5);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_16);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 3, __pyx_t_16);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 4, __pyx_t_4);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 5, __pyx_t_6);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 6, __pyx_t_3);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 7, __pyx_t_2);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_14);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 8, __pyx_t_14);\n",
       "                  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_254);\n",
       "                  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_255, 9, __pyx_t_254);\n",
       "                  __pyx_t_1 = 0;\n",
       "                  __pyx_t_5 = 0;\n",
       "                  __pyx_t_16 = 0;\n",
       "                  __pyx_t_4 = 0;\n",
       "                  __pyx_t_6 = 0;\n",
       "                  __pyx_t_3 = 0;\n",
       "                  __pyx_t_2 = 0;\n",
       "                  __pyx_t_14 = 0;\n",
       "                  __pyx_t_254 = 0;\n",
       "                  if (<span class='pyx_c_api'>__Pyx_Print</span>(0, __pyx_t_255, 1) &lt; 0) __PYX_ERR(0, 203, __pyx_L1_error)\n",
       "                  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_255); __pyx_t_255 = 0;\n",
       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">204</span>: </pre>\n",
       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">205</span>:         <span class=\"k\">if</span> <span class=\"n\">Done</span><span class=\"o\">==</span><span class=\"mf\">1</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_13 = ((__pyx_v_Done == 1) != 0);\n",
       "    if (__pyx_t_13) {\n",
       "/* … */\n",
       "    }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">206</span>:             <span class=\"n\">indOut</span><span class=\"p\">[</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">indout</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_256 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=0 */ ((char *) (((double *) __pyx_v_indOut.data) + __pyx_t_256)) )) = __pyx_v_indout;\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">207</span>:             <span class=\"n\">SOut</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">kout</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_257 = 0;\n",
       "      __pyx_t_258 = __pyx_v_ii;\n",
       "      __pyx_t_259 = 0;\n",
       "      __pyx_t_260 = __pyx_v_ii;\n",
       "      __pyx_t_261 = 0;\n",
       "      __pyx_t_262 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SOut.data + __pyx_t_261 * __pyx_v_SOut.strides[0]) )) + __pyx_t_262)) )) = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_257 * __pyx_v_Ds.strides[0]) )) + __pyx_t_258)) ))) + (__pyx_v_kout * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_259 * __pyx_v_us.strides[0]) )) + __pyx_t_260)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">208</span>:             <span class=\"n\">SOut</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">kout</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_263 = 1;\n",
       "      __pyx_t_264 = __pyx_v_ii;\n",
       "      __pyx_t_265 = 1;\n",
       "      __pyx_t_266 = __pyx_v_ii;\n",
       "      __pyx_t_267 = 1;\n",
       "      __pyx_t_268 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SOut.data + __pyx_t_267 * __pyx_v_SOut.strides[0]) )) + __pyx_t_268)) )) = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_263 * __pyx_v_Ds.strides[0]) )) + __pyx_t_264)) ))) + (__pyx_v_kout * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_265 * __pyx_v_us.strides[0]) )) + __pyx_t_266)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">209</span>:             <span class=\"n\">SOut</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">kout</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_269 = 2;\n",
       "      __pyx_t_270 = __pyx_v_ii;\n",
       "      __pyx_t_271 = 2;\n",
       "      __pyx_t_272 = __pyx_v_ii;\n",
       "      __pyx_t_273 = 2;\n",
       "      __pyx_t_274 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SOut.data + __pyx_t_273 * __pyx_v_SOut.strides[0]) )) + __pyx_t_274)) )) = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_269 * __pyx_v_Ds.strides[0]) )) + __pyx_t_270)) ))) + (__pyx_v_kout * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_271 * __pyx_v_us.strides[0]) )) + __pyx_t_272)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">210</span>:             <span class=\"n\">phi</span> <span class=\"o\">=</span> <span class=\"n\">Catan2</span><span class=\"p\">(</span><span class=\"n\">SOut</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">],</span><span class=\"n\">SOut</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">])</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_275 = 1;\n",
       "      __pyx_t_276 = __pyx_v_ii;\n",
       "      __pyx_t_277 = 0;\n",
       "      __pyx_t_278 = __pyx_v_ii;\n",
       "      __pyx_v_phi = atan2((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SOut.data + __pyx_t_275 * __pyx_v_SOut.strides[0]) )) + __pyx_t_276)) ))), (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SOut.data + __pyx_t_277 * __pyx_v_SOut.strides[0]) )) + __pyx_t_278)) ))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">211</span>:             <span class=\"n\">VPerp</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ccos</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">indout</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_279 = 0;\n",
       "      __pyx_t_280 = __pyx_v_indout;\n",
       "      __pyx_t_281 = 0;\n",
       "      __pyx_t_282 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPerp.data + __pyx_t_281 * __pyx_v_VPerp.strides[0]) )) + __pyx_t_282)) )) = (cos(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_279 * __pyx_v_vIn.strides[0]) )) + __pyx_t_280)) ))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">212</span>:             <span class=\"n\">VPerp</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Csin</span><span class=\"p\">(</span><span class=\"n\">phi</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">indout</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_283 = 0;\n",
       "      __pyx_t_284 = __pyx_v_indout;\n",
       "      __pyx_t_285 = 1;\n",
       "      __pyx_t_286 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPerp.data + __pyx_t_285 * __pyx_v_VPerp.strides[0]) )) + __pyx_t_286)) )) = (sin(__pyx_v_phi) * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_283 * __pyx_v_vIn.strides[0]) )) + __pyx_t_284)) ))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">213</span>:             <span class=\"n\">VPerp</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">vIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">indout</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_287 = 1;\n",
       "      __pyx_t_288 = __pyx_v_indout;\n",
       "      __pyx_t_289 = 2;\n",
       "      __pyx_t_290 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_VPerp.data + __pyx_t_289 * __pyx_v_VPerp.strides[0]) )) + __pyx_t_290)) )) = (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_vIn.data + __pyx_t_287 * __pyx_v_vIn.strides[0]) )) + __pyx_t_288)) )));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">214</span>:         <span class=\"k\">if</span> <span class=\"n\">kin</span><span class=\"o\">&lt;</span><span class=\"n\">kout</span><span class=\"p\">:</span></pre>\n",
       "<pre class='cython code score-0 '>    __pyx_t_13 = ((__pyx_v_kin &lt; __pyx_v_kout) != 0);\n",
       "    if (__pyx_t_13) {\n",
       "/* … */\n",
       "    }\n",
       "  }\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">215</span>:             <span class=\"n\">SIn</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">kin</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_291 = 0;\n",
       "      __pyx_t_292 = __pyx_v_ii;\n",
       "      __pyx_t_293 = 0;\n",
       "      __pyx_t_294 = __pyx_v_ii;\n",
       "      __pyx_t_295 = 0;\n",
       "      __pyx_t_296 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SIn.data + __pyx_t_295 * __pyx_v_SIn.strides[0]) )) + __pyx_t_296)) )) = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_291 * __pyx_v_Ds.strides[0]) )) + __pyx_t_292)) ))) + (__pyx_v_kin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_293 * __pyx_v_us.strides[0]) )) + __pyx_t_294)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">216</span>:             <span class=\"n\">SIn</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">kin</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_297 = 1;\n",
       "      __pyx_t_298 = __pyx_v_ii;\n",
       "      __pyx_t_299 = 1;\n",
       "      __pyx_t_300 = __pyx_v_ii;\n",
       "      __pyx_t_301 = 1;\n",
       "      __pyx_t_302 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SIn.data + __pyx_t_301 * __pyx_v_SIn.strides[0]) )) + __pyx_t_302)) )) = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_297 * __pyx_v_Ds.strides[0]) )) + __pyx_t_298)) ))) + (__pyx_v_kin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_299 * __pyx_v_us.strides[0]) )) + __pyx_t_300)) )))));\n",
       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">217</span>:             <span class=\"n\">SIn</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Ds</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">kin</span><span class=\"o\">*</span><span class=\"n\">us</span><span class=\"p\">[</span><span class=\"mf\">2</span><span class=\"p\">,</span><span class=\"n\">ii</span><span class=\"p\">]</span></pre>\n",
       "<pre class='cython code score-0 '>      __pyx_t_303 = 2;\n",
       "      __pyx_t_304 = __pyx_v_ii;\n",
       "      __pyx_t_305 = 2;\n",
       "      __pyx_t_306 = __pyx_v_ii;\n",
       "      __pyx_t_307 = 2;\n",
       "      __pyx_t_308 = __pyx_v_ii;\n",
       "      *((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_SIn.data + __pyx_t_307 * __pyx_v_SIn.strides[0]) )) + __pyx_t_308)) )) = ((*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_Ds.data + __pyx_t_303 * __pyx_v_Ds.strides[0]) )) + __pyx_t_304)) ))) + (__pyx_v_kin * (*((double *) ( /* dim=1 */ ((char *) (((double *) ( /* dim=0 */ (__pyx_v_us.data + __pyx_t_305 * __pyx_v_us.strides[0]) )) + __pyx_t_306)) )))));\n",
       "</pre><pre class=\"cython line score-186\" onclick='toggleDiv(this)'>+<span class=\"\">218</span>:     <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"n\">SIn</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"n\">SOut</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"n\">VPerp</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"n\">indOut</span><span class=\"p\">)</span></pre>\n",
       "<pre class='cython code score-186 '>  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
       "  __pyx_t_254 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "  __pyx_t_14 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_254, __pyx_n_s_asarray); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_14);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_254); __pyx_t_254 = 0;\n",
       "  __pyx_t_254 = __pyx_memoryview_fromslice(__pyx_v_SIn, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "  __pyx_t_2 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_14))) {\n",
       "    __pyx_t_2 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_14);\n",
       "    if (likely(__pyx_t_2)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_14);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_2);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_14, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_2) {\n",
       "    __pyx_t_255 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_14, __pyx_t_254); if (unlikely(!__pyx_t_255)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_254); __pyx_t_254 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_255);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_14)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_254};\n",
       "      __pyx_t_255 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_255)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_255);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_254); __pyx_t_254 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_14)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_254};\n",
       "      __pyx_t_255 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_255)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_255);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_254); __pyx_t_254 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_254);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0+1, __pyx_t_254);\n",
       "      __pyx_t_254 = 0;\n",
       "      __pyx_t_255 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_14, __pyx_t_3, NULL); if (unlikely(!__pyx_t_255)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_255);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_14); __pyx_t_14 = 0;\n",
       "  __pyx_t_3 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  __pyx_t_254 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_3, __pyx_n_s_asarray); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_SOut, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  __pyx_t_2 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_254))) {\n",
       "    __pyx_t_2 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_254);\n",
       "    if (likely(__pyx_t_2)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_254);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_2);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_254, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_2) {\n",
       "    __pyx_t_14 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_254, __pyx_t_3); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_14);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_254)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_3};\n",
       "      __pyx_t_14 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_254, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_14);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_254)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_3};\n",
       "      __pyx_t_14 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_254, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_14);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, __pyx_t_2); __pyx_t_2 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0+1, __pyx_t_3);\n",
       "      __pyx_t_3 = 0;\n",
       "      __pyx_t_14 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_254, __pyx_t_6, NULL); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_14);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_254); __pyx_t_254 = 0;\n",
       "  __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_6, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __pyx_t_6 = __pyx_memoryview_fromslice(__pyx_v_VPerp, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  __pyx_t_2 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_3))) {\n",
       "    __pyx_t_2 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_3);\n",
       "    if (likely(__pyx_t_2)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_2);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_3, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_2) {\n",
       "    __pyx_t_254 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_3, __pyx_t_6); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_3)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_6};\n",
       "      __pyx_t_254 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_3)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_6};\n",
       "      __pyx_t_254 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0+1, __pyx_t_6);\n",
       "      __pyx_t_6 = 0;\n",
       "      __pyx_t_254 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_254)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_254);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_indOut, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n",
       "  __pyx_t_2 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS &amp;&amp; unlikely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_6))) {\n",
       "    __pyx_t_2 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_6);\n",
       "    if (likely(__pyx_t_2)) {\n",
       "      PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_6);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_2);\n",
       "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_6, function);\n",
       "    }\n",
       "  }\n",
       "  if (!__pyx_t_2) {\n",
       "    __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_6, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "    <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "  } else {\n",
       "    #if CYTHON_FAST_PYCALL\n",
       "    if (<span class='py_c_api'>PyFunction_Check</span>(__pyx_t_6)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4};\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyFunction_FastCall</span>(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    #if CYTHON_FAST_PYCCALL\n",
       "    if (<span class='pyx_c_api'>__Pyx_PyFastCFunction_Check</span>(__pyx_t_6)) {\n",
       "      PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4};\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyCFunction_FastCall</span>(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
       "    } else\n",
       "    #endif\n",
       "    {\n",
       "      __pyx_t_16 = <span class='py_c_api'>PyTuple_New</span>(1+1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_16);\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2); <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0, __pyx_t_2); __pyx_t_2 = NULL;\n",
       "      <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_4);\n",
       "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_16, 0+1, __pyx_t_4);\n",
       "      __pyx_t_4 = 0;\n",
       "      __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_6, __pyx_t_16, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n",
       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_16); __pyx_t_16 = 0;\n",
       "    }\n",
       "  }\n",
       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 218, __pyx_L1_error)\n",
       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_255);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, __pyx_t_255);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_14);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 1, __pyx_t_14);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_254);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 2, __pyx_t_254);\n",
       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_3);\n",
       "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 3, __pyx_t_3);\n",
       "  __pyx_t_255 = 0;\n",
       "  __pyx_t_14 = 0;\n",
       "  __pyx_t_254 = 0;\n",
       "  __pyx_t_3 = 0;\n",
       "  __pyx_r = __pyx_t_6;\n",
       "  __pyx_t_6 = 0;\n",
       "  goto __pyx_L0;\n",
       "</pre></div></body></html>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%cython -a\n",
    "cimport cython\n",
    "import numpy as np\n",
    "cimport numpy as cnp\n",
    "import math\n",
    "from cpython cimport bool\n",
    "from libc.math cimport sqrt as Csqrt, cos as Ccos, sin as Csin, atan2 as Catan2\n",
    "\n",
    "@cython.cdivision(True)\n",
    "@cython.wraparound(False)\n",
    "@cython.boundscheck(False)\n",
    "def Calc_LOS_PInOut_cython(double [:,::1] Ds, double [:,::1] us, double [:,::1] VPoly, double [:,::1] vIn,\n",
    "                           bool Forbid=True, RMin=None, double EpsUz=1.e-6, double EpsVz=1.e-9, double EpsA=1.e-9, double EpsB=1.e-9):\n",
    "\n",
    "    cdef int ii, jj, Nl=Ds.shape[1], Ns=vIn.shape[1]\n",
    "    cdef double Rmin, upscaDp, upar2, Dpar2, Crit2, kout, kin\n",
    "    cdef int indout, Done\n",
    "    cdef double L, S1X, S1Y, S2X, S2Y, sca, sca0, sca1, sca2\n",
    "    cdef double q, C, delta, sqd, k, sol0, sol1\n",
    "    cdef double v0, v1, A, B\n",
    "    cdef int Forbidbis, Forbid0\n",
    "    cdef cnp.ndarray[double,ndim=2] SIn_=np.nan*np.ones((3,Nl)), SOut_=np.nan*np.ones((3,Nl))\n",
    "    cdef cnp.ndarray[double,ndim=2] VPerp_=np.nan*np.ones((3,Nl))\n",
    "    cdef cnp.ndarray[double,ndim=1] indOut_=np.nan*np.ones((Nl,))\n",
    "\n",
    "    cdef double[:,::1] SIn=SIn_, SOut=SOut_, VPerp=VPerp_\n",
    "    cdef double[::1] indOut=indOut_\n",
    "    \n",
    "    ################\n",
    "    # Prepare input\n",
    "    if RMin is None:\n",
    "        Rmin = 0.95*min(np.min(VPoly[0,:]),np.min(np.hypot(Ds[0,:],Ds[1,:])))\n",
    "    else:\n",
    "        Rmin = RMin\n",
    "    \n",
    "    ################\n",
    "    # Compute\n",
    "    if Forbid:\n",
    "        Forbid0, Forbidbis = 1, 1\n",
    "    else:\n",
    "        Forbid0, Forbidbis = 0, 0\n",
    "    for ii in range(0,Nl):\n",
    "        upscaDp = us[0,ii]*Ds[0,ii] + us[1,ii]*Ds[1,ii]\n",
    "        upar2 = us[0,ii]**2 + us[1,ii]**2\n",
    "        Dpar2 = Ds[0,ii]**2 + Ds[1,ii]**2\n",
    "        # Prepare in case Forbid is True\n",
    "        if Forbid0 and not Dpar2>0:\n",
    "            Forbidbis = 0\n",
    "        if Forbidbis:\n",
    "            # Compute coordinates of the 2 points where the tangents touch the inner circle\n",
    "            L = Csqrt(Dpar2-Rmin**2)\n",
    "            S1X = (Rmin**2*Ds[0,ii]+Rmin*Ds[1,ii]*L)/Dpar2\n",
    "            S1Y = (Rmin**2*Ds[1,ii]-Rmin*Ds[0,ii]*L)/Dpar2\n",
    "            S2X = (Rmin**2*Ds[0,ii]-Rmin*Ds[1,ii]*L)/Dpar2\n",
    "            S2Y = (Rmin**2*Ds[1,ii]+Rmin*Ds[0,ii]*L)/Dpar2\n",
    "        \n",
    "        # Compute all solutions\n",
    "        # Set tolerance value for us[2,ii]\n",
    "        # EpsUz is the tolerated DZ across 20m (max Tokamak size)\n",
    "        Crit2 = EpsUz**2*upar2/400.\n",
    "        kout, kin, Done = 1.e12, 1e12, 0\n",
    "        # Case with horizontal semi-line\n",
    "        if us[2,ii]**2<Crit2:\n",
    "            for jj in range(0,Ns):\n",
    "                # Solutions exist only in the case with non-horizontal segment (i.e.: cone, not plane)\n",
    "                if (VPoly[1,jj+1]-VPoly[1,jj])**2>EpsVz**2:\n",
    "                    q = (Ds[2,ii]-VPoly[1,jj])/(VPoly[1,jj+1]-VPoly[1,jj])\n",
    "                    # The intersection must stand on the segment \n",
    "                    if q>=0 and q<1:\n",
    "                        C = q**2*(VPoly[0,jj+1]-VPoly[0,jj])**2 + 2.*q*VPoly[0,jj]*(VPoly[0,jj+1]-VPoly[0,jj]) + VPoly[0,jj]**2\n",
    "                        delta = upscaDp**2 - upar2*(Dpar2-C)\n",
    "                        if delta>0.:\n",
    "                            sqd = Csqrt(delta)\n",
    "                            # The intersection must be on the semi-line (i.e.: k>=0)\n",
    "                            # First solution\n",
    "                            if -upscaDp - sqd >=0:\n",
    "                                k = (-upscaDp - sqd)/upar2\n",
    "                                sol0, sol1 = Ds[0,ii] + k*us[0,ii], Ds[1,ii] + k*us[1,ii] \n",
    "                                if Forbidbis:\n",
    "                                    sca0 = (sol0-S1X)*Ds[0,ii] + (sol1-S1Y)*Ds[1,ii]\n",
    "                                    sca1 = (sol0-S1X)*S1X + (sol1-S1Y)*S1Y\n",
    "                                    sca2 = (sol0-S2X)*S2X + (sol1-S2Y)*S2Y\n",
    "                                if not Forbidbis or (Forbidbis and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                    # Get the normalized perpendicular vector at intersection\n",
    "                                    phi = Catan2(sol1,sol0)\n",
    "                                    # Get the scalar product to determine entry or exit point\n",
    "                                    sca = Ccos(phi)*vIn[0,jj]*us[0,ii] + Csin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                    if sca<=0 and k<kout:\n",
    "                                        kout = k\n",
    "                                        indout = jj\n",
    "                                        Done = 1\n",
    "                                        print 1, k\n",
    "                                    elif sca>=0 and k<min(kin,kout):\n",
    "                                        kin = k\n",
    "                                        print 2, k\n",
    "                                    \n",
    "                            # Second solution\n",
    "                            if -upscaDp + sqd >=0:\n",
    "                                k = (-upscaDp + sqd)/upar2\n",
    "                                sol0, sol1 = Ds[0,ii] + k*us[0,ii], Ds[1,ii] + k*us[1,ii]\n",
    "                                if Forbidbis:\n",
    "                                    sca0 = (sol0-S1X)*Ds[0,ii] + (sol1-S1Y)*Ds[1,ii]\n",
    "                                    sca1 = (sol0-S1X)*S1X + (sol1-S1Y)*S1Y\n",
    "                                    sca2 = (sol0-S2X)*S2X + (sol1-S2Y)*S2Y\n",
    "                                if not Forbidbis or (Forbidbis and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                    # Get the normalized perpendicular vector at intersection\n",
    "                                    phi = Catan2(sol1,sol0)\n",
    "                                    # Get the scalar product to determine entry or exit point\n",
    "                                    sca = Ccos(phi)*vIn[0,jj]*us[0,ii] + Csin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                    if sca<=0 and k<kout:\n",
    "                                        kout = k\n",
    "                                        indout = jj\n",
    "                                        Done = 1\n",
    "                                        print 3, k\n",
    "                                    elif sca>=0 and k<min(kin,kout):\n",
    "                                        kin = k\n",
    "                                        print 4, k\n",
    "                                        \n",
    "        # More general non-horizontal semi-line case\n",
    "        else:\n",
    "            for jj in range(Ns):\n",
    "                v0, v1 = VPoly[0,jj+1]-VPoly[0,jj], VPoly[1,jj+1]-VPoly[1,jj]\n",
    "                A = v0**2 - upar2*(v1/us[2,ii])**2\n",
    "                B = VPoly[0,jj]*v0 + v1*(Ds[2,ii]-VPoly[1,jj])*upar2/us[2,ii]**2 - upscaDp*v1/us[2,ii]\n",
    "                C = -upar2*(Ds[2,ii]-VPoly[1,jj])**2/us[2,ii]**2 + 2.*upscaDp*(Ds[2,ii]-VPoly[1,jj])/us[2,ii] - Dpar2 + VPoly[0,jj]**2              \n",
    "               \n",
    "                if A**2<EpsA**2 and B**2>EpsB**2:\n",
    "                    q = -C/(2.*B)\n",
    "                    if q>=0. and q<1.:\n",
    "                        k = (q*v1 - (Ds[2,ii]-VPoly[2,jj]))/us[2,ii]\n",
    "                        if k>=0:\n",
    "                            sol0, sol1 = Ds[0,ii] + k*us[0,ii], Ds[1,ii] + k*us[1,ii]\n",
    "                            if Forbidbis:\n",
    "                                sca0 = (sol0-S1X)*Ds[0,ii] + (sol1-S1Y)*Ds[1,ii]\n",
    "                                sca1 = (sol0-S1X)*S1X + (sol1-S1Y)*S1Y\n",
    "                                sca2 = (sol0-S2X)*S2X + (sol1-S2Y)*S2Y\n",
    "                                #print 1, k, kout, sca0, sca1, sca2\n",
    "                                if sca0<0 and sca1<0 and sca2<0:\n",
    "                                    continue\n",
    "                            # Get the normalized perpendicular vector at intersection\n",
    "                            phi = Catan2(sol1,sol0)\n",
    "                            # Get the scalar product to determine entry or exit point\n",
    "                            sca = Ccos(phi)*vIn[0,jj]*us[0,ii] + Csin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                            if sca<=0 and k<kout:\n",
    "                                kout = k\n",
    "                                indout = jj\n",
    "                                Done = 1\n",
    "                                print 5, k\n",
    "                            elif sca>=0 and k<min(kin,kout):\n",
    "                                kin = k\n",
    "                                print 6, k\n",
    "                                \n",
    "                elif A**2>=EpsA**2 and B**2>A*C:\n",
    "                    sqd = Csqrt(B**2-A*C)\n",
    "                    # First solution\n",
    "                    q = (-B + sqd)/A\n",
    "                    if q>=0. and q<1.:\n",
    "                        k = (q*v1 - (Ds[2,ii]-VPoly[1,jj]))/us[2,ii]\n",
    "                        if k>=0.:\n",
    "                            sol0, sol1 = Ds[0,ii] + k*us[0,ii], Ds[1,ii] + k*us[1,ii]\n",
    "                            if Forbidbis:\n",
    "                                sca0 = (sol0-S1X)*Ds[0,ii] + (sol1-S1Y)*Ds[1,ii]\n",
    "                                sca1 = (sol0-S1X)*S1X + (sol1-S1Y)*S1Y\n",
    "                                sca2 = (sol0-S2X)*S2X + (sol1-S2Y)*S2Y\n",
    "                                #print 2, k, kout, sca0, sca1, sca2\n",
    "                            if not Forbidbis or (Forbidbis and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                # Get the normalized perpendicular vector at intersection\n",
    "                                phi = Catan2(sol1,sol0)\n",
    "                                # Get the scalar product to determine entry or exit point\n",
    "                                sca = Ccos(phi)*vIn[0,jj]*us[0,ii] + Csin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                if sca<=0 and k<kout:\n",
    "                                    kout = k\n",
    "                                    indout = jj\n",
    "                                    Done = 1\n",
    "                                    print 7, k, q, A, B, C, sqd\n",
    "                                elif sca>=0 and k<min(kin,kout):\n",
    "                                    kin = k\n",
    "                                    print 8, k, jj\n",
    "                            \n",
    "                    # Second solution\n",
    "                    q = (-B - sqd)/A\n",
    "                    if q>=0. and q<1.:\n",
    "                        k = (q*v1 - (Ds[2,ii]-VPoly[1,jj]))/us[2,ii]\n",
    "                        \n",
    "                        if k>=0.:\n",
    "                            sol0, sol1 = Ds[0,ii] + k*us[0,ii], Ds[1,ii] + k*us[1,ii]\n",
    "                            if Forbidbis:\n",
    "                                sca0 = (sol0-S1X)*Ds[0,ii] + (sol1-S1Y)*Ds[1,ii]\n",
    "                                sca1 = (sol0-S1X)*S1X + (sol1-S1Y)*S1Y\n",
    "                                sca2 = (sol0-S2X)*S2X + (sol1-S2Y)*S2Y\n",
    "                                #print 3, k, kout, sca0, sca1, sca2\n",
    "                            if not Forbidbis or (Forbidbis and not (sca0<0 and sca1<0 and sca2<0)):\n",
    "                                # Get the normalized perpendicular vector at intersection\n",
    "                                phi = Catan2(sol1,sol0)\n",
    "                                # Get the scalar product to determine entry or exit point\n",
    "                                sca = Ccos(phi)*vIn[0,jj]*us[0,ii] + Csin(phi)*vIn[0,jj]*us[1,ii] + vIn[1,jj]*us[2,ii]\n",
    "                                if sca<=0 and k<kout:\n",
    "                                    kout = k\n",
    "                                    indout = jj\n",
    "                                    Done = 1\n",
    "                                    print 9, k, jj\n",
    "                                elif sca>=0 and k<min(kin,kout):\n",
    "                                    kin = k\n",
    "                                    print 10, k, q, A, B, C, sqd, v0, v1, jj\n",
    "\n",
    "        if Done==1:\n",
    "            indOut[ii] = indout\n",
    "            SOut[0,ii] = Ds[0,ii] + kout*us[0,ii]\n",
    "            SOut[1,ii] = Ds[1,ii] + kout*us[1,ii]\n",
    "            SOut[2,ii] = Ds[2,ii] + kout*us[2,ii]\n",
    "            phi = Catan2(SOut[1,ii],SOut[0,ii])\n",
    "            VPerp[0,ii] = Ccos(phi)*vIn[0,indout]\n",
    "            VPerp[1,ii] = Csin(phi)*vIn[0,indout]\n",
    "            VPerp[2,ii] = vIn[1,indout]\n",
    "        if kin<kout:\n",
    "            SIn[0,ii] = Ds[0,ii] + kin*us[0,ii]\n",
    "            SIn[1,ii] = Ds[1,ii] + kin*us[1,ii]\n",
    "            SIn[2,ii] = Ds[2,ii] + kin*us[2,ii]\n",
    "            \n",
    "\n",
    "    return np.asarray(SIn), np.asarray(SOut), np.asarray(VPerp), np.asarray(indOut)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pythran version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Numba version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Benchmark overview"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Useful functions for defining input data\n",
    "\n",
    "C, a = [3.,0.], 1.\n",
    "def makeVesPoly(NS, C=C, a=a):\n",
    "    theta = np.linspace(0,2.*np.pi,NS+1)\n",
    "    VP = np.array([C[0]+a*np.cos(theta), C[1]+a*np.sin(theta)])\n",
    "    ind = (VP[1,:]<C[1]-0.85*a).nonzero()[0]\n",
    "    div = np.array([[C[0]-0.2*a, C[0], C[0]+0.2*a],[C[1]-1.2*a, C[1]-0.75*a, C[1]-1.2*a]])\n",
    "    VP = np.concatenate((VP[:,:ind[0]],div,VP[:,ind[-1]+1:-1],VP[:,0:1]), axis=1)\n",
    "    return VP\n",
    "\n",
    "phi = [0.,np.pi/3.,np.pi/2.,np.pi]\n",
    "Dr = [-0.1,0.1]\n",
    "def makeLOS(NL, phi=phi, theta=phi, Dr=Dr, dphi=0., Dthet=np.pi/2., C=C, a=a):\n",
    "    Ntot = len(phi)*len(theta)*len(Dr)\n",
    "    nn = np.ceil(Ntot/NL)\n",
    "    Ds, us = [], []\n",
    "    for ii in range(len(Dr)):\n",
    "        for jj in range(len(phi)):\n",
    "            for kk in range(len(theta)):\n",
    "                D = np.array([(C[0]+(a+Dr[ii])*np.cos(theta[kk]))*np.cos(phi[jj]), (C[0]+(a+Dr[ii])*np.cos(theta[kk]))*np.sin(phi[jj]), C[1]+(a+Dr[ii])*np.sin(theta[kk])])\n",
    "                Ref = np.array([C[0]*np.cos(phi[jj]), C[0]*np.sin(phi[jj]), C[1]])\n",
    "                duRef = (Ref-D)/np.linalg.norm(Ref-D)\n",
    "                if NL==1:\n",
    "                    dus = duRef.reshape((3,1))\n",
    "                else:\n",
    "                    ephi = np.array([-np.sin(phi[jj]),np.cos(phi[jj]),0.])\n",
    "                    eperp = np.cross(ephi,duRef)/np.linalg.norm(np.cross(ephi,duRef))\n",
    "                    epar = duRef*np.cos(dphi) + ephi*np.sin(dphi)\n",
    "                    DThet = np.linspace(-Dthet,Dthet,NL)[np.newaxis,:]\n",
    "                    dus = epar[:,np.newaxis]*np.cos(DThet) + eperp[:,np.newaxis]*np.sin(DThet)\n",
    "                    dus = np.concatenate((duRef.reshape((3,1)),dus),axis=1)\n",
    "                dus = dus/(np.sqrt(np.sum(dus**2,axis=0))[np.newaxis,:])\n",
    "                Ds.append(np.tile(D,(dus.shape[1],1)).T)\n",
    "                us.append(dus)\n",
    "    Ds = np.concatenate(tuple(Ds),axis=1)\n",
    "    us = np.concatenate(tuple(us),axis=1)\n",
    "    return Ds, us\n",
    "\n",
    "                \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Results "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Preliminary checks and debugging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:40: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:62: RuntimeWarning: divide by zero encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:62: RuntimeWarning: invalid value encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:63: RuntimeWarning: divide by zero encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:63: RuntimeWarning: invalid value encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:63: RuntimeWarning: invalid value encountered in subtract\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:64: RuntimeWarning: divide by zero encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:64: RuntimeWarning: invalid value encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:64: RuntimeWarning: invalid value encountered in add\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:66: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:66: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:75: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:121: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:121: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:122: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:122: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/numpy/lib/nanfunctions.py:236: RuntimeWarning: All-NaN axis encountered\n",
      "  warnings.warn(\"All-NaN axis encountered\", RuntimeWarning)\n"
     ]
    }
   ],
   "source": [
    "VPoly = makeVesPoly(50)\n",
    "vIn = np.array([-(VPoly[1,1:]-VPoly[1,:-1]), VPoly[0,1:]-VPoly[0,:-1]])\n",
    "vIn = vIn/np.tile(np.sqrt(np.sum(vIn**2,axis=0)),(2,1))\n",
    "Ds, us = makeLOS(100)\n",
    "\n",
    "N, nN = 0, Ds.shape[1]\n",
    "SIn0, SOut0, VPerp0, indOut0 = Calc_LOS_PInOut_python(Ds[:,N:N+nN], us[:,N:N+nN], VPoly, vIn, Forbid=True)#[:,N:N+nN]\n",
    "SIn1, SOut1, VPerp1, indOut1 = Calc_LOS_PInOut_numpy1(Ds[:,N:N+nN], us[:,N:N+nN], VPoly, vIn, Forbid=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "print np.allclose(SIn0, SIn1,atol=1.e-9,rtol=0., equal_nan=True)\n",
    "print np.allclose(SOut0, SOut1,atol=1.e-9,rtol=0., equal_nan=True)\n",
    "print np.allclose(VPerp0, VPerp1,atol=1.e-9,rtol=0., equal_nan=True)\n",
    "print np.allclose(indOut0, indOut1,atol=1.e-9,rtol=0., equal_nan=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0 []\n",
      "[]\n",
      "[]\n",
      "[]\n",
      "[]\n",
      "[]\n",
      "[]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:2: RuntimeWarning: invalid value encountered in greater\n",
      "  from ipykernel import kernelapp as app\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:7: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:8: RuntimeWarning: invalid value encountered in greater\n"
     ]
    }
   ],
   "source": [
    "d = np.sqrt(np.sum((SIn0-SIn1)**2,axis=0))\n",
    "print np.nanmax(d), (d>0.1*np.nanmax(d)).nonzero()[0]\n",
    "print (np.any(np.isnan(SOut0),axis=0) & np.all(~np.isnan(SOut1),axis=0)).nonzero()[0]\n",
    "print (np.any(np.isnan(SOut1),axis=0) & np.all(~np.isnan(SOut0),axis=0)).nonzero()[0]\n",
    "print (np.any(np.isnan(SIn0),axis=0) & np.all(~np.isnan(SIn1),axis=0)).nonzero()[0]\n",
    "print (np.any(np.isnan(SIn1),axis=0) & np.all(~np.isnan(SIn0),axis=0)).nonzero()[0]\n",
    "print (np.sqrt(np.sum((SOut0-SOut1)**2,axis=0))>1.e-9).nonzero()[0]\n",
    "print (np.sqrt(np.sum((SIn0-SIn1)**2,axis=0))>1.e-9).nonzero()[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Benchmark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "LS = 50\n",
      "    LL = 1\n",
      "        python 0.0191445 / 0.000610945010255\n",
      "        cython 0.000199 / 4.98820831785e-05   True vs python\n",
      "        numpy1 0.003128 / 0.0014264099068   True vs cython\n",
      "    LL = 4\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:40: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:62: RuntimeWarning: divide by zero encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:62: RuntimeWarning: invalid value encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:63: RuntimeWarning: divide by zero encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:63: RuntimeWarning: invalid value encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:63: RuntimeWarning: invalid value encountered in subtract\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:64: RuntimeWarning: divide by zero encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:64: RuntimeWarning: invalid value encountered in divide\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:64: RuntimeWarning: invalid value encountered in add\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:66: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:66: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:75: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:121: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:121: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:122: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:122: RuntimeWarning: invalid value encountered in greater\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "        python 0.122824 / 0.0189960652124\n",
      "        cython 0.000407 / 5.26743137908e-05   True vs python\n",
      "        numpy1 0.0062755 / 0.000329268591815   True vs cython\n",
      "    LL = 10\n",
      "        python 0.284569 / 0.00505746370614\n",
      "        cython 0.0007995 / 0.000143224765084   True vs python\n",
      "        numpy1 0.012043 / 0.000852165216115   True vs cython\n",
      "    LL = 40\n",
      "        python 1.1191715 / 0.00588616891299\n",
      "        cython 0.002464 / 0.000253885418163   True vs python\n",
      "        numpy1 0.043131 / 0.00111199696492   True vs cython\n",
      "    LL = 100\n",
      "        python 2.7928785 / 0.00647867684536\n",
      "        cython 0.005834 / 0.000253289963393   True vs python\n",
      "        numpy1 0.1099845 / 0.00597864986849   True vs cython\n",
      "    LL = 400\n",
      "        python 11.084091 / 0.0302316658347\n",
      "        cython 0.022572 / 0.000288738299426   True vs python\n",
      "        numpy1 0.4673885 / 0.0165061515949   True vs cython\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwEAAAJ0CAYAAABKhy/TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xdc1XX///EHuHFVjvISFRVUFHGApZZ7lV6YOVKjS1OL\nNK0ckZp6pV0OUMCBE0FcOHKk4UpLbZiGmCNxhAIiam5xIMo4vz/ON35ZamrA53DO8367dTPO+QBP\nEfHzPJ/3+/WxM5lMJkRERERExGbYGx1ARERERERyl0qAiIiIiIiNUQkQEREREbExKgEiIiIiIjZG\nJUBERERExMaoBIiIiIiI2BiVABERERERG6MSICIiIiJiY1QCRERERERsTH6jA+SE0qVL4+TkZHQM\nEREREZFck5CQwKVLlx7pWKssAU5OTkRHRxsdQ0REREQk13h6ej7ysVoOJCIiIiJiY1QCRERERERs\njEqAiIiIiIiNsco9AfeTlpZGUlISqampRkcRG1K4cGEcHR0pUKCA0VFEREREsthMCUhKSqJ48eI4\nOTlhZ2dndByxASaTicuXL5OUlETlypWNjiMiIiKSxWaWA6WmplKqVCkVAMk1dnZ2lCpVSlefRERE\nxOLYTAkAVAAk1+l7TkRERCyRTZUAERERERFRCbBoEydOzPr/hIQE3NzcDEwjf/bdd99Rv3598ufP\nz+rVq42OIyIiIvLIVAIs2B9LgFieihUrsnDhQt544w2jo4iIiIg8FpWAXJSQkECNGjXw9vbG1dWV\nrl27smnTJjp16pR1zLZt23jttdcYMWIEt2/fpm7dunh7ewOQkZHBO++8Q61atWjbti23b98G4MCB\nAzRs2BB3d3dee+01rl69CkDz5s0ZPnw4zz//PNWqVeP777/P/d90DkhISMDV1fUvX4vmzZsTHR0N\nwKVLl3BycgJg4cKFdOrUiTZt2uDk5MTMmTMJCgqiXr16NGzYkCtXrgDmr9eHH35I3bp1cXNzIyoq\niszMTFxcXLh48SIAmZmZODs7c/HiRZycnHB3d8feXn+NREREJG/R2UsuO378OO+99x5Hjx6lRIkS\nxMTEcOzYsayTzPDwcPr27Yufnx9FihThwIEDREREABAbG8vAgQOJiYnhqaeeYs2aNQD06tULf39/\nDh06RO3atRk3blzW50tPTycqKopp06bd83he96CvxYMcPnyYtWvXsnfvXkaNGoWDgwP79++nUaNG\n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\n+OILSdKJEydUrVo1SVLJkiXVqFGjK/o9AID/jiIAACBJ6tWrl6KiopSYmJjre3FxcVq/fr0WL16s\nV155RSkpKYV+/R07duj222/P8VhQUJB27NghSXrzzTdVv359de7cWWPHjr2i3wEAKBiKAACAJKlC\nhQrq3r27RowYket7ISEhKlGihOrWravatWtr9+7dTv/9gwYNUnR0tNq2bavp06fr4YcfdvrvAAAY\nFAEAgEv69u2rCRMmKCkpKcfjPj4++d4viEaNGmnjxo05Htu4caMaN2586f4tt9yiV199VT/++KO2\nbNmiU6dOFfr3AAD+O4oAAMAlN9xwg0JCQjRhwoQcj8+ZM0eZmZn6/ffftX//ftWvX7/Qr/3222/r\n008/VVxcnCTTYvTJJ59cmkq0ePFiWZYlSdq7d69Kliyp66+//ur+gwAAeWI6EAAgh379+mnUqFE5\nHvP399c///lPnTt3TmPGjFG5cuV05MgRvfjii1qyZEmer9OkSROVKGHWmkJCQvT111/rs88+U3Bw\nsNLT01W6dGl9/vnnCgwMlCRNnTpVb775pnx9fVWqVClFRUWpZMmSRfsfCwBeysfKWnYBAAAA4BVo\nBwIAAAC8DEUAAAAA4GUoAgAAAAAvQxEAAAAAeBmKAAAAAMDLUAQAAAAAXoYiAAAAAPAy/wem+vpH\nPC7ypwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f3cdf6d8090>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import datetime as dtm\n",
    "\n",
    "######################################## (to be edited)\n",
    "# Dictionnary of functions to be tested (add key to add a function)\n",
    "Tests = {'python':{'func':Calc_LOS_PInOut_python, 'c':'k'},\n",
    "         'numpy1':{'func':Calc_LOS_PInOut_numpy1, 'c':'r'},\n",
    "         'cython':{'func':Calc_LOS_PInOut_cython, 'c':'b'}}\n",
    "\n",
    "######################################## (can be edited)\n",
    "# Parameters of the benchmark\n",
    "\n",
    "# Number of segments constituting the vessel polygon \n",
    "# (i.e.: the polygon representing the cross-section of the toroial vessel) \n",
    "LS = [50]#[50,200]#,500]\n",
    "\n",
    "# Number of Lines of Sight for which the function should be run\n",
    "#, (i.e.: semi-lines)\n",
    "LL = [1,4,10,40,100,400]#,100000,400000]\n",
    "NS, NL = len(LS), len(LL)\n",
    "\n",
    "# Number of times each function is executed (average and standard deviation are computed)\n",
    "NRepeat = 6\n",
    "\n",
    "######################################## (no editing)\n",
    "# Benchmark and plot\n",
    "\n",
    "Keys = Tests.keys()\n",
    "for kk in range(len(Keys)):\n",
    "    Tests[Keys[kk]]['t'] = np.nan*np.ones((NS,NL))\n",
    "    Tests[Keys[kk]]['check'] = dict([(nn,np.zeros((NS,NL),dtype=bool)) for nn in ['SIn','SOut','VPerp','indOut']])\n",
    "\n",
    "# Compute execution times\n",
    "LSr, LLr = [], []\n",
    "for ii in range(NS):\n",
    "    VPoly = np.ascontiguousarray(makeVesPoly(LS[ii]))\n",
    "    vIn = np.array([-(VPoly[1,1:]-VPoly[1,:-1]), VPoly[0,1:]-VPoly[0,:-1]])\n",
    "    vIn = np.ascontiguousarray(vIn/np.tile(np.sqrt(np.sum(vIn**2,axis=0)),(2,1)))\n",
    "    LSr.append(vIn.shape[1])\n",
    "    print(\"\")\n",
    "    print(\"LS = \"+str(LS[ii]))\n",
    "    for jj in range(NL):\n",
    "        Ds, us = makeLOS(LL[jj])\n",
    "        Ds = np.ascontiguousarray(Ds)\n",
    "        us = np.ascontiguousarray(us)\n",
    "        if ii==0:\n",
    "            LLr.append(Ds.shape[1])\n",
    "        print(\"    LL = \"+str(LL[jj]))\n",
    "        for kk in range(len(Keys)):\n",
    "            t = []\n",
    "            for tt in range(NRepeat):\n",
    "                t0 = dtm.datetime.now()\n",
    "                SIn, SOut, VPerp, indOut = Tests[Keys[kk]]['func'](Ds, us, VPoly, vIn)\n",
    "                t.append( (dtm.datetime.now()-t0).total_seconds() )\n",
    "                if tt==NRepeat-1:\n",
    "                        SIn0, SOut0, VPerp0, indOut0 = SIn, SOut, VPerp, indOut\n",
    "            \n",
    "            Tests[Keys[kk]]['t'][ii,jj] = np.median(t)\n",
    "            Str = \"        \"+Keys[kk]+\" \"+str(np.median(t))+\" / \"+str(np.std(t))\n",
    "            if kk>0:\n",
    "                Tests[Keys[kk]]['check']['SIn'][ii,jj] = np.allclose(SIn,SIn0,atol=1.e-9,rtol=0.,equal_nan=True)\n",
    "                Tests[Keys[kk]]['check']['SOut'][ii,jj] = np.allclose(SOut,SOut0,atol=1.e-9,rtol=0.,equal_nan=True)\n",
    "                Tests[Keys[kk]]['check']['VPerp'][ii,jj] = np.allclose(VPerp,VPerp0,atol=1.e-9,rtol=0.,equal_nan=True)\n",
    "                Tests[Keys[kk]]['check']['indOut'][ii,jj] = np.allclose(indOut,indOut0,atol=1.e-9,rtol=0.,equal_nan=True)\n",
    "                Tests[Keys[kk]]['check']['vs'] = Keys[kk-1]\n",
    "                allok = all([Tests[Keys[kk]]['check'][cc][ii,jj] for cc in ['SIn','SOut','VPerp','indOut']])\n",
    "                Str += \"   \"+str(allok)+\" vs \"+Keys[kk-1]\n",
    "            print(Str)\n",
    "        \n",
    "# Plot results  \n",
    "f = plt.figure(figsize=(14,10),facecolor='w')\n",
    "ax = f.add_axes([0.1,0.1,0.7,0.8], frameon=True,xscale='log',yscale='log')\n",
    "ax.set_xlabel(r\"Nb. LOS\")\n",
    "ax.set_ylabel(r\"CPU time (s)\")\n",
    "m = ['o','x','^','+','s']\n",
    "for kk in range(len(Keys)):\n",
    "    for ii in range(NS):\n",
    "        ax.plot(LLr, Tests[Keys[kk]]['t'][ii,:], ls='-', lw=1., c=Tests[Keys[kk]]['c'], marker=m[ii])\n",
    "\n",
    "# Legend proxys\n",
    "for kk in range(len(Keys)):\n",
    "    ax.plot([],[], ls='-',lw=1.,c=Tests[Keys[kk]]['c'],label=Keys[kk])\n",
    "for ii in range(NS):\n",
    "    ax.plot([],[],ls='None',lw=0.,c='k',marker=m[ii], label=\"{0}\".format(LS[ii]))\n",
    "        \n",
    "        \n",
    "ax.legend(loc=\"upper left\", ncol=2)\n",
    "        \n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "plt.gcf().savefig('./Fig_IPyNb_Stats_Cython_Last.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# Debug special cases"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "VPoly = np.array([[ 1.26499999,  1.26499999,  1.60800004 , 1.68299997,  1.63100004 , 1.57799995 ,                                                               \n",
    "   1.59300005  ,1.62600005,  2.00600004,  2.23300004  ,2.2349999  , 2.26300001 ,                                                               \n",
    "   2.2980001 ,  2.31599998 , 2.31599998 , 2.2980001 ,  2.26300001 , 2.2349999,                                                                 \n",
    "   2.23300004  ,2.00600004 , 1.62600005 , 1.59300005  ,1.57799995 , 1.63100004   ,                                                             \n",
    "   1.68299997  ,1.60800004 , 1.26499999]    ,                                                                                               \n",
    " [ 1.08500004, -1.08500004, -1.42900002, -1.43099999, -1.32599997, -1.32000005 ,                                                               \n",
    "  -1.153  ,    -1.09000003, -0.773   ,   -0.44400001 ,-0.36899999 ,-0.31  ,     -0.189 ,                                                        \n",
    "  -0.062   ,    0.062     ,  0.189  ,     0.31       , 0.36899999 , 0.44400001   ,                                                             \n",
    "   0.773   ,    1.09000003 , 1.153   ,    1.32000005 , 1.32599997 , 1.43099999  ,                                                              \n",
    "   1.42900002 , 1.08500004]])\n",
    "\n",
    "VIn = np.array([[ 1. ,         0.70813522 , 0.02665687, -0.89612787 ,-0.1124874 , -0.99599034   ,                                                             \n",
    "  -0.88583147, -0.64058188 ,-0.82309181, -0.99964469, -0.90342508, -0.96061987  ,                                                              \n",
    "  -0.99010493, -1.         ,-0.99010493, -0.96061987, -0.90342508, -0.99964469   ,                                                             \n",
    "  -0.82309181 ,-0.64058188 ,-0.88583147, -0.99599034, -0.1124874 , -0.89612787  ,                                                              \n",
    "   0.02665687 , 0.70813522]   ,                                                                                                            \n",
    " [ 0.       ,   0.70607684 , 0.99964464, -0.44379595, -0.99365315,  0.08946081   ,                                                             \n",
    "   0.46400713 , 0.76788987 , 0.56790833,  0.02665525,  0.42874599 , 0.27786592  ,                                                              \n",
    "   0.14032896 , 0.        , -0.14032896, -0.27786592 ,-0.42874599, -0.02665525  ,                                                              \n",
    "  -0.56790833 ,-0.76788987, -0.46400713, -0.08946081,  0.99365315 , 0.44379595 ,                                                               \n",
    "  -0.99964464 ,-0.70607684]])\n",
    "\n",
    "#Ds =np.array([[6.098],[-0.03115],[0.134175]])\n",
    "Ds = np.array([[6.098],[-0.03115],[0.134175]])\n",
    "\n",
    "#dus = np.array([[-9.85837500e-01],[1.67701586e-01],[-7.75785190e-04]])\n",
    "dus = np.array([[-9.86046458e-01],[1.66470367e-01],[5.86903767e-09]])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A [ 5.22365342  3.93303256] [ 0 14] [ 0.43816821  0.56830709] [ 1.60022497  5.31657769] [ 0.79444343  2.08506429]\n",
      "A [ 6.81254028  8.10316114] [ 0 14] [ 0.43816821  0.56830709]\n",
      "B [] []\n",
      "C [] [] [] [] []\n",
      "C [] [] [] [] []\n",
      "1 5.22365341838\n",
      "2 3.93303256252\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:120: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:120: RuntimeWarning: invalid value encountered in greater\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:121: RuntimeWarning: invalid value encountered in less\n",
      "/Applications/Anaconda/python27/lib/python2.7/site-packages/ipykernel/__main__.py:121: RuntimeWarning: invalid value encountered in greater\n"
     ]
    }
   ],
   "source": [
    "SInn, SOutn, VPerpn, indOutn = Calc_LOS_PInOut_numpy1(Ds, dus, VPoly, VIn)\n",
    "SInc, SOutc, VPerpc, indOutc = Calc_LOS_PInOut_cython(Ds, dus, VPoly, VIn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RIn [ 2.30577052] [ 2.30577052]\n",
      "ROut [ 1.26499999] [ 1.26499999]\n",
      "\n",
      "[ 2.21984717  0.62358337  0.13417502]\n",
      "[ 2.21984717  0.62358337  0.13417502]\n",
      "\n",
      "[ 0.94723505  0.8384335   0.13417503]\n",
      "[ 0.94723505  0.8384335   0.13417503]\n",
      "\n",
      "[ 0.74880242  0.66279329  0.        ]\n",
      "[ 0.74880242  0.66279329  0.        ]\n",
      "\n",
      "[ 0.]\n",
      "[ 0.]\n"
     ]
    }
   ],
   "source": [
    "print \"RIn\", np.hypot(SInn[0,:],SInn[1,:]), np.hypot(SInc[0,:],SInc[1,:])\n",
    "print \"ROut\", np.hypot(SOutn[0,:],SOutn[1,:]), np.hypot(SOutc[0,:],SOutc[1,:])\n",
    "\n",
    "for (A,B) in [(SInn,SInc),(SOutn,SOutc),(VPerpn,VPerpc),(indOutn,indOutc)]:\n",
    "    print \"\"\n",
    "    print A.flatten()\n",
    "    print B.flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAJiCAYAAADwuZJ4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdYVNfaBfB16FhQ7ApGoyKoKEhVFOyVYIsKSrBHjFHs\nBltijNFgLBijYouNIihYwdiNDRBQwA4W7CIWiiiIcL4/5mril4IF2DPM+j3PPNd4cGbNvbnCmr3P\nuyVZlkFERERERET/TkN0ACIiIiIiImXH4kRERERERFQIFiciIiIiIqJCsDgREREREREVgsWJiIiI\niIioECxOREREREREhWBxIiIiIiIiKgSLExERERERUSFYnIiIiIiIiAqhJeJFq1SpItetW1fESxMR\nEREREQEA4uLiHsmyXPVdvlZIcapbty5iY2NFvDQREREREREAQJKkm+/6tdyqR0REREREVAgWJyIi\nIiIiokKwOBERERERERWCxYmIiIiIiKgQLE5ERERERESFYHEiIiIiIiIqBIsTERERERFRIViciIiI\niIiICsHiREREREREVAgWJyIiIiIiokKwOBERERERERWCxYmIiIiIiKgQLE5ERERERESFYHEiIiIi\nIiIqBIsTERERERFRIViciIiIiIiICsHiREREREREVAgWJyIiIiIiokKwOBERERERERWCxYmIiIiI\niKgQLE5ERERERESFYHEiIiIiIiIqBIsTERERERFRIbREByCikvPixQvcvXsXDx48wNOnT5Genv63\nR05ODl6+fPnmkZeXh5cvX6KgoADa2trQ1taGlpbWm1/r6OjAwMAAFSpUQMWKFVGhQoU3v65WrRpq\n1qyJ6tWrQ1tbW/TbJyIiIvpgLE5EpUhGRgaSk5PfPFJSUnD37l3cvXsX9+7dw9OnT//1z5YtWxYV\nKlRAmTJloKOj86YUvX5IkoS8vDzk5uYiLy/vzSM3NxeZmZnIyMjAy5cv//G5JUl6U6Jq1aqF2rVr\no0GDBmjQoAFMTExQr1496OvrF9d/LUREREQfjcWJSAVlZGQgMTER8fHxSEhIwOXLl5GcnIyHDx++\n+RpJklCzZk0YGRnBxMQEbdq0gZGREYyMjFCjRg1UqlQJhoaGb1aJimJFKCcnBxkZGW9Wrx4+fIh7\n9+7h/v37b/7z7t27iI6OxuPHj9/6s8bGxjAxMUHTpk1hYWEBCwsLNGnSBHp6eh+di4iIiOhjsTgR\nKbnMzExER0cjKioKZ8+eRXx8PG7cuPHmepUqVdC4cWO4uLigYcOGMDExgYmJCerXr1/iqzh6enrQ\n09ND9erVC/3ap0+f4tq1a7h69SquXr2K5ORkXLlyBWvXrsXz588BAJqamjA1NYWFhQXs7Ozg4OAA\nS0tL6OjoFPdbISIiInqLJMtyib+ojY2NHBsbW+KvS6TsZFlGSkoKTp48iVOnTuHkyZM4d+4cZFmG\nJEkwMTGBpaXlm4eFhQVq1qwJSZJERy8yBQUFuHbtGhISEt484uPjcfv2bQCKcmZjY4OWLVuiZcuW\ncHR0RJUqVQSnJiIiIlUkSVKcLMs27/S1LE5EYj1+/BiHDh3CgQMHsH//fty6dQsAUL58ebRo0QIO\nDg5o1aoV7O3tYWBgIDitOPfu3UNkZCROnTqFyMhIxMXFvbmnqnnz5ujYsSM6duyI1q1bo0yZMoLT\nEhERkSpgcSJSYvn5+Th16hT27t2LAwcOIC4uDrIso0KFCmjfvj06dOiA1q1bw9zcHJqamqLjKq2c\nnBycOXMGR44cwcGDB3Hy5Enk5eVBR0cHrVq1QpcuXdCzZ0+YmZmJjkpERERKisWJSMnk5OTg4MGD\n2LFjB3bt2oW0tDRoamqiRYsW6Ny5Mzp16gRbW1toafG2ww+VnZ2NEydO4MCBAzhw4AASExMBAA0b\nNkTPnj3Rq1cv2Nvbs4wSERHRGyxOREogOzsbu3btQlhYGPbu3Yvs7GyUL18ezs7O6N27N7p06YIK\nFSqIjllq3blzB7t27cLOnTtx5MgR5OXloVq1aujRowcGDBiANm3asEQRERGpORYnIkFevXqFw4cP\nw9/fH2FhYcjOzkaNGjXerHi0a9cOurq6omOqnYyMDOzduxc7d+7Enj178OzZM9SqVQtubm5wd3dH\n8+bNS9WADSIiIno3LE5EJezMmTPYvHkzgoKCkJqaigoVKqBfv35wd3eHk5MTNDQ0REek/3nx4gX2\n7NmDgIAAREREIC8vD6amphg4cCCGDBmCTz75RHREIiIiKiEsTkQlICsrC4GBgVi9ejXOnDkDHR0d\nfPbZZ3B3d0f37t15cKsKePr0KUJDQxEQEIA//vgDkiSha9euGDlyJJydnXnPGRERUSnH4kRUjM6c\nOYNVq1YhMDAQz549Q7NmzeDp6YkBAwbA0NBQdDz6QCkpKVi3bh1+++033Lt3D7Vq1cKwYcMwfPhw\n1K1bV3Q8IiIiKgYsTkRFLC8vD1u3boWvry9iYmKgr68PV1dXeHp6wt7envfHlCKvXr1CREQEVq9e\njb1790KWZfTo0QMTJkyAk5MT/7cmIiIqRd6nOPHGC6L/kJ6ejp9//hn16tWDu7s7MjMz8csvv+De\nvXtYv349WrRowR+kSxktLS306NEDe/bswY0bNzB9+nScOHECbdu2hbW1Nfz9/d8cvEtERETqg8WJ\n6B/cuHED48ePR+3atTF16lQ0bNgQe/bswcWLFzF27FhUrFhRdEQqAZ988gnmzp2L27dvY9WqVcjJ\nyYGHhwfq1q2LefPmIT09XXREIiIiKiEsTkR/kZSUhMGDB8PExATLly9H7969cfbsWRw6dAjOzs6c\njqem9PX1MXLkSJw/fx579+6Fubk5ZsyYgTp16mDWrFl4/Pix6IhERERUzPhTIBGAS5cu4YsvvkCj\nRo2wdetWeHl5ISUlBZs2bYKlpaXoeKQkNDQ00LVrV+zfvx/x8fHo3LkzfvzxR9StWxfffPMNHj58\nKDoiERERFRMWJ1JrFy5cgJubG5o0aYIdO3Zg8uTJSElJweLFi2FkZCQ6HikxCwsLbN26FefOnYOL\niwsWLlyIunXrYsKECSxQREREpRCLE6mlmzdvYvDgwWjatCnCw8Ph7e2NlJQU+Pj4oFq1aqLjkQpp\n0qQJAgMDcenSJfTv3x/Lli1DvXr18N133yEzM1N0PCIiIioiLE6kVh4/foxJkyahYcOGCA4OxpQp\nU5CSkoJ58+ahSpUqouORCmvYsCE2bNiACxcuoFu3bpgzZw7q16+PpUuXIjc3V3Q8IiIi+kgsTqQW\nnj9/jp9++gn169fHkiVL4O7ujuTkZPj4+KBy5cqi41EpYmpqiq1bt+L06dNo1qwZxo8fDzMzM/j7\n+6OgoEB0PCIiIvpALE5UqsmyjODgYJiammLatGlwdHREYmIifvvtN9SuXVt0PCrFbG1tcfDgQezb\ntw+Ghobw8PCAg4MDYmJiREcjIiKiD8DiRKXWuXPn0L59e7i5uaFKlSo4evQodu/eDXNzc9HRSE1I\nkoTOnTsjNjYWGzduxM2bN2FnZ4dhw4YhNTVVdDwiIiJ6DyxOVOo8ffoUY8eOhaWlJRITE7Fy5UrE\nxsaiTZs2oqORmtLQ0MCgQYNw5coVTJkyBf7+/mjYsCEWLVqEly9fio5HRERE74DFiUoNWZaxfv16\nNGzYECtWrICnpyeSkpIwatQoaGpqio5HBAMDAyxYsADnz59H69atMXnyZFhaWuL48eOioxEREVEh\nWJyoVLh69So6duyIYcOGwdTUFHFxcVixYgUHP5BSatiwIcLDw7F79248f/4cTk5O8PT0RHp6uuho\nRERE9C9YnEil5eXlwcfHB02bNkVsbCz8/Pxw7NgxWFpaio5GVKjPPvsMFy5cwKRJk7B27Vo0atQI\n27ZtgyzLoqMRERHR/8PiRCorLi4OdnZ28Pb2Rrdu3XDx4kV4enpCQ4P/WpPqKFu2LBYuXIjTp0+j\nVq1a6NevH3r16oU7d+6IjkZERER/wZ8wSeW8fPkSM2bMgJ2dHVJTUxEaGoqwsDAYGRmJjkb0wayt\nrREdHY1Fixbh4MGDMDc3h7+/P1efiIiIlASLE6mU8+fPw87ODvPmzcOQIUNw8eJF9OnTR3QsoiKh\npaWFiRMnIjExEU2bNoWHhwf69u2LtLQ00dGIiIjUHosTqYT8/HwsXLgQ1tbWuH//Pnbu3Il169ah\nYsWKoqMRFbn69evj6NGjWLBgAfbs2QNzc3Ps2rVLdCwiIiK1xuJESi8lJQXt27fHlClT0L17d5w/\nfx49evQQHYuoWGlqamLKlCmIjY1FrVq10LNnTwwdOhRZWVmioxEREaklFidSaiEhIbCwsMDZs2ex\nfv16hIWFoWrVqqJjEZWYpk2bIjo6GjNmzMCmTZtgbW2Ns2fPio5FRESkdj66OEmSVFuSpCOSJF2U\nJOmCJEnjiiIYqbcXL17gq6++gqurKxo3bozExEQMGTIEkiSJjkZU4nR0dDB37lwcOXIE2dnZaNGi\nBZYtW8bBEURERCWoKFacXgGYJMtyYwAtAHwtSVLjInheUlNXrlxBixYt4Ofnh6lTp+LYsWOoW7eu\n6FhEwjk5OSEhIQGdOnWCl5cX+vTpgydPnoiORUREpBY+ujjJsnxfluUz//t1FoBLADgXmj6Iv78/\nrK2tcffuXYSHh8PHxwfa2tqiYxEpjSpVqmD37t1YtGgRwsPD0bx5c0RGRoqORUREVOoV6T1OkiTV\nBdAcQPQ/XBspSVKsJEmxHK1L/19ubi48PT3h4eEBKysrxMfHo3v37qJjESklSZIwceJEnDx5Elpa\nWmjTpg1WrFjBrXtERETFqMiKkyRJ5QCEAhgvy3Lm/78uy/JqWZZtZFm24c399Ff37t1Du3btsHr1\nanzzzTc4fPgwjI2NRcciUnq2traIjY1Fp06d8PXXX2P48OHIyckRHYuIiKhUKpLiJEmSNhSlKUCW\n5bCieE5SD6dOnYK1tTUSExOxdetW/PTTT9DS0hIdi0hlGBoaYvfu3Zg1axbWr18PR0dH3Lp1S3Qs\nIiKiUqcopupJANYBuCTL8uKPj0TqYtWqVWjbti3Kli2LqKgo9O3bV3QkIpWkoaGBOXPmYPv27bhy\n5Qqsra1x5MgR0bGIiIhKlaJYcWoFwANAe0mS4v/34M0p9K/y8vLg6emJUaNGoUOHDoiJiYG5ubno\nWEQqr1evXjh9+jSqVKmCTp06wc/PT3QkIiKiUuOj90TJsnwCAA/XoXeSnp6Ovn374tChQ/D29sbc\nuXOhqakpOhZRqWFmZobo6GgMGDAAX331FZKSkvDzzz/z/2dEREQfqUin6hH9lxs3bsDBwQHHjh3D\n+vXrMX/+fP4wR1QMDAwMsHPnTnh5eWHJkiXo3bs3nj17JjoWERGRSmNxohIRFRUFe3t73L9/H/v3\n78eQIUNERyIq1bS0tLB06VIsW7YM4eHhcHR0xJ07d0THIiIiUlksTlTstm7dinbt2qF8+fKIiopC\n27ZtRUciUhtjxozBnj17cO3aNdjb2yM+Pl50JCIiIpXE4kTFaunSpejfvz+srKwQFRUFU1NT0ZGI\n1E63bt1w8uRJaGpqwsnJCUePHhUdiYiISOWwOFGxkGUZM2bMwPjx49G7d28cOnQIPPiYSJymTZvi\n1KlTqF27Nrp06YLQ0FDRkYiIiFQKixMVufz8fIwaNQrz5s3DiBEjsHXrVujp6YmORaT2jI2Ncfz4\ncVhbW6Nfv35YtWqV6EhEREQqg8WJilRubi5cXV2xevVqTJ8+HatXr+bkPCIlUqlSJRw8eBDdunXD\nqFGjMGfOHMiyLDoWERGR0mNxoiKTlZWF7t27IzQ0FEuWLMGPP/4ISeIRX0TKpkyZMtixYwcGDRqE\n7777DuPHj2d5IiIiKsRHH4BLBAAZGRno2rUrYmJisGnTJnh4eIiORET/QVtbGxs2bEDlypWxZMkS\n5OTkYOXKldDQ4OdpRERE/4TFiT7a06dP0aVLF8THx2Pr1q3o3bu36EhE9A4kScKiRYugp6eH+fPn\n4+XLl1i7di231xIREf0DFif6KI8fP0anTp1w4cIFhIaGwsXFRXQkInoPkiThxx9/hK6uLmbPno2X\nL19i48aN0NLitwciIqK/4ndG+mBpaWno0KEDkpKSsHPnTnTt2lV0JCL6AJIk4bvvvoOuri6mTZuG\nly9fIjAwENra2qKjERERKQ0WJ/ogqampaN++PW7cuIE9e/agY8eOoiMR0Ufy9vaGrq4uJk6ciPz8\nfAQHB7M8ERER/Q/vAqb39vjxY3Ts2BEpKSmIiIhgaSIqRSZMmIClS5di+/btGDRoEPLz80VHIiIi\nUgpccaL3kpGRgS5duiA5ORnh4eFo27at6EhEVMS8vLyQk5ODb775Bnp6eli3bh2n7RERkdpjcaJ3\nlp2dDWdnZyQmJmL79u3o0KGD6EhEVEymTp2KFy9eYPbs2dDX18fy5ct5LhsREak1Fid6Jy9evECP\nHj0QGRmJ4OBgODs7i45ERMXs22+/xYsXL+Dj4wM9PT0sWrSI5YmIiNQWixMV6uXLl+jXrx+OHDmC\njRs3om/fvqIjEVEJkCQJ8+fPx4sXL7BkyRKUK1cOc+bMER2LiIhICBYn+k8FBQUYOnQowsPD4efn\nBw8PD9GRiKgESZIEX19fZGdn44cffkCNGjUwevRo0bGIiIhKHIsT/aepU6ciMDAQ8+bNg6enp+g4\nRCSAJEnw8/NDWloaxowZg2rVqnHlmYiI1A7HJNG/Wrx4MRYtWoQxY8bA29tbdBwiEkhLSwtbtmyB\ng4MD3N3dceTIEdGRiIiIShSLE/2joKAgTJo0CX379oWvry9vCCci6OvrY9euXTAxMUGvXr2QkJAg\nOhIREVGJYXGivzl48CAGDx6MNm3aYPPmzdDU1BQdiYiURKVKlfD777+jQoUK6Nq1K27cuCE6EhER\nUYlgcaK3JCYmok+fPjAzM8OOHTugp6cnOhIRKRljY2Ps27cPubm5cHZ2Rnp6uuhIRERExY7Fid54\n8OABXFxcYGBggL1796JixYqiIxGRkmrUqBHCwsJw9epV9O/fH3l5eaIjERERFSsWJwKgOOC2V69e\nePToEXbt2gUjIyPRkYhIybVt2xarVq3CgQMH4OXlBVmWRUciIiIqNhxHTpBlGcOGDcPp06cRFhYG\nKysr0ZGISEUMHToUV65cgY+PD0xNTTF+/HjRkYiIiIoFixNhzpw52LJlC3766Sf06tVLdBwiUjHz\n5s1DcnIyJk6ciPr168PFxUV0JCIioiLHrXpqbsuWLZg9ezaGDBmCqVOnio5DRCpIQ0MDmzdvhpWV\nFQYMGIBz586JjkRERFTkWJzU2NmzZzF06FA4Ojpi1apVPKuJiD5YmTJlsGvXLhgYGKB37954+vSp\n6EhERERFisVJTT1+/Bh9+vRBlSpVsG3bNujo6IiOREQqrlatWti2bRtu3boFd3d35Ofni45ERERU\nZFic1FB+fj4GDBiAe/fuITQ0FNWqVRMdiYhKCQcHByxbtgx79+7Fd999JzoOERFRkeFwCDU0c+ZM\nHDhwAGvXroWdnZ3oOERUyowcORKxsbH48ccfYWVlhT59+oiORERE9NG44qRmQkND8dNPP8HT0xPD\nhw8XHYeISiFJkvDrr7/C3t4egwcPxsWLF0VHIiIi+mgsTmrk0qVLGDJkCFq0aIGlS5eKjkNEpZiu\nri5CQ0NRtmxZ9OnTB8+ePRMdiYiI6KOwOKmJ58+fo1+/ftDX18e2bdugq6srOhIRlXJGRkYICgpC\ncnIyvvrqK8iyLDoSERHRB2NxUhPjxo3DxYsX4e/vDyMjI9FxiEhNtGvXDt9++y38/f2xfv160XGI\niIg+GIuTGggMDMTatWsxbdo0dO7cWXQcIlIzM2fORPv27TFmzBicP39edBwiIqIPIonYOmFjYyPH\nxsaW+Ouqo6SkJFhbW8PCwgJHjx6FlhYHKRJRyXvw4AEsLS1RqVIlxMTEoGzZsqIjERERQZKkOFmW\nbd7la7niVIrl5OTA1dUVOjo6CAoKYmkiImFq1KiBgIAAXL58GaNHjxYdh4iI6L2xOJVikydPRnx8\nPDZs2IDatWuLjkNEaq5Dhw6YNWsWNm3ahMDAQNFxiIiI3guLUym1d+9eLF++HOPHj4eLi4voOERE\nAIBZs2bBwcEBo0ePxq1bt0THISIiemcsTqXQo0ePMGzYMJibm2P+/Pmi4xARvaGlpYXNmzcjPz8f\ngwYNQn5+vuhIRERE74TFqZSRZRkjR47EkydP4O/vDz09PdGRiIjeUq9ePfzyyy/4448/sHjxYtFx\niIiI3gmLUymzceNGbN++HXPnzoWFhYXoOERE/2jIkCHo06cPZsyYgYSEBNFxiIiICsVx5KXIjRs3\nYGFhASsrKxw6dAiampqiIxER/atHjx6hWbNmb0aU6+vri45ERERqhuPI1dDr+wUkScLGjRtZmohI\n6VWpUgUbNmzAhQsXMGvWLNFxiIiI/hOLUynx66+/4sSJE1i2bBnq1KkjOg4R0Tvp3LkzPD09sWTJ\nEkRHR4uOQ0RE9K+4Va8UuHbtGpo2bYp27dphz549kCRJdCQioneWmZkJc3NzlCtXDmfOnOFQGyIi\nKjHcqqdGZFnGl19+CW1tbaxatYqliYhUjoGBAdasWYNLly5hzpw5ouMQERH9IxYnFbdmzRocOXIE\nCxcuhLGxseg4REQfpEuXLhg6dCgWLFiAuLg40XGIiIj+hlv1VNjt27fRpEkT2Nra4uDBg1xtIiKV\nlp6ejsaNG6NKlSqIjY2Fjo6O6EhERFTKcaueGpBlGZ6ensjPz8eaNWtYmohI5VWsWBGrVq3CuXPn\nMH/+fNFxiIiI3sLipKK2bNmCvXv3Yt68eahXr57oOERERcLFxQWurq6YN28ekpOTRcchIiJ6g1v1\nVFBGRgbMzMxgbGyMqKgontlERKXK/fv3YWZmBjs7O+zfv58r6kREVGy4Va+UmzlzJlJTU7Fy5UqW\nJiIqdWrWrIl58+bh4MGD2LJli+g4REREAFicVE5sbCxWrFiBr7/+GjY271SOiYhUzqhRo2Bra4sJ\nEyYgPT1ddBwiIiIWJ1WSn5+PUaNGoVq1apg7d67oOERExUZTUxN+fn5IS0vD9OnTRcchIiJicVIl\nfn5+iIuLw+LFi1GhQgXRcYiIipWVlRW8vLzg5+eH6Oho0XGIiEjNcTiEikhNTYWpqSlsbW15szQR\nqY2srCyYmZnByMgIUVFR0NDg531ERFR0OByiFJo5cyays7Px66+/sjQRkdooX748fHx8EBMTg02b\nNomOQ0REaozFSQWcPXsW69atg5eXF0xNTUXHISIqUQMHDkSLFi3g7e2NzMxM0XGIiEhNsTgpOVmW\nMW7cOFSuXBmzZs0SHYeIqMRpaGjgl19+QWpqKubNmyc6DhERqSkWJyW3bds2HD9+HHPnzkXFihVF\nxyEiEsLW1hZDhgzBkiVLcPXqVdFxiIhIDXE4hBJ78eIFzMzMULFiRZw5c4aH3RKRWrt//z4aNmyI\n9u3bY+fOnaLjEBFRKcDhEKXEokWLcOvWLSxdupSliYjUXs2aNTFz5kzs2rULBw4cEB2HiIjUDFec\nlNSDBw/QoEEDdOnSBaGhoaLjEBEphdzcXJiZmcHQ0BCxsbEcT05ERB+FK06lwA8//ICcnBz89NNP\noqMQESkNXV1dzJ07F2fPnkVQUJDoOEREpEa44qSEkpOT0bhxY3z55ZdYsWKF6DhEREqloKAANjY2\nePr0KS5fvgxdXV3RkYiISEVxxUnFzZw5Ezo6Ovj2229FRyEiUjoaGhrw8fFBSkoKVq5cKToOERGp\nCRYnJRMTE4OQkBBMmjQJNWrUEB2HiEgpderUCZ06dcLcuXORkZEhOg4REakBFiclIssyvvnmG1Sp\nUgWTJ08WHYeISKn5+Pjg8ePH8PHxER2FiIjUAIuTEtm/fz+OHDmCWbNmwcDAQHQcIiKl1rx5c7i7\nu8PX1xf3798XHYeIiEo5FiclIcsyZs6ciTp16sDT01N0HCIilTB79my8fPmSq05ERFTsWJyURHh4\nOGJjYzFz5kxOiCIiekcNGjTA4MGD4efnh3v37omOQ0REpRiLkxKQZRmzZ8/Gp59+isGDB4uOQ0Sk\nUmbOnIn8/HzMnz9fdBQiIirFtEQHIGD37t2Ii4vDunXroK2tLToOqQFZlnH37l0kJSXh9u3buHfv\nHu7fv4979+7hyZMnyMzMRFZWFrKyspCTk/PmzwCKUdDlypVDuXLlULZsWRgYGKB69eqoUaMGatas\niZo1a6JevXowMTFB5cqVIUmSyLdKauDTTz/F0KFDsXr1akydOhW1a9cWHYmIiEohHoArmCzLsLa2\nRkZGBi5fvsziREUuPT0dZ86cQVxcHM6cOYPLly8jKSkJz58/f+vrKlSogFq1aqFy5cooX778m4e+\nvv6b8iNJEvLz85GdnY1nz57h2bNnyMjIQGpqKu7fv48XL1689ZyGhoYwMTFBs2bNYGVlBSsrKzRr\n1gz6+vol9v5JPdy8eRMmJiYYPnw4z3YiIqJ39j4H4HLFSbBdu3bh7NmzWL9+PUsTFYnbt2/j6NGj\nOHr0KI4dO4arV6++uVanTh00adIEbdu2hampKUxMTFC3bl3UrFkTZcqU+ajXlWUZmZmZuHv3Lq5d\nu4bk5GQkJycjKSkJYWFhWLt2LQBAU1MTFhYWaNOmDdq0aQNHR0dUqlTpo16bqE6dOhgxYgTWrl0L\nb29v1KlTR3QkIiIqZbjiJJAsy7CyssKzZ89w6dIlaGmxx9L7e/nyJf744w/s3r0bERERuHbtGgDF\nao+TkxPs7e1hbW0NKysrVKlSRUhGWZZx+/btNytfJ06cQGRkJHJzcwEA1tbW+Oyzz/DZZ5/BysoK\nGhq8/ZLe3507d1C/fn0MGzaMq05ERPRO3mfFicVJoIiICDg7O2P9+vUYMmSI6DikQl68eIHw8HCE\nhITg999/R1ZWFvT19dGhQwd07NgRbdu2RdOmTZW6gOTm5uL06dM4evQo9u3bh8jISBQUFKBGjRro\n2bMnBgz7No9fAAAgAElEQVQYAEdHR6V+D6R8Ro4ciU2bNiElJQU1atQQHYeIiJQci5OKcHJyQkpK\nCq5evQodHR3RcUjJ5efn4/DhwwgMDERYWBgyMzNRvXp19OzZEy4uLmjfvv1Hb7cT6dGjR/j999+x\ne/duhIeHIzs7G0ZGRnB1dYWHhwcsLS1FRyQVcPXqVZiammLy5Mk824mIiArF4qQCTp48idatW2Pp\n0qXw8vISHYeUWGpqKn777TesXr0aKSkpMDAwwOeffw53d3e0bdsWmpqaoiMWuezsbOzevRtBQUHY\nu3cv8vLyYGtrC09PT7i5uaFs2bKiI5ISc3NzQ0REBG7duoWKFSuKjkNERErsfYoT98AI8tNPP6Fy\n5coYPny46CikpKKiouDq6gpjY2NMnz4d9erVw5YtW94UqQ4dOpTK0gQAZcuWhZubG3bu3IkHDx5g\n6dKlyM7OxogRI1CrVi2MGzcON27cEB2TlJS3tzeysrKwfPly0VGIiKgUYXES4Ny5c9izZw+8vLz4\nyTm9paCgAHv27IGTkxNatmyJAwcOwMvLC5cvX8ahQ4fg6uoKPT090TFLVKVKleDl5YXz58/j+PHj\ncHFxwcqVK9GgQQO4ublB3Vev6e8sLS3RrVs3+Pr6/m3sPhER0YdicRJgwYIFKFu2LMaMGSM6CimJ\ngoIChISEoFmzZnBxccHNmzfh6+uLW7duYdGiRTA1NRUdUThJktC6dWv4+/vjxo0bmDRpEvbu3Qtb\nW1t07twZUVFRoiOSEpk2bRoePXr0Zgw+ERHRx2JxKmEpKSkICgqCp6cnz64hyLKM3bt3w8rKCq6u\nrpBlGf7+/rh69SrGjRuHcuXKiY6olIyMjLBgwQLcvn0bCxYsQHx8PFq2bAlnZ2fExcWJjkdKwNHR\nEa1atcLixYvx6tUr0XGIiKgUYHEqYb/88gskScKECRNERyHBIiMj4eDggB49eiA7OxsBAQFITEyE\nu7s7D0N+RwYGBpgyZQquX7+O+fPnIzIyEjY2NnB1dUVKSoroeCTYpEmTcPPmTezYsUN0FCIiKgVY\nnEpQVlYW1q1bh379+sHY2Fh0HBLk9u3bGDhwIBwcHHDr1i2sWbMGFy9exMCBA0vtsIfiVq5cOXh7\neyMlJQXffvstdu/eDTMzM0yfPh1ZWVmi45EgPXr0wKeffgpfX1/RUYiIqBRgcSpBGzZsQGZmJsaP\nHy86CgmQm5uLH374Aaampti+fTtmzpyJK1euYMSIEVxhKiIGBgb4/vvvkZSUhH79+mH+/PkwMTFB\nYGAgRBy9QGJpamrCy8sLJ0+eRExMjOg4RESk4niOUwkpKChAw4YNUa1aNZw6dUp0HCphx48fx8iR\nI3H58mX069cPP//8M+rUqSM6VqkXHR2NsWPHIiYmBp07d8bKlStRr1490bGoBGVmZsLY2BguLi4I\nCAgQHYeIiJQMz3FSQuHh4bh27RrGjRsnOgqVoPT0dHh6esLJyQk5OTnYu3cvQkJCWJpKiL29PSIj\nI7Fs2TJERkbC3NwcPj4+HBagRgwMDDBixAiEhITg7t27ouMQEZEKY3EqIb6+vjA2NkafPn1ER6ES\ncuTIETRr1gxr167FpEmTcP78eXTt2lV0LLWjqamJMWPG4OLFi+jatSu8vb3h5OSEa9euiY5GJWTs\n2LEoKCjggbhERPRRWJxKwLlz53D48GGMGTOG97KogdzcXEyePBkdOnSAvr4+oqKisHDhQh52LJix\nsTHCwsIQGBiIS5cuwcLCAmvWrOG9T2rg008/Ra9evbBq1Sq8ePFCdBwiIlJRLE4lYPny5dDT08OX\nX34pOgoVs3PnzsHW1haLFi3CqFGjcObMGdja2oqORX8xYMAAJCYmwt7eHiNHjkTPnj2RlpYmOhYV\nszFjxuDJkyfYunWr6ChERKSiWJyKWVZWFgICAuDm5sYDb0u5DRs2wM7ODg8fPkR4eDhWrFjBVSYl\nVbt2bRw4cAC+vr7Yv38/rKysEBUVJToWFaO2bdvC1NQUfn5+oqMQEZGKYnEqZgEBAXj27BlGjRol\nOgoVk5ycHHh6emLo0KFo2bIlEhMT0b17d9GxqBAaGhoYN24cTp06BW1tbTg5OWHZsmXculdKSZKE\nUaNGITIyEgkJCaLjEBGRCmJxKkayLMPPzw+Wlpaws7MTHYeKwc2bN+Ho6IjVq1fD29sb+/fvR7Vq\n1UTHovdgZWWFuLg4dO3aFV5eXhg4cCCePXsmOhYVg8GDB0NPTw8rV64UHYWIiFQQi1Mxio6ORkJC\nAkaNGgVJkkTHoSJ24sQJWFtbIykpCdu3b8f8+fOhpaUlOhZ9AENDQ+zYsQPz589HSEgIWrdujdu3\nb4uORUXM0NAQbm5uCAgIQFZWlug4RESkYlicipGfnx/KlSuHgQMHio5CRSwgIAAdOnRA5cqVERsb\ni169eomORB9JQ0MD3t7e2Lt3L27cuAF7e3uo20Hd6uCrr77Cs2fP4O/vLzoKERGpGBanYvL06VME\nBwfjiy++QPny5UXHoSIiyzK+//57fPHFF3BwcEBkZCRMTExEx6Ii1LlzZ5w6dQq6urpwcnJCWFiY\n6EhUhGxtbdG8eXP4+fnxfjYiInovLE7FZPPmzW+GBlDpkJeXh8GDB2P27NkYPHgw9u3bx0mJpVST\nJk0QHR0NCwsLfP7551iyZInoSFREJEnCyJEjkZiYiDNnzoiOQ0REKoTFqZhs2LAB1tbWsLS0FB2F\nisCLFy/Qu3dvbN68GT/88APWr18PHR0d0bGoGFWrVg2HDx9G3759MXHiRMycOZMrFKWEq6srdHV1\nsWHDBtFRiIhIhbA4FYOEhAScPXsWQ4YMER2FikBmZia6deuGiIgI+Pn5YebMmRz2oSb09fWxZcsW\nDB8+HD/++CPGjh2LgoIC0bHoIxkaGqJ3794IDAxEbm6u6DhERKQiiqQ4SZL0myRJDyVJOl8Uz6fq\nNm7cCG1tbQwYMEB0FPpIjx8/RseOHXHixAkEBARw66Ua0tTUxJo1azB58mQsX74cgwcPRl5enuhY\n9JGGDh2KJ0+eYNeuXaKjEBGRiiiqFacNALoW0XOptLy8PAQEBKBHjx6oXLmy6Dj0EdLS0tCmTRsk\nJiZi+/btLMJqTJIkLFiwAD/++CP8/f0xYMAAvHr1SnQs+ggdOnSAsbEx1q9fLzoKERGpiCIpTrIs\nHwPwpCieS9X9/vvvePjwIbfpqbgnT56gY8eOuH79OiIiIuDi4iI6EgkmSRKmT5+OxYsXIzQ0FB4e\nHsjPzxcdiz6QpqYmBg0ahH379uHu3bui4xARkQoosXucJEkaKUlSrCRJsWlpaSX1siVuw4YNqF69\nOrp06SI6Cn2gjIwMdO7cGVeuXMHOnTvRvn170ZFIiUyYMAE+Pj7YsmULhg4dyvKkwoYMGYKCggJs\n3rxZdBQiIlIBJVacZFleLcuyjSzLNlWrVi2ply1Rjx49wu7du/HFF19AW1tbdBz6AFlZWejatSsS\nExMRGhqKTp06iY5ESmjq1Kn44YcfsHnzZnh6enJghIoyMTGBg4MDD8MlIqJ3wql6RSg0NBR5eXnw\n8PAQHYU+QG5uLnr06IGYmBgEBwfD2dlZdCRSYjNnzsSsWbOwbt06TJkyRXQc+kDu7u64cOECzp07\nJzoKEREpORanIhQUFIRGjRqhWbNmoqPQeyooKMCgQYNw9OhRbNy4Eb179xYdiVTA999/j7Fjx2Lx\n4sU8JFdF9evXD5qamggKChIdhYiIlFxRjSMPAhAJwFSSpDuSJA0viudVJXfv3sWxY8fg5ubGM35U\n0JQpUxASEoIFCxbA3d1ddBxSEZIkYcmSJfj8888xceJEBAcHi45E76lq1aro2LEjgoKCeMAxERH9\np6KaqjdAluWasixry7JsLMvyuqJ4XlUSEhICWZbh5uYmOgq9J19fXyxevBhjx47F5MmTRcchFaOp\nqQl/f384Ojpi0KBBOHLkiOhI9J4GDBiAlJQUREVFiY5CRERKjFv1isiWLVtgZWWFhg0bio5C7yEs\nLAwTJ05Enz59sGTJEq4W0gfR09PDzp070aBBA/Tu3RtXrlwRHYneQ+/evaGrq8vtekRE9J9YnIrA\ntWvXcPr0aR6QqmISExPh4eEBe3t7+Pv7Q1NTU3QkUmGGhoaIiIiAjo4OevTogfT0dNGR6B0ZGBjg\ns88+Q0hICA82JiKif8XiVARe39fQv39/wUnoXT169Ag9e/ZExYoVERYWBn19fdGRqBSoU6cOQkND\ncePGDQwYMIBnPKmQAQMGIDU1FUePHhUdhYiIlBSLUxEICQlBq1at8Mknn4iOQu8gLy8P/fv3x/37\n97F9+3bUrFlTdCQqRRwdHfHrr7/i999/h7e3t+g49I66d++OMmXKICwsTHQUIiJSUixOH+n69etI\nSEjA559/LjoKvaPJkyfjyJEjWL16Nezs7ETHoVJo5MiRGD16NBYuXIiAgADRcegd6Ovro1u3btix\nYwcPNCYion/E4vSRtm/fDgA890dFhISE4JdffsGECRMwaNAg0XFIGRXRPS6+vr5wdHSEp6cnLl++\nXCTPScWrT58+uH//PqKjo0VHISIiJcTi9JG2b98OS0tL1K1bV3QUKsS1a9cwYsQItGzZEj4+PqLj\nkLL69lugdm2gf39g8WLg1CkgJ+e9n0ZbWxtBQUHQ19dHv3798Pz582IIS0XJ2dkZ2tra3K5HRET/\niMXpI6SmpuLUqVNcbVIBubm5cHV1hZaWFoKCgqCtrS06EikrGxugdWsgJgaYNAlo1QowMADs7AAv\nLyAwELh+HXiHw1KNjIywefNmnD9/HuPGjSuB8PQxKlSogA4dOiAsLIyH4RIR0d+wOH2EnTt3QpZl\nFicV8M033yAuLg7r169HnTp1RMchZdanDxAUBNy4Ady/D+zYoShQZcsC69YB7u5A/fpA9epAjx7A\nvHnA4cNAVtY/Pl3Xrl0xbdo0rF27lvc7qYA+ffrg+vXrSExMFB2FiIiUjCTiUzUbGxs5Nja2xF+3\nqHXr1g3JyclITk7mwalKbPfu3ejRowfGjRsHX19f0XFIlb16BVy4AERF/fl4ff+ShgZgbg60aPHn\nw9QU0NDAq1ev0K5dO8THxyMxMRGffvqp2PdB/+rhw4eoUaMGZs2ahe+//150HCIiKmaSJMXJsmzz\nTl/L4vRhMjIyULVqVYwbNw4///yz6Dj0Lx49egRzc3NUr14dp0+fhq6uruhIVNo8eQKcPv1nkYqO\nBl4ffluhAmBvD7RogdRPP4Xd2LH41Noahw8fhoYGF/yVlZOTEzIyMpCQkCA6ChERFbP3KU5axR2m\ntNq/fz/y8vLQq1cv0VHoP3z99dd48uQJ9u/fz9JExaNSJaBrV8UDAAoKgKSkt1el5s5F9YIC3ARw\n5Y8/cNneHo2HDQNatlSsUmnxr2Jl4uzsDG9vb9y5cwfGxsai4xARkZLgR54fKCIiAoaGhmjRooXo\nKPQvgoODERISgu+//x7NmjUTHYfUhYYGYGYGDBkC+PkB8fFARgZw5AjkefPwtHp1VI6NBUaPBpo3\nV6xKtW0LeHsr7qd68ED0O1B7zs7OABR/zxMREb3GrXofoKCgALVq1UK7du0QFBQkOg79g/v378Pc\n3BwmJiY4ceIEtPiJPimJBw8ewLxJEzjUqoWwqVOhFRurWJU6exbIy1N8UZ06b98r1bw5wBXTEiPL\nMurWrYvmzZtjx44douMQEVEx4la9YhYfH4/U1FR0795ddBT6F19//TWeP3+OjRs3sjSRUqlRowZW\n+vmhf//+8E1NxeSlSxUXcnIU5en19r7ISCA4WHFNR0dRnlq0UGzva9EC+OQTgENpioUkSXB2dsam\nTZuQm5vLbb5ERASAW/U+SEREBCRJQpcuXURHoX+wa9cubN++HbNnz4apqanoOER/07dvX7i4uOC7\n775DSkqK4jf19BSlaMIERWG6eRO4excICwPGj1eUp9WrATc3oG5doFYtoHdvwMcH+OMPIDtb5Fsq\ndbp3747s7GwcO3ZMdBQiIlIS3Kr3ARwcHJCfn4/o6GjRUej/efbsGRo3bowKFSrgzJkzPOiWlNat\nW7fQuHFjtGnTBnv27Hm3Iw3y8oBz594ePJGcrLimqQk0bfr2Fr+GDbkq9YGeP3+OypUrw9PTk8cY\nEBGVYu+zVY8rTu/p0aNHiIqK4jY9JTV79mzcvn0bq1atYmkipfbJJ5/ghx9+QEREBLZt2/Zuf0hb\nG7CyUgyW2LRJMb0vLQ0IDwemTweqVgUCAxWDKczMgMqVgW7dgDlzgP37/xyTToUqU6YM2rVrh/Dw\ncNFRiIhISXDF6T0FBgbC3d0d0dHRsLOzEx2H/iI+Ph42NjYYPnw4Vq1aJToOUaFevXoFe3t73Lt3\nD5cvX0aFChU+/kkLChSH8kZG/rkqdeEC8Prv+kaN3l6VatJEsVpFf7Ns2TJ4eXnh+vXrPLSYiKiU\n4gG4xWjYsGHYsWMH0tLSoMkfNpSGLMtwdHREUlISrly5AkNDQ9GRiN5JbGws7OzsMHnyZCxYsKB4\nXiQzE4iJeXuL36NHimvlygG2tm+XqWrViieHirl48SKaNGmCNWvWYMSIEaLjEBFRMWBxKiavR9Ta\n2NggNDRUdBz6i5CQELi6uvIHHFJJQ4cORUBAAC5evIgGDRoU/wvKMnD9+ttFKj4eePVKcb1evbeL\nlIWFYjiFmpFlGUZGRnBycsKWLVtExyEiomLA4lRMrl69ChMTEyxfvhyjR48WHYf+JycnB2ZmZqhY\nsSLi4uK4Ekgq5/79+zAxMUGnTp2wfft2MSGePwfOnHl7HPq9e4prurqAtfXbZcrYWC0GT3h4eGDf\nvn148OABNDR4WzARUWnD4RDF5NChQwCADh06CE5Cf7VkyRLcvHkTS5YsYWkilVSzZk1Mnz4dO3bs\nwOHDh8WEKFMGaN0amDwZ2LZNMQr99m1g61ZgzBhFSVq+HOjfX3GGlLEx8PnnwM8/A8ePK4pXKdSx\nY0ekpaXh3LlzoqMQEZFgXHF6D/3798epU6dw+/btdxsdTMXuwYMHMDExQceOHcV9Uk9UBF6vnL4e\npa+UHwK8fAkkJr69xe/aNcU1LS3Flr6/rkrVr6/yq1J37txB7dq1sWjRIkycOFF0HCIiKmLcqlcM\nCgoKUK1aNTg7O2Pjxo2i49D/fPXVV1i3bl3J3RtCVIxe36u3adMmeHh4iI7zbh4+BKKj/yxSp08D\nz54prlWu/HaRsrMDDAzE5v0AZmZmqFevHiIiIkRHISKiIsbiVAzi4+PRvHlzbNy4EYMGDRIdhwBc\nv34dpqam8PT0xK+//io6DtFHKygogI2NDTIyMnD58mXVPIssPx+4ePHtVamLFxXXJAlo3PjPItWy\npWI8upLfOzRmzBisX78eT58+hY4aDskgIirNeI9TMXh93wHvb1Iec+bMgZaWFqZPny46ClGR0NDQ\nwNy5c3H9+nX89ttvouN8GE1NoGlT4MsvgXXrFGdIPX2qOID3++8V90eFhSmum5sDhoZAp07ArFmK\ng3xfj0lXIm3btsXz589x5swZ0VGIiEggrji9oz59+iAxMRFXr14VHYUAXLp0Cebm5pgwYQIWLlwo\nOg5RkZFlGa1bt0ZKSgquXr0KfX190ZGKniwDyclvr0olJipWqwCgQYO3t/g1awYIXH178OABatas\niZ9//hmTJ08WloOIiIoet+oVMVmWUb16dXTv3h0bNmwQHYcAuLq6IiIiAtevX0fVqlVFxyEqUn/8\n8Qfatm2rXgMJsrOBuLi3x6E/eKC4pqcH2Ngotva9LlO1apVoPBMTEzRu3Bg7d+4s0dclIqLi9T7F\nSau4w5QGSUlJSEtLQ+vWrUVHIQDnzp1DSEgIZs6cydJEpVKbNm3QqVMn+Pj44Kuvviqdq07/X9my\ngJOT4gEoVqVu3/6zREVFAUuXKsafA0Dt2m+vSllZKQpWMXF0dMTOnTtRUFDA85yIiNQU//Z/BydO\nnAAAFicl4ePjg3LlymHChAmioxAVmxkzZuDhw4eqe6/Tx5Ikxf1Q/fsDS5YoylNmpqJA+foCrVoB\nMTHApEmKXxsYKKb2eXkBgYHA9euK8lVEHB0d8eTJE1y+fLnInpOIiFQLt+q9g6FDh2L37t1IS0vj\n+U2C3bhxAyYmJhg/fjzvbaJSTZZltGrVCvfu3UNycrJqTtgrCQ8e/H0c+uvDeKtVe3tVysYGKF/+\ng14mOTkZDRs2hJ+fHzw9PYvwDRARkUicqlfETpw4gdatW7M0KYGFCxdCQ0ODq01U6kmShGnTpuHm\nzZvYsmWL6DjKq0YNoGdPYP584MgRICMDiI8HVq4EunUDrlwBpk8H2rcHKlZUHNLr6QmsXw9cugQU\nFLzTyzRo0ADVq1fH8ePHi/kNERGRsuKKUyE4TUl5pKamom7dunB3d8fatWtFxyEqdgUFBbCwsEBB\nQQHOnTvHe2s+1JMnipWo16tS0dFAerriWoUKgL39n6tS9vZApUr/+DT9+vVDTEwMUlJSSi47EREV\nKw6HKEKRkZEAgFatWglOQr/88gtyc3MxdepU0VGISoSGhga8vb3xxRdfIDw8HC4uLqIjqaZKlYCu\nXRUPQLHKlJT09jj0uXP/XH0yNX17i5+5OaClhZYtW2Lbtm1ITU1F9erVxb0fIiISgitOhZg2bRoW\nLlyIrKws6BXjxCb6by9evICxsTHatm2L0NBQ0XGISsyrV69Qt25dNGrUCAcOHBAdp/TKygJiY98u\nUw8fKq6VKQPY2uK2sTHGBgTg602b0MnDQ2xeIiIqElxxKkKnT5+GhYUFS5NgQUFBePLkCby8vERH\nISpRWlpaGD16NGbMmIGLFy+icePGoiOVTuXLA+3aKR6AYiJfSspbRco4JAQ7AGDQIGDWrD9XpFq2\nBCwtAV1dgW+AiIiKG1ec/kNBQQEMDQ0xcOBArFy5UnQctSXLMqysrPDq1SskJiZySAepnbS0NNSu\nXRvDhg3DihUrRMdRXzk5GNS0KRw0NTHKwkIxIv32bcU1HR3FWVJ/3eL3ySeKsepERKS0OFWviCQn\nJyMzMxO2traio6i1U6dOIT4+HmPHjmVpIrVUtWpVDBgwABs3bkT666EGVPL09KDXrh2mpaZC3rIF\nuHULuHMHCA0Fxo0DtLWBVasANzegbl2gVi2gd2/Axwf44w8gO1v0OyAioo/A4vQfTp8+DQCws7MT\nnES9LVu2DBUrVoS7u7voKETCjB07Fs+fP8f69etFR1FrdnZ2SE9Px9WrVxW/YWQE9OkDLFgAHDum\nGIceFwcsXw506gRcuAB4ewNt2yom+DVvDnz1FbBpk2JAhYBdH0RE9GFYnP5DTEwMypYti0aNGomO\norZSU1MRGhqKoUOHomzZsqLjEAljZWUFBwcHrFq1CiK2WJPC6w/SXn+w9jfa2oote6NH/1mO0tKA\n8HDFeVJVqgABAcDgwYrpfZUrA927A3PmAPv3/zkmnYiIlA6HQ/yHmJgYWFlZQVNTU3QUtbV582a8\nevUKI0eOFB2FSLgRI0Zg2LBhiIyMhIODg+g4aqlx48YoU6YMYmJi3n0VvEoVRTnq3l3xz/n5wOXL\nb0/w+/33P1efGjV6+16pJk0Afh8iIhKOwyH+xatXr1C+fHmMHj0aixYtEh1HLcmyjCZNmsDQ0BAn\nT54UHYdIuGfPnqFGjRpwc3PjIdACtWzZErq6ujh69GjRPWlmJhAT83aZevRIca1cOcDWVjG97/Uh\nvdWqFd1rExGpMY4jLwJJSUnIycmBpaWl6Chq6/Tp07h06RLWrFkjOgqRUihXrhxcXV0RHBwMX19f\nlCtXTnQktWRhYYHg4GDIslx0A2sMDIAOHRQPQLH6dP26YnLf6yK1YAHw6pXier16b69KWVgoJvsR\nEVGx4T1O/yIhIQGA4hskifHbb7+hTJky6N+/v+goREpj2LBhePbsGbZu3So6itqytLREeno6bt26\nVXwvIklA/frAF18Av/6qOJw3IwM4fhz4+WfFkImjRwEvL8DOTlG8WrUCJk0Ctm79c0w6EREVGa44\n/YvExERoa2vDzMxMdBS19Pz5c2zZsgV9+/aFgYGB6DhESsPBwQGmpqb47bffMHToUNFx1NLrD9QS\nEhJQp06dknvhMmWA1q0Vj9fu3Hl7e9/y5cDixYprRkZvr0pZWSmeg4iIPgiL079ISEhAo0aNoMOt\nD0Ls3r0bmZmZGDJkiOgoREpFkiQMGjQIM2bMwK1bt/DJJ5+IjqR2mjZtCkmSEB8fjx49eogNY2wM\n9O2reADAy5dAQsLbZSo0VHFNS0uxpe+vZap+fR7SS0T0jrhV718kJCRwm55AwcHBqFmzJpycnERH\nIVI6rq6uAICQkBDBSdRTuXLl0KBBgzdbupWKjo5ikMTYsYqx59euAampwK5dwNSpirOkNm4EPDwA\nExOgalXgs8+AuXOBgwcVQyqIiOgfccXpHzx69Aj37t1jcRIkMzMTERERGDlyJEfBE/2D+vXrw8bG\nBsHBwZg8ebLoOGrJ0tISZ86cER3j3VSrBri4KB6AYhz6xYtvr0qFhyuuSZJi/PlfV6UaNQI0+Dkr\nERGL0z9ITEwEwMEQouzatQu5ublvPlUnor9zc3PD5MmTcfXqVTRo0EB0HLVjYWGBrVu3IisrC+XL\nlxcd5/1oagJNmyoeX36p+L30dOD06be3970eeW9goBhA8bpI2dsrzqYiIlIz/AjpH5w7dw6AYh87\nlbzg4GAYGxujZcuWoqMQKa3X0yaDg4MFJ1FPjRs3BgBcvnxZcJIiUrEi0Lkz8O23QEQE8PgxcOWK\nYlufu7vin+fPV2zrq1pVsc3Pw0MxjCIuDsjLE/0OiIiKHVec/sGlS5dQqVIlVOMBgyUuPT0d+/bt\nw9ixY6HBrSFE/6p27dpo3bo1QkJCMGPGDNFx1E6jRo0AKL5f2NraCk5TDCQJ+D/27jwsqvJ/H/g9\nwCGFEZwAACAASURBVLAKLiAgi6KoLAKCAm654xahpqWpaZqlVi5l+dG2b5n97JNZuZaWuWUuuC+I\npma5YYKI5gIqqCgugKggiAzM/P44joIfzY05z8yc+3Vd5+pyTulthcM97+d5TsOG0jVokPRaYaFU\nkvRTqe3bgSVLpHt2dkB4eMUlfh4e4vITERkAi9MDpKamIiAgoPIebEiPLT4+HhqNBi/pT4giood6\n8cUX8f777+PcuXPyHotN8PX1hZWVFU6cOCE6inwcHIA2baQLkB7Sm5lZca/U9OnSc6YAwNv7f49D\nt7UVl5+I6BnxI/0HSE1N5fObBNm4cSNq1qyJyMhI0VGIjF7Mnc3+GzduFJxEedRqNRo0aKCs4nQ/\nlQqoUwfo2xf4/nsgIUE6lW//fmDaNOmBvImJ0kN5W7W6t1dq9Ghg2TLgzBmpfBERmQgWp/tcu3YN\nV65cYXESQKPRID4+HtHR0TxNj+gxNGjQAP7+/tiwYYPoKIoUEBCg7OL0IDY20uERY8bcK0eXLgHr\n1kkFyt4e+OUXoH9/oF49wN0d6NFD2j+1cydQUCD6d0BE9FBcqncf/UZfFif57d27F9evX7/7KToR\nPVpMTAymTZuG/Px8ODk5iY6jKAEBAVi/fj1KSkr4sPR/oy9HPXpIPy4tBY4erbjET1/+LSyAoKCK\nS/z8/HgcOhEZBf5JdB8WJ3E2btwIa2trdOrUSXQUIpMRExMDjUaDrVu3io6iOAEBASgrK8OpU6dE\nRzEtVlZAaCgwYgSwcCGQmiqd2hcfD3z6KVCrFhAbC7z+OhAYCDg7A127Ap9/DmzZAuTlif4dEJFC\nceJ0nxMnTsDa2hp169YVHUVxNm3ahHbt2pneM1GIBGrRogVq1KiBuLg4vPzyy6LjKIr+ZL3U1FQ0\natRIcBoTV6OGVI66dpV+rNUCJ09K06iEBOmvkyZJrwPSFKr8VCooSCpkREQGxD9l7pOWloYGDRpw\nj43MMjMzcfLkSbz11luioxCZFCsrK3Ts2BE7duyATqfjaaAy0j94OD09XXASM2RhAfj7S9fgwdJr\nBQVAUtK95X3x8dJzpgBp71RERMUy5e4uLD4RmScWp/tkZGTcfTMk+ezYsQMA0LFjR8FJiExPVFQU\nVq5ciZMnT8LPz090HMVwcnKCi4sLi5NcHB2B9u2lC5BO5Dt7tuJeqe++u/cwXh+fikUqNFQ6vIKI\n6CmxOJWj0+mQkZGBqKgo0VEUZ8eOHXB1dUVQUJDoKEQmR/9n1vbt21mcZFavXj1kZGSIjqFMKhVQ\nt6509esnvVZcDBw6dG953969wPLl0j1ra+lZUuXLVO3a0s9DRPQYWJzKyc7ORlFREerVqyc6iqLo\ndDrs2LEDHTp04DIjoqdQr149+Pj4YPv27XjnnXdEx1EUX19f7N+/X3QM0rO1BVq0kC69rCzg77/v\nTaXmzpWeMwVIy/nKF6nwcOlBv0RED8DiVM6ZM2cAgMVJZqmpqbh8+TKX6RE9A/1yvbKyMu7RlFG9\nevUQGxsLjUYDtVotOg49iKcn0KuXdAHSUr5//qm4xG/dOumepSUQElKxTDVowKkUEQHgceQV6Jdb\nsDjJ648//gDA/U1Ez6Jjx464ceMGDh06JDqKovj6+qKsrAyZmZmio9DjUqulJXtvvw0sXiyd3peT\nA2zaBHz4oXT8+ZIlwGuvSaf3ubgAzz8PfPEF8PvvwPXron8HRCQIJ07l6IuTj4+P2CAKs2fPHnh5\nefEIeKJn8NxzzwEAEhISEB4eLjiNcug/aMvIyICvr6/gNPTUXFyA6GjpAoCyMun5UuWnUlu2SAdS\nAEBAwL2JVIsW0vOmOOklMnssTuVkZGTAw8MDdnZ2oqMoyr59+9CyZUvRMYhMmpeXF7y9vbF3716M\nGjVKdBzF0Jel9PR0PrzbnFhaAo0aSdfQodJr+flAYuK9IrVxI7BggXSvShUgMvJemWrWDHB1FZef\niAyCxamcM2fOcOohs6ysLGRmZuK9994THYXI5LVs2RL79u0THUNRatWqBUtLS5w/f150FDI0Jyeg\nY0fpAqTpU3p6xanUlClAaal0v169inulGjeWTvYjIpPF4lTO+fPnERERITqGoiQkJAAAJ05ElaBl\ny5ZYsWIFzp8/D29vb9FxFMHS0hIeHh64cOGC6CgkN5UKqF9ful59VXqtqAhITr5XpP78E1i6VLpn\nYwM0bXpveV/z5oCXl7D4RPTkWJzu0Ol0yMrKQs+ePUVHUZSEhATY2toiNDRUdBQik6f/ACIhIYHF\nSUbe3t4sTiSxtweee0669C5cqDiVmj1belAvIJ34V34q1bQpwO0CREaLxemOvLw8FBcXw4uf/shK\nv5HdmssXiJ5Z48aNYWtri/3796NPnz6i4yiGl5cXUlJSRMcgY+XlBbz0knQBQEkJcPhwxTK1erV0\nz8pKWtJXvkz5+vI4dCIjweJ0R1ZWFgDA09NTcBLlKC0txaFDhzBixAjRUYjMglqtRkhICI8kl5mX\nlxc2bdoEnU7Hh3jTo1lbAxER0qU/yCU7u+JDehctkiZTgHQ8evkT/CIipP1WRCQ7Fqc79MssOHGS\nz6lTp1BcXIywsDDRUYjMRlhYGFasWMFv4mXk5eWFoqIiXLt2DTVq1BAdh0yRqysQEyNdgHQc+vHj\nFadScXHSPZVKOu2v/FQqIACw4KM5iQyNxekOTpzkp1/awv1NRJUnLCwMc+fOxblz5/hMOpnoP3C7\ncOECixNVDktLIDhYut58U3rt+nXgwIGKy/vmzZPuOTn973HoLi7i8hOZKRanOy5cuACVSoVatWqJ\njqIYKSkpsLa2hr+/v+goRGZD/0HEoUOHWJxkoi9O58+fR0hIiOA0ZLaqVQM6d5YuQDoO/dSpilOp\nr76SplWAdNpf+RP8goMBtVpcfiIzwOJ0R1ZWFlxdXaHmHyqySUlJQaNGjXgwBFElCg4OhoWFBQ4d\nOoQXX3xRdBxF0H/gduXKFcFJSFFUKqBhQ+kaNEh6rbAQOHhQKlEJCcD27cCSJdI9OzsgPLziEj8P\nD3H5iUwQi9MdV65cgbu7u+gYipKSkoLo6GjRMYjMir29Pfz8/HD48GHRURSjZs2aAIDs7GzBSUjx\nHByANm2kC5CmUpmZFadS06cD33wj3ff2rlikmjQBbG3F5ScycixOd+Tk5Nx98yPDy83NRXZ2NoKC\ngkRHITI7gYGB+Oeff0THUAwHBwc4ODiwOJHxUamAOnWkq29f6bXbt4GUlIplauVK6Z5aDYSFVSxT\nPj48Dp3oDhanO3JyclCvXj3RMRQjLS0NAODn5yc4CZH58ff3x7p161BSUsKlsDJxdXVlcSLTYGMj\nHR7RrBkwZoz02uXL0nHoCQlSkZo3D5gxQ7rn6lqxSEVEAFWqiMtPJBCL0x05OTlwdXUVHUMxWJyI\nDMfPzw9lZWXIyMjg4SsycXV1RU5OjugYRE/H3R3o0UO6AKC0FDh6tOJUasMG6Z6FBRAUVPHZUg0b\n8jh0UgQWJwC3b99GQUEBl+rJKC0tDWq1mqd+ERmAviylpqayOMmkZs2ad58HSGTyrKyA0FDp0j+k\nPi+v4nHoK1YAP/0k3atWTZpg6ctUZCTAo/nJDLE4AXc/JWRxkk9aWhrq168PKyv+L0hU2fST3NTU\nVMFJlMPV1RXJycmiYxAZTo0aQNeu0gUAWi1w8uS95X379wOTJkmvA4CfX8UlfkFBUiEjMmH8Pxgs\nTiKkpaXxk3AiA3FyckKtWrXuLoklw9PvcdLpdFBxIz0pgYUF4O8vXUOGSK8VFABJSfeK1ObNwKJF\n0j17e2l/lH55X7Nm0hJBIhPC4gQWJ7lptVpkZGQgJiZGdBQis1WvXj2cPXtWdAzFcHFxQWlpKfLz\n81G1alXRcYjEcHQE2reXLkA6Dv3s2Yp7pb77DtBopPs+PhWnUqGh0uEVREaKxQlAXl4eAKAG1+PK\nIjs7GyUlJahTp47oKERmq06dOkhISBAdQzGqVasGALhx4waLE5GeSgXUrStd/fpJr926BRw6dK9I\n7d0LLF8u3bO2lp4lVb5M1a7N49DJaLA4QXqjA8A3O5lkZmYCAGrXri04CZH5qlOnDmJjY1FWVgZL\nS0vRccye/v1D/35CRA9hZwe0bCldellZ0nHo+jI1dy4wbZp0z9393vK+5s2Bpk2lB/0SCcDiBBYn\nubE4ERle7dq1UVpaisuXL8PT01N0HLOnnzhdv35dcBIiE+TpCfTqJV2AtJTvn3/uFamEBGDdOume\npSUQElJxKtWgAadSJAsWJ0jFydLSEg78BEMW58+fB8DiRGRI+qWw586dY3GSASdORJVIrZaW7DVp\nArz9tvRabm7FqdSSJcCPP0r3atT43+PQ73yYQVSZWJwgvdE5OTnxJCSZZGZmokqVKnc/oSWiyle+\nOLUsvySGDKL8HiciMgAXFyA6WroAoKwMSE2tePDEli3SgRQAEBBwb3lf8+ZAYKA0rSJ6BixO4GZe\nuV24cAFeXl4sqkQG5OHhAQC4dOmS4CTKoH8P4VI9IplYWgKNGknX0KHSa/n5QGLiveV969cD8+dL\n96pUkSZR+iLVrBng6iouP5kkFiewOMktOzsbbm5uomMQmbWqVatCrVYjOztbdBRF4FI9IiPg5AR0\n7ChdgDR9Sk+vOJWaMgUoLZXu16tXca9U48bSyX5ED8HiBBYnuWVnZyMoKEh0DCKzplKp7j6UlQzP\nxsYGNjY2LE5ExkSlAurXl65XX5VeKyoCkpPvFak//wSWLpXu2dpKp/aVL1NeXsLik/FhcQJw8+ZN\n1KpVS3QMxcjJyeHDholk4OrqevcB32R49vb2uHXrlugYRPRv7O2B556TLr0LF+4t79u/H5g1C/j2\nW+mep2fFItW0qXSkOikSixOAW7duwY5fBLIoKytDXl4eixORDDhxkpednR2LE5Ep8vICXnpJugCg\npAQ4fLjiEr/Vq6V7VlbSkr7yZcrXl8ehKwSLE6TiZGtrKzqGIly9ehU6nY7FiUgGrq6uSEtLEx1D\nMezs7FBUVCQ6BhE9K2trICJCukaNkl7Lzq54HPqiRcDs2dI9F5eKRSoiQtpvRWaHxQlAcXExJ04y\nyc3NBQAWJyIZODs74+rVq6JjKAYnTkRmzNUViImRLkA6Dv3YsYpTqU2bpHsqlXTaX/kyFRAAWFiI\ny0+VgsUJXKonJ/3GaR7GQWR4jo6OuHnzJnQ6HY//lwH3OBEpiKUlEBIiXcOGSa9dvw4cOFBxed+8\nedI9J6eKx6E3bw44O4vLT0+FxQksTnK6efMmAKBKlSqCkxCZP0dHR+h0OhQWFvJrTgZcqkekcNWq\nAZ07SxcgHYd+6lTFqdRXX0nTKgBo0KBikQoOBtRqcfnpkRRfnLRaLUpKSrjHSSYFBQUApG/oiMiw\n9F9nBQUFLE4ysLOz49JIIrpHpQIaNpSuQYOk1woLgaSke0Xq99+BX3+V7tnZAeHhFcvUnYeZk3FQ\nfHEqLi4GAE6cZMKJE5F8yhcnPnLB8LjHiYgeycEBaNtWugBpKpWZWXEqNX068M030n1vb6lAtWgh\n/TUsTHreFAnB4nSnONnY2AhOogycOBHJp3xxIsOzsrJCaWmp6BhEZEpUKqBOHenq21d67fZtICXl\nXpFKSABWrpTuqdVSeSo/lfLx4XHoMlF8cdJqtQCkNzwyPE6ciOSj/zrTf92RYVlaWqJMv3eBiOhp\n2dgAzZpJ15gx0muXLlU8Dn3ePGDGDOmeq+v/HofO77MMQvFtQf8mZ8EjImWhn/BxTxmR4VlbWwMA\nNBqN4CTKwOJERAZTqxbQs6d0AUBpKXD0aMUlfhs2SPcsLICgoHvL+5o3l/ZZ8XvdZ6b44qSfOFla\nWgpOogxlZWVQqVQsqkQy0E/SWZzkweJERLKxsgJCQ6VrxAjptbw86Tj0hASpSC1fDsydK92rVk2a\nYOmLVGQkUKOGuPwmSvHFiRMneZWWlnJZJJFM9F9r3HcjDxYnIhKqRg2ga1fpAgCtFkhLqziVmjRJ\neh0A/PwqLvELCpIKGT1UpfzbUalUXQFMB2AJYJ5Op/tvZfy8cuDESV6lpaX8d00kE/Wd54GwOMnD\nysqKxYmIjIeFBRAQIF1DhkivFRRUPA5982Zg0SLpnoODtD9KX6SaNQPc3cXlN0LPXJxUKpUlgNkA\nOgG4ACBRpVJt0Ol0x5/155YDJ07yKisr48SJSCZcqicvS0tLllQiMm6OjkD79tIFSMehnz17b3nf\n/v3A1KnSHipAOrGv/FQqNFQ6vEKhKuM72EgAp3U6XQYAqFSq5QB6ADCJ4sSJk7y4VI9IPpmZmQCA\n3377DX369BGcxvzNmTNHdAQioiejUgF160pX//7Sa7duAYcO3StSe/dK+6UAwNoaaNKkYpmqXVsx\nx6FXxnewngDOl/vxBQDN7v+bVCrVMADDAKB27dqV8MtWDn1xUinkP7hoOp1OdAQixdA/x6lhw4aC\nkyiDh4cHLl68KDoGEdGzsbMDWraULr2srIrHoc+dC0ybJt2rVatikWraVFr2Z4Zk++hfp9P9BOAn\nAAgPDzea7571kyZ9gSLD4gMiieRTrVo1AEBkZKTgJMrQvXt3rFmzRnQMIqLK5+kJ9OolXQCg0QBH\njlQ8eGLtWumepSUQElKxTDVoYBZTqcooTlkAvMv92OvOayZBX5z4zbw81Go191sQyUS/h5PLY+VR\nVlbG/bJEpAxqtTRZatoUeOcd6bXc3IpTqSVLgB9/lO7VqHHvOPQePYDGjcVlfwaV8W6aCKCBSqWq\nC6kwvQKgfyX8vLLQf0PBk5DkweJEJB/9B0IsTvLQarXcL0tEyuXiAkRHSxcAlJUBqan3ilRCArBl\nC1C9unKLk06nK1WpVCMBbIV0HPl8nU537JmTyYQTJ3mp1WpotVpotVp+MktkYJw4yYsTJyKiciwt\ngUaNpGvoUOm1/HyxmZ5Rpbyb6nS6zQA2V8bPJTdOnOSlf66MRqOBjYKPsySSw+3btwHc+7ojwyor\nK+PEiYjo3zg5iU7wTBT/0Zi+OHHiJA9ra2sAQElJieAkROavsLAQAFClShXBSZSBxYmIyLwpvjhx\nqZ689N/A3bx5U3ASIvOn/zpjcZJHcXExbG1tRccgIiIDUXxx4sRJXk53RrT5Jr7GlcgUsDjJi8WJ\niMi8Kb446ffZ6PcCkGHpH8jJ4kRkeCxO8mJxIiIyb4ovThYWFrC1tUVRUZHoKIqgnzgVFBQITkJk\n/vTFycFMn+BubFiciIjMm+KLEwDY29uzOMmES/WI5FNQUABLS0t+My8TFiciIvPG4gQWJznpl+rd\nuHFDcBIi85ebmwtnZ2eoVCrRURSBxYmIyLyxOAGws7NjcZKJs7MzAODq1auCkxCZv5ycHNSsWVN0\nDMVgcSIiMm8sTuDESU7VqlWDWq1Gdna26ChEZi83NxcuLi6iYyjGrVu3WJyIiMwYixNYnOSkUqng\n6uqKK1euiI5CZPY4cZJXQUHB3X2cRERkflicwOIkNzc3N06ciGSQk5PDiZNMysrKcPPmTRYnIiIz\nxuIE6cACnvImH1dXVxYnIgMrKytDXl4eJ04y0R/9zuJERGS+WJwg7bvhKW/ycXNz41I9IgO7dOkS\ndDodPDw8REdRBP17SNWqVQUnISIiQ2FxglScrl+/LjqGYtSqVQuXLl1CWVmZ6ChEZiszMxMAULt2\nbcFJlEG/aoETJyIi88XiBKk4FRQUoLS0VHQURahTpw5KS0tx6dIl0VGIzNb58+cBAN7e3oKTKAOL\nExGR+WNxglScAHCfk0x8fHwAAOfOnRMbhMiM6YsTJ07y0L9/cKkeEZH5YnHCveJ07do1wUmUoU6d\nOgCAs2fPig1CZMYyMzPh6OjIb+Rlot/j5OjoKDgJEREZCosTgOrVqwMA9znJRP8JOCdORIZz/vx5\nTptkdPXqVQCAs7Oz4CRERGQoLE64N3FicZKHg4MDatasyeJEZEDp6el3l8WS4eXm5gJgcSIiMmcs\nTrg3cdJ/YkiGV7duXaSnp4uOQWSWtFotTp06BT8/P9FRFCMnJwfVqlWDWq0WHYWIiAyExQnSA1kB\n6Y2P5OHv74+0tDTRMYjM0vnz51FcXMziJKPc3Fy4uLiIjkFERAbE4gTAxcUFKpWKD2WVkb+/Py5c\nuICCggLRUYjMzsmTJwEADRs2FJxEOXJyclCzZk3RMYiIyIBYnABYWlrCxcUF2dnZoqMohr+/PwBw\n6kRkACxO8svJyeHEiYjIzLE43eHm5sbiJCN9cUpNTRWchMj8pKWloUqVKqhVq5boKIqRm5vLiRMR\nkZljcbrD1dWVS/Vk5OvrC0tLSxYnIgM4fvw4/P39oVKpREdRBJ1Oxz1OREQKwOJ0BydO8rK2tkb9\n+vVx7Ngx0VGIzIpOp0NKSgoaN24sOopiXLt2DSUlJXBzcxMdhYiIDIjF6Q5OnOQXGhqKlJQU0TGI\nzMrFixdx9epVhIaGio6iGFlZWQAAT09PwUmIiMiQWJzucHNzQ0FBAYqKikRHUYywsDCcPXsWeXl5\noqMQmQ39hxGcOMnn4sWLAFiciIjMHYvTHV5eXgCACxcuCE6iHE2aNAEATp2IKtHhw4cBACEhIYKT\nKAcnTkREysDidIe3tzcA6cGRJI+wsDAAQHJysuAkRObj8OHDqFu3LqpWrSo6imLoi5OHh4fgJERE\nZEgsTndw4iQ/FxcXeHt749ChQ6KjEJmNgwcPcn+TzLKysuDi4gIbGxvRUYiIyIBYnO7QFydOnOTV\npEkTJCUliY5BZBays7ORnp6OFi1aiI6iKFlZWVymR0SkACxOd9ja2qJmzZosTjJr3rw5Tp48idzc\nXNFRiEze33//DUD6uiL5XLx4kcWJiEgBWJzK8fb2ZnGSWcuWLQEACQkJgpMQmb6EhARYWVkhPDxc\ndBRFyczMvLtqgYiIzBeLUzleXl4sTjKLiIiAWq3Gvn37REchMnkJCQkIDQ2FnZ2d6CiKcfPmTeTm\n5qJu3bqioxARkYGxOJVTu3ZtFieZ2dnZoUmTJti7d6/oKEQmrbS0FImJidzfJLMzZ84AAIsTEZEC\nsDiVU7duXdy4cYMPZJVZq1atkJiYiJKSEtFRiEzW4cOHUVhYyOIkM31xqlevnuAkRERkaCxO5fj6\n+gIA0tPTBSdRllatWqG4uBgHDx4UHYXIZO3YsQMA0L59e8FJlCUjIwMAJ05ERErA4lSOvjidPn1a\ncBJladOmDVQq1d1v/Ijoyf3xxx8IDAyEu7u76CiKcubMGVSpUgXOzs6ioxARkYGxOJWjX2rBiZO8\nXFxcEBYWhm3btomOQmSSSkpKsHv3bnTo0EF0FMU5c+YM6tatC5VKJToKEREZGItTOfb29qhVqxaL\nkwCdOnVCQkICbt68KToKkck5cOAAioqK0LFjR9FRFEdfnIiIyPyxON3H19eXxUmAqKgoaDQa7N69\nW3QUIpOzY8cOqFQqtG3bVnQURdFqtcjIyODBEERECsHidB8WJzFatWoFGxsbLtcjegq///47mjZt\niurVq4uOoigXLlxAUVER/P39RUchIiIZsDjdp379+rh48SKKiopER1EUOzs7tG7dGlu3bhUdhcik\n5ObmIiEhAdHR0aKjKE5aWhoAsDgRESkEi9N9/Pz8ANx7QyT5REdH4/jx45z4ET2B+Ph46HQ6xMTE\niI6iOKmpqQDuvW8QEZF5Y3G6T2BgIADgxIkTgpMoT/fu3QEAGzduFJyEyHRs2rQJtWrVQlhYmOgo\nipOamoqqVavCzc1NdBQiIpIBi9N9GjRoAEtLSxw/flx0FMWpV68egoKCsGHDBtFRiEyCRqPBli1b\nEB0dDQsL/nEut7S0NPj5+fEociIiheA77X2sra1Rv359FidBunfvjl27diEvL090FCKjt3v3buTn\n5+OFF14QHUWRUlNTub+JiEhBWJweIDAwkEv1BOnevTvKysoQHx8vOgqR0Vu7di1sbW35/CYBCgoK\nkJWVxf1NREQKwuL0AAEBATh16hRKSkpER1GciIgIuLu7Y82aNaKjEBm1srIyrFq1CtHR0ahSpYro\nOIqjPxiCEyciIuVgcXqAwMBAlJWV4fTp06KjKI6FhQVefvllxMXFIT8/X3QcIqO1e/duXL58GX36\n9BEdRZGOHDkCAAgJCRGchIiI5MLi9AD6k/WOHTsmOIky9evXD7dv38b69etFRyEyWrGxsbC3t+fz\nmwQ5cuQIHBwcUK9ePdFRiIhIJixOD+Dv7w9LS8u7nyiSvJo3b446depg2bJloqMQGaXS0lKsXr0a\nL7zwAhwcHETHUaQjR44gODiYpxkSESkI/8R/ADs7O/j7+yMlJUV0FEVSqVTo27cvtm3bhtzcXNFx\niIzOX3/9hezsbC7TE0Sn0+HIkSNcpkdEpDAsTg8RGhrK4iRQv3797n6qTkQVLV68GE5OTujWrZvo\nKIp08eJF5OXlsTgRESkMi9NDhIaG4sKFC5x4CNK4cWMEBARg0aJFoqMQGZWCggKsWrUKr7zyCuzt\n7UXHUSQeDEFEpEwsTg8RGhoKADh8+LDgJMqkUqnw+uuvIyEhgc/UIionNjYWRUVFGDJkiOgoiqV/\nXwgODhachIiI5MTi9BCNGzcGAC7XE2jQoEGwsrLCL7/8IjoKkdFYuHAh/Pz80KxZM9FRFCslJQV1\n6tRBtWrVREchIiIZsTg9RM2aNeHp6cniJJCrqytiYmKwePFiPoyYCMCpU6ewZ88eDBkyBCqVSnQc\nxUpKSkJ4eLjoGEREJDMWp38RGhqK5ORk0TEUbejQocjJycGmTZtERyESbv78+bCwsMDAgQNFR1Gs\nvLw8pKenszgRESkQi9O/CA8Px4kTJ1BQUCA6imJ16dIFHh4e+Pnnn0VHIRKquLgY8+bNQ48ePeDh\n4SE6jmIlJSUBACIiIgQnISIiubE4/YvIyEjodDocPHhQdBTFsrKywrBhw7BlyxacOnVKdBwiwOo5\nPwAAIABJREFUYWJjY5Gbm4uRI0eKjqJo+uLUtGlTwUmIiEhuLE7/IjIyEgDw999/C06ibMOHD4da\nrcasWbNERyESZtasWQgICED79u1FR1G0xMRENGzYkAdDEBEpEIvTv3BxcYGvry+Lk2Du7u7o27cv\nFixYgPz8fNFxiGR34MABJCYmYuTIkTwUQrDExETubyIiUigWp0do1qwZi5MRGD16NAoKCvhAXFKk\nWbNmwdHRkYdCCHbp0iVkZWVxfxMRkUKxOD1CZGQkLl68iKysLNFRFC0iIgItWrTAzJkzodVqRcch\nks2FCxewfPlyDB48GI6OjqLjKNqBAwcA8GAIIiKlYnF6BP1DJjl1Em/MmDE4deoUNmzYIDoKkWy+\n//57aLVajB07VnQUxduzZw+sra15MAQRkUKxOD1CaGgo1Go19u/fLzqK4vXu3Ru+vr6YPHkydDqd\n6DhEBpeXl4e5c+eiX79+8PHxER1H8fbu3YuIiAjY2tqKjkJERAKwOD2Cra0twsPDsWfPHtFRFM/K\nygrjx49HYmIiduzYIToOkcH98MMPKCwsxH/+8x/RURTv1q1bSEpKQqtWrURHISIiQVicHkPr1q2R\nlJSEW7duiY6ieIMGDYKHhwcmT54sOgqRQRUVFWHGjBl4/vnnERwcLDqO4iUlJUGj0eC5554THYWI\niARhcXoMbdq0gUaj4T4nI2BjY4MPPvgAO3fuREJCgug4RAbz888/IycnB+PHjxcdhYC7qw5atmwp\nOAkREYnC4vQYWrVqBZVKhV27domOQgCGDRsGZ2dnTJo0SXQUIoMoLCzEV199hfbt26NNmzai4xCk\n/U0BAQFwdnYWHYWIiARhcXoM1apVQ0hICHbv3i06CgFwcHDAuHHjEB8fz71nZJZmz56NK1eu8MMB\nI6HVarF3717ubyIiUjgWp8fUunVrJCQkQKPRiI5CAEaNGgV3d3d89NFHPGGPzEp+fj6mTJmCrl27\n8ht1I3H06FFcv36d+5uIiBSOxekxtW7dGoWFhTh06JDoKATA3t4en376KXbv3o2tW7eKjkNUaaZP\nn46rV6/iiy++EB2F7vjjjz8AAB06dBCchIiIRGJxekytW7cGAPz111+Ck5DeG2+8AR8fH3z00UfQ\narWi4xA9s6tXr+Lbb79Fjx49EBERIToO3fHHH3+gQYMG8Pb2Fh2FiIgEYnF6TLVq1UJgYCCfH2RE\nrK2tMXHiRBw6dAgrV64UHYfomX3++ecoKCjAl19+KToK3VFaWoq//vqL0yYiImJxehJRUVHYtWsX\niouLRUehOwYMGICQkBCMHz+ez9kik5aamooff/wRw4YNQ1BQkOg4dMfBgweRn5/P4kRERCxOTyIq\nKgq3bt3i84OMiKWlJaZNm4Zz587hu+++Ex2H6Kl98MEHcHBwwMSJE0VHoXL0+5vat28vOAkREYnG\n4vQE2rVrB0tLS2zfvl10FCqnffv26NWrFyZPnoysrCzRcYie2LZt2xAXF4ePP/4Yrq6uouNQOX/8\n8QdCQkJQs2ZN0VGIiEgwFqcn4OjoiObNm2Pbtm2io9B9vvnmG5SWluLDDz8UHYXoiWg0GowdOxZ1\n69bFmDFjRMehcm7fvo09e/ZwmR4REQFgcXpiUVFRSEpKwrVr10RHoXLq1auHsWPH4tdff+VSSjIp\n06dPx9GjR/Hdd9/BxsZGdBwqZ/fu3SguLkZUVJToKEREZARYnJ5Qp06doNPp7q57J+Px0UcfwcvL\nC8OHD+eDiskkZGZm4rPPPkNMTAx69OghOg7dZ/PmzbCxseH+JiIiAsDi9MQiIyPh6OjIh64aIUdH\nR8yePRv//PMPvv32W9FxiB5p9OjRAICZM2dCpVIJTkP3i4+PR9u2bWFvby86ChERGQEWpyekVqvR\nuXNnbN68GTqdTnQcuk/37t3Rq1cvTJw4Eenp6aLjED3U+vXrsX79enz++eeoU6eO6Dh0n7NnzyI1\nNRXdunUTHYWIiIwEi9NTiI6ORlZWFg4fPiw6Cj3AjBkzYG1tjbfeeovllozSjRs3MGrUKAQFBeHd\nd98VHYceID4+HgBYnIiI6C4Wp6fw/PPPAwA2bdokOAk9iKenJ7766its27YNixcvFh2H6H+MHTsW\nWVlZmDdvHtRqteg49ADx8fGoW7cuGjZsKDoKEREZCRanp+Dm5oaIiAjExcWJjkIPMWLECLRp0waj\nR49GZmam6DhEd8XFxWH+/PkYP348mjVrJjoOPUBxcTF27NiBbt26ce8ZERHdxeL0lKKjo/H3338j\nJydHdBR6AAsLCyxcuBBarRaDBw+GVqsVHYkIeXl5eOONNxAcHIzPPvtMdBx6iN27d6OoqIjL9IiI\nqAIWp6f0wgsvQKfT3V0HT8anbt26mDZtGnbu3IkZM2aIjkOEUaNGITc3F4sWLeIzm4zYunXrYG9v\nj44dO4qOQkRERoTF6SmFhYXB3d2d+5yM3Ouvv46YmBhMmDABx48fFx2HFGzp0qVYunQpPvnkE4SF\nhYmOQw+h1Wqxfv16dOnSBXZ2dqLjEBGREWFxekoWFhaIiYlBfHw8iouLRcehh1CpVPj555/h6OiI\nfv364datW6IjkQKdPn0aw4cPR6tWrfDxxx+LjkP/4uDBg8jKysKLL74oOgoRERkZFqdn0KtXL9y8\neRPbt28XHYX+hZubGxYvXowjR45gzJgxouOQwty+fRt9+/aFWq3G0qVLYWVlJToS/Yu1a9fC0tIS\n0dHRoqMQEZGRYXF6Bh06dEDVqlWxZs0a0VHoEbp164YJEybg559/xm+//SY6DinI+PHjkZycjIUL\nF6J27dqi49AjrFu3Du3atUONGjVERyEiIiPD4vQMrK2tERMTg/Xr10Oj0YiOQ48wadIkPPfccxg+\nfDhSU1NFxyEFWL9+PaZPn47Ro0eje/fuouPQI6SlpeHEiRPo2bOn6ChERGSEWJyeUa9evZCXl4dd\nu3aJjkKPYGVlheXLl8POzg4vv/wybt68KToSmbETJ05g4MCBCA8Px5QpU0THocewbt06AECPHj0E\nJyEiImPE4vSMunTpAnt7ey7XMxGenp5YunQpjh8/jkGDBvH5TmQQ169fR48ePWBnZ4e1a9fy6HET\nsXr1aoSHh8Pb21t0FCIiMkIsTs/I3t4e3bp1w9q1a/lNuIno1KkTpk6dirVr12LixImi45CZKSsr\nQ//+/XH27FmsXr0aXl5eoiPRY0hPT0diYiL69u0rOgoRERkpFqdK0KtXL1y6dAn79u0THYUe07vv\nvovBgwfjiy++wMqVK0XHITPyySefID4+HjNnzsRzzz0nOg49ptjYWABAnz59BCchIiJjxeJUCWJi\nYmBnZ4dly5aJjkKPSaVSYc6cOWjRogVee+01JCcni45EZmD+/Pn473//i+HDh2P48OGi49ATWL58\nOVq2bMmTD4mI6KFYnCqBo6MjunfvjtjYWJ6uZ0JsbGywZs0auLi4IDo6GmfPnhUdiUzYli1bMGzY\nMHTu3BkzZ84UHYeewPHjx3HkyBG88soroqMQEZERY3GqJP3790dubi4fhmti3N3dsWXLFty+fRtd\nunRBbm6u6EhkgpKTk/HSSy8hODgYq1atglqtFh2JnsCKFStgYWGBl19+WXQUIiIyYixOlaRr166o\nXr06li5dKjoKPaHAwEBs3LgRmZmZeOGFF1BYWCg6EpmQs2fPIjo6Gs7OzoiLi4Ojo6PoSPQEdDod\nli9fjrZt28Ld3V10HCIiMmIsTpXE2toaL730EtauXYuioiLRcegJtWrVCsuWLUNiYiL69OnDJZf0\nWC5duoROnTqhuLgY8fHx8PDwEB2JnlBKSgpOnjzJZXpERPRIz1ScVCrVyyqV6phKpdKqVKrwygpl\nqvr374/CwkJs3LhRdBR6Cj179sQPP/yAzZs3Y8CAASgtLRUdiYxYTk4OoqKicOnSJcTFxSEwMFB0\nJHoKixcvhlqtRu/evUVHISIiI/esE6ejAHoB2FUJWUxe69at7z5glUzT8OHDMXXqVKxcuRKDBg1C\nWVmZ6EhkhPLy8tCpUydkZGRg06ZNaNmypehI9BQ0Gg1+++03dO/eHc7OzqLjEBGRkbN6ln9Yp9Od\nAKSjnQmwtLREv379MG3aNOTk5KBmzZqiI9FTeP/991FaWooJEybAysoKCxYsgKWlpehYZCTy8/PR\ntWtXnDhxAhs2bEC7du1ER6KntGXLFuTk5OC1114THYWIiEyAbHucVCrVMJVKlaRSqZJycnLk+mVl\nN2TIEJSWlmLJkiWio9AzGD9+PCZNmoRff/0Vb7zxBidPBAC4evUqoqKicOjQIaxcuRJdunQRHYme\nwcKFC1GzZk107dpVdBQiIjIBjyxOKpVqu0qlOvqAq8eT/EI6ne4nnU4XrtPpws15EhMYGIhmzZph\nwYIF0Ol0ouPQM/jkk0/w2WefYeHChejfvz9KSkpERyKBLl++jHbt2uHIkSNYs2YNunfvLjoSPYOr\nV69i48aNGDBgAI+PJyKix/LIpXo6nS5KjiDmZMiQIRgxYgQOHjyI8HDFn5lh0j7//HNUqVIF48aN\nw40bN7B69Wo4ODiIjkUyO3fuXIWDIDp27Cg6Ej2j5cuXQ6PRYPDgwaKjEBGRieBx5AbwyiuvwNbW\nFgsWLBAdhSrBBx98gHnz5mHbtm3o3Lkzrl27JjoSySg1NRWtW7dGbm4utm3bxtJkJhYtWoTGjRuj\ncePGoqMQEZGJeNbjyF9UqVQXALQAEKdSqbZWTizTVrVqVfTu3RtLly7FrVu3RMehSjB06FDExsYi\nKSkJbdu2RWZmpuhIJIM///wTLVq0wO3bt7Fz5060aNFCdCSqBP/88w8SExN5KAQRET2RZypOOp1u\nrU6n89LpdDY6nc5Np9Nxp/QdQ4YMwfXr17Fu3TrRUaiS9O7dG3FxcTh37hyaNWuGAwcOiI5EBrR4\n8WJ07twZtWrVwt9//43Q0FDRkaiSzJ07FzY2Nhg0aJDoKEREZEK4VM9A2rdvDx8fH8ybN090FKpE\nUVFRSEhIgJ2dHdq2bYuVK1eKjkSVTKfT4fPPP8drr72G1q1bY9++ffDx8REdiypJYWEhfv31V7z0\n0kt8dhMRET0RFicDsbCwwJtvvok//vgDaWlpouNQJQoMDMTff/+Npk2bok+fPvjyyy95gqKZKCgo\nQJ8+fTBx4kQMHjwY8fHxqFatmuhYVIlWrFiB/Px8jBgxQnQUIiIyMSxOBjR06FCo1WrMmTNHdBSq\nZDVr1sSOHTswcOBAfPrpp+jZsycPjTBxqampiIyMxJo1azBlyhTMnz8f1tbWomNRJZs7dy4CAwPR\nqlUr0VGIiMjEsDgZkJubG3r37o2FCxeiqKhIdByqZDY2Nli0aBFmzJiB+Ph4NG3aFMnJyaJj0VNY\nvXo1IiIicPXqVWzbtg3jxo2DSqUSHYsqWUpKCg4cOIDhw4fzvy8RET0xFicDe+utt3D9+nUsX75c\ndBQyAJVKhVGjRmHXrl0oLS1Fy5YtMXfuXC7dMxHFxcV477338NJLL6FRo0ZITk5Ghw4dRMciA5k7\ndy5sbW0xcOBA0VGIiMgEsTgZWOvWrdGoUSP88MMPoqOQATVv3hzJyclo27YtRowYgd69eyMnJ0d0\nLPoX//zzDyIjIzFt2jSMHDkSf/31F7y8vETHIgPJz8/Hb7/9hr59+6J69eqi4xARkQlicTIwlUqF\nt956CwcPHkRiYqLoOGRALi4uiI+Px5QpUxAXF4fg4GBs2rRJdCy6j1arxffff4/w8HBkZ2dj8+bN\nmDlzJmxsbERHIwNasGABCgoKMHLkSNFRiIjIRLE4yWDgwIFwcHDA7NmzRUchA7OwsMC4ceOQmJgI\nNzc3xMTE4M0330RBQYHoaAQgPT0dnTt3xtixY9GlSxccOXIE3bp1Ex2LDKysrAwzZ85Ey5YtER4e\nLjoOERGZKBYnGTg5OWHw4MFYtmwZLl++LDoOySAkJAQHDhzAhAkTMH/+fAQGBvJhyAKVlpZi6tSp\nCA4OxoEDBzB37lysX78erq6uoqORDDZv3oz09HSMHj1adBQiIjJhLE4yGTNmDDQaDfc6KYiNjQ2+\n+uor7N27FzVq1MCLL76Inj174vz586KjKUpSUhKaNWuGcePGoXPnzjh+/DiGDRvGU9UUZPr06fD0\n9ESvXr1ERyEiIhPG4iSTBg0aICYmBj/++CNu3bolOg7JqHnz5khKSsKUKVOwbds2BAQEYPLkyfz/\nwMAuX76M119/HREREbh48SJWrVqFtWvX8gAIhTl69Ch27NiBd955B2q1WnQcIiIyYSxOMnrvvfeQ\nm5uLJUuWiI5CMlOr1Rg3bhyOHTuGTp064eOPP4a/vz+WLVvGo8srWXFxMaZMmYKGDRtiyZIlGDdu\nHNLS0tC7d29OmRRo5syZsLW1xbBhw0RHISIiE8fiJKO2bdsiLCwM33//Pb9ZVigfHx+sXbsWO3fu\nhLOzM/r3748WLVpg+/bt/H/iGWk0GsybNw8NGjTA+PHj0a5dOxw7dgxTpkyBk5OT6HgkQG5uLn79\n9Ve8+uqrcHZ2Fh2HiIhMHIuTjFQqFd577z2cOHECW7duFR2HBGrXrh2SkpKwYMECXLx4EZ06dULb\ntm3x559/io5mcsrKyrB06VIEBgbizTffhKenJ7Zv344NGzagQYMGouORQLNmzcKtW7fw3nvviY5C\nRERmgMVJZn379kWtWrXw7bffio5CgllYWGDw4ME4deoUZs+ejfT0dLRv3x7t2rVDXFwctFqt6IhG\nrbi4GHPnzoW/vz8GDBgAOzs7bNiwAQkJCejYsaPoeCRYYWEhZs6cie7duyMwMFB0HCIiMgMsTjKz\ntrbGmDFjsH37dhw8eFB0HDICNjY2ePvtt5Geno7p06cjPT0dL7zwAoKCgjBv3jwUFxeLjmhUcnJy\nMHnyZPj4+GDEiBGoVq0aVq5ciZSUFMTExHAfEwEA5s2bh7y8PIwfP150FCIiMhMqEfsqwsPDdUlJ\nSbL/usYiPz8ftWvXRlRUFFatWiU6DhkZjUaD2NhYTJ06FSkpKXBxccHgwYPx5ptvomHDhqLjCaHT\n6bBv3z78+OOPWLlyJUpKStC5c2eMHz8e7du3Z1miCjQaDerXr486depg165douMQEZERU6lUB3U6\n3WM9HZ0TJwGcnJwwcuRIrFmzBidOnBAdh4yMWq3GgAEDkJycjO3bt6NNmzaYNm0a/Pz80K5dO/z6\n668oKCgQHVMWWVlZmDp1Kho3boznnnsOGzduxPDhw3Hs2DFs3boVHTp0YGmi/7F8+XJkZmZy2kRE\nRJWKEydBcnJyUKdOHfTp0wcLFy4UHYeM3OXLl7Fw4UL8/PPPyMjIgK2tLaKjo9GvXz88//zzsLOz\nEx2x0uTk5GDDhg1YunQpdu7cCZ1Oh2bNmmHo0KHo378/HBwcREckI6bVahESEgKVSoUjR46wWBMR\n0b96kokTi5NA7777LmbPno3Tp0+jTp06ouOQCdBqtUhISMDy5csRGxuL7Oxs2Nvbo2PHjoiOjsbz\nzz8Pb29v0TGfiE6nQ2pqKjZu3IgNGzZg37590Ol0aNCgAQYMGIABAwagfv36omOSidi4cSO6d+9+\n9xhyIiKif8PiZCLOnz8PX19fDB8+HDNnzhQdh0xMaWkp/vzzT6xbtw5xcXE4e/YsAKBRo0Zo27Yt\n2rRpg9atW8PDw0Ns0PvodDqkp6fjzz//xM6dO7Fz505cunQJANCkSRP06NEDMTExCA0N5bSAnohO\np0NERASuXbuG1NRUqNVq0ZGIiMjIsTiZkDfeeAO//fYbzpw5A3d3d9FxyETppzZxcXHYvn079u7d\ni5s3bwIA6tatiyZNmiAsLAxhYWFo3LgxPDw8ZCklGo0GGRkZOH78OJKSku5eeXl5AAA3Nzd06NAB\n7du3R7du3eDl5WXwTGS+Nm3ahJiYGMyfPx9DhgwRHYeIiEwAi5MJOX36NPz9/TFq1Ch8//33ouOQ\nmSgtLUVKSgp2796Nffv24dChQ0hPT797397eHvXr10f9+vXh6+sLDw8PuLu7w83NDW5ubnBycoKD\ngwMcHBxgbW39Pz+/RqNBQUEB8vPzkZ+fj9zcXGRlZSErKwsXL17EuXPnkJaWhvT0dJSWlgIALC0t\nERwcjPDwcISHh6NNmzbw9/fnVIkqBadNRET0NFicTMzrr7+OpUuXIj09HZ6enqLjkJm6ceMGjhw5\ngiNHjuD06dM4ffo0Tp06hYyMDGg0mof+c1ZWVrC0tIROp4NWq4VOp0NZWdlD/34nJyd4e3vDz88P\nfn5+8Pf3h7+/P4KDg83qEAsyLpw2ERHR02BxMjFnzpxBw4YNMWzYMMyePVt0HFIYrVaLa9eu4fLl\ny7hy5QouX76MgoICFBYW3r20Wi0sLCxgYWEBlUoFGxsbVK1aFU5OTqhatSqqV68OT09PeHh4oEqV\nKqJ/S6QwnDYREdHTepLiZGXoMPRodevWxdChQ/Hzzz/jP//5D0/YI1lZWFjA2dkZzs7OaNSokeg4\nRE8sLi4OBw8exPz581maiIjIYPgAXCPx8ccfQ6VS4csvvxQdhYjIZGi1Wnz22WeoV68ejx8nIiKD\nYnEyEt7e3hg2bBgWLFhQYRM/ERE93MqVK5GcnIzPPvuM0yYiIjIo7nEyIhcvXoSvry9efvllLF68\nWHQcIiKjptFoEBgYCFtbW6SkpMDS0lJ0JCIiMjFPsseJEycj4uHhgVGjRmHJkiU4fPiw6DhEREZt\n3rx5OH36NL766iuWJiIiMjhOnIzMtWvX4Ovri8jISGzZskV0HCIio1RYWHj3WWS7du3i88CIiOip\ncOJkwqpXr45PPvkEW7duxfbt20XHISIyStOmTcPly5fx9ddfszQREZEsOHEyQrdv34a/vz+qV6+O\npKQkWFiw3xIR6V29ehX16tVDu3btsH79etFxiIjIhHHiZOJsbGzw5Zdf4tChQ1i2bJnoOERERmXS\npEm4efMmJk+eLDoKEREpCCdORkqr1SI8PBx5eXlITU2Fra2t6EhERMKlpqYiODgYQ4cOxZw5c0TH\nISIiE8eJkxmwsLDAN998g3PnzmH69Omi4xARGYX3338f9vb2+OKLL0RHISIihWFxMmIdO3ZE9+7d\n8eWXX+LSpUui4xARCbVlyxZs3rwZn376KVxdXUXHISIihWFxMnLfffcdSkpKMGHCBNFRiIiEKS0t\nxdixY1G/fn2MHj1adBwiIlIgFicj5+vri7Fjx2Lx4sXYv3+/6DhERELMmTMHJ06cwNSpU2FtbS06\nDhERKRAPhzABN2/ehJ+fHzw9PbF//34eT05EipKXl4cGDRogNDQU27dv53ObiIio0vBwCDNTpUoV\nfP3110hMTMSiRYtExyEiktVHH32EGzdu4Pvvv2dpIiIiYVicTMSAAQPQokULTJgwATdu3BAdh4hI\nFn///Td++uknjB49GiEhIaLjEBGRgrE4mQiVSoWZM2ciNzcXH3/8seg4REQGV1pairfeegu1atXC\nxIkTRcchIiKFY3EyIU2bNsU777yDH374AQcOHBAdh4jIoH788UccOnQI06ZNg6Ojo+g4RESkcDwc\nwsTk5+cjICAArq6uSExMhJWVlehIRESV7tKlS/D390fz5s2xZcsW7m0iIiKD4OEQZszJyQkzZsxA\nSkoKZsyYIToOEZFBvP/++7h9+zZmz57N0kREREaBxckE9erVC9HR0fi///s/ZGZmio5DRFSptm7d\nimXLlmH8+PGoX7++6DhEREQAuFTPZJ09exaBgYHo1KkT1q9fLzoOEVGlKCgoQFBQEOzt7XHo0CHY\n2tqKjkRERGaMS/UUwMfHBxMnTsSGDRuwcuVK0XGIiCrFRx99hPPnz+OXX35haSIiIqPC4mTC3nvv\nvbsn7eXk5IiOQ0T0TPbs2YNZs2Zh1KhRaNmypeg4REREFbA4mTArKyssXLgQ169fx6hRo0THISJ6\nasXFxRg6dCh8fHzw//7f/xMdh4iI6H+wOJm4oKAgfPbZZ1ixYgVWr14tOg4R0VOZOHEiTp48iZ9+\n+glVqlQRHYeIiOh/8HAIM6DRaNC8eXNcuHABx44dg4uLi+hIRESPLSkpCc2bN8drr72GX375RXQc\nIiJSEB4OoTBqtRoLFizAtWvXMHr0aNFxiIge261btzBw4EC4u7tj6tSpouMQERE9FIuTmQgJCcEn\nn3yCZcuWcckeEZmMCRMmIDU1FQsXLkT16tVFxyEiInooFicz8uGHHyI8PBzDhg1DVlaW6DhERP9q\n27ZtmDFjBkaPHo2oqCjRcYiIiP4Vi5MZUavV+O2331BcXIzBgwdDq9WKjkRE9EDXrl3DkCFD4O/v\nj//+97+i4xARET0Si5OZadiwIb7//nts374d06dPFx2HiOiB3nnnHVy5cgW//vor7OzsRMchIiJ6\nJBYnM/Tmm2+iR48emDBhAo4cOSI6DhFRBcuWLcOyZcvwf//3fwgPf6yDjIiIiITjceRmKicnB8HB\nwahZsyYSExNha2srOhIREdLT0xEWFoagoCDs2rULVlZWoiMREZGC8ThyQs2aNbFgwQIcPXoU48aN\nEx2HiAi3b99G3759YWlpiWXLlrE0ERGRSWFxMmPdunXDu+++i1mzZmHVqlWi4xCRwk2YMAEHDx7E\nggULUKdOHdFxiIiIngiLk5n7+uuvERkZiaFDhyI9PV10HCJSqI0bN2LatGkYOXIkevbsKToOERHR\nE2NxMnPW1tZYsWIFLCws0KdPHxQXF4uOREQKc/78eQwePBihoaH45ptvRMchIiJ6KixOCuDj44NF\nixYhOTkZH3zwgeg4RKQgGo0G/fv3x+3bt7FixQoeVENERCaLxUkhunfvjvfffx+zZ89GbGys6DhE\npBDjxo3Dnj178NNPP6Fhw4ai4xARET01FicF+eqrr9C8eXO88cYbSE1NFR2HiMzcsmUZ6VnfAAAY\nVUlEQVTLMH36dIwePRr9+/cXHYeIiOiZsDgpiFqtRmxsLOzs7NCjRw/cuHFDdCQiMlNHjhzB0KFD\n0bp1a0ydOlV0HCIiomfG4qQw3t7eWLlyJTIyMvDqq69Cq9WKjkREZub69evo1asXqlWrhtjYWKjV\natGRiIiInhmLkwK1adMG06ZNw6ZNmzBx4kTRcYjIjGi1WgwcOBDnzp3DqlWr4O7uLjoSERFRpeBj\n2xXq7bffxsGDB/HFF18gLCyMz1Uhokrx+eefY9OmTZg1axZatmwpOg4REVGl4cRJoVQqFX744QdE\nRkZi4MCBOH78uOhIRGTili5dikmTJmHIkCF4++23RcchIiKqVCxOCmZra4vVq1fDwcEBMTExyMnJ\nER2JiEzU/v378frrr6NNmzaYM2cOVCqV6EhERESVisVJ4by8vLB+/XpcvHgRL774IoqLi0VHIiIT\nk5mZiZ49e8LT0xOrV6+GtbW16EhERESVjsWJ0KxZMyxevBh79+7F0KFDodPpREciIhNx8+ZNxMTE\n4NatW9i0aRNcXFxERyIiIjIIFicCALz88suYPHkyli5dypP2iOixlJWVYcCAATh69ChiY2MREBAg\nOhIREZHB8FQ9umvChAk4deoUJk6ciPr16+PVV18VHYmIjJROp8OYMWOwYcMGzJw5E126dBEdiYiI\nyKBYnOgulUqFOXPm4OzZsxg6dCi8vLzQrl070bGIyAh9/fXXmD17Nj744AOMHDlSdBwiIiKD41I9\nqsDa2hqrV6+Gr68vevTogZSUFNGRiMjILF68GB9++CH69++Pr7/+WnQcIiIiWbA40f+oXr06tm7d\nCicnJ3Tt2hUZGRmiIxGRkfj9998xdOhQdOzYEQsWLICFBd9GiIhIGfiORw/k7e2N33//HRqNBp07\nd8aVK1dERyIiwZKTk9G7d280atQIa9as4bHjRESkKCxO9FABAQGIi4vDpUuX0K1bN+Tn54uORESC\npKWloVu3bnB2dsbmzZvh5OQkOhIREZGsWJzoXzVv3hyrVq3CP//8g549e/IBuUQKdPbsWURFRQEA\ntm7dCg8PD8GJiIiI5MfiRI/UrVs3LFiwADt37sRLL72EkpIS0ZGISCYXL15Ex44dUVhYiG3btsHP\nz090JCIiIiFYnOixvPrqq5gzZw7i4uLwyiuvQKPRiI5ERAaWk5ODqKgoZGdnY8uWLQgJCREdiYiI\nSBgWJ3psw4cPx/Tp07F27VoMGjQIZWVloiMRkYFcv34dXbp0wdmzZxEXF4fIyEjRkYiIiITiA3Dp\niYwePRq3b9/Gf/7zH1hbW/M4YiIzdOPGDXTr1g1Hjx7Fxo0b0eb/t3fvQVXXCR/HP19AYc00S2Yx\nJXEFL6SkDQoq6nqleLyhu5o+udmOqZu1tVs6mSttq9M246a1+ZiGVlsRuaaMVlompuAx2lDwLl4y\nWhwUXcxL6jHg+/yROe2uerygX87h/Zr5jQKnznuc3wgfz++c06OH6yQAAJxjOOGKTZo0SWfOnFFa\nWppCQ0M1b948xhMQIH54pKmgoECLFy9WcnKy6yQAAGoEhhOuyh/+8AedOXNGzz33nKqqqjR//nwF\nBwe7zgJwDcrLy9W/f39t3bpVS5Ys0cCBA10nAQBQYzCccFWMMZoxY4ZCQkL0pz/9SadPn9bf/vY3\nhYRwSgH+6F//+pf69eunHTt2KCsrSykpKa6TAACoUfgpF1fNGKNnn31WYWFhevrpp+X1evXOO++o\nbt26rtMAXIEfXj2vqKhIy5Yt4/I8AAAugCem4JpNmTJFs2fP1pIlSzRs2DDeJBfwIwcOHFCvXr20\ne/duvf/++4wmAAAuguGEavH4449r7ty5+uCDDzRo0CB9++23rpMA+LBnzx4lJSWpuLhYK1asUL9+\n/VwnAQBQYzGcUG1+85vf6PXXX1d2drb69OmjI0eOuE4CcBEFBQVKSkrSyZMn9emnn6pXr16ukwAA\nqNEYTqhWY8aM0ZIlS1RYWHj+X7IB1Cw5OTn6+c9/rtDQUOXm5io+Pt51EgAANR7DCdVuyJAhWrVq\nlQ4ePKiuXbtq69atrpMAnPPD85huv/12eTwetWnTxnUSAAB+geGE66JHjx7Kzc2VJHXv3l05OTmO\niwDMnz9fqampat++vXJzcxUZGek6CQAAv8FwwnXTvn17bdiwQREREerfv78WL17sOgmolaqqqjR5\n8mRNmDBBycnJys7OVuPGjV1nAQDgVxhOuK6aN2+u9evX6+6779bw4cP13HPPyVrrOguoNU6fPq3h\nw4dr5syZevjhh7Vs2TLdfPPNrrMAAPA7DCdcd40bN9aaNWs0atQoTZ06VQ888IC8Xq/rLCDglZWV\nqVevXlq6dKleeOEFzZkzRyEhvO85AABXg++guCHCwsL09ttvq3Xr1nrmmWe0f/9+ZWVlcbkQcJ1s\n375dAwcO1MGDB7VkyRKlpqa6TgIAwK/xiBNuGGOM0tLSlJmZqS+++EIJCQnasWOH6ywg4GRlZSkx\nMVGnTp3S2rVrGU0AAFQDhhNuuPvuu09r167VyZMnlZiYqKysLNdJQECoqqpSWlqahg4dqtjYWG3c\nuFGdO3d2nQUAQEBgOMGJxMRE5efnq23btho6dKimTJmiyspK11mA3zp27JgGDx6s6dOn68EHH9S6\ndevUtGlT11kAAASMaxpOxpiZxphdxpgtxpgsY8wt1RWGwBcZGamcnByNGzdOzz//vO69914dOXLE\ndRbgd4qKipSQkKCPPvpIc+bM0cKFCxUWFuY6CwCAgHKtjzh9IqmdtTZO0m5JU649CbVJaGio5s+f\nr/T0dK1bt07x8fHatGmT6yzAb2RmZio+Pl7l5eVavXq1Jk6cKGOM6ywAAALONQ0na+0qa23FuQ/z\nJDW79iTURmPHjtX69etVVVWlrl27au7cubzfE3AJp0+f1vjx4zVq1Cjddddd2rhxo3r27Ok6CwCA\ngFWdz3H6taSVF/uiMWacMSbfGJN/+PDharxbBIpOnTpp48aN6tWrlyZOnKhhw4apvLzcdRZQ4xQV\nFSkxMVGvvvqqnnrqKX366aeKjIx0nQUAQEDzOZyMMauNMdsucAz+0W2mSqqQlHGx/4+19lVrbby1\nNj48PLx66hFwwsPD9eGHH2rmzJl6//331aFDB3k8HtdZQI3xw6V5Bw4c0IoVK/TnP/9ZderUcZ0F\nAEDA8zmcrLV9rbXtLnAskyRjzBhJAyT9r+XaKlSDoKAgPfnkk/J4PKpTp4569uypGTNm8Kp7qNWO\nHTumBx544PyleYWFhbr33ntdZwEAUGtc66vq3SNpsqRB1tpT1ZMEfK9z584qKCjQL3/5S02bNk29\ne/fW/v37XWcBN9y6desUFxenjIwMpaWlae3atWrWjKeUAgBwI13rc5zmSLpZ0ifGmEJjzLxqaALO\na9Cggd555x29/vrrKigoUFxcnNLT03nhCNQKXq9XkyZNUq9evRQaGiqPx6Nnn31WISEhrtMAAKh1\nrvVV9aKttZHW2g7njgnVFQb8wBijMWPGaOvWrercubPGjRunlJQUHThwwHUacN1s3rxZnTp10l/+\n8heNHz9eBQUFSkhIcJ0FAECtVZ2vqgdcV82bN9cnn3yiOXPmaN26dWrXrp0yMjJ49AkBxev1atq0\naYqPj1dZWZk+/PBDvfLKK7rppptcpwEAUKsxnOBXgoKCNHHiRG3evFmxsbG6//77NXDgQBUXF7tO\nA66Zx+NRhw4dNGPGDI0cOVLbtm1TSkqK6ywAACCGE/xUTEyMcnJyNGvWLK1du1axsbGaNWuWKioq\nfP/HQA1z4sQJPfLII+revbtOnTqllStX6s0331Tjxo1dpwEAgHMYTvBbwcHB+t3vfqcdO3aod+/e\neuKJJ9S5c2fl5+e7TgMui7VWy5Yt05133qm5c+fq0Ucf1fbt23XPPfe4TgMAAP+B4QS/d8cdd2j5\n8uVavHixDh48qISEBD322GP65ptvXKcBF7V7926lpKRoyJAhatCggTwej1566SXVr1/fdRoAALgA\nhhMCgjFGv/jFL7Rz506NHz9eL7/8slq1aqX09HTeOBc1yrfffqspU6aoXbt22rBhg2bPnq2CggJ1\n6dLFdRoAALgEhhMCSsOGDTV37lzl5+erdevWGjdunDp16qTc3FzXaajlrLX6+9//rjZt2uj555/X\nqFGjVFRUpMcff1x16tRxnQcAAHxgOCEg3X333crJydG7776rI0eOqEePHrrvvvv09ddfu05DLeTx\neJSUlKQRI0YoPDxcHo9Hb7zxhiIiIlynAQCAy8RwQsAyxmjEiBHatWuXnnnmGS1btkytWrXSE088\noSNHjrjOQy2wa9cupaamKikpSfv371d6erq++OILde3a1XUaAAC4QgwnBLx69erpj3/8o4qKijRq\n1Ci9+OKL+tnPfqbp06fr5MmTrvMQgEpLSzVhwgS1a9dO2dnZmjFjhvbs2aOxY8cqODjYdR4AALgK\nDCfUGnfccYdee+01bd26VX379lVaWppatmypl19+WV6v13UeAkBZWZkmT56s6OhoLVy4UA8//LD2\n7dunqVOn6qabbnKdBwAArgHDCbVObGysli5dqry8PMXGxuq3v/2tYmJiNGfOHJ0+fdp1HvxQWVmZ\nJk2apBYtWuiFF15Qamqqdu7cqb/+9a8KDw93nQcAAKoBwwm1VkJCgtasWaNVq1apefPmevTRR9Wi\nRQvNnDlTJ06ccJ0HP3Do0CE9+eSTioqK0qxZszRs2DDt3LlTb7/9tqKjo13nAQCAasRwQq1mjFG/\nfv2Um5urdevWKS4uTpMnT1ZUVJSmT5+uo0ePuk5EDVRUVKQJEyYoKipKs2fPPv8eYm+++aZatWrl\nOg8AAFwHDCfgnB49emjVqlXKy8tTt27dlJaWpmbNmmnixIkqKipynQfHrLXKycnR4MGD1bZtW73x\nxhu6//77GUwAANQSDCfgPyQkJGj58uXavHmzhg8frgULFqhNmzYaMGCAVq9eLWut60TcQGfPntWi\nRYuUkJCgnj17yuPxaNq0aSouLlZ6ejqDCQCAWsK4+CEwPj7e5ufn3/D7Ba7GoUOHNG/ePM2dO1dl\nZWW68847NXHiRI0aNUoNGzZ0nYfr5KuvvlJ6eroWLlyoQ4cOKSYmRr///e/1q1/9SvXq1XOdBwAA\nqoExZqO1Nv6ybstwAi6P1+vVu+++qxdffFGFhYWqV6+ehg8froceekhdunSRMcZ1Iq5RZWWlVqxY\noXnz5mnlypUyxmjAgAGaMGGC+vfvz3swAQAQYBhOwHVkrVV+fr7S09OVmZmpkydPqm3btho7dqxG\njx7Ny0/7oe3bt+utt95SRkaGSkpK1KRJEz300EMaO3asIiMjXecBAIDrhOEE3CAnT57UokWLtGDB\nAuXl5Sk4OFj9+vXTyJEjNWTIEDVo0MB1Ii6itLRUmZmZeuutt1RYWKjg4GD1799fY8eO1cCBA1Wn\nTh3XiQAA4DpjOAEObNu2TRkZGcrMzFRxcbHCwsI0YMAAjRw5UikpKQoLC3OdWOuVlZVp2bJleu+9\n97R69WpVVVUpPj5eo0eP1ogRI/TTn/7UdSIAALiBGE6AQ9ZaffbZZ8rMzNSiRYt0+PBh1a9fX8nJ\nyRo0aJBSUlLUuHFj15m1RnFxsbKysrR06VJ5PB5VVVWpRYsWGjlypEaPHq02bdq4TgQAAI4wnIAa\noqKiQmvWrNHSpUu1fPlylZaWKigoSN26ddOgQYM0cOBAtWrViheWqEbfffedPv/8c3388cdasWKF\nNm3aJElq3769UlNTNXToUMXFxfFnDgAAGE5ATVRVVaVNmzZp+fLl598nSpKaNWumvn37qk+fPurT\np4+aNGniuNT/fPnll/r444+1atUqrVmzRsePH1dQUJASExM1ZMgQpaamKjo62nUmAACoYRhOgB8o\nLi7WypUrlZ2drTVr1qi8vFySFBsbq969e6tbt25KTExU8+bNeXTkRyorK7V9+3atX79eHo9H69ev\n19dffy1Jat68uZKTk5WcnKzevXvrlltucVwLAABqMoYT4GeqqqpUWFio7OxsZWdnKzc3V6dOnZIk\nRUREKDExUV26dFFiYqI6dOhQa16tz1qrkpISFRQUqKCgQHl5edqwYYOOHz8uSWrSpImSkpLUvXt3\nJScnKyYmhpEJAAAuG8MJ8HPfffedtm7dqry8PH322WfKy8vT3r17z389KipKcXFx54/27dsrOjpa\nISEhDquvzYkTJ7Rnzx7t2rVLhYWFKigoUGFhoY4cOSJJMsaobdu26t69u7p166akpCRFRUUxlAAA\nwFVjOAEB6PDhw/rHP/6hzZs3a8uWLdqyZYt2796tyspKSVJISIiioqLUsmVLtWzZUtHR0WrZsqVa\ntGih22+/XbfeeqvTkVFRUaHS0lKVlJSopKRExcXF2rNnj4qKirR7926Vlpaev23dunXVrl07dezY\nUR06dFDHjh111113qX79+s76AQBA4GE4AbXEmTNntHPnTm3ZskVFRUXat2+f9u3bp7179+rYsWP/\ndts6deooIiJCERERatKkiSIiItSoUSM1aNDgv46f/OQnCgkJOX8EBwcrJCREQUFB8nq98nq9Onv2\n7Pnfe71effPNNzp69Oj5o7y8XEePHtWhQ4dUUlKiQ4cOqaqq6t+aGjdurFatWp0/WrdurZiYGLVu\n3Vp169a9kX+UAACgFmI4AbWctVbl5eXat2+fvvrqK5WWlurgwYP/9euxY8fk9Xqr/f4bNGigW2+9\nVY0aNVJ4eLiaNWv2b0fTpk0VGRmpRo0aVft9AwAAXK4rGU7++4QIABdljNFtt92m2267TZ07d77k\nbb1er44fP37+OHbsmM6cOaPKykpVVFScPyorK1VZWanQ0NALHg0bNlSjRo3UsGFDv36uFQAAwIXw\n0w1Qy4WGhio8PFzh4eGuUwAAAGqsINcBAAAAAFDTMZwAAAAAwAeGEwAAAAD4wHACAAAAAB8YTgAA\nAADgA8MJAAAAAHxgOAEAAACADwwnAAAAAPCB4QQAAAAAPjCcAAAAAMAHhhMAAAAA+MBwAgAAAAAf\nGE4AAAAA4APDCQAAAAB8YDgBAAAAgA8MJwAAAADwgeEEAAAAAD4wnAAAAADAB4YTAAAAAPjAcAIA\nAAAAHxhOAAAAAOADwwkAAAAAfGA4AQAAAIAPDCcAAAAA8MFYa2/8nRpzWFLxDb/jmqOxpCOuI4Ar\nxHkLf8W5C3/EeQt/5I/nbXNrbfjl3NDJcKrtjDH51tp41x3AleC8hb/i3IU/4ryFPwr085ZL9QAA\nAADAB4YTAAAAAPjAcHLjVdcBwFXgvIW/4tyFP+K8hT8K6POW5zgBAAAAgA884gQAAAAAPjCcAAAA\nAMAHhpMjxpiZxphdxpgtxpgsY8wtrpuAizHG3GOMKTLG7DXGPOW6B/DFGBNpjPnUGLPDGLPdGPOY\n6ybgchljgo0xBcaYD1y3AJfLGHOLMea9cz/f7jTGdHHdVN0YTu58IqmdtTZO0m5JUxz3ABdkjAmW\n9H+S7pUUK2mkMSbWbRXgU4WkJ6y1sZISJU3kvIUfeUzSTtcRwBV6SdJH1to2ku5SAJ7DDCdHrLWr\nrLUV5z7Mk9TMZQ9wCZ0l7bXWfmmtPSvpXUmDHTcBl2StLbXWbjr3+xP6/ht4U7dVgG/GmGaS/kfS\nAtctwOUyxjSU1EPSQkmy1p611n7jtqr6MZxqhl9LWuk6AriIppL++aOPS8QPoPAjxpgoSR0lfe62\nBLgsL0qaLKnKdQhwBVpIOizp9XOXmS4wxtzkOqq6MZyuI2PMamPMtgscg390m6n6/pKSDHelABCY\njDH1JS2R9Li19rjrHuBSjDEDJJVZaze6bgGuUIikuyW9Yq3tKOlbSQH3nOgQ1wGBzFrb91JfN8aM\nkTRAUh/LG2qh5jogKfJHHzc79zmgRjPG1NH3oynDWrvUdQ9wGbpJGmSMSZEUJqmBMeZta+39jrsA\nX0oklVhrf3hk/z0F4HDiESdHjDH36PuH4gdZa0+57gEu4QtJMcaYFsaYupLuk7TccRNwScYYo++v\ntd9prZ3luge4HNbaKdbaZtbaKH3/d+0aRhP8gbX2oKR/GmNan/tUH0k7HCZdFzzi5M4cSaGSPvn+\n+7vyrLUT3CYB/81aW2GMeUTSx5KCJb1mrd3uOAvwpZuk0ZK2GmMKz33uaWvtCodNABDIHpWUce4f\nWb+U9KDjnmpnuEIMAAAAAC6NS/UAAAAAwAeGEwAAAAD4wHACAAAAAB8YTgAAAADgA8MJAAAAAHxg\nOAEAAACADwwnAAAAAPDh/wEFGd1YSx3OqwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f3cdf0ee3d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAJiCAYAAAArAjhaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xm0lXWh//HPwxTgkIA4oJCZQ6mpPzWvV6l7C0XFNAUk\nLS2nLKe0HFGch5xKK01FA5xyKANNcQS9Bs6WlXmtyAlxIklEZZTn94dY1sWJs895zt779VqLJeew\nz34+dy1by/f9sp+nKMsyAAAAtEyHqgcAAAA0AnEFAABQA+IKAACgBsQVAABADYgrAACAGhBXAAAA\nNSCuAAAAakBcAQAA1IC4AgAAqIFOVQ94L8svv3y52mqrVT0DAABoYg8//PDfyrLs/X6va9dxtdpq\nq+Whhx6qegYAANDEiqJ4+oO8zl8LBAAAqAFxBQAAUAPiCgAAoAbEFQAAQA2IKwAAgBoQVwAAADUg\nrgAAAGpAXAEAANRATeKqKIpRRVG8VBTFo+/y5/9dFMXMoigeWfTruFpcFwAAoL3oVKP3GZPkvCSX\nvcdrfl2W5RdrdD0AAIB2pSYnV2VZ3p1kRi3eCwAAoB615WeuNi+K4vdFUdxcFMW67/aioij2LYri\noaIoHpo+fXobzgMAAFhybRVXv0nSryzL9ZP8OMm4d3thWZYjy7LcpCzLTXr37t1G8wAAAFqmTeKq\nLMtXy7J8bdHvxyfpXBTF8m1xbQAAgLbQJnFVFMVKRVEUi36/6aLrvtwW1wYAAGgLNblbYFEUVyX5\n7yTLF0XxbJLjk3ROkrIsL0wyNMl+RVEsSDI7yS5lWZa1uDYAAEB7UJO4Ksty1/f58/Py1q3aAQAA\nGlJb3i0QAACgYYkrAACAGhBXAAAANSCuAAAAakBcAQAA1IC4AgAAqIGa3IodkuTJJ5/M+PHjM3v2\n7MyZM+df/rm47w0cODDHHHNM1bMBAKAmxBU18cILL6R///557rnn/vG9jh07plu3bunates//tm1\na9d06dIlDz/8cJZaaqkKFwMAQG2JK1ps3rx5GTJkSF555ZXce++9WXfdddOtW7d06rT4f73Gjx+f\n7bbbLnvttVcbLwUAgNYjrmixb3/727nnnntyzTXXZLPNNnvf148cOTIrrLBCdthhhzZYBwAAbcMN\nLWiRiy++OBdddFGOOOKIDBs27H1fP23atNx4443Zc88906VLlzZYCAAAbUNcscTuvffeHHDAARk4\ncGBOO+20D/Qzo0ePzptvvpl99tmnldcBAEDbElcskeeeey5DhgxJ3759c9VVV6Vjx47v+zMLFy7M\nJZdckgEDBmSNNdZog5UAANB2xBUf2ty5czN06NC8+uqrGTduXHr27PmBfu7222/P008/nX333beV\nFwIAQNtzQws+tG9/+9u59957c+211+bTn/70B/65kSNHpnfv3tlxxx1bcR0AAFTDyRUfykUXXZSR\nI0fmqKOOys477/yBf+7555/PDTfckD322MONLAAAaEjiig9s8uTJOeigg7LNNtvklFNO+VA/O2bM\nmCxYsMCNLAAAaFhFWZZVb3hXm2yySfnQQw9VPYO8dQOLjTfeOEsttVQefPDB9OjR4wP/7MKFC7PG\nGmvkYx/7WO68885WXAkAALVXFMXDZVlu8n6vc3LF+5o7d26GDBmSWbNmZdy4cR8qrJJk4sSJefLJ\nJ93IAgCAhuaGFrynsixz4IEH5r777ssvfvGLrLfeeh/6PUaOHJlevXplp512aoWFAADQPji54j1d\ndNFFueSSS3L00UdnyJAhH/rnX3zxxYwdOzZf//rX07Vr11ZYCAAA7YO44l1Nnjw53/72t7Ptttvm\npJNOWqL3uPTSS7NgwYJ84xvfqPE6AABoX9zQgsWaNm1aNt544yyzzDJ58MEHs9xyy33o91i4cGHW\nXnvt9OnTJ//zP//TCisBAKD1uaEFS2zOnDkZPHhwXn/99YwbN26JwipJ7rrrrkyZMsWNLAAAaApu\naMG/KMsyBxxwQB544IFcd911WXfddZf4vUaOHJkePXos0We1AACg3ogr/sUFF1yQUaNGZcSIERk8\nePCH+tl58+blqaeeypQpU/KXv/wlY8eOzf777+9GFgAANAVxxT/8+te/zsEHH5ztttsuJ5544vu+\n/vLLL8+9996bKVOmZMqUKXn66aezcOHCf/z5KquskgMOOKA1JwMAQLvhhhYkSZ599tlsvPHG+ehH\nP5oHHnjgfT9nNXv27HTv3j1LL710PvWpT2WNNdb4P7969+6doija6P8CAABoHR/0hhZOrvjHDSze\neOON3HnnnR/oBhZdu3ZNp06dctBBB+W0005rg5UAANC+iasmV5Zl9t9//zz44IMZO3Zs1llnnQ/0\nc0VRpGfPnnn55ZdbeSEAANQHt2Jvcj/5yU8yevToHHvssdlxxx0/1M/26tUrM2bMaKVlAABQX8RV\nE7v77rtzyCGH5Itf/GJOOOGED/3zTq4AAOCfxFWTmjp1aoYOHZpPfOITueKKK9Khw4f/V8HJFQAA\n/JO4akKzZ8/O4MGDM2fOnIwbNy4f/ehHl+h9nFwBAMA/uaFFkynLMvvtt18eeuihXH/99fnkJz+5\nxO/l5AoAAP7JyVWTOe+883LppZfm+OOPzw477NCi9+rZs2feeOONzJkzp0brAACgfomrJvI///M/\n+c53vpMddtghxx13XIvfr1evXkni9AoAACKumsYzzzyTnXfeOWuuuWYuv/zyJbqBxb/r2bNnkvjc\nFQAARFw1hdmzZ2ennXbK3LlzM27cuCy77LI1eV8nVwAA8E9uaNHgyrLMN7/5zfzmN7/JDTfckLXX\nXrtm7+3kCgAA/snJVYP70Y9+lMsvvzwnnnhitt9++5q+t5MrAAD4J3HVwO68884ceuih2XHHHTNi\nxIiav7+TKwAA+Cdx1aCefvrpDBs2LGuuuWYuvfTSmtzA4t917949H/nIR5xcAQBAxFVDmj17dgYP\nHpx58+bl+uuvr9kNLP5dURTp2bOnkysAAIgbWjScsiyz77775re//W1+9atfZa211mrV6/Xs2dPJ\nFQAARFw1nHPPPTdXXHFFTj755Gy33Xatfr1evXo5uQIAgPhrgQ1l4sSJOfzww7PTTjvl6KOPbpNr\nOrkCAIC3iKsG8dRTT2XYsGFZe+21W+0GFovj5AoAAN4irhrAG2+8kZ122ikLFizIuHHjsswyy7TZ\ntd8+uSrLss2uCQAA7ZHPXNW5sizzjW98I7/73e9y4403Zs0112zT6/fq1Stz587NG2+8kaWWWqpN\nrw0AAO2Jk6s6d8455+RnP/tZTjnllAwaNKjNr//2g4R97goAgGYnrurYHXfckcMPPzxDhgzJ8OHD\nK9nQq1evJPG5KwAAmp64qlNPPvlkvvzlL+dTn/pUxowZk6IoKtnh5AoAAN4irurQ2zewWLhwYcaN\nG5ell166si1OrgAA4C1uaFFnyrLM3nvvnd///vcZP3581lhjjUr3OLkCAIC3iKs68/3vfz9XX311\nTjvttGyzzTZVz/lHXDm5AgCg2flrgXXk9ttvz5FHHpmhQ4fmqKOOqnpOkqRbt27p1q2bkysAAJqe\nuKoTTz75ZHbZZZesu+66GT16dGU3sFicXr165YUXXqh6BgAAVEpc1YHXX389O+64Y8qyzNixYyu9\ngcXifPazn82NN96Y1157reopAABQGXHVzr19A4tHH300V111VT7xiU9UPen/OOCAAzJz5sxceeWV\nVU8BAIDKiKt27qyzzso111yT0047LVtvvXXVcxZr8803z4YbbpjzzjsvZVlWPQcAACohrtqx2267\nLcOHD8+wYcNyxBFHVD3nXRVFkQMPPDCPPvpo7r777qrnAABAJcRVO/XXv/71HzewGDVqVLu6gcXi\n7LrrrunRo0fOP//8qqcAAEAlxFU79Prrr2ennXZKkowbNy5LLbVUxYveX/fu3bP33nvnl7/8ZaZN\nm1b1HAAAaHPiqp0pyzJ77bVX/vjHP+aaa67J6quvXvWkD2y//fbLwoULc9FFF1U9BQAA2py4amfO\nPPPMXHvttTn99NOz1VZbVT3nQ1l99dUzaNCgjBw5MvPmzat6DgAAtClx1Y7ccsstGT58eHbZZZcc\ndthhVc9ZIgceeGBefPHFXHfddVVPAQCANlW051tnb7LJJuVDDz1U9Yw2MWXKlHzmM59Jv379cs89\n99TF56wWZ+HChVl77bWzwgorZPLkyVXPAQCAFiuK4uGyLDd5v9c5uWoHXnvttey4447p0KFD3dzA\n4t106NAhBxxwQO6555785je/qXoOAAC0GXFVsddeey3LLLPMP25g8fGPf7zqSS22xx57ZNlll83u\nu++e6dOnVz0HAADahLiq2NunO6uvvnq23HLLitfUxnLLLZfrr78+TzzxRAYOHJi///3vVU8CAIBW\nJ64q9slPfjJJ8t3vfrfiJbX13//93xk3blwee+yxbLPNNnn11VerngQAAK1KXLUTRVFUPaHmtt56\n6/z85z/Pb37zm2y33XZ5/fXXq54EAACtRlzRqnbYYYdceeWVueeee/KlL30pc+bMqXoSAAC0CnFF\nqxs2bFhGjx6diRMnZujQoR4wDABAQxJXtImvfe1rufDCC3PTTTdl1113zYIFC6qeBAAANSWuaDP7\n7rtvzj333Pzyl7/M17/+9bz55ptVTwIAgJrpVPUAmsvBBx+c2bNnZ/jw4enatWsuvvjidOig8QEA\nqH/iijZ31FFH5Y033sjJJ5+cbt265cc//nFD3i0RAIDmIq6oxIknnpjZs2fn7LPPTrdu3XLmmWcK\nLAAA6pq4ohJFUeTMM8/8l8A66aSTqp4FAABLTFxRmaIo8qMf/Shz5sz5x18RHD58eNWzAABgiYgr\n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\n1MCGG26Yr3/96/nhD3+Yp556quo5AABUQFxBjZx88snp2LGjBwsDADQpcQU1suqqq+bQQw/NVVdd\nlQceeKDqOQAAtDFxBTV0xBFHZIUVVvBgYQCAJiSuoIaWWWaZnHjiifn1r3+d66+/vuo5AAC0IXEF\nNbbPPvvkk5/8ZI488sjMnz+/6jkAALQRcQU19vaDhf/85z9n5MiRVc8BAKCNiCtoBdttt10+//nP\n54QTTsjMmTOrngMAQBsQV9AKiqLI2Wefnb/97W85/fTTq54DAEAbEFfQSjbaaKPsvvvuOeecc/LM\nM89UPQcAgFYmrqAVnXLKKSmKIsccc0zVUwAAaGXiClpRv3798p3vfCdXXHFFHn744arnAADQisQV\ntLKjjjoqvXv39mBhAIAGJ66glS277LI54YQTctddd+XGG2+seg4AAK1EXEEb+MY3vpG11147hx9+\nuAcLAwA0KHEFbaBz584588wz86c//SmXXHJJ1XMAAGgF4grayPbbb5//+q//yvHHH59XX3216jkA\nANSYuII28vaDhadPn54zzjij6jkAANSYuII2tMkmm+SrX/1qfvCDH2Tq1KlVzwEAoIbEFbSxU089\nNWVZZsSIEVVPAQCghsQVtLGPfexjOeSQQ3L55Zfnt7/9bdVzAACoEXEFFRg+fHh69uzpwcIAAA1E\nXEEFPvrRj+aEE07IxIkTc/PNN1c9BwCAGhBXUJFvfvObWXPNNXP44YdnwYIFVc8BAKCFxBVU5O0H\nCz/22GMZNWpU1XMAAGghcQUV+tKXvpTPfvazOe644zJr1qyq5wAA0ALiCir09oOFX3zxxZx11llV\nzwEAoAXEFVRs0003za677pqzzz4706ZNq3oOAABLSFxBO3DaaaflzTffzLHHHlv1FAAAlpC4gnZg\ntdVWy8EHH5wxY8bkd7/7XdVzAABYAuIK2omjjz46PXr08GBhAIA6Ja6gnVhuueVy3HHH5Y477sit\nt95a9RwAAD4kcQXtyH777ZdPfOITOeywwzxYGACgzograEe6dOmSM844I3/84x8zZsyYqucAAPAh\niCtoZwYPHpzNN988xx57bF577bWq5wAA8AGJK2hniqLI97///bzwwgs5++yzq54DAMAHJK6gHdps\ns80ybNiwnHXWWXnuueeqngMAwAdQk7gqimKboij+VBTFlKIojlrMn/93URQzi6J4ZNGv42pxXWhk\n3/ve9zJ//vwcf/zxVU8BAOADaHFcFUXRMcn5SbZNsk6SXYuiWGcxL/11WZYbLvp1UkuvC41u9dVX\nz0EHHZRRo0blD3/4Q9VzAAB4H7U4udo0yZSyLJ8oy3JekquTfKkG7wtN75hjjslHP/rRHHHEEVVP\nAQDgfdQirlZJMvUdXz+76Hv/bvOiKH5fFMXNRVGs+25vVhTFvkVRPFQUxUPTp0+vwTyoXz179syx\nxx6bW265JbfddlvVcwAAeA9tdUOL3yTpV5bl+kl+nGTcu72wLMuRZVluUpblJr17926jedB+7b//\n/ll99dVz+OGH580336x6DgAA76IWcTUtSd93fL3qou/9Q1mWr5Zl+dqi349P0rkoiuVrcG1oeB/5\nyEdy+umn5/e//30uu+yyqucAAPAuahFXDyZZsyiKjxdF0SXJLklueOcLiqJYqSiKYtHvN1103Zdr\ncG1oCkOHDs1mm22WESNG5PXXX696DgAAi9HiuCrLckGSA5PcmuR/k1xbluUfi6L4VlEU31r0sqFJ\nHi2K4ndJfpRkl7Isy5ZeG5rF2w8Wfu655/KDH/yg6jkAACxGp1q8yaK/6jf+37534Tt+f16S82px\nLWhWm2++eYYOHZozzjgj3/jGN7LSSitVPQkAgHdoqxtaADXwve99L/PmzfNgYQCAdkhcQR1ZY401\ncsABB+SSSy7JH//4x6rnAADwDuIK6syIESOy7LLLerAwAEA7I66gzvTq1SsjRozI+PHjc8cdd1Q9\nBwCARcQV1KEDDzwwffv2zbnnnlv1FAAAFhFXUIc+8pGPZK211sorr7xS9RQAABYRV1CnunTpkvnz\n51c9AwCARcQV1KnOnTtn3rx5Vc8AAGARcQV1qkuXLuIKAKAdEVdQpzp37uyvBQIAtCPiCuqUkysA\ngPZFXEGdcnIFANC+iCuoU06uAADaF3EFdcrJFQBA+yKuoE65FTsAQPsirqBOeYgwAED7Iq6gTnXu\n3DkLFixIWZZVTwEAIOIK6laXLl2SxOkVAEA7Ia6gTvXu3TtJ8vjjj1e8BACARFxB3dppp53SuXPn\njBkzpuopAABEXEHdWn755bPDDjvk8ssvd9dAAIB2QFxBHdtrr73yt7/9LTfeeGPVUwAAmp64gjo2\ncODA9OnTJ6NHj656CgBA0xNXUMc6deqUr3/96xk/fnyef/75qucAADQ1cQV1bo899sjChQtz+eWX\nVz0FAKCpiSuoc2uttVb69++fUaNGeaAwAECFxBU0gL322it/+tOfcu+991Y9BQCgaYkraAA777xz\nllpqKTe2AACokLiCBrD00ktn2LBhufrqq/P6669XPQcAoCmJK2gQu+yyS1577bVMmjSp6ikAAE1J\nXEGD+M///M907NgxkydPrnoKAEBTElfQIJZZZplssMEGTq4AACoirqCB9O/fP/fff3/mz59f9RQA\ngKYjrqCBbLHFFnnjjTfyyCOPVD0FAKDpiCtoIFtssUWS+NwVAEAFxBU0kFVWWSWrrbaaz10BAFRA\nXEGD6d+/fyZPnpyyLKueAgDQVMQVNJgtttgiL7zwQp544omqpwAANBVxBQ2mf//+SXzuCgCgrYkr\naDDrrLNOlltuOZ+7AgBoY+IKGkyHDh2y+eabO7kCAGhj4goa0BZbbJHHHnssM2bMqHoKAEDTEFfQ\ngN7+3NU999xT8RIAgOYhrqABfeYzn0nnzp197goAoA2JK2hA3bp1y8Ybb+xzVwAAbUhcQYPaYost\n8uCDD2bu3LlVTwEAaAriChpU//79M3fu3Dz88MNVTwEAaAriChrU5ptvniQ+dwUA0EbEFTSoFVZY\nIWuttZbPXQEAtBFxBQ1siy22yOTJk1OWZdVTAAAanriCBta/f/+8/PLL+dOf/lT1FACAhieuoIF9\n5jOfSZI88sgjFS8BAGh84goa2Mc+9rEkydSpUyteAgDQ+MQVNLBll102yy67rLgCAGgD4goaXN++\nfcUVAEAbEFfQ4MQVAEDbEFfQ4MQVAEDbEFfQ4Pr27ZuXXnopc+bMqXoKAEBDE1fQ4Pr165ckefbZ\nZyteAgDQ2MQVNLi+ffsmcTt2AIDW1qnqAXXjkEOSVngQ63Lz5+fOJGuee25y7bU1f3/YbPbs3Jnk\nk/vvn6y4YtVzAADe24YbJueeW/WKJeLkChrcRz7ykSTJXJ+5AgBoVU6uPqhWqudXXnopn19xxZx/\nyCHZf//9W+UaNLeOSXbu3TuDBw7MRRddVPUcAICG5eQKmoDbsQMAtD5xBU2gX79+4goAoJWJK2gC\nTq4AAFqfuIIm0Ldv38ycOTOzZs2qegoAQMMSV9AEPOsKAKD1iStoAm/H1TPPPFPxEgCAxiWuoAk4\nuQIAaH3iCppAnz59UhSFuAIAaEXiCppA586d06dPH3EFANCKxBU0CbdjBwBoXeIKmoS4AgBoXeIK\nmkSfPn3y/PPPVz0DAKBhiStoEp06dcrChQurngEA0LDEFQAAQA2IKwAAgBoQVwAAADUgrgAAAGpA\nXAEAANS+eNzKAAAgAElEQVSAuAIAAKgBcQUAAFADNYmroii2KYriT0VRTCmK4qjF/HlRFMWPFv35\n74ui2KgW1wUAAGgvWhxXRVF0THJ+km2TrJNk16Io1vm3l22bZM1Fv/ZNckFLrwsAANCe1OLkatMk\nU8qyfKIsy3lJrk7ypX97zZeSXFa+5b4kyxVFsXINrg0AANAu1CKuVkky9R1fP7voex/2NUmSoij2\nLYrioaIoHpo+fXoN5gEAALS+dndDi7IsR5ZluUlZlpv07t276jkAAAAfSC3ialqSvu/4etVF3/uw\nrwEAAKhbtYirB5OsWRTFx4ui6JJklyQ3/NtrbkjytUV3DdwsycyyLJ+vwbUBAADahU4tfYOyLBcU\nRXFgkluTdEwyqizLPxZF8a1Ff35hkvFJBiWZkuSNJHu29LoAAADtSYvjKknKshyftwLqnd+78B2/\nL5McUItrAQAAtEft7oYWAAAA9UhcAQAA1IC4AgAAqAFxBQAAUAPiCgAAoAbEFTSJWbNmpVu3blXP\nAABoWOIKmsTUqVPTt2/fqmcAADQscQVNQlwBALQucQVNYurUqenXr1/VMwAAGpa4giYwa9aszJw5\n08kVAEArElfQBKZOnZok4goAoBWJK2gC4goAoPWJK2gCzzzzTBJxBQDQmsQVNIGpU6emKIr06dOn\n6ikAAA1LXEETmDp1avr06ZPOnTtXPQUAoGGJK2gCnnEFAND6xBU0AXEFAND6xBU0uLIsxRUAQBsQ\nV9DgXn755cyePVtcAQC0MnEFDe7tZ1z169ev4iUAAI1NXEGD8wBhAIC2Ia6gwYkrAIC2Ia6gwU2d\nOjWdO3fOCiusUPUUAICGJq6gwU2dOjWrrrpqOnTwP3cAgNbkv7agwbkNOwBA2xBX0OCeeeYZdwoE\nAGgD4goa2Jtvvplp06Y5uQIAaAPiChrYiy++mAULFogrAIA2IK6ggf3lL39Jknz84x+veAkAQOMT\nV9DAJk+enCTZdNNNK14CAND4xBU0sMmTJ2edddZJz549q54CANDwxBU0qIULF+aee+5J//79q54C\nANAUxBU0qMceeyyvvPJKtthii6qnAAA0BXEFDWrSpElJ4uQKAKCNiCtoUJMmTcpKK63kToEAAG1E\nXEGDmjx5cvr375+iKKqeAgDQFMQVNKBp06blqaee8nkrAIA2JK6gAb39fCuftwIAaDviChrQpEmT\n0r1792ywwQZVTwEAaBriChrQ5MmTs9lmm6Vz585VTwEAaBriChrMrFmz8sgjj/i8FQBAGxNX0GDu\nv//+LFy40OetAADamLiCBjNp0qR06NAhm222WdVTAACairiCBjN58uSsv/76WXbZZaueAgDQVMQV\nNJAFCxbk3nvv9XkrAIAKiCtoIL///e/z+uuv+7wVAEAFxBU0kEmTJiWJkysAgAqIK2ggkydPTr9+\n/dK3b9+qpwAANB1xBQ2iLMtMmjTJqRUAQEXEFTSIp59+Os8995zPWwEAVERcQYO4/fbbk0RcAQBU\nRFxBgxgzZkw+9alP5dOf/nTVUwAAmpK4ggbw+OOP55577slee+2VoiiqngMA0JTEFTSA0aNHp2PH\njtltt92qngIA0LTEFdS5BQsW5LLLLst2222XlVZaqeo5AABNS1xBnbvlllvywgsvZK+99qp6CgBA\nUxNXUOdGjRqVFVZYIYMGDap6CgBAUxNXUMemT5+eX/3qV9l9993TuXPnqucAADQ1cQV17IorrsiC\nBQuy5557Vj0FAKDpiSuoU2VZZtSoUdl0002z7rrrVj0HAKDpiSuoUw8//HAeffRRN7IAAGgnxBXU\nqTvvvDNJMmTIkIqXAACQiCuoW3Pnzk2SLLfcchUvAQAgEVdQt+bNm5eiKNKxY8eqpwAAEHEFdWv+\n/Pnp3LlziqKoegoAABFXULfmzZuXLl26VD0DAIBFxBXUqbdPrgAAaB/EFdQpJ1cAAO2LuII65eQK\nAKB9EVdQp5xcAQC0L+IK6pSTKwCA9kVcQZ1ycgUA0L6IK6hTTq4AANoXcQV1av78+U6uAADaEXEF\ndWrOnDlOrgAA2hFxBXXoL3/5SyZPnpwNNtig6ikAACwirqAODR8+PF27ds0xxxxT9RQAABYRV1Bn\nJk+enOuuuy5HHnlkVlppparnAACwiLiCOlKWZQ499ND06dMn3/3ud6ueAwDAO3SqegDwwf385z/P\n/fffn9GjR6d79+5VzwEA4B2cXEGdmDt3bo466qhssMEG2X333aueAwDAv3FyBXXi/PPPz5NPPpnb\nb789HTt2rHoOAAD/pkVxVRRFzyTXJFktyVNJhpVl+ffFvO6pJLOSvJlkQVmWm7TkutBsZsyYkZNP\nPjnbbLNNttxyy6rnAACwGC39a4FHJZlQluWaSSYs+vrdfL4syw2FFXx4p5xySl599dWcddZZVU8B\nAOBdtDSuvpTk0kW/vzTJji18P+Df/PWvf815552XvfbaK+utt17VcwAAeBctjasVy7J8ftHvX0iy\n4ru8rkxyR1EUDxdFse97vWFRFPsWRfFQURQPTZ8+vYXzoP4NHz48nTt3zkknnVT1FAAA3sP7fuaq\nKIo7kizuSaXHvPOLsizLoijKd3mb/mVZTiuKYoUktxdF8XhZlncv7oVlWY5MMjJJNtlkk3d7P2gK\n9957b37+85/nhBNOyMorr1z1HAAA3sP7xlVZlu/66fmiKF4simLlsiyfL4pi5SQvvct7TFv0z5eK\nohibZNMki40r4C1vPzB45ZVXzmGHHVb1HAAA3kdL/1rgDUm+vuj3X09y/b+/oCiKpYqiWObt3ycZ\nmOTRFl4XGt51112Xe++9NyeffHKWWmqpqucAAPA+WhpXpyfZqiiKvyTZctHXKYqiT1EU4xe9ZsUk\nk4qi+F2SB5LcVJblLS28LjS0efPm5cgjj8x6662XPfbYo+o5AAB8AC16zlVZli8nGbCY7z+XZNCi\n3z+RZIOWXAeazU9+8pM88cQTueWWWzwwGACgTrT05Aqosb///e856aSTMnDgwGy99dZVzwEA4AMS\nV9DOnHrqqXnllVc8MBgAoM6IK2hHnnzyyfz4xz/OnnvumfXXX7/qOQAAfAjiCtqRo48+Op06dfLA\nYACAOiSuoJ24//77c/XVV+ewww7LKqusUvUcAAA+JHEF7UBZljnssMOy4oor5vDDD696DgAAS6BF\nt2IHamPcuHGZNGlSRo4cmaWXXrrqOQAALAEnV1CxefPm5Ygjjsg666yTPffcs+o5AAAsISdXULGL\nLrooU6ZMyU033ZROnfxPEgCgXjm5ggq98sorOfHEEzNgwIBsu+22Vc8BAKAFxBVU6Hvf+15mzJiR\ns88+O0VRVD0HAIAWEFdQkaeeeio//OEP87WvfS0bbrhh1XMAAGghcQUVOeaYY1IURU455ZSqpwAA\nUAPiCirw4IMP5mc/+1kOPfTQrLrqqlXPAQCgBsQVtLG3Hxi8wgor5Mgjj6x6DgAANeK+z9DGbrjh\nhtx999254IILsswyy1Q9BwCAGnFyBW1o/vz5OeKII/LJT34y++yzT9VzAACoISdX0IZGjhyZP//5\nz/nVr37lgcEAAA3GyRW0kZkzZ+aEE07I5z//+Wy33XZVzwEAoMbEFbSR008/PX/72988MBgAoEGJ\nK2gDzzzzTM4555zsvvvu2WijjaqeAwBAKxBX0AY8MBgAoPGJK2hlDz/8cK644op85zvfSb9+/aqe\nAwBAKxFX0IrefmDw8ssv74HBAAANzr2goRXddNNNueuuu3Leeeflox/9aNVzAABoRU6uoJUsWLAg\nhx9+eNZaa63su+++Vc8BAKCVObmCVnLJJZfk8ccfz7hx49K5c+eq5wAA0MqcXEErePXVV3P88cfn\nc5/7XHbYYYeq5wAA0AacXEErOPPMM/PSSy/lxhtv9MBgAIAm4eQKauzZZ5/N97///XzlK1/JZz7z\nmarnAADQRsQV1NiIESNSlmVOPfXUqqcAANCGxBXU0G9/+9tcdtllOfjgg7PaaqtVPQcAgDYkrqBG\n3n5gcM+ePTN8+PCq5wAA0Mbc0AJq5Oabb87EiRPzox/9KMstt1zVcwAAaGNOrqAG3n5g8Jprrplv\nfvObVc8BAKACTq6gBkaNGpXHHnssv/zlL9OlS5eq5wAAUAEnV9BCs2bNynHHHZf+/ftnxx13rHoO\nAAAVcXIFLXTWWWflxRdfzPXXX++BwQAATczJFbTAtGnTcvbZZ2eXXXbJf/zHf1Q9BwCACokraIFj\njz02b775Zk477bSqpwAAUDFxBUvod7/7XcaMGZODDjooH//4x6ueAwBAxcQVLIG3Hxi83HLL5Zhj\njql6DgAA7YAbWsASuPXWW3PHHXfknHPOSY8ePaqeAwBAO+DkCj6kefPm5fDDD88nPvGJ7L///lXP\nAQCgnXByBR/CggUL8pWvfCWPPvpoxo4d64HBAAD8g5Mr+IDefPPN7LHHHrnuuutyzjnneGAwAAD/\nQlzBB7Bw4cJ861vfypVXXpnTTjsthxxySNWTAABoZ8QVvI+yLHPwwQfnkksuyYgRIzJ8+PCqJwEA\n0A6JK3gPZVnmyCOPzHnnnZdDDz00J510UtWTAABop8QVvIcTTzwxZ511Vvbff/+cddZZKYqi6kkA\nALRT4grexRlnnJETTzwxe+21V3784x8LKwAA3pO4gsX44Q9/mKOOOipf+cpXMnLkyHTo4H8qAAC8\nN//FCP9m5MiROeSQQzJ48OBceuml6dixY9WTAACoA+IK3uHyyy/Pt771rQwaNChXXXVVOnXynG0A\nAD4YcQWLXHvttdljjz3yhS98Idddd126dOlS9SQAAOqIuIIkN9xwQ7761a9m8803z/XXX5+uXbtW\nPQkAgDojrmh6t956a3beeedstNFGuemmm7LUUktVPQkAgDokrmhqd911V3bcccess846ueWWW7Ls\nsstWPQkAgDolrmha9957b774xS9m9dVXz2233ZYePXpUPQkAgDomrmhKDz/8cLbZZpusvPLKueOO\nO9K7d++qJwEAUOfEFU3nD3/4QwYOHJgePXpkwoQJWXnllaueBABAAxBXNJXHH388W265Zbp165aJ\nEyemX79+VU8CAKBBiCuaxl//+tcMGDAgSTJhwoSsvvrqFS8CAKCRdKp6ALSFZ555JgMGDMicOXNy\n1113Ze211656EgAADUZc0fCee+65DBgwIK+88komTpyYT3/601VPAgCgAYkrGtpLL72ULbfcMi+8\n8EJuv/32bLTRRlVPAgCgQYkrGtaMGTMycODAPPXUU7n55puz2WabVT0JAIAGJq5oSDNnzsw222yT\n//3f/82vfvWr/Nd//VfVkwAAaHDiiobz2muvZbvttstvf/vb/PKXv8zAgQOrngQAQBMQVzSU2bNn\n50tf+lLuvffeXH311dl+++2rngQAQJMQVzSMuXPnZsiQIbnzzjtz2WWXZeedd656EgAATURc0RDm\nz5+fXXfdNTfffHNGjhyZ3XbbrepJAAA0mQ5VD4CWevPNN/O1r30tY8eOzY9+9KN84xvfqHoSAABN\nSFxR1xYuXJh99tknV199dc4444wcdNBBVU8CAKBJiSvqVlmWOfDAAzNmzJgcf/zxOeKII6qeBABA\nExNX1KWyLHPYYYflggsuyBFHHJHjjz++6kkAADQ5cUVdOvbYY/ODH/wgBx10UE4//fQURVH1JAAA\nmpy4ou6ceuqpOfXUU7PPPvvk3HPPFVYAALQL4oq6cs4552TEiBHZbbfdcuGFF6ZDB/8KAwDQPvgv\nU+rGBRdckO9+97sZOnRoRo8enY4dO1Y9CQAA/kFcURfGjBmT/fffP9tvv32uvPLKdOrk+dcAALQv\n4op27+qrr87ee++drbbaKtdee226dOlS9SQAAPg/xBXt2tixY7Pbbrulf//+GTduXLp27Vr1JAAA\nWKwWxVVRFDsXRfHHoigWFkWxyXu8bpuiKP5UFMWUoiiOask1aR4333xzvvzlL2eTTTbJjTfemO7d\nu1c9CQAA3lVLT64eTTI4yd3v9oKiKDomOT/JtknWSbJrURTrtPC6NLiJEydm8ODBWW+99XLLLbdk\nmWWWqXoSAAC8pxbdFaAsy/9N8n7PGdo0yZSyLJ9Y9Nqrk3wpyWMtuTaNa/Lkydl+++2zxhpr5Lbb\nbstyyy1X9SQAAHhfbfGZq1WSTH3H188u+t5iFUWxb1EUDxVF8dD06dNbfRzty4MPPphtt902q666\nam6//fYsv/zyVU8CAIAP5H1ProqiuCPJSov5o2PKsry+1oPKshyZZGSSbLLJJmWt35/263e/+122\n3nrrLL/88pkwYUJWWmlx/9oBAED79L5xVZblli28xrQkfd/x9aqLvgf/8Nhjj2XLLbfMUkstlYkT\nJ2bVVVetehIAAHwobfHXAh9MsmZRFB8viqJLkl2S3NAG16VOTJkyJVtuuWU6deqUiRMnZrXVVqt6\nEgAAfGgtvRX7TkVRPJvkP5PcVBTFrYu+36coivFJUpblgiQHJrk1yf8mubYsyz+2bDaN4qmnnsoX\nvvCFzJ8/P3fccUfWXHPNqicBAMASaendAscmGbuY7z+XZNA7vh6fZHxLrkXjmTZtWgYMGJBZs2Zl\n4sSJWXfddaueBAAAS6xFcQVL6sUXX8yAAQMyffr03H777fl//+//VT0JAABaRFzR5l5++eVstdVW\nmTp1am655Zb8x3/8R9WTAACgxcQVbeqVV17JwIED8+c//zk33nhjPvvZz1Y9CQAAakJc0WZmzZqV\nQYMG5Q9/+EPGjh2bLbds6V3+AQCg/RBXtIk33ngj22+/fR544IFcc8012W677aqeBAAANSWuaHVz\n587NTjvtlLvvvjtXXHFFhgwZUvUkAACoOXFFq5o/f36GDRuW2267LT/96U/zla98pepJAADQKlr0\nEGF4LwsWLMhXv/rV3HDDDTnvvPOy1157VT0JAABajbiiVSxcuDB77bVXfv7zn+ess87KAQccUPUk\nAABoVeKqYksvvXS6d++eq6++OvPnz696Ts0ceOCBufzyy3PSSSflsMMOq3oOAAC0OnFVse7du+fi\niy/Or3/963z3u9+tek5NPPLII7ngggtyyCGHZMSIEVXPAQCANuGGFu3AV77ylfzmN7/J97///Wy0\n0UbZc889q57UIueff366deuW4447LkVRVD0HAADahJOrduL000/PgAED8q1vfSsPPPBA1XOW2IwZ\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f3cde86e850>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "f = plt.figure(figsize=(14,10))\n",
    "ax = f.add_axes([0.1,0.1,0.8,0.8])\n",
    "the = np.linspace(0.,2.*np.pi,1000)\n",
    "ax.plot(np.nanmin(VPoly[0,:])*np.cos(the), np.nanmin(VPoly[0,:])*np.sin(the),'-k')\n",
    "ax.plot(np.nanmax(VPoly[0,:])*np.cos(the), np.nanmax(VPoly[0,:])*np.sin(the),'-k')\n",
    "k = 5.5\n",
    "ax.plot([Ds[0,0],Ds[0,0]+k*dus[0,0]],[Ds[1,0],Ds[1,0]+k*dus[1,0]], '-r')\n",
    "\n",
    "f = plt.figure(figsize=(14,10))\n",
    "ax = f.add_axes([0.1,0.1,0.8,0.8])\n",
    "ax.plot(VPoly[0,:],VPoly[1,:],'-k')\n",
    "k = 5.5\n",
    "ax.plot([np.hypot(Ds[0,0],Ds[1,0]),np.hypot(Ds[0,0]+k*dus[0,0],Ds[1,0]+k*dus[1,0])],[Ds[2,0],Ds[2,0]+k*dus[2,0]], '-r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
