├── README.md ├── circle.m ├── diameter.m ├── f_energy.m ├── f_energyMR.m ├── f_energy_MR_poly.m ├── f_energy_MR_poly_onespeed.m ├── f_gamma.m ├── f_gammaLeft.m ├── f_gammaRight.m ├── f_power.m ├── figs ├── coverage.eps ├── coverage.fig ├── dubins planner.jpg ├── dubins.fig ├── dubins.jpg ├── p1_diameter.eps ├── p1_diameter.fig ├── p1_distance.eps ├── p1_distance.fig ├── p1_energy.eps ├── p1_polygon.eps ├── p1_polygon.fig ├── pathexample.eps ├── pathexample.fig └── untitled.jpg ├── fu.m ├── fx.m ├── getDubinsCurve.m ├── getDubinsWaypoints.m ├── getDubinsWaypointsEnergy.m ├── getPath.m ├── getPathAndEnergy.m ├── getPathAndEnergyMR.m ├── getPathMR.m ├── getPolygon.m ├── guiMR.fig ├── guiMR.m ├── leftTurnAndEnergy.m ├── license.txt ├── lineSegmentIntersect.m ├── polygon_intersection.m ├── powerFitting.m ├── power_circunfleja.m ├── rotatePolygon.m ├── test.m ├── testDubins.m ├── testEnergyOptimizationB2.m ├── testEnergyOptimizationMRB2.m ├── testIntersections.m ├── testPathOptimization.m ├── testRotation.m ├── test_compensation.m ├── test_integration.m └── u.m /README.md: -------------------------------------------------------------------------------- 1 | # Path Planning under Wind Conditions 2 | 3 | This is an experimental code related to the following paper: 4 | 5 | > Vasquez-Gomez, J. I., Gomez-Castañeda, C., De Cote, E. M., & Herrera-Lozada, J. C. (2016, November). Multirotor uav coverage planning under wind conditions. In 2016 International Conference on Mechatronics, Electronics and Automotive Engineering (ICMEAE) (pp. 32-37). IEEE. 6 | 7 | 8 | -------------------------------------------------------------------------------- /circle.m: -------------------------------------------------------------------------------- 1 | function [X,Y] = circle(P, radius, theta0, theta1, steep) 2 | Theta = theta0:steep:theta1; 3 | X = radius * cos(Theta); 4 | X = P(1,1) + X; 5 | 6 | Y = radius * sin(Theta); 7 | Y = P(1,2) + Y; 8 | end 9 | 10 | -------------------------------------------------------------------------------- /diameter.m: -------------------------------------------------------------------------------- 1 | function diam = diameter(M) 2 | % left limit 3 | l_limit = min(M(:,1)); 4 | 5 | %right limit 6 | r_limit = max(M(:,1)); 7 | 8 | diam = abs(r_limit - l_limit); 9 | 10 | end -------------------------------------------------------------------------------- /f_energy.m: -------------------------------------------------------------------------------- 1 | %objetive function 2 | 3 | function [energy, D, Gamma] = f_energy(M, dx, curve_radius, u, w, gamma_w, b0, b1 ,b2) 4 | 5 | %gamma_w = pi/4; 6 | %u = 10; 7 | %r = 15; 8 | %t0 = 0; 9 | %t1 = 4; 10 | 11 | %% Calculate path 12 | %disp('Calculate path'); 13 | [Path, D] = getPath(M, dx, curve_radius); 14 | 15 | % D = [lb lf ll lr]; 16 | lb = D(1); 17 | lf = D(2); 18 | ll = D(3); 19 | lr = D(4); 20 | %ltotal = lf + lb +ll+ lr; 21 | %ltotal = lf + lb; %remove 22 | 23 | %% Calculate energy 24 | %disp('Estimate energy'); 25 | 26 | % fordward energy 27 | theta = pi/2; 28 | vf = abs(u * sin(theta) + w * sin(gamma_w)); 29 | t0 = 0; 30 | t1 = lf/vf; 31 | 32 | ff_gamma = @(gamma_w, theta, t) gamma_w - theta; 33 | 34 | ff_power = @(t,b0,b1,b2,w,gamma_w, theta) b0 + b1 * abs(w * cos(ff_gamma(gamma_w, theta, t))) + b2 * abs(w * sin(ff_gamma(gamma_w, theta,t))); 35 | 36 | gammaf = ff_gamma( gamma_w,theta); 37 | p = ff_power(0,b0,b1,b2,w,gamma_w,theta); 38 | ef = p * t1; 39 | %ef = integral(@(t)ff_power(t, b0, b1, b2, w, gamma_w, theta), t0, t1); 40 | 41 | %backward energy 42 | theta = 3*pi/2; 43 | vb = abs(u * sin(theta) + w * sin(gamma_w)); 44 | t2 = lb/vb; 45 | gammab = ff_gamma(gamma_w,theta); 46 | p = ff_power(0,b0,b1,b2,w,gamma_w,theta); 47 | eb = p * t2; 48 | %eb = integral(@(t)ff_power(t, b0, b1, b2, w, gamma_w, theta), t0, t1); 49 | 50 | el = 0; 51 | er = 0; 52 | 53 | energy = ef + eb + el + er; 54 | Gamma = gammaf; 55 | %pause 56 | %exit 0 57 | end -------------------------------------------------------------------------------- /f_energyMR.m: -------------------------------------------------------------------------------- 1 | %objetive function 2 | 3 | function [energy, D, gamma_return] = f_energyMR(M, dx, curve_radius, v, w, gamma_w, b0, b1 ,b2) 4 | 5 | %gamma_w = pi/4; 6 | %u = 10; 7 | %r = 15; 8 | %t0 = 0; 9 | %t1 = 4; 10 | 11 | %% Calculate path 12 | %disp('Calculate path'); 13 | [Path, D] = getPathMR(M, dx, curve_radius); 14 | 15 | % D = [lb lf ll lr]; 16 | lb = D(1); 17 | lf = D(2); 18 | ll = D(3); 19 | lr = D(4); 20 | %ltotal = lf + lb +ll+ lr; 21 | %ltotal = lf + lb; %remove 22 | 23 | %% Calculate energy 24 | %disp('Estimate energy'); 25 | power_mr = @(v, w, angle, b0, b1, b2) b0 + b1 * abs(v - w*cos(angle)) + b2 * abs(w * sin(angle)); 26 | 27 | % fordward energy 28 | theta = pi/2; 29 | t = lf/v; 30 | gamma = gamma_w-theta; 31 | gamma_return = gamma; 32 | p = power_mr(v,w,gamma,b0,b1,b2); 33 | ef = p * t; 34 | 35 | %backward energy 36 | theta = 3*pi/2; 37 | t = lb/v; 38 | gamma = gamma_w-theta; 39 | p = power_mr(v, w, gamma, b0, b1, b2); 40 | eb = p * t; 41 | 42 | %right energy 43 | theta = 0; 44 | t = lr/v; 45 | gamma = gamma_w-theta; 46 | p = power_mr(v,w,gamma,b0,b1,b2); 47 | er = p * t; 48 | 49 | %left energy 50 | theta = 0; 51 | t = ll/v; 52 | gamma = gamma_w-theta; 53 | p = power_mr(v,w,gamma,b0,b1,b2); 54 | el = p * t; 55 | 56 | energy = ef + eb + el + er; 57 | %pause 58 | %exit 0 59 | end -------------------------------------------------------------------------------- /f_energy_MR_poly.m: -------------------------------------------------------------------------------- 1 | %objetive function 2 | 3 | function [energy, D, gamma_return] = f_energy_MR_poly(M, dx, curve_radius, v, w, gamma_w, b0, b1 ,b2) 4 | 5 | velocity = [2 4 6 8 10 12 14 16]; 6 | power = [220 215 210 208 212 230 260 300]; 7 | %plot(velocity, power, 'o'); 8 | p = polyfit(velocity,power,3); 9 | %t2 = 0:0.1:16; 10 | %y2 = polyval(p,t2); 11 | %figure 12 | %plot(velocity,power,'o',t2,y2) 13 | %title('Plot of Data (Points) and Model (Line)') 14 | 15 | 16 | %gamma_w = pi/4; 17 | %u = 10; 18 | %r = 15; 19 | %t0 = 0; 20 | %t1 = 4; 21 | 22 | %% Calculate path 23 | %disp('Calculate path'); 24 | [Path, D] = getPathMR(M, dx, curve_radius); 25 | 26 | % D = [lb lf ll lr]; 27 | lb = D(1); 28 | lf = D(2); 29 | ll = D(3); 30 | lr = D(4); 31 | %ltotal = lf + lb +ll+ lr; 32 | %ltotal = lf + lb; %remove 33 | 34 | %% Calculate energy 35 | %disp('Estimate energy'); 36 | %power_mr = @(v, w, angle, b0, b1, b2) b0 + b1 * abs(v - w*cos(angle)) + b2 * abs(w * sin(angle)); 37 | power_mr = @(v, w, angle, b0, b1, b2) polyval(p,(abs(v - w*cos(angle)))) + polyval(p, abs(w * sin(angle))); 38 | 39 | % fordward energy 40 | theta = pi/2; 41 | t = lf/v; 42 | 43 | gamma = gamma_w-theta; 44 | gamma_return = gamma; 45 | p = power_mr(v,w,gamma,b0,b1,b2); 46 | ef = p * t; 47 | 48 | %backward energy 49 | theta = 3*pi/2; 50 | t = lb/v; 51 | gamma = gamma_w-theta; 52 | p = power_mr(v, w, gamma, b0, b1, b2); 53 | eb = p * t; 54 | 55 | %right energy 56 | theta = 0; 57 | t = lr/v; 58 | gamma = gamma_w-theta; 59 | p = power_mr(v,w,gamma,b0,b1,b2); 60 | er = p * t; 61 | 62 | %left energy 63 | theta = 0; 64 | t = ll/v; 65 | gamma = gamma_w-theta; 66 | p = power_mr(v,w,gamma,b0,b1,b2); 67 | el = p * t; 68 | 69 | energy = ef + eb + el + er; 70 | %pause 71 | %exit 0 72 | end -------------------------------------------------------------------------------- /f_energy_MR_poly_onespeed.m: -------------------------------------------------------------------------------- 1 | %objetive function 2 | 3 | function [energy, D, gamma_return] = f_energy_MR_poly_onespeed(M, dx, curve_radius, v_spd, w_spd, gamma_w) 4 | disp('Calculating Energy'); 5 | velocity = [2 4 6 8 10 12 14 16]; 6 | power = [220 215 210 208 212 230 260 300]; 7 | %plot(velocity, power, 'o'); 8 | coef = polyfit(velocity,power,3); 9 | power_mr = @(speed) polyval(coef, speed); 10 | %t2 = 0:0.1:16; 11 | %y2 = polyval(p,t2); 12 | %figure 13 | %plot(velocity,power,'o',t2,y2) 14 | %title('Plot of Data (Points) and Model (Line)') 15 | 16 | 17 | W = [w_spd.*cos(gamma_w); w_spd.*sin(gamma_w)]; 18 | 19 | %% Calculate path 20 | %disp('Calculate path'); 21 | [Path, D] = getPathMR(M, dx, curve_radius); 22 | 23 | % D = [lb lf ll lr]; 24 | lb = D(1); 25 | lf = D(2); 26 | ll = D(3); 27 | lr = D(4); 28 | %ltotal = lf + lb +ll+ lr; 29 | %ltotal = lf + lb; %remove 30 | 31 | %% Calculate energy 32 | %disp('Estimate energy'); 33 | 34 | % fordward energy 35 | theta = pi/2; 36 | t = lf/v_spd; 37 | 38 | V = [v_spd .* cos(theta);v_spd .* sin(theta)]; 39 | U = V - W; 40 | u_spd = norm(U); 41 | p = power_mr(u_spd); 42 | ef = p * t; 43 | 44 | gamma_return = gamma_w-theta; 45 | 46 | %backward energy 47 | theta = 3*pi/2; 48 | t = lb/v_spd; 49 | V = [v_spd .* cos(theta);v_spd .* sin(theta)]; 50 | U = V - W; 51 | u_spd = norm(U); 52 | p = power_mr(u_spd); 53 | eb = p * t; 54 | 55 | %right energy 56 | theta = 0; 57 | t = lr/v_spd; 58 | V = [v_spd .* cos(theta);v_spd .* sin(theta)]; 59 | U = V - W; 60 | u_spd = norm(U); 61 | p = power_mr(u_spd); 62 | er = p * t; 63 | 64 | %left energy 65 | theta = 0; 66 | t = ll/v_spd; 67 | V = [v_spd .* cos(theta);v_spd .* sin(theta)]; 68 | U = V - W; 69 | u_spd = norm(U); 70 | p = power_mr(u_spd); 71 | el = p * t; 72 | 73 | energy = ef + eb + el + er; 74 | %pause 75 | %exit 0 76 | end -------------------------------------------------------------------------------- /f_gamma.m: -------------------------------------------------------------------------------- 1 | function gamma = f_gamma(gamma_w, u, r, t) 2 | gamma = gamma_w - u*t/r - pi/2; 3 | end -------------------------------------------------------------------------------- /f_gammaLeft.m: -------------------------------------------------------------------------------- 1 | % calculates the gamma angle parametrized by time 2 | % We assume that the uav is turning left following a perfect circle and 3 | % t = 0 starts pointing to the north 4 | 5 | function gamma = f_gammaLeft(gamma_w, u, r, t) 6 | gamma = gamma_w - u*t/r - pi/2; 7 | end 8 | 9 | -------------------------------------------------------------------------------- /f_gammaRight.m: -------------------------------------------------------------------------------- 1 | % calculates the gamma angle parametrized by time 2 | % We assume that the uav is turning right and starts pointing to the north 3 | % t = 0 4 | function gamma = f_gammaRight(gamma_w, u, r, t) 5 | gamma = gamma_w + u*t/r - pi/2; 6 | end 7 | 8 | -------------------------------------------------------------------------------- /f_power.m: -------------------------------------------------------------------------------- 1 | function p = f_power(t,b0,b1,b2,w,gamma_w, u, r) 2 | 3 | p = b0 + b1 * abs(w * cos(f_gamma(gamma_w, u, r, t))) + b2 * abs(w * sin(f_gamma(gamma_w, u, r, t))); 4 | 5 | end -------------------------------------------------------------------------------- /figs/coverage.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%Creator: (MATLAB, The Mathworks, Inc. Version 8.4.0.150421 \(R2014b\). Operating System: Linux) 3 | %%Title: /home/irving/projects/wind_optimization/figs/coverage.eps 4 | %%CreationDate: 2016-03-17T11:55:51 5 | %%Pages: (atend) 6 | %%BoundingBox: 0 0 383 377 7 | %%LanguageLevel: 2 8 | %%EndComments 9 | %%BeginProlog 10 | %%BeginResource: procset (Apache XML Graphics Std ProcSet) 1.2 0 11 | %%Version: 1.2 0 12 | %%Copyright: (Copyright 2001-2003,2010 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0) 13 | /bd{bind def}bind def 14 | /ld{load def}bd 15 | /GR/grestore ld 16 | /M/moveto ld 17 | /LJ/setlinejoin ld 18 | /C/curveto ld 19 | /f/fill ld 20 | /LW/setlinewidth ld 21 | /GC/setgray ld 22 | /t/show ld 23 | /N/newpath ld 24 | /CT/concat ld 25 | /cp/closepath ld 26 | /S/stroke ld 27 | /L/lineto ld 28 | /CC/setcmykcolor ld 29 | /A/ashow ld 30 | /GS/gsave ld 31 | /RC/setrgbcolor ld 32 | /RM/rmoveto ld 33 | /ML/setmiterlimit ld 34 | /re {4 2 roll M 35 | 1 index 0 rlineto 36 | 0 exch rlineto 37 | neg 0 rlineto 38 | cp } bd 39 | /_ctm matrix def 40 | /_tm matrix def 41 | /BT { _ctm currentmatrix pop matrix _tm copy pop 0 0 moveto } bd 42 | /ET { _ctm setmatrix } bd 43 | /iTm { _ctm setmatrix _tm concat } bd 44 | /Tm { _tm astore pop iTm 0 0 moveto } bd 45 | /ux 0.0 def 46 | /uy 0.0 def 47 | /F { 48 | /Tp exch def 49 | /Tf exch def 50 | Tf findfont Tp scalefont setfont 51 | /cf Tf def /cs Tp def 52 | } bd 53 | /ULS {currentpoint /uy exch def /ux exch def} bd 54 | /ULE { 55 | /Tcx currentpoint pop def 56 | gsave 57 | newpath 58 | cf findfont cs scalefont dup 59 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 60 | /UnderlinePosition get Ts mul /To exch def 61 | /UnderlineThickness get Ts mul /Tt exch def 62 | ux uy To add moveto Tcx uy To add lineto 63 | Tt setlinewidth stroke 64 | grestore 65 | } bd 66 | /OLE { 67 | /Tcx currentpoint pop def 68 | gsave 69 | newpath 70 | cf findfont cs scalefont dup 71 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 72 | /UnderlinePosition get Ts mul /To exch def 73 | /UnderlineThickness get Ts mul /Tt exch def 74 | ux uy To add cs add moveto Tcx uy To add cs add lineto 75 | Tt setlinewidth stroke 76 | grestore 77 | } bd 78 | /SOE { 79 | /Tcx currentpoint pop def 80 | gsave 81 | newpath 82 | cf findfont cs scalefont dup 83 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 84 | /UnderlinePosition get Ts mul /To exch def 85 | /UnderlineThickness get Ts mul /Tt exch def 86 | ux uy To add cs 10 mul 26 idiv add moveto Tcx uy To add cs 10 mul 26 idiv add lineto 87 | Tt setlinewidth stroke 88 | grestore 89 | } bd 90 | /QT { 91 | /Y22 exch store 92 | /X22 exch store 93 | /Y21 exch store 94 | /X21 exch store 95 | currentpoint 96 | /Y21 load 2 mul add 3 div exch 97 | /X21 load 2 mul add 3 div exch 98 | /X21 load 2 mul /X22 load add 3 div 99 | /Y21 load 2 mul /Y22 load add 3 div 100 | /X22 load /Y22 load curveto 101 | } bd 102 | /SSPD { 103 | dup length /d exch dict def 104 | { 105 | /v exch def 106 | /k exch def 107 | currentpagedevice k known { 108 | /cpdv currentpagedevice k get def 109 | v cpdv ne { 110 | /upd false def 111 | /nullv v type /nulltype eq def 112 | /nullcpdv cpdv type /nulltype eq def 113 | nullv nullcpdv or 114 | { 115 | /upd true def 116 | } { 117 | /sametype v type cpdv type eq def 118 | sametype { 119 | v type /arraytype eq { 120 | /vlen v length def 121 | /cpdvlen cpdv length def 122 | vlen cpdvlen eq { 123 | 0 1 vlen 1 sub { 124 | /i exch def 125 | /obj v i get def 126 | /cpdobj cpdv i get def 127 | obj cpdobj ne { 128 | /upd true def 129 | exit 130 | } if 131 | } for 132 | } { 133 | /upd true def 134 | } ifelse 135 | } { 136 | v type /dicttype eq { 137 | v { 138 | /dv exch def 139 | /dk exch def 140 | /cpddv cpdv dk get def 141 | dv cpddv ne { 142 | /upd true def 143 | exit 144 | } if 145 | } forall 146 | } { 147 | /upd true def 148 | } ifelse 149 | } ifelse 150 | } if 151 | } ifelse 152 | upd true eq { 153 | d k v put 154 | } if 155 | } if 156 | } if 157 | } forall 158 | d length 0 gt { 159 | d setpagedevice 160 | } if 161 | } bd 162 | %%EndResource 163 | %%BeginResource: procset (Apache XML Graphics EPS ProcSet) 1.0 0 164 | %%Version: 1.0 0 165 | %%Copyright: (Copyright 2002-2003 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0) 166 | /BeginEPSF { %def 167 | /b4_Inc_state save def % Save state for cleanup 168 | /dict_count countdictstack def % Count objects on dict stack 169 | /op_count count 1 sub def % Count objects on operand stack 170 | userdict begin % Push userdict on dict stack 171 | /showpage { } def % Redefine showpage, { } = null proc 172 | 0 setgray 0 setlinecap % Prepare graphics state 173 | 1 setlinewidth 0 setlinejoin 174 | 10 setmiterlimit [ ] 0 setdash newpath 175 | /languagelevel where % If level not equal to 1 then 176 | {pop languagelevel % set strokeadjust and 177 | 1 ne % overprint to their defaults. 178 | {false setstrokeadjust false setoverprint 179 | } if 180 | } if 181 | } bd 182 | /EndEPSF { %def 183 | count op_count sub {pop} repeat % Clean up stacks 184 | countdictstack dict_count sub {end} repeat 185 | b4_Inc_state restore 186 | } bd 187 | %%EndResource 188 | %FOPBeginFontDict 189 | %%IncludeResource: font Courier-Bold 190 | %%IncludeResource: font Helvetica 191 | %%IncludeResource: font Courier-BoldOblique 192 | %%IncludeResource: font Courier-Oblique 193 | %%IncludeResource: font Times-Roman 194 | %%IncludeResource: font Helvetica-BoldOblique 195 | %%IncludeResource: font Helvetica-Bold 196 | %%IncludeResource: font Helvetica-Oblique 197 | %%IncludeResource: font Times-BoldItalic 198 | %%IncludeResource: font Courier 199 | %%IncludeResource: font Times-Italic 200 | %%IncludeResource: font Times-Bold 201 | %%IncludeResource: font Symbol 202 | %%IncludeResource: font ZapfDingbats 203 | %FOPEndFontDict 204 | %%BeginResource: encoding WinAnsiEncoding 205 | /WinAnsiEncoding [ 206 | /.notdef /.notdef /.notdef /.notdef /.notdef 207 | /.notdef /.notdef /.notdef /.notdef /.notdef 208 | /.notdef /.notdef /.notdef /.notdef /.notdef 209 | /.notdef /.notdef /.notdef /.notdef /.notdef 210 | /.notdef /.notdef /.notdef /.notdef /.notdef 211 | /.notdef /.notdef /.notdef /.notdef /.notdef 212 | /.notdef /.notdef /space /exclam /quotedbl 213 | /numbersign /dollar /percent /ampersand /quotesingle 214 | /parenleft /parenright /asterisk /plus /comma 215 | /hyphen /period /slash /zero /one 216 | /two /three /four /five /six 217 | /seven /eight /nine /colon /semicolon 218 | /less /equal /greater /question /at 219 | /A /B /C /D /E 220 | /F /G /H /I /J 221 | /K /L /M /N /O 222 | /P /Q /R /S /T 223 | /U /V /W /X /Y 224 | /Z /bracketleft /backslash /bracketright /asciicircum 225 | /underscore /quoteleft /a /b /c 226 | /d /e /f /g /h 227 | /i /j /k /l /m 228 | /n /o /p /q /r 229 | /s /t /u /v /w 230 | /x /y /z /braceleft /bar 231 | /braceright /asciitilde /bullet /Euro /bullet 232 | /quotesinglbase /florin /quotedblbase /ellipsis /dagger 233 | /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft 234 | /OE /bullet /Zcaron /bullet /bullet 235 | /quoteleft /quoteright /quotedblleft /quotedblright /bullet 236 | /endash /emdash /asciitilde /trademark /scaron 237 | /guilsinglright /oe /bullet /zcaron /Ydieresis 238 | /space /exclamdown /cent /sterling /currency 239 | /yen /brokenbar /section /dieresis /copyright 240 | /ordfeminine /guillemotleft /logicalnot /sfthyphen /registered 241 | /macron /degree /plusminus /twosuperior /threesuperior 242 | /acute /mu /paragraph /middot /cedilla 243 | /onesuperior /ordmasculine /guillemotright /onequarter /onehalf 244 | /threequarters /questiondown /Agrave /Aacute /Acircumflex 245 | /Atilde /Adieresis /Aring /AE /Ccedilla 246 | /Egrave /Eacute /Ecircumflex /Edieresis /Igrave 247 | /Iacute /Icircumflex /Idieresis /Eth /Ntilde 248 | /Ograve /Oacute /Ocircumflex /Otilde /Odieresis 249 | /multiply /Oslash /Ugrave /Uacute /Ucircumflex 250 | /Udieresis /Yacute /Thorn /germandbls /agrave 251 | /aacute /acircumflex /atilde /adieresis /aring 252 | /ae /ccedilla /egrave /eacute /ecircumflex 253 | /edieresis /igrave /iacute /icircumflex /idieresis 254 | /eth /ntilde /ograve /oacute /ocircumflex 255 | /otilde /odieresis /divide /oslash /ugrave 256 | /uacute /ucircumflex /udieresis /yacute /thorn 257 | /ydieresis 258 | ] def 259 | %%EndResource 260 | %FOPBeginFontReencode 261 | /Courier-Bold findfont 262 | dup length dict begin 263 | {1 index /FID ne {def} {pop pop} ifelse} forall 264 | /Encoding WinAnsiEncoding def 265 | currentdict 266 | end 267 | /Courier-Bold exch definefont pop 268 | /Helvetica findfont 269 | dup length dict begin 270 | {1 index /FID ne {def} {pop pop} ifelse} forall 271 | /Encoding WinAnsiEncoding def 272 | currentdict 273 | end 274 | /Helvetica exch definefont pop 275 | /Courier-BoldOblique findfont 276 | dup length dict begin 277 | {1 index /FID ne {def} {pop pop} ifelse} forall 278 | /Encoding WinAnsiEncoding def 279 | currentdict 280 | end 281 | /Courier-BoldOblique exch definefont pop 282 | /Courier-Oblique findfont 283 | dup length dict begin 284 | {1 index /FID ne {def} {pop pop} ifelse} forall 285 | /Encoding WinAnsiEncoding def 286 | currentdict 287 | end 288 | /Courier-Oblique exch definefont pop 289 | /Times-Roman findfont 290 | dup length dict begin 291 | {1 index /FID ne {def} {pop pop} ifelse} forall 292 | /Encoding WinAnsiEncoding def 293 | currentdict 294 | end 295 | /Times-Roman exch definefont pop 296 | /Helvetica-BoldOblique findfont 297 | dup length dict begin 298 | {1 index /FID ne {def} {pop pop} ifelse} forall 299 | /Encoding WinAnsiEncoding def 300 | currentdict 301 | end 302 | /Helvetica-BoldOblique exch definefont pop 303 | /Helvetica-Bold findfont 304 | dup length dict begin 305 | {1 index /FID ne {def} {pop pop} ifelse} forall 306 | /Encoding WinAnsiEncoding def 307 | currentdict 308 | end 309 | /Helvetica-Bold exch definefont pop 310 | /Helvetica-Oblique findfont 311 | dup length dict begin 312 | {1 index /FID ne {def} {pop pop} ifelse} forall 313 | /Encoding WinAnsiEncoding def 314 | currentdict 315 | end 316 | /Helvetica-Oblique exch definefont pop 317 | /Times-BoldItalic findfont 318 | dup length dict begin 319 | {1 index /FID ne {def} {pop pop} ifelse} forall 320 | /Encoding WinAnsiEncoding def 321 | currentdict 322 | end 323 | /Times-BoldItalic exch definefont pop 324 | /Courier findfont 325 | dup length dict begin 326 | {1 index /FID ne {def} {pop pop} ifelse} forall 327 | /Encoding WinAnsiEncoding def 328 | currentdict 329 | end 330 | /Courier exch definefont pop 331 | /Times-Italic findfont 332 | dup length dict begin 333 | {1 index /FID ne {def} {pop pop} ifelse} forall 334 | /Encoding WinAnsiEncoding def 335 | currentdict 336 | end 337 | /Times-Italic exch definefont pop 338 | /Times-Bold findfont 339 | dup length dict begin 340 | {1 index /FID ne {def} {pop pop} ifelse} forall 341 | /Encoding WinAnsiEncoding def 342 | currentdict 343 | end 344 | /Times-Bold exch definefont pop 345 | %FOPEndFontReencode 346 | %%EndProlog 347 | %%Page: 1 1 348 | %%PageBoundingBox: 0 0 383 377 349 | %%BeginPageSetup 350 | [1 0 0 -1 0 377] CT 351 | %%EndPageSetup 352 | GS 353 | [0.75 0 0 0.75 0 0.5] CT 354 | N 355 | 0 0 M 356 | 510 0 L 357 | 510 502 L 358 | 0 502 L 359 | 0 0 L 360 | cp 361 | clip 362 | 1 GC 363 | N 364 | 0 0 510 502 re 365 | f 366 | GR 367 | GS 368 | [0.48 0 0 0.48 0 136.34] CT 369 | [1 0 0 1 0 0] CT 370 | N 371 | 0 -283 M 372 | 796.875 -283 L 373 | 796.875 501.375 L 374 | 0 501.375 L 375 | 0 -283 L 376 | cp 377 | clip 378 | GS 379 | 0 0 translate 380 | 510 502 scale 381 | %AXGBeginBitmap: java.awt.image.BufferedImage 382 | {{ 383 | /RawData currentfile /ASCII85Decode filter def 384 | /Data RawData /RunLengthDecode filter def 385 | /DeviceRGB setcolorspace 386 | << 387 | /Decode [0 1 0 1 0 1] 388 | /BitsPerComponent 8 389 | /Width 510 390 | /ImageType 1 391 | /DataSource Data 392 | /ImageMatrix [510 0 0 502 0 0] 393 | /Height 502 394 | >> image 395 | } stopped {handleerror} if 396 | RawData flushfile 397 | } exec 398 | K)^H&b5_GfK)_>?!<<,grrN1@]n6:.rrN1@]n6:+rrN1@]n6:+rrN1@]n6:+rrN1@]n6:.rrN1@]n699 399 | s.KDk-A)8brrE*"o)AakEkSLQ!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeu 400 | EkSCN!W[8SWrE,#EkR))K)_MDr[*6sR/[0e!:p-k!-5cQrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 401 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss-Wfh!!*$!!;6?n!-5cQrrN1@]r1l3 402 | !-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss-!r[*6sO8f4\!;lct!-5cQrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 411 | !-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s-E]a;uS-C[.s\#o):WJ-N;l^s8Hd4-NV^>YN,Z^-A)8QrrN1@^&@s3!!'8'!W[8SVuHeuEkSCN!W[8S 431 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))PQ1X9r_`G;r\shTo)J]#r[.WJ 432 | q#C?L"98H%!!'J-!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 436 | VuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6sL]7DUEkV5I!<<,.rrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 437 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss+gUU!-5dIrrE*"[f6C/EkSCN 438 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!!< 444 | K)^W+!W[8Snc&^l!<3$!^]+?8EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 445 | VuHeuEkSLQ!W[8SK)^H&T`>!!!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 451 | !-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)8QrrN1@^$,Is!!("!]!6G0A!-5cNrrN1@]r1l3!-5cNrrN1@ 456 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)8QrrN1@^#K%m!!(4B!W[8S 457 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6s 458 | L]7DUEkUK4!<<,CrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 459 | ]rM)6!-5c)s+:9Ds8F?ss+gUU!-5d1rrE*"cMmqGEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 460 | VuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!!![NV 476 | EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!< 477 | K)^W+!W[8Sd/O4K!<3$!i;WiYEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 478 | VuHeuEkSLQ!W[8SK)^H&T`>!!!aN9!:9^e 490 | !-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk 491 | -A)8QrrN1@]ts^L!!)Bc!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN 492 | !W[8SWrE,#EkR))K)_MDr[*6sL]7DUEkT3e!<<,grrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 493 | !-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss+gUU!-5cerrE*"n,EFhEkSCN!W[8SVuHeu 494 | EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!!'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ 501 | !W[8SK)^H&T`>!!]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 511 | rrN1@]rM)6!-5c)s+:9Ds8F?ss+gUU!-5cSs8E!!EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 512 | VuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!L!<<,.rrN1@ 532 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s4mYRp&6B=.fT,6 533 | s8Hp8-N9n)s8F?ss,I$[!-5cBrrN1@^&@s6!!*$!!4i+2!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 534 | rrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+::(s8I->-N9#"s8LaO./kt#o&fuO-A)8WrrN1@]po$'!-5dL 535 | rrE*"\c2^2EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)aO( 536 | roO,=r[.Vgrj_rsr]'m(ri"lWr[*6sOT,@^EkRk?!W[8SqYpQr!4i+2!-5cNrrN1@]r1l3!-5cNrrN1@ 537 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+::%s8LaO;>;L;2u]c6s8F?ss,d6^!-5c!L 542 | !<<,7rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk 543 | -A)8`rrN1@]o;sm!-5dLrr`<%rr<&9rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 544 | ]r1l3!-5cQrrN1@]n699s.KDk-A)8crrN1@]nZOg!-5dLrrE*"_Z'Z;EkSCN!W[8SVuHeuEkSCN!W[8S 545 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6sRK!EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,# 548 | EkR))K)_MDr[*6sSGrWjEkR))r;QfuEkVGO!<<,=rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 549 | !-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)8irrN1@]n6:[rrN1@^&%a0!!(+?!W[8SVuHeuEkSCN 550 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!!!^"!&`!-5cNrrN1@ 560 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss0Ve-!-5c)s3^iI 561 | !!*#u!W[8SfDbmPEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR)) 562 | K)_MDr[*6s\,QL0EkR))bQ%PA!HPm*rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 563 | ]r1l3!-5cQrrN1@]n699s.KDk-A)9,rrN1@]n6:-rrE*"rr3$"EkU3,!W[8SVuHeuEkSCN!W[8SVuHeu 564 | EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!^"WJf!-5cN 565 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss1SF6!-5c) 566 | s2+d:!!*#u!W[8Sh>[NVEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,# 567 | EkR))K)_MDr[*6s^&J-6EkR))_Z'`=!<3$!rr3$"EkUE2!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 568 | VuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!!!rrN1@]r1l3!-5cNrrN1@ 588 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)9ArrN1@]n69VrriCC^&J'4 589 | n,EFhEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6s 590 | bl7_EEkR))TDo&pEkVJQ!:Tph!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 591 | ]rM)6!-5c)s+:9Ds8F?ss31KE!-5c)s.B;m!-5dOrrE*"o)AakEkSCN!W[8SVuHeuEkSCN!W[8SVuHeu 592 | EkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6sbl7_EEkR))TDnrmEkVGO!<<,jrrN1@]r1l3 593 | !-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)9ArrN1@]n69V 594 | rrN1@^&@s6!!*$!!;6?n!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6 595 | !-5c)s+:9Ds8F?ss31KE!-5c)s.B;m!-5dLrrE*"p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN 596 | !W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6sbl7_EEkR))TDnrmEkV>L!<<,mrrN1@]r1l3!-5cN 597 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)9ArrN1@]n69VrrN1@ 598 | ^%_O-!!)fo!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H& 599 | T`>! 603 | rrN1@]n69\rrN1@^%)+*!!*$!!<3!"!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 604 | rrN1@]rM)6!-5c)s+:9Ds8F?ss2k9B!-5c)s/#_s!-5d@rrE*"rr3$"EkSCN!W[8SVuHeuEkSCN!W[8S 605 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6sao;DBEkR))V>gSsEkUo@!<<-!rrN1@ 606 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cQrrN1@]n699s.KDk-A)9;rrN1@ 607 | ]n69brrN1@^$,Lq!!.,RVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8S 608 | K)^H&T`>!!![NVEkV>L!<<,(rrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 619 | rrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss1843!-5c)s24jL"98H%!!'A*!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 622 | VuHeuEkSCN!W[8SWrE,#EkR))PQ1W`r[RRfrb2<+i;`dklmD_=j8]**K)`=[!W[8SK)`sm!W[8SfDbmP 623 | EkV5I!<<,+rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s-E]abPijf 624 | 2#b#aqYo4J>Q,uKI,P&(CAoRZV"1_gjQ$:>-A)9)rrN1@]n6:1rrN1@^"!&`!-5dIrrE*"Zi:(,EkSCN 625 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)_/:r_reCrj;J#rpp%Jr[.X$j8]*n 626 | r[.X4dJs1mK)`+U!W[8SK)aC$!W[8SdJj7JEkV,F!<<,.rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 627 | ]r1l3!-5cNrrN1@]rM)6!-5c)s-`odhu4u%2tI"JLAiP!Q/hoDCAoRZma;(6-A)9&rrN1@]n6::rrN1@ 628 | ^!?WZ!-5dFrrE*"[f6C/EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)_8= 629 | rj;YOrbh<,rjr(UrbCKnrbDEZrpKd^rq=tDr[*6sY5\P'EkR))g]%Virq67;r[[%/rnd>JrqQJ:r[.V,rqtpYmjJs8IBE-N9.us8MTg-N5[Gs8Mur8,ak7]&s%l-A)8irrN1@]n6:^rriCC 637 | ]`<)d^]+?8EkUo@!<<,4rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c) 638 | s0;V'/+k7gJc#KHSc0u8Hh.49a8RFb9$[J9GQ&rgOll]C-A)8frrN1@]n?=d!-5c`rrN1@^$G\!!!'e6 639 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))Z2aCkrquZnrjr(Urak[# 640 | rj)MMrbg$]rcnDhrefkEkMHn]q56*!-5d7rrE*"`W#u>EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN 649 | !W[8SVuHeuEkSLQ!W[8SK)^i1rndXirlb<>fDkjFrl+lPrke[)gAh.!K)^H&p\tL!EkMHn]`<)deGfdS 650 | EkMHn]`<)dR/[3fEkUT7!<<,=rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6 651 | !-5c)s+:9Ds8F?ss+::=s"".j]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5c6 652 | rrN1@^#K%m!!(+?!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MD 653 | r[*6sK)^H&cMmqGEkUK4!<<,@rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6 654 | !-5c)s+:9Ds8F?ss+:9&s3CWG!-5d1rrE*"bPqVDEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 655 | VuHeuEkSLQ!W[8SK)^H&T`>!!!!!!!!!![NVEkR>0!W[8S[f6C/EkS[V 706 | "TSQ&!!*&u!!.,RVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkR))K)_MDr[*6sK)^H&h>[NVEkR5- 707 | !W[8S\c2^2EkSCN#QSnYrr<'!!!'/$!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!L$31)+!!*$!!<3$!\c2^2EkSCN!W[8SVuHeuEkSCN!W[8S 709 | WrE,#EkU0+!<<+Os+:9ns8F?ss+:9&s5EkS1H!W[8Sf)GsT!<3$!rr<&TrrN1@]r1l3!-5cNrrN1@]r1l3!-5cbrsf#/ 715 | rr<'!!!*$!!<3$!s8E!!EkR))K)_MDr[*6sK)^H&l2LebEkR))mJd4fEkTQo!W[8SU&P/oEkT`t#64c( 716 | !!*$!!9X:_!-5cNrrN1@]r1l3!-5cNrrN1@]uU-^!!*$!!<3$!rr<'!!!)Ti!W[8SK)^H&T`>!!< 723 | K)^H&K)bEA!W[8SK)aU*!W[8SeGfRMEkRtB!W[8SXoAG&EkV5I#64c(!!*$!!4i+2!-5cNrrN1@]s[kJ 724 | !!*$!!<3$!rr<'!rVut>]rh;9!-5c)s+:9As8F?ss+:9&s7QBn!-5c)s4.,N!-5d)rrN1@]po$'!-5cT 725 | rrN1@^$bn*!!*$!!<3$!_Z'Z;EkSCN!W[8S`;^AK!<3$!rr<'!!!*$!!<3$!p&>'nEkSUT!W[8SK)^H& 726 | ScA[9K)^H&K)bWG!W[8SK)a0s!W[8SgA_3SEkRk?!W[8SYl=b)EkUT7$31)+!!*$!!<3$!cMmqGEkSCN 727 | !W[8Sd/OOT!<3$!rr<'!!!*$!!9X:_!-5cTrrN1@]n699s.02h-A)8Ls+::JrrN1@]n6:.rrN1@^"r\i 728 | !-5cUrr<&!rrN1@]rh;9!-5c)s+::%s8Jem;uS9A-JJM! 734 | -A)8Ls+:7P!-5c)s1SF6!-5d>rrN1@]o;sm!-5cZrrN1@]s[kI!!*$!!<3$!rr<&urrN1@]tXLX!!*$! 735 | !<3$!rr<'!!!*$!!;lct!-5cNrrN1@]s.M=/om?\Dm/Qr0gAh.!K)^H&MuNhYEkR))X8`>'EkMHn]n6:OrrN1@]u^3T!-5cKrrN1@ 746 | ]rh;9!-5cErrN1@]taRK!-5c)s+::1s8FPA-N8S_s8+.ss8F?ss+:92rrN1@]n69_rriCC]`<)dK)b-9 747 | !W[8SbPqVDEkS:K!W[8SXoAG&EkS(E!W[8S^]+?8EkR))K)aj1o(r@`m/Qr0gAh.!K)^H&NrK.\EkR)) 748 | X8`5$EkVJP!W[8SK)b$6!W[8ScMmqGEkS1H!W[8SYl=b)EkS(E!W[8S_Z'Z;EkR))K)`@\q^1%sr[*6s 749 | K)^l2!W[8SK)`"R!W[8Squ6]tEkR))kPkS`EkTm#!W[8ST)SilEkS^W!W[8SS,WNiEkTQo!W[8SK)^H& 750 | [K$+NgAh.!K)^H&OoGI_EkR))Y5\P'EkV/G!W[8SK)b$6!W[8SeGfRMEkS(E!W[8SZi:(,EkRk?!W[8S 751 | bPqVDEkR))K)`Rbrlb(Jq^2)Lrl=1$r[*6sK)^u5!W[8SK)`"R!W[8Sp&>'nEkR))kPkS`EkU!&!W[8S 752 | S,WNiEkSp]!W[8SQ2^mcEkTcu!W[8SK)^H&^An2>kpHD5k5YE-K)^H&OoGI_EkR))Z2Xk*EkV&D!W[8S 753 | K)ap3!W[8SfDbmPEkRtB!W[8S\c2^2EkRY9!W[8SdJj7JEkR))K)^H&r[*6sK)^u5!W[8SK)`4X!W[8S 754 | n,EFhEkR))iVrrZEkU3,!W[8SS,WNiEkT$`!W[8SP5bR`EkU!&!W[8SK)^H&K)biMr[*6sK)^u5!W[8S 755 | K)`=[!W[8Sm/I+eEkR))iVrrZEkU!W[8SN;iqZ 760 | EkTQo!W[8SK)YuRrr@)Ql2LebEkR))K)^H&o)J\9K)^H&OoGI_EkR))_#FH9EkUN5!W[8SK)aC$!W[8S 761 | n,EFhEkR>0!W[8SbPqVDEkR))r;QfuEkUi>!W[8SK)^H&K)bEAr[*6sK)^u5!W[8SK)`ag!W[8Si;WiY 762 | EkR))ec,[NEkV&D!W[8SLAq;TEkTcu!W[8SK)bZH!W[8Sn,EFhEkR))K)^H&n,NA6K)^H&OoGI_EkR)) 763 | _uBc'nEkR,*!W[8SeGfRMEkR))oD\jlEkV/G!W[8SK)^H&K)b3;r[*6s 764 | K)^u5!W[8SK)`ag!W[8Si;WiYEkR))df0@KEkV8J!W[8SK)bcK!W[8SfDbmPEkR))oD\jlEkV/G!W[8S 765 | K)^H&K)b3;r[*6sK)^u5!W[8SK)`ag!W[8Si;WiYEkR))df0@KEkV8J!W[8SK)bcK!W[8SgA_3SEkR)) 766 | mJd4fEkVAM!W[8SK)^H&K)b*8r[*6sK)^u5!W[8SK)`jj!W[8Sh>[NVEkR))ci4%HEkVJP!W[8SK)bQE 767 | !W[8Si;WiYEkR))kPkS`EkVJP!W[8SK)^H&K)b*8r[*6sK)^l2!W[8SK)`sm!W[8Sh>[NVEkR))ci4.K 768 | EkMHn]n6:RrrN1@^#T+o!-5c)s6'Cc!-5aQEkR))K)^H&k5YE-K)^H&NrK.\EkR))ao;DBEkUE2!W[8S 769 | K)a'p!W[8SK)b-9!W[8Sl2LebEkR))iVs&]EkMHn]n699s+::8s8F?ss+:92rrN1@]n6:+rrN1@^#8nl 770 | !-5c)s3L]H!-5dPrrN1@]n6:OrrN1@^$Pb#!-5c)s5*bW!-5dPrrN1@]n699s+::;s8F?ss+:92rrN1@ 771 | ]n6:.rrN1@^"r\i!-5c)s3goK!-5dMrrN1@]n6:LrriCC]`<)do)AakEkR))iVrrZEkVAM!W[8SK)^H& 772 | K)b3;r[*6sK)^c/!W[8SK)a0s!W[8Si;WiYEkR))df0@KEkV8J!W[8SK)ap3!W[8Sq#:BqEkR))hZ!WW 773 | EkV8J!W[8SK)^H&K)b<>r[*6sK)^c/!W[8SK)a0s!W[8Si;WiYEkR))df0@KEkV/G!W[8SK)b$6!W[8S 774 | qu6]tEkR))g]%!W[8SK)^H&K)bWGr[*6sK)^Z,!W[8S 778 | K)a:!!W[8Sj8T/\EkR))f`)!QEkUi>!W[8SK)b$6!W[8Squ6]tEkR))iVrrZEkUW8!W[8SK)^H&K)b`J 779 | r[*6sK)^Z,!W[8SK)a:!!W[8Sk5PJ_EkR))f`)!QEkU`;!W[8SK)b$6!W[8Sq#:BqEkR))jSo8]EkUW8 780 | !W[8SK)^H&K)b`Jr[*6sK)^Q)!W[8SK)aC$!W[8Sk5PJ_EkR))g]%!W[8SK)b-9!W[8Si;WiYEkR))K)^H&r[*6s 785 | K)^H&qu6]tEkR))iVrrZEkUi>!W[8SK)aL'!W[8Si;WiYEkR))mJd4fEkU`;!W[8SK)b6!W[8SK)aL'!W[8Si;WiYEkR))nG`OiEkUW8!W[8S 787 | K)b6'nEkR))kPkS`EkV&D!W[8SK)aC$ 789 | !W[8Sh>[NVEkR))oD\jlEkUE2!W[8SK)b??!W[8Sh>[NVEkR))K)^Q)r[*6sK)^H&p&>'nEkR))kPkS` 790 | EkV/G!W[8SK)a:!!W[8Sh>[NVEkR))oD\jlEkUE2!W[8SK)b??!W[8Sh>[NVEkR))K)^Q)r[*6sK)^H& 791 | o)AakEkR))kPkS`EkV8J!W[8SK)a:!!W[8Si;WiYEkR))nG`OiEkUE2!W[8SK)b??!W[8Sh>[NVEkR)) 792 | K)^Q)r[*6sK)^H&n,EFhEkR))lMgncEkVAM!W[8SK)a:!!W[8Sh>[NVEkR))oD\jlEkU3,!W[8SK)bHB 793 | !W[8Sh>[NVEkR))K)^Q)r[*6sK)^H&m/I4hEkMHn]n6:Rrs/UF]`<)d!-5c)s3L]H!-5d/rrN1@]n6:U 794 | rrN1@^"WJf!-5c)s7?6l!-5d,rrN1@]n699s+p^S-A)8Ls+::5rrN1@]n6:UrriCC]`<)dK)a'p!W[8S 795 | i;WiYEkR))nG`OiEkU3,!W[8SK)bHB!W[8SgA_3SEkR))K)^Z,r[*6sK)^H&j8T/\EkR))r;Qp#EkMHn 796 | ^&J$5!-5c)s3L]H!-5d/rrN1@]n6:RrrN1@^"<8c!-5c)s7?6l!-5d/rrN1@]n699s+p^S-A)8Ls+::/ 797 | rrN1@]n?=d!-5dJrrN1@]n6:1rrN1@^"r\i!-5c)s7$$i!-5d)rrN1@]n6:UrrN1@^"r\i!-5c)s+:9, 798 | s8F?ss+:9&s5!\Y!-5aQEkRG3!W[8So)AakEkR))df0@KEkUE2!W[8SK)b6EkMHn]`<)deGfdSEkMHn]`<)dbPqVDEkR))f`)!Q 805 | EkUW8!W[8SK)b$6!W[8SfDbmPEkR))nG`OiEkUE2!W[8SK)^H&M#[H$K)^H&K)`:Z/-'_(!-5aQEkMHn 806 | ]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkT?i!W[8SK)aL'!W[8Sk5PJ_EkR))kPkS`EkU3, 807 | !W[8SK)b-9!W[8Sj8T/\EkR))K)^Z,r[*6sK)^H&K)`jj!W[8SK)aU*!W[8Sl2LebEkR))jSo8]EkU3, 808 | !W[8SK)b-9!W[8Sj8T/\EkR))K)^Z,r[*6sK)^H&K)`ag!W[8SK)a^-!W[8Sm/I+eEkR))iVrrZEkU3, 809 | !W[8SK)b-9!W[8Sj8T/\EkR))K)^Z,r[*6sK)^H&K)`Xd!W[8SK)ag0!W[8Sm/I+eEkR))iVrrZEkU3, 810 | !W[8SK)b$6!W[8Sk5PJ_EkR))K)^Z,r[*6sK)^H&K)`Xd!W[8SK)ag0!W[8Sn,EFhEkR))hZ!WWEkU3, 811 | !W[8SK)b$6!W[8Sk5PJ_EkR))K)^Z,r[*6sK)^H&K)`Oa!W[8SK)ap3!W[8So)AakEkR))f`)!QEkU'nEkR))ec,[NEkUQ!-5dJrrN1@]n699s+::M-A)8Ls+:9&s/uA'!-5c)s7$$l!-5aQEkR))ao;DBEkUN5 817 | !W[8SK)aC$!W[8Squ6]tEkR))K)^H&r[*6sK)^H&K)_nO!W[8SK)bQE!W[8Srr3$"EkR))`r?)?EkUW8 818 | !W[8SK)aC$!W[8Squ6]tEkR))K)^H&r[*6sK)^H&K)_eL"TWSV!-5c)rriB%!-5dMrrN1@]n6:(rrN1@ 819 | ^#o=r!-5c)s3goN!-5aQEkR))K)^H&rr;sEK)^H&K)^H&UAk8pEkR5-!W[8Sp&>'nEkR))ao;DBEkU`; 820 | !W[8SK)a'p!W[8SK)^H&K)biMr[*6sK)^H&K)_JC"TWSV!-5c9rriCC]`<)do)AakEkR))`r?)?EkUi> 821 | !W[8SK)a'p#QSnY!-5aQEkR))K)^Q)r[*6sK)^H&K)_8="TWSV!-5cBrrN1@^$Pb#!-5c)s2P'?!-5d> 822 | rrN1@]n6:1rrN1@^%hU/!-5c)s+:9,s8F?ss+:9&s+:97rs/UF]`<)d!-5cTrs/UF]`<)d!-5d8rrN1@ 823 | ]n6:(rrN1@^$kt&!-5c)s3L]H!-5dGrrN1@]n699s,6pV-A)8Ls+:9&s,-g[!-5aQEkT6f$NP4\!-5aQ 824 | EkMHn^"r\i!-5c)s2P'?!-5dDrrN1@]n6:1rrN1@^$kt&!-5c)s+:92s8F?ss+:9&s+:9(rs/UF]`<)d 825 | !-5d&rsJgI]`<)d!-5aQEkTcu!W[8SK)`jj!W[8Sp&>'nEkR))ci4%HEkUi>"TWSV!-5c)s+:98s8F?s 826 | s+:9&s+:9&s8)aH!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]u'dN!-5c) 827 | s24j[WYEkMHn]n69Js8Jem;uS9A-J/:sC@!;H[,_2c-A)8Ls+:9&s+:9, 829 | rrN1@]n6:(rriCC]`<)dK)a0s!W[8SfDc*VEkMHn]`<)dK)_A@rc%i`r^$O$q^0qprbDEZrhT+groE,> 830 | r[*6sK)^H&K)^H&L&V2SEkR))ao;MEEkMHn]n6:4rrN1@^!$E]!-5aQEkMHn]n69\s8L[MqYUQ!-5cfrs/UF]`<)d!-5c)s.]Pj 832 | -J/:sCAoRZma;(6-A)8Ls+:9&s+:9&rrN1@]n6:4rrN1@^%hU/!-5c)s4dPT!-5cZrt,6O]`<)d!-5aQ 833 | EkMHn]`<)dK)`4Xq^0qprbDEZrpKd^rq=tDr[*6sK)^H&K)^H&K)biM!W[8SK)aL'!W[8So)AakEkR)) 834 | hZ!WWEkR))K)a="q^0qprbDEZr\s^$r[n+krncT5r[*6sK)^H&K)^H&K)biM!W[8SK)aL'!W[8Sn,EFh 835 | EkR))jSo8]EkR))K)a3tq^0qprbDEnrbDFTrbDEhr[.UtrlF."r[*6sK)^H&K)^H&K)b`J!W[8SK)a^- 836 | !W[8Sl2LebEkR))mJd=iEkMHn]n699s3:T@-J/:shY$pJq#5L:-N6.,r9"%J-A)8Ls+:9&s+:9,rrN1@ 837 | ]n6:FrrN1@^#T+o!-5c)s7?6l!-5c)s+::=s8IK?HiC>;s8+.^s8Mur8,ak7]&s%l-A)8Ls+:9&s+:9& 838 | s7QBq!-5aQEkR))mJd4fEkUgrfQ@C 839 | r[*6sK)^H&K)^H&K)b<>!W[8SK)bQE"TWSV!-5d&rrN1@]nZOg!-5c)s+::4s76$cr9XI\-Gof^GlB&h 840 | MWXs<-A)8Ls+:9&s+:9&s6Tae!-5c)s8;lu!-5crrrN1@]o;sm!-5c)s+:9_s8+.[s8Gsr-N:C7s8F?s 841 | s+:9&s+:9&s+::8rrN1@]n?=d!-5clrrN1@]p8U$!-5aQEkR))K)`@\q^1\0rgj%2rlt6ribA^r[*6sK)^H&K)^H&K)ad/!W[8SQ2^mc 844 | EkSgZ$NP4\!-5aQEkMHn]sdqH!-5aQEkMHn]n699s1&+.[-8q:YPA.sAc=%UYPA.sc2L'#-N6g?_VkIn 845 | -A)8Ls+:9&s+:9&s5!\Y!-5aQEkS1H"TWSV!-5cKrsJgI]`<)d!-5aQEkTQo"TWSV!-5c)s+:9&s6p!e 846 | q#883_#D4Mn_4$B-A)8Ls+:9&s+:9&s4@8V!-5aQEkMHn]sI_E!-5aQEkMHn]orC3!-5aQEkMHn]`<)d 847 | !-5aQEkMHn]`<)dl2M"hEkMHn]`<)dK)^H&K)`1Wr[*6sK)^H&K)^H&K)a-r"TWSV!-5cirs/UF]`<)d 848 | !-5c)s7$%)!-5aQEkMHn]`<)d!-5aQEkMHn]`<)dK)^H&K)_kNr[*6sK)^H&K)^H&K)`pl#QSnY!-5aQ 849 | EkU!&#QSnY!-5aQEkR))K)^H&K)^H&p](4>K)^H&K)^H&K)^H&^],hbEkMHn]`<)d!-5aQEkMHn]`<)d 850 | !-5aQEkMHn]`<)d!-5aQEkMHn]`<)dK)^H&K)^H&K)b9=r[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biM 851 | r[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H& 852 | K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H& 853 | K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H& 854 | K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6s 855 | K)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H& 856 | K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H& 857 | K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biM 858 | r[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H& 859 | K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H& 860 | K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H& 861 | K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6s 862 | K)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H& 863 | K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H& 864 | K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biM 865 | r[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H& 866 | K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H& 867 | K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H& 868 | K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6s 869 | K)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H& 870 | K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H& 871 | K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biM 872 | r[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H& 873 | K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H& 874 | K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H& 875 | K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6s 876 | K)^H&K)^H&K)^H&K)^H&K)^H&K)biMr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&[K$6UrhfR?rhTPQh>dI$ 877 | K)^H&K)^H&K)^H&K)^H&K)^H&K)`I_rm1R/mjA$gi;`d'K)^H&K)^H&K)^H&K)^H&K)^H&K)`I_rj;YS 878 | rcS4Mqq1n=r\=C!rfQ7@r[*6sK)^H&ZiC"OK)^H&K)`1Wr[*6sK)^H&K)a^-roF(Do)J^+r[.Utrr)!Z 879 | r[*6sK)^H&ZiC"OK)^H&K)`1Wr[*6sK)^H&K)`jjr[n*rroiMEr[*6sK)^H&ZiC"OK)^H&K)`1Wr[*6s 880 | K)^H&K)`smrr)gHr[.X>k5YE-K)^H&K)`1Wr[*6sK)^H&ZiC"OK)^H&K)^H&aoD@Or[.Vom?\Dn,NC^ra,RNrcEblK)^H&K)^H& 883 | K)^H&K)^H&K)^H&XT/8Mod9Zho)J^cra5XOrb[8eK)^H&K)^H&K)^H&K)^H&K)^H&WW2PcrquHhrqcV) 884 | r[.VZK)^H&K)^H&K)^H&K)^H&K)^H&K)^c/rqub+r[.VTrqqBJK)^H&K)^H&K)^H&K)^H&K)^H&NrT+W 885 | rb;?Yrac$)K)^H&K)^H&K)^H&K)^H&K)^H&K)^c/riZ,Fra,&)rm?>tK)^H&K)^H&K)^H&K)^H&K)^H& 886 | ScA\ijsL)CK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 887 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&cN!mnrhfR?rhTPQK)^H&K)`L`rr)iB 888 | qmqCZK)^H&aT)8#rh07;repd!K)^H&K)^H&Y5eLIr]op!re?%)K)^H&`W,q4r_reGpa1UmK)^H&bQ%RC 889 | r[RRfrb2<+K)^H&K)^H&[/^-4r[Rnirj_jXrgj$Cr[.W,K)^H&K)`plrc%i`r^$O$q^-ppK)^H&cN!me 890 | r[.V$rj_t(rn@?Ur[.VlK)^H&K)^H&[/^-drp'(SrkeX]r\+9LK)^H&K)a$orn.5Hqu?O?K)^H&K)a-r 891 | r_reCrj;J#rpp%Jr[.X$K)^H&K)^H&TE"mBr[.X.K)^H&K)`Ucq^-ppK)^H&dJs4'r[.V'o)J]Dr[.W0 892 | K)^H&K)^H&UAt5kr[[sprqM*FK)^H&^]40XK)^H&K)a6urj;YOrbh<,rjr(Urb@&bK)^H&K)_SFrjr(U 893 | r_.qDK)^H&]`7jUK)^H&K)a6urfI++rdOGVi 895 | rq67;r[WU#K)^H&K)a'prdONerj)+prqQJ!r[.VdK)^H&K)aR)rdONerj)"mq^-ppK)^H&dJs2mr[.W, 896 | o)J^[r[.UtK)^H&K)^H&bl@Ymod9Zhp&G$fra5XOrb[8eK)^H&fDkh#od9Zhn,N83K)^H&K)a6urgj$8 897 | rd459rl>!br^qeBK)^H&K)a'po(r@`q#C?irac!Trb@&bK)^H&eGo+9rqu6bq^-ppK)^H&dJs3Wr[.VU 898 | o)J]pr[.V^K)^H&K)^H&[/^.'rac!Trac$+K)^H&K)`(Tq^-ppK)^H&dJs4=r[@aqrq5sarbh]^rhb;I 899 | K)^H&K)`=[rr)h1r[.VTrq_6HK)^H&XoJ8FK)^H&K)a-rrcJ,drf-^Qrn@?"r\=ECK)^H&K)^H&\,ZH1 900 | q^2;Kmq)LGK)^H&K)a$orlb(Jq^2)Lrl9WjK)^H&gAh06r]'m(rce@OrgWmHr[.WCK)^H&K)^H&[/^-+ 901 | jsL)CK)^H&K)a$orj:o:ri^qRK)^H&fDkj(r_`G;r\shTK)^H&K)^H&K)^H&K)^H&K)^H&K)^c/rndXi 902 | rlb<>K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 903 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 904 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 905 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 906 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 907 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 908 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 909 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 910 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 911 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 912 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 913 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 914 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 915 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 916 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 917 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 918 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 919 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 920 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 921 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 922 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 923 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 924 | K)^H&K)^H&K)^H&K)^H&K)^H&K)b]IJ,~> 925 | 926 | %AXGEndBitmap 927 | GR 928 | GR 929 | GS 930 | [0.48 0 0 0.48 244.8 136.34] CT 931 | [1 0 0 1 0 0] CT 932 | N 933 | -510 -283 M 934 | 286.875 -283 L 935 | 286.875 501.375 L 936 | -510 501.375 L 937 | -510 -283 L 938 | cp 939 | clip 940 | GS 941 | 0 0 translate 942 | 287 502 scale 943 | %AXGBeginBitmap: java.awt.image.BufferedImage 944 | {{ 945 | /RawData currentfile /ASCII85Decode filter def 946 | /Data RawData /RunLengthDecode filter def 947 | /DeviceRGB setcolorspace 948 | << 949 | /Decode [0 1 0 1 0 1] 950 | /BitsPerComponent 8 951 | /Width 287 952 | /ImageType 1 953 | /DataSource Data 954 | /ImageMatrix [287 0 0 502 0 0] 955 | /Height 502 956 | >> image 957 | } stopped {handleerror} if 958 | RawData flushfile 959 | } exec 960 | K)bHB!W[8Shu<]W!.t73rrN1@]n69_rrN1@]n699s.KAn!-5cNrrN1@^"iVj!!*$!!8@GS!-5c%EkSCN!W[8Sb5VSE!<3$!k5PJ_EkS1H!W[8Sj8T/\EkR)) 965 | [/U1-EkR))K)`%S!W[8SVuHeuEkTEk!<<,arrN1@]qPH-!-5d5rrN1@]n69krrN1@]n699s0)G(!-5cN 966 | rrN1@]ts^O!!*$!!:Tph!-5cHrrN1@^#o=r!-5c)s/uA'!-5c)s+:9VrrN1@]r1l3!-5cerr`<%rr<&i 967 | rrN1@]qPH-!-5d8rrN1@]n69errN1@]n699s0DY+!-5cNrrN1@]t"(C!!)]l!W[8SU&P/oEkUW8!W[8S 968 | K)`"R!W[8SK)^H&ZMst+EkSCN!W[8S[Jp@0!<3$!qu6]tEkS1H!W[8Sl2LebEkR))X8`5$EkR))K)`.V 969 | !W[8SVuHeuEkSdY"98H%!!)or!W[8SVuHeuEkUW8!W[8SK)_eL!W[8SK)^H&[Jp:.EkSCN!W[8SXT&;$ 970 | !<3!"!-5cNrrN1@^#o=r!-5c)s/>r!!-5c)s+:9YrrN1@]r1l3!-5cPs8E!!EkSCN!W[8Sl2LebEkR)) 971 | V>gSsEkR))K)`7Y!W[8SVuHeuEkSCN"TWSVrr<&!rrN1@^$5Ou!-5c)s/#_s!-5c)s+:9YrrN1@]r1l3 972 | !-5cNrs/UF^&J'4rr<&$rrN1@^$5Ou!-5c)s.]Mp!-5c)s+:9\rrN1@]r1l3!-5cNrrN1@^&%a0!!'8' 973 | !W[8Sm/I+eEkR))TDnrmEkR))K)`@\!W[8SVuHeuEkSCN!W[8Sp\t?r!<3$![f6C/EkUi>!W[8SK)_JC 974 | !W[8SK)^H&\GlU1EkSCN!W[8SVuHeuEkV,F"98H%!!'S0!W[8Sm/I+eEkR))TDnrmEkR))K)`@\!W[8S 975 | VuHeuEkSCN!W[8Smf*:f!5/=5!-5d>rrN1@]n69VrrN1@]n699s1&(1!-5cNrrN1@]r1l3!-5d=rr`<% 976 | rr<&9rrN1@^$Pb#!-5c)s.B;m!-5c)s+:9\rrN1@]r1l3!-5cNrrN1@^$,J!!!*$!!6+s>!-5d>rrN1@ 977 | ]n69VrrN1@]n699s1&(1!-5cNrrN1@]r1l3!-5d7rr`<%rr<&?rrN1@^$Pb#!-5c)s.B;m!-5c)s+:9\ 978 | rrN1@]r1l3!-5cNrrN1@^#/hj!!(4B!W[8Sm/I+eEkR))SGrWjEkR))K)`I_!W[8SVuHeuEkSCN!W[8S 979 | h#@KW!<3$!dJj7JEkUi>!W[8SK)_A@!W[8SK)^H&]Dhp4EkSCN!W[8SVuHeuEkU0+"98H%!!(OK!W[8S 980 | m/I+eEkR))SGrWjEkR))K)`I_!W[8SVuHeuEkSCN!W[8Se,KFK!8%5P!-5d>rrN1@]n69SrrN1@]n699 981 | s1A:4!-5cNrrN1@]r1l3!-5d"rr`<%rr<&TrrN1@^$Pb#!-5c)s.')j!-5c)s+:9_rrN1@]r1l3!-5cN 982 | rrN1@^!6Q[!!*$!!9!kY!-5d>rrN1@]n69SrrN1@]n699s1A:4!-5cNrrN1@]r1l3!-5cqrr`<%rr<&Z 983 | rrN1@^$Pb#!-5c)s.')j!-5c)s+:9_rrN1@]r1l3!-5cNrrN1@]u9pO!!)0]!W[8Sm/I+eEkR))SGrWj 984 | EkR))K)`I_!W[8SVuHeuEkSCN!W[8S_>aW!W[8SK)_JC!W[8SK)^H&\GlU1EkSCN 985 | !W[8SVuHeuEkT3e"98H%!!)Kf!W[8Sl2LebEkR))UAk8pEkR))K)`@\!W[8SVuHeuEkSCN!W[8S\GlR0 986 | !:p-k!-5d;rrN1@]n69YrrN1@]n699s1&(1!-5cNrrN1@]r1l3!-5c\rr`<%rr<&orrN1@^$5Ou!-5c) 987 | s/#_s!-5c)s+:9YrrN1@]r1l3!-5cNrrN1@]s@Y@!!*$!!;lct!-5d8rrN1@]n69_rrN1@]n699s0_k. 988 | !-5cNrrN1@]r1l3!-5cVrr`<%rr<&urrN1@^#o=r!-5c)s/>r!!-5c)s+:9YrrN1@]r1l3!-5cNrrN1@ 989 | ]rD&2!!.,Rk5PJ_EkR))X8`5$EkR))K)`.V!W[8SVuHeuEkSCN!W[8SVuHo#EkVJQ!9X:_!-5c)s/uA' 990 | !-5c)s+:9VrrN1@]r1l3!-5cNrrN1@]r1l9!-5dQ!!*$!!9sLb!-5c)s/uA'!-5c)s+:9VrrN1@]r1l3 991 | !-5cNrrN1@]r1l3!-5dLrrE*"m/I+eEkR))Z2Xk*EkR))K)`%S!W[8SVuHeuEkSCN!W[8SVuHeuEkV5I 992 | "98H%!!)Kf!W[8SK)`4X!W[8SK)^H&YQ"Y(EkSCN!W[8SVuHeuEkSCN!W[8So`#$o!<3$!o)AakEkR)) 993 | \,QL0EkR))K)_qP!W[8SVuHeuEkSCN!W[8SVuHeuEkV#C"98H%!!)Ti!W[8SK)`F^!W[8SK)^H&XT&>% 994 | EkSCN!W[8SVuHeuEkSCN!W[8Sli-tc!;6?n!-5c)s1SF6!-5c)s+:9MrrN1@]r1l3!-5cNrrN1@]r1l3 995 | !-5d:rr`<%rr<&orrN1@]n6:%rrN1@]n699s/,et!-5cNrrN1@]r1l3!-5cNrrN1@^#f7s!!*$!!;QQq 996 | !-5c)s2k9B!-5c)s+:9GrrN1@]r1l3!-5cNrrN1@]r1l3!-5d1rrE*"qu6]tEkR))ao;DBEkR))K)_VG 997 | !W[8SVuHeuEkSCN!W[8SVuHeuEkU9."98H%!!*#u!W[8SK)a0s!W[8SK)^H&T`5&nEkSCN!W[8SVuHeu 998 | EkSCN!W[8Sg&D0T!<3$!rr3$"EkR))ec,[NEkR))K)_DA!W[8SVuHeuEkSCN!W[8SVuHeuEkU'("98H% 999 | !!*#u!W[8SK)aL'!W[8SK)^H&Sc8`kEkSCN!W[8SVuHeuEkSCN!W[8Sd/X(F!HPl*s4dPT!-5c)s+:9> 1000 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cts8E!!EkR))iVrrZEkR))K)_2;!W[8SVuHeuEkSCN!W[8SVuHeu 1001 | EkTWqrVut>]n6:IrrN1@]n699s-3Nb!-5cNrrN1@]r1l3!-5cNrrN1@]up?U!!*#u!W[8SK)b-9!W[8S 1002 | K)^H&PlCdbEkSCN!W[8SVuHeuEkSCN!W[8Sa8Z/?!<3!"!-5c)s7$$i!-5c)s+:95rrN1@]r1l3!-5cN 1003 | rrN1@]r1l3!-5cnrrE*"qu6]tEkR))pAY0oEkR))K)^l2!W[8SVuHeuEkSCN!W[8SVuHeuEkTEk!<<,s 1004 | rrN1@]n6:^rrN1@]n699s,6mY!-5cNrrN1@]r1l3!-5cNrrN1@]u9pO!!)or!W[8SK)bcK!W[8SK)^H& 1005 | MuNhYEkSCN!W[8SVuHeuEkSCN!W[8S`;]r?!<3$!qu6]tEkR,*!W[8SK)^H&M#RMVEkSCN!W[8SVuHeu 1006 | EkSCN!W[8S_>aN9!;lct!-5c-rrN1@]n699s+UIS!-5cNrrN1@]r1l3!-5cNrrN1@]ts^O!!*$!!;lct 1007 | !-5c0rrN1@]n699s+UIS!-5cNrrN1@]r1l3!-5cNrrN1@]tXLI!!)or!W[8SN;iqZEkR))K)^H&!W[8S 1008 | VuHeuEkSCN!W[8SVuHeuEkT3e!<<,prrN1@]oW0p!-5c)s+:9&rrN1@]r1l3!-5cNrrN1@]r1l3!-5cb 1009 | rrE*"qu6]tEkRY9!W[8SK)^H&K)biM!W[8SVuHeuEkSCN!W[8SVuHeuEkT*b!<<,prrN1@]p8U!!-5c) 1010 | s+:9&s8N$"!-5cNrrN1@]r1l3!-5cNrrN1@]t"(C!!)or!W[8SQ2^mcEkR))K)^H&rr3$"EkSCN!W[8S 1011 | VuHeuEkSCN!W[8S\GlR0!;QQq!-5cBrrN1@]n699s+::JrrN1@]r1l3!-5cNrrN1@]r1l3!-5c_rr`<% 1012 | rr<&rrrN1@]po$'!-5c)s+:9&s82ft!-5cNrrN1@]r1l3!-5cNrrN1@]s[k@!!)or!W[8SS,WNiEkR)) 1013 | K)^H&qu6]tEkSCN!W[8SVuHeuEkSCN!W[8S[Jp7-!;lct!-5cErrN1@]n699s+::GrrN1@]r1l3!-5cN 1014 | rrN1@]r1l3!-5cYrrE*"rr3$"EkS(E!W[8SK)^H&K)bWG!W[8SVuHeuEkSCN!W[8SVuHeuEkSdY!<<,s 1015 | rrN1@]qPH-!-5c)s+:9&s7lTq!-5cNrrN1@]r1l3!-5cNrrN1@]s%G:!!*#u!W[8SV#LJrEkR))K)^H& 1016 | p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SYQ"V'!<3!"!-5cKrrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@ 1017 | ]r1l3!-5cVrrN0#s8E!!EkS:K!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSRSrVut>]qkZ0 1018 | !-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r_85!!.,RV#LJrEkR))K)^H&p&>'nEkSCN!W[8S 1019 | VuHeuEkSCN!W[8SWW2qt!HPlOrrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cPs8E!!EkSCN 1020 | !W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkR))K)^H&p&>'nEkSCN!W[8S 1021 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN"TWSVrr<&! 1022 | rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrriCC^&J'4WrE,#EkR))K)^H&p&>'nEkSCN 1023 | !W[8SVuHeuEkSCN!W[8SVuI#&EkVJQ!<3$!XoAG&EkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8S 1024 | VuHeuEkVGO!<<,%rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^&@s3!!'/$!W[8S 1025 | K)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SqYpQr!3lJ)!-5c)s+:9&s7QBn!-5cNrrN1@ 1026 | ]r1l3!-5cNrrN1@]r1l3!-5dLrrE*"Yl=b)EkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeu 1027 | EkV5I!<<,+rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^%_O-!!'A*!W[8SK)^H& 1028 | K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Sp\t?r!<3$![f6C/EkR))K)^H&p&>'nEkSCN!W[8S 1029 | VuHeuEkSCN!W[8SVuHeuEkV,F!<<,.rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 1030 | ^%D=-!!*$!!4i+2!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5dCrrE*"\c2^2EkR)) 1031 | K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkV#C!<<,1rrN1@]n699s+::DrrN1@]r1l3!-5cN 1032 | rrN1@]r1l3!-5cNrrN1@^$bn$!!'\3!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 1033 | mf*:f!5/=5!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5d=rrE*"^]+?8EkR))K)^H& 1034 | p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkUf=!<<,7rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@ 1035 | ]r1l3!-5cNrrN1@^$G\$!!*$!!5ea;!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5d: 1036 | rrE*"_Z'Z;EkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkU]:!<<,:rrN1@]n699s+::D 1037 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^#f7p!!("]!6+s>!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5d4rrE*" 1039 | aSu;AEkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkUK4!<<,@rrN1@]n699s+::DrrN1@ 1040 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^#/hj!!(4B!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeu 1041 | EkSCN!W[8Shu<]W!6bBD!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5d1rr`<%rr<&E 1042 | rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^"iVg!!(=E!W[8SK)^H&K)bND!W[8S 1043 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8Sh#@BT!7(TG!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@ 1044 | ]r1l3!-5d+rrE*"dJj7JEkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkU0+!<<,IrrN1@ 1045 | ]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^"32a!!(OK!W[8SK)^H&K)bND!W[8SVuHeu 1046 | EkSCN!W[8SVuHeuEkSCN!W[8Sf)GaN!7_#M!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 1047 | !-5d(rr`<%rr<&NrrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^!lu^!!(XN!W[8S 1048 | K)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Se,KFK!8%5P!-5c)s+:9&s7QBn!-5cNrrN1@ 1049 | ]r1l3!-5cNrrN1@]r1l3!-5d"rrE*"gA_3SEkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeu 1050 | EkTj"!<<,RrrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^!6QX!!(jT!W[8SK)^H& 1051 | K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Sc2ReE!8[YV!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3 1052 | !-5cNrrN1@]r1l3!-5cqrrE*"i;WiYEkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkTWq 1053 | !<<,XrrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]up?X!!*$!!9=(\!-5c)s+:9& 1054 | s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cnrrE*"j8T/\EkR))K)^H&p&>'nEkSCN!W[8SVuHeu 1055 | EkSCN!W[8SVuHeuEkTNn!<<,[rrN1@]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]u9pO 1056 | !!)0]!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S`;]i'nEkSCN!W[8SVuHeuEkSCN 1058 | !W[8SVuHeuEkT'n 1060 | EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkT3e"98H%!!)Kf!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8S 1061 | VuHeuEkSCN!W[8S]Dhm3!:Tph!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cbrrE*" 1062 | n,EFhEkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkT!_!<<,jrrN1@]n699s+::DrrN1@ 1063 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]t"(C!!)Ti!W[8SK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeu 1064 | EkSCN!W[8S[Jp7-!;6?n!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5c\rrE*"p&>'n 1065 | EkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSm\"98H%!!)fo!W[8SK)^H&K)bND!W[8S 1066 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SZMsq*!;QQq!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@ 1067 | ]r1l3!-5cYrrE*"q#:BqEkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkS[V!<<,srrN1@ 1068 | ]n699s+::DrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]s%G:!!)or!W[8SK)^H&K)bND!W[8SVuHeu 1069 | EkSCN!W[8SVuHeuEkSCN!W[8SXT&;$!<3!"!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 1070 | !-5cSrrE*"rr3$"EkR))K)^H&p&>'nEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSIPrVut>]n699s+::D 1071 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rD&2!!.,RK)^H&K)bND!W[8SVuHeuEkSCN!W[8SVuHeu 1072 | EkSCN!W[8SWW2qt!HPl*s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]n699s+::D 1073 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5c)s+:9&s7QBn!-5cNrrN1@]r1l3!-5cNrrN1@ 1074 | ]r1l3!-5cNrriCC^&J'4K)^H&K)bWG!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHo#EkVJQ!.t6& 1075 | s+::GrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5dOrrE*"K)^H&K)b`J!W[8SVuHeuEkSCN 1076 | !W[8SVuHeuEkSCN!W[8SVuHeuEkVGO!<<+Os+:9&s82ft!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 1077 | rrN1@^&@s6!!*$!!.t6&s+::MrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5dLrrE*"K)^H& 1078 | K)biM!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkV>L!<<+Os+:9&s8N$"!-5cNrrN1@]r1l3 1079 | !-5cNrrN1@]r1l3!-5cNrrN1@^%_O-!!%WNK)^H&!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeu 1080 | EkV5I!<<+Os+:9&rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5dFrrE*"K)^H&L&V2SEkSCN 1081 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8So`"pl!.t6&s+UIS!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 1082 | !-5cNrrN1@^%)+'!!%WNK)^Z,!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkV#C!<<+Os+:9, 1083 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5dCrr`<%rr<%Ns+:9/rrN1@]r1l3!-5cNrrN1@ 1084 | ]r1l3!-5cNrrN1@]r1l3!-5d@rrE*"K)^H&MuNhYEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 1085 | mf*:f!.t6&s,6mY!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^$G\!!!%WNK)^l2!W[8SVuHeu 1086 | EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkUf=!<<+Os+:92rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 1087 | ]r1l3!-5d:rrE*"K)^H&OoGI_EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Skl1Y`!.t6&s,m<_ 1088 | !-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^$,J!!!*$!!.t6&s-3Nb!-5cNrrN1@]r1l3!-5cN 1089 | rrN1@]r1l3!-5cNrrN1@^%)+0!!*$!!<3$!rr<%Ns+:95rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 1090 | ]r1l3!-5dLrs&N(rr<'!!!%WNK)^Q)!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVZ-l$!<3$!rr<%N 1091 | s+:9&s82ft!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cVrs&N(rr<'!!!%WNK)^H&o)AakEkSCN!W[8S 1092 | VuHeuEkSCN!W[8SVuHeuEkT!_#64c(!!*$!!.t6&s+::8rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 1093 | ]ts^R!!*$!!<3$!K)^H&K)ad/!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Sb5V\H!<3$!rr<%Ns+:9& 1094 | s4@8P!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5d%rs&N(rr<'!!!%WNK)^H&cMmqGEkSCN!W[8SVuHeu 1095 | EkSCN!W[8SVuHeuEkU9.#64c(!!*$!!.t6&s+:9irrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@^#f8! 1096 | !!*$!!<3$!K)^H&K)`L`!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Smf*Ll!<3$!rr<%Ns+:9&s0M_, 1097 | !-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5dIrs&N(rr<'!!!%WNK)^H&WrE,#EkSCN!W[8SVuHeuEkSCN 1098 | !W[8SVuI,)EkVJQ!<3$!rr<%Ns+:9&s.TGo!-5cNrrN1@]r1l3!-5cNrrN1@]s%G>!!*$!!<<#u!HPl* 1099 | s+:9&s-Wff!-5cNrrN1@]r1l3!-5cNrrN1@]t"(L!!*$!!<3$!rr<&rrrN1@]n699s+:9]r1l3!-5c)s+:9&s-Wff!-5cNrrN1@]r1l3!-5c\rs&N(rr<'! 1107 | !!)or!W[8SVuHeuEkR))K)^H&R/[3fEkSCN!W[8SVuHeuEkT3e#64c(!!*$!!:p-k!-5cNrrN1@]n699 1108 | s+:9Urr<&'rrN1@]q56*!-5c)s+:9&s-s#i!-5cN 1114 | rrN1@]s[kI!!*$!!<3$!rr<&urrN1@]rh;9!-5cBrrN1@]n699s+:9BrrN1@]r1l3!-5cersA`+rr<'! 1115 | !!*$!!;6?n!-5cTrrN1@]po$'!-5c)s+:9&s.95l!-5cNrrN1@]uU-[!!*$!!<3$!rr<&crrN1@]rh;9 1116 | !-5cBrrN1@]n699s+:9BrrN1@]r1l3!-5d"rsA`+rr<'!!!*$!!9=(\!-5cWrrN1@]p8U!!-5c)s+:9& 1117 | s.TGo!-5cNrrN1@^"NDm!!*$!!<3$!rr<&QrrN1@]s.M!-5cZ 1119 | rrN1@]oW0p!-5c)s+:9&s.oYr!-5cNrrN1@^%D=0!!*$!!<3$!]`/$5EkSp]!W[8SN;iqZEkR))K)^H& 1120 | V#LJrEkSCN!W[8SrVm*&!<3$!rr<&*rrN1@]sdqB!-5c0rrN1@]n699s+:9KrrN1@]rD&2!!I>Urr<&! 1121 | rrN1@]t+.E!-5c*rrN1@]n699s+:9NrrN1@]s@YC!!*$!!<3$!rr3$"EkSCN!W[8S\c2^2EkR,*!W[8S 1122 | K)^H&K)_kN!W[8S]Di*9!<3$!rr<&lrrN1@]r1l3!-5ccrrN1@]n6:^rrN1@]n699s+:9QrrN1@]u9pU 1123 | !!*$!!<3$!n,EFhEkS:K!W[8S]`/$5EkR))q>UKrEkR))K)^H&Yl=b)EkT`t#64c(!!*$!!9X:_!-5cH 1124 | rrN1@]u'dN!-5c)s7?6l!-5c)s+:9&s0M_,!-5d(rs&N(rr<'!!!(jT!W[8SU&P/oEkTHl!W[8SK)b6< 1125 | !W[8SK)^H&K)`:Z!W[8ShuQ!-5c) 1129 | s+:9&s472]!!*$!!<3$!rr<'!!!*$!!;lct!-5cTrrN1@]po$'!-5d)rrN1@]n6:7rrN1@]n699s+::1 1130 | rs\r.rr<'!!!*$!!<3$!m/I+eEkSUT!W[8SR/[3fEkU[NVEkSUT!W[8SR/[3fEkUE2!W[8SK)`sm!W[8SK)^H&K)`gi!W[8SYl=b)EkRY9!W[8Sj8T/\ 1132 | EkR))ao;DBEkR))K)^H&`W#u>EkS^W!W[8SP5bR`EkUW8!W[8SK)`ag!W[8SK)^H&K)`pl!W[8SZi:(, 1133 | EkRP6!W[8Sl2LebEkR))^&J-6EkR))K)^H&bPqVDEkSgZ!W[8SN;iqZEkUi>!W[8SK)`F^!W[8SK)^H& 1134 | K)a-r!W[8S[f6C/EkR>0!W[8Sn,EFhEkR))\,QL0EkR))K)^H&cMmqGEkSp]!W[8SLAq;TEkV&D!W[8S 1135 | K)`4X!W[8SK)^H&K)a-r!W[8S]`/$5EkR,*!W[8Sp&>'nEkR))Z2Xk*EkR))K)^H&cMmqGEkT-c!W[8S 1136 | K)YuRrr@)Qq#:BqEkR))Y5\P'EkR))K)^H&dJj7JEkT6f!W[8SK)bZH!W[8Squ6]tEkR))Y5\P'EkR)) 1137 | K)^H&dJj7JEkT6f!W[8SK)bZH!W[8Srr3$"EkR))X8`5$EkR))K)^H&dJj7JEkT?i!W[8SK)bHB"TWSV 1138 | !-5c)s/>r!!-5c)s+:9&s3^iJ!-5clrrN1@]n6:UrriCC]`<)dK)_eL!W[8SK)^H&K)a6u!W[8SaSu;A 1139 | EkR))nG`XlEkMHn]n69_rrN1@]n699s+:9urrN1@^!$EW!-5c)s6]gf!-5dPrrN1@]n69_rrN1@]n699 1140 | s+:9urrN1@^!?WZ!-5c)s6]gf!-5dPrrN1@]n69_rrN1@]n699s+:9urrN1@^!Zi]!-5c)s6]gf!-5dJ 1141 | rrN1@]n69brrN1@]n699s+:9urrN1@^"!&`!-5c)s6BUc!-5dGrrN1@]n69brrN1@]n699s+:9urrN1@ 1142 | ^"WJf!-5c)s6'C`!-5dGrrN1@]n69brrN1@]n699s+:9urrN1@^"WJf!-5c)s6'C`!-5dDrrN1@]n69e 1143 | rrN1@]n699s+:9urrN1@^"r\i!-5c)s5a1]!-5dArrN1@]n69hrrN1@]n699s+:9rrrN1@^#T+o!-5c) 1144 | s5EtZ!-5dArrN1@]n69hrrN1@]n699s+:9rrrN1@^#o=r!-5c)s5*bW!-5d>rrN1@]n69krrN1@]n699 1145 | s+:9orrN1@^$Pb#!-5c)s4dPT!-5d;rrN1@]n69nrrN1@]n699s+:9orrN1@^$Pb#!-5c)s4dPT!-5d8 1146 | rrN1@]n69qrrN1@]n699s+:9lrrN1@^%21)!-5c)s4I>Q!-5d8rrN1@]n69qrrN1@]n699s+:9irrN1@ 1147 | ^%hU/!-5c)s4.,N!-5d5rrN1@]n69trrN1@]n699s+:9irrN1@^%hU/!-5c)s4.,N!-5d5rrN1@]n69t 1148 | rrN1@]n699s+:9frrN1@^&J$5!-5c)s3goK!-5d2rrN1@]n6:"rrN1@]n699s+:9crriCC]`<)dK)a:! 1149 | !W[8Si;WiYEkR))_#FH9EkR))K)^H&]`/$5EkR))df0@KEkUE2!W[8SK)`Xd!W[8SK)^H&K)`L`!W[8S 1150 | K)a:!!W[8Sh>[NVEkR))_uBcQ!-5d2rrN1@]n6:(rrN1@]n699s+:9`rrN1@^%hU/!-5c)s4I>Q 1152 | !-5d/rrN1@]n6:+rrN1@]n699s+:9`rrN1@^%MC,!-5c)s4I>Q!-5d2rrN1@]n6:.rrN1@]n699s+:9` 1153 | rrN1@^$kt&!-5c)s4dPT!-5d2rrN1@]n6:.rrN1@]n699s+:9`rrN1@^$kt&!-5c)s4dPT!-5d/rrN1@ 1154 | ]n6:1rrN1@]n699s+:9`rrN1@^$Pb#!-5c)s4dPT!-5d2rrN1@]n6:4rrN1@]n699s+:9]rrN1@^$Pb# 1155 | !-5c)s4dPT!-5d2rrN1@]n6:4rrN1@]n699s+:9]rrN1@^$5Ou!-5c)s5*bW!-5d2rrN1@]n6:4rrN1@ 1156 | ]n699s+:9]rrN1@^#o=r!-5c)s5*bW!-5d5rrN1@]n6:7rrN1@]n699s+:9ZrrN1@^#o=r!-5c)s5*bW 1157 | !-5d5rrN1@]n6:7rrN1@]n699s+:9ZrrN1@^#T+o!-5c)s5*bW!-5d8rrN1@]n6::rrN1@]n699s+:9W 1158 | rrN1@^#T+o!-5c)s5*bW!-5d8rrN1@]n6::rrN1@]n699s+:9WrrN1@^#8nl!-5c)s5*bW!-5d;rrN1@ 1159 | ]n6:=rrN1@]n699s+:9TrrN1@^#8nl!-5c)s4dPT!-5d>rrN1@]n6:@rrN1@]n699s+:9QrrN1@^#8nl 1160 | !-5c)s4I>Q!-5dArrN1@]n6:@rrN1@]n699s+:9QrrN1@^#8nl!-5c)s4I>Q!-5dArrN1@]n6:CrrN1@ 1161 | ]n699s+:9NrrN1@^"r\i!-5c)s4I>Q!-5dDrrN1@]n6:FrrN1@]n699s+:9KrrN1@^"r\i!-5c)s4.,N 1162 | !-5dGrrN1@]n6:IrrN1@]n699s+:9HrrN1@^"r\i!-5c)s4.,N!-5dGrrN1@]n6:IrrN1@]n699s+:9E 1163 | rrN1@^#8nl!-5c)s3goK!-5dJrrN1@]n6:LrrN1@]n699s+:9BrrN1@^"r\i!-5c)s3goQ!-5aQEkMHn 1164 | ]n6:LrrN1@]n699s+:9?rrN1@^"r\i!-5c)s31KE!-5c)s7$$l!-5aQEkR))K)^H&R/[3fEkU'nEkR5-!W[8SK)^H&K)^]-!W[8Si;WiYEkR))ci4%HEkV&D 1167 | "TWSV!-5c9rriCC]`<)dK)^H&K)^T*!W[8Si;WiYEkR))df0@KEkU`;"TWSV!-5cBrrN1@]n699s+:9& 1168 | s8;lu!-5d5rrN1@]n6:4rrN1@^#T+u!-5aQEkMHn]rh;?!-5aQEkMHn]n699s+:9&s7uZr!-5d5rrN1@ 1169 | ]n6:4rrN1@^"WJi!-5aQEkT6f$NP4\!-5aQEkMHn]n699s+:9&s7$$i!-5d5rrN1@]n6:7rrN1@^!Zic 1170 | !-5aQEkMHn^"!&i!-5aQEkMHn]`<)dK)^H&K)^H&iVrrZEkUW8!W[8SK)aC$!W[8SaT!dkEkMHn]`<)d 1171 | !-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)dK)^H&K)^H&ec,[NEkUW8!W[8SK)aL'!W[8S 1172 | K)^H&K)^H&K)b'7!W[8Sl2LebEkR))f`)!QEkR))K)^H&K)^H&jo5A^EkUi>!W[8SK)aU*!W[8SK)^H& 1173 | K)^H&K)aa.!W[8Sn,EFhEkR))hZ!WWEkR))K)^H&K)^H&h#@EUEkUrA!W[8SK)a^-!W[8SK)^H&K)^H& 1174 | K)aO(!W[8Sp&>'nEkR))hZ!WWEkR))K)^H&K)^H&e,KILEkV8J!W[8SK)ag0!W[8SK)^H&K)^H&K)a3t 1175 | !W[8Sq#:BqEkR))jSo8]EkR))K)^H&K)^H&b5VMCEkVJP!W[8SK)ag0!W[8SK)^H&K)^H&K)`mk"TWSV 1176 | !-5c)s5a1]!-5c)s+:9&s+:9&s2"^=!-5aQEkR))mJd=iEkMHn]n699s+:9&s+:9errN1@^&.g2!-5c) 1177 | s7?6l!-5c)s+:9&s+:9&s1A:4!-5dJrrN1@]n6:^rriCC]`<)dK)^H&K)^H&K)`@\!W[8Sp&>'nEkR,* 1178 | !W[8SK)^H&K)^H&K)`7Y!W[8Sn,EOkEkMHn]o;sm!-5c)s+:9&s+:9&s0DY+!-5d;rrN1@]p8U$!-5aQ 1179 | EkR))K)^H&K)^H&ZMst+EkUN5"TWSV!-5cHrriCC]`<)dK)^H&K)^H&K)_qP!W[8Sh>[`\EkMHn]`<)d 1180 | Zi::2EkMHn]`<)dK)^H&K)^H&K)_hM!W[8SdJj@MEkMHn]u'dT!-5aQEkMHn]n699s+:9&s+:9GrrN1@ 1181 | ]u^3Z!-5aQEkMHn^"!&f!-5aQEkMHn]n699s+:9&s+:9>rrN1@]taRu!-5aQEkMHn]`<)d!-5aQEkMHn 1182 | ]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]n699s+:9&s+:98rrN1@]n699s+:9&s+:9&s.oYr!-5c)s+:9& 1183 | s+:9&s+:9HrrN1@]n699s+:9&s+:9&s.TGo!-5c)s+:9&s+:9&s+:9HrrN1@]n699s+:9&s+:9&s/5l# 1184 | !-5aQEkR))K)^H&K)^H&K)_bK!W[8SK)^H&K)^H&K)^H&VuHo#EkMHn]n699s+:9&s+:9&s/5ku!-5c) 1185 | s+:9&s+:9&s+:9HrrN1@]n699s+:9&s+:9&s/5l#!-5aQEkR))K)^H&K)^H&K)_kN"TWSV!-5c)s+:9& 1186 | s+:9&s+:9Qrs/UF]`<)d!-5c)s+:9&s+:9&s+:9QrriCC]`<)dK)^H&K)^H&K)^H&XoAY,EkMHn]`<)d 1187 | K)^H&K)^H&K)^H&_Z(MSEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkR))K)^H&K)^H&K)^H&K)^H&K)^H& 1188 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1189 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1190 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1191 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1192 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1193 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1194 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1195 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1196 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1197 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1198 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1199 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1200 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1201 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1202 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1203 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1204 | K)^H&K)^H&K)^H&NW8u)K)^H&K)`1Wr[*6sK)^H&o)J\9K)^H&K)`1Wr[*6sK)^H&o)J\9K)^H&K)`1W 1205 | r[*6sK)^H&o)J\9K)^H&K)`1Wr[*6sK)^H&o)J\9K)^H&K)`1Wr[*6sK)^H&o)J\9K)^H&K)`1Wr[*6s 1206 | SH"0fJgQ'rJgQ-tK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1207 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1208 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&QN-s_rm1JQK)^H&K)`L`rm^qEqgAC=ro/P0K)^Z,rhKHkr[R[i 1209 | K)^H&K)`^frm1R/mjA$gK)^H&MuWcqr[.V1rbhT[K)^H&K)`^frj;YSrcS4Mqq1n=r\=C!rfMg4K)^l2 1210 | rn.5Hqu?O?K)^H&K)`^froF(Do)J^+r[.Utrr%HKK)^Q)q^-ppK)^H&WrN&Mr[.X.K)^H&L&_#sK)^H& 1211 | K)_tQrr)gHr[.X>K)^H&L&_#sK)^H&K)_tQrjr(Ur_.qDK)^H&q^-ppK)^H&YlF^hr]:$*rkO-cK)^H& 1212 | q^-ppK)^H&ZiC$tr`B(GreH+*K)^H&rr;jBK)^H&K)`:ZrqQJ!r[.VdK)^H&K)b`Jq^-ppK)^H&\c;[* 1213 | ra5XOrb[8eK)^H&q#C40.rkO-cK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1216 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1217 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1218 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1219 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1220 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1221 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1222 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1223 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1224 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1225 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1226 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1227 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1228 | K)^H&K)`plJ,~> 1229 | 1230 | %AXGEndBitmap 1231 | GR 1232 | GR 1233 | GS 1234 | [0.48 0 0 0.48 0 0.5] CT 1235 | [1 0 0 1 0 0] CT 1236 | N 1237 | 0 0 M 1238 | 796.875 0 L 1239 | 796.875 784.375 L 1240 | 0 784.375 L 1241 | 0 0 L 1242 | cp 1243 | clip 1244 | GS 1245 | 0 0 translate 1246 | 510 283 scale 1247 | %AXGBeginBitmap: java.awt.image.BufferedImage 1248 | {{ 1249 | /RawData currentfile /ASCII85Decode filter def 1250 | /Data RawData /RunLengthDecode filter def 1251 | /DeviceRGB setcolorspace 1252 | << 1253 | /Decode [0 1 0 1 0 1] 1254 | /BitsPerComponent 8 1255 | /Width 510 1256 | /ImageType 1 1257 | /DataSource Data 1258 | /ImageMatrix [510 0 0 283 0 0] 1259 | /Height 283 1260 | >> image 1261 | } stopped {handleerror} if 1262 | RawData flushfile 1263 | } exec 1264 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1265 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1266 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1267 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1268 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1269 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1270 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1271 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1272 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1273 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1274 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1275 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1276 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1277 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1278 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1279 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1280 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1281 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1282 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&df9cggK)^H&K)^H& 1288 | K)^H&K)^H&K)^H&K)`dhrqcV$r[.V]gAh.!K)^H&K)^H&K)^H&K)^H&K)^H&K)`7YrqcV)r[.VZfDkgs 1289 | K)^H&K)^H&K)^H&K)^H&K)^H&K)`@\rqub+r[.VTrqtCJr[*6sK)^H&K)^H&K)^H&K)^H&K)^H&]Dqm/ 1290 | rb;?Yrac$)eGoLpK)^H&K)^H&K)^H&K)^H&K)^H&K)`I_riZ,Fra,&)rmBm.r[*6sK)^H&K)^H&K)^H& 1291 | K)^H&K)^H&]Dql2jsL)Ck5YE-K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H& 1292 | K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1293 | rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H& 1294 | K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H& 1295 | K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H& 1296 | K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sE 1297 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H& 1298 | K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H& 1299 | K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1300 | rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H&K)^H&K)^H&K)^H&K)^H&K)^H&rr;sEK)^H& 1301 | K)^H&K)^H&K)a'p(BAKh!-5aQEkMHn]`<)d!-5aQEkMHn]n699s+:9&s31NB-A)8Ls+:9&s+:9&s+::0 1302 | rtGHR]`<)d!-5aQEkMHn]`<)d!-5d;rs/UF]`<)d!-5c)s+:9&s+::$s8F?ss+:9&s+:9&s+:9&s6BUi 1303 | !-5aQEkMHn^!$EZ!-5aQEkR))K)^H&K)aU*r[*6sK)^H&K)^H&K)^H&oD]'rEkMHn]`<)d]`/6;EkMHn 1304 | ]`<)dK)^H&K)^H&jT#3+K)^H&K)^H&K)^H&K)bcK#QSnY!-5aQEkSLQ"TWSV!-5c)s+:9&s+::9s8F?s 1305 | s+:9&s+:9&s+:9'rriCC]`<)dS,WWlEkMHn]n699s+:9&s7$'f-A)8Ls+:9&s+:9&s+^OT!-5c6rrN1@ 1306 | ]n699s+:9&s7?9i-A)8Ls+:9&s+:9&s,?s]!-5aQEkR>0!W[8SK)^H&K)^H&pAb+=K)^H&K)^H&K)^H& 1307 | O8f7]EkR))#QOf(EkMHn]n699s+:9&s8;or-A)8Ls+:9&s+:9&s-!B`!-5c)s7ZHo!-5c)s+:9&s+:7O 1308 | s8W'FK)^H&K)^H&K)^H&R/[EkMHn]n699s-Ncb-A)8Ls+:9&s24jQ!-5aQEkMHn]`<)d 1319 | !-5aQEkMHn]`<)dWrE5&EkMHn]n6:OrriCC]`<)drr3$"EkR))^&J-6EkU]nZOg 1328 | !-5d8rrN1@]n6:=rrN1@^%21)!-5c)s1SF9!-5aQEkR))mJd=iEkMHn]n699s2"a7-A)8Ls+:9*rriCC 1329 | ]`<)dK)Z)Urr@)Q!-5dArrN1@]n6::rrN1@^$kt&!-5c)s24j'nEkR))K)^H&WrN&FK)^H&XT&P+EkMHn]`<)d 1335 | WrE5&EkMHn^!Zi]!-5c)s5*bZ!-5aQEkR))f`)!QEkUN5!W[8SK)a:!!W[8So)AakEkR))K)^H&WrN&F 1336 | K)^H&ZMt(.EkMHn]po$'!-5d)rrN1@]n6:=rriCC]`<)dK)aL'!W[8Si;WiYEkR))f`)!QEkUrA!W[8S 1337 | K)^H&K)_kNr[*6sK)`@\"TWSV!-5c9rriCC]`<)dh>[NVEkR))hZ!WWEkVAM!W[8SK)aU*!W[8Si;WiY 1338 | EkR))f`)!QEkUrA!W[8SK)^H&K)_kNr[*6sK)`I_!W[8SLAq;TEkUN5!W[8SK)aU*!W[8Sq#:BqEkR)) 1339 | hZ!WWEkUE2!W[8SK)aU*!W[8Sm/I+eEkR))K)^H&WrN&FK)^H&_>aZ=EkMHn]n67es8N(>^$5Ou!-5c) 1340 | s4I>Q!-5dGrrN1@]n6:CrrN1@^"r\i!-5c)s5EtZ!-5d;rrN1@]n699s+:9Ns8F?ss31Ko!-5aQEkMHn 1341 | ]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]r1l3!-5c)s7ZHo!-5d>rrN1@]n6:=rrN1@ 1342 | ^%21)!-5c)s5EtZ!-5d/rrN1@]n6:FrrN1@^#o=r!-5c)s+:9&s/Q+u-A)9Jrs/UF]`<)d!-5d&rs/UF 1343 | ]`<)d!-5cZrrN1@]n6:RrriCC]`<)dp&>'nEkR))f`)!QEkUrA!W[8SK)ap3!W[8Sh>[NVEkR))jSo8] 1344 | EkUW8!W[8SK)^H&K)_kNr[*6shZ!i]EkMHn]`<)d_Z'c>EkMHn]taRN!-5aQEkR))kPkS`EkVAM!W[8S 1345 | K)aC$!W[8Sm/I+eEkR))kPkS`EkU3,!W[8SK)b-9!W[8Sj8T/\EkR))K)^H&WrN&FK)b$6#QSnY!-5aQ 1346 | EkSgZ#QSnY!-5aQEkTZr!W[8SK)a^-"TWSV!-5c)s4.,N!-5d;rrN1@]n6:IrrN1@^"WJf!-5c)s6BUc 1347 | !-5d5rrN1@]n699s+:9Ns8F?ss6]gi!-5aQEkS1H"TWSV!-5d&rrN1@]n6::rrN1@]n6:7rrN1@^#o=r 1348 | !-5c)s6BUc!-5d,rrN1@]n6:LrrN1@^#T+o!-5c)s+:9>s8Murchk<*s8L@2])LpRs8F?ss7$$i!-5c< 1349 | rriCC]`<)dgA_3SEkR))g]%EWEkMHn]n6:7rrN1@^#o=r!-5c)s6BUc!-5d)rrN1@]n6:RrrN1@^#8nl 1350 | !-5c)s+:9Ds8Jem;uS9A-J/:sC@!;H[,_2c-A)9krriCC]`<)dN;iqZEkUE2!W[8SK)aL'!W[8Srr3$" 1351 | EkR))g]%"1r[.V1rbhT[fDkhb 1352 | r[.W?nur&Rj8]**K)bZH!W[8SKDtuQEkUW8!W[8SK)aC$!W[8Squ6]tEkR))hZ!WWEkUE2!W[8SK)b6< 1353 | !W[8SfDbmPEkR))nG`OiEkUE2!W[8SK)^H&T`>#DrqcNlq^0qprbDEZrpJ26r[*6sr;QfuEkR))r;Qp# 1354 | EkMHn^$Pb#!-5c)s4I>Q!-5dGrrN1@]n6:CrrN1@^#8nl!-5c)s6]gf!-5d)rrN1@]n6:RrrN1@^#8nl 1355 | !-5c)s+:98s8+.ps8Hd4-N[NVEkR))nG`OiEkU*)!W[8SK)bHB!W[8Sh>[NVEkR))K)_)8q^0qprbDEZrpKd^rq=tDr[*C" 1357 | !W[8SK)b-9"TWSV!-5dMrrN1@]n6:4rrN1@^%21)!-5c)s5a1]!-5d/rrN1@]n6:RrrN1@^"<8c!-5c) 1358 | s7?6l!-5d2rrN1@]n699s,m?Y-J/:sCAoRZ2u=s$/cKkkhVeG5-Aha(!-5c)s5Et]!-5aQEkR))ci4%H 1359 | EkUrA!W[8SK)b$6!W[8Sh>[NVEkR))mJd4fEkU3,!W[8SK)bHB!W[8Si;WiYEkR))K)^u5q^0qprbDEn 1360 | rbDFTrbDEhr[.UtrlF."r[*U(!W[8SK)aU*!W[8SK)a:!!W[8Sm/I+eEkR))kPkS`EkU3,!W[8SK)b?? 1361 | !W[8SgA_3SEkR))oD\jlEkUE2!W[8SK)^H&OoP;*fDkj,p&G$drce>gr]L2Xk5XlsS,WNiEkR))hZ!`Z 1362 | EkMHn]n6:4rrN1@^$5Ou!-5c)s6BUc!-5d,rrN1@]n6:RrrN1@^"WJf!-5c)s7ZHo!-5d/rrN1@]n699 1363 | s,m?Y-H6#arVf=d-N:U=s6h;+rrN1@]n6:=rrN1@^&J$5!-5c)s4.,N!-5d;rrN1@]n6:LrrN1@^"WJf 1364 | !-5c)s6]gf!-5d/rrN1@]n6:XrrN1@^#8nl!-5c)s+:92s8+.[s8I6A-N9.is8F@.rrN1@]n6::rrN1@ 1365 | ^&.g2!-5c)s4I>Q!-5d8rrN1@]n6:OrrN1@^"<8c!-5c)s7$$i!-5d/rrN1@]n6:XrrN1@^#8nl!-5c) 1366 | s+:92s8+.[s8I9B-N8nbs8F@.rrN1@]n6:=rrN1@^%MC,!-5c)s5*bW!-5d5rrN1@]n6:OrrN1@^"<8c 1367 | !-5c)s7$$i!-5d/rrN1@]n6:XrrN1@^#8nl!-5c)s+:92s8+.[s8Gsr-N:C7s8F@1rrN1@]n6::rrN1@ 1368 | ^%MC,!-5c)s5*bW!-5d5rrN1@]n6:OrrN1@^"<8c!-5c)s6]gf!-5d2rrN1@]n6:XrrN1@^#8nl!-5c) 1369 | s+:92s8+/0s8JSgFoKY\s8M6]p%&.^R/SH30E1M(s8F@1rrN1@]n6::rrN1@^%21)!-5c)s5EtZ!-5d2 1370 | rrN1@]n6:RrrN1@^"<8c!-5c)s6]gf!-5d2rrN1@]n6:XrrN1@^#T+o!-5c)s+:9;s8L4:Ac!hLAcBaF 1371 | s8HU/-N:4Ds8KD).fO2^MuKdVMuHTN-N:4/s8F@4rrN1@]n6:7rrN1@^$kt&!-5c)s5a1]!-5d2rrN1@ 1372 | ]n6:RrrN1@^"<8c!-5c)s6]gf!-5d2rrN1@]n6:XrrN1@^#T+o!-5c)s+:9;s8KCi-N:4Ds8HU/-N:4D 1373 | s8L:B6LlK&:]A5hs8F@7rrN1@]n6:7rrN1@^$Pb#!-5c)s5a1]!-5d2rrN1@]n6:RrrN1@^"<8c!-5c) 1374 | s6BUc!-5d5rrN1@]n6:XrrN1@^#T+o!-5c)s+:9&s4@;Mq#883_#D4Mn_4$B-Cb#:!-5c)s4.,N!-5d; 1375 | rrN1@]n6:IrrN1@^"r\i!-5c)s7?6l!-5d)rrN1@]n6:LrrN1@^#o=r!-5c)s7?6l!-5d8rrN1@]n699 1376 | s+:9Bs8F@:rrN1@]n6:4rrN1@^$5Ou!-5c)s6'C`!-5d/rrN1@]n6:RrrN1@^"WJf!-5c)s6'C`!-5d; 1377 | rrN1@]n6:UrrN1@^#o=r!-5c)s+:9&s.98i-D(5=!-5c)s3goK!-5d8rrN1@]n6:LrrN1@^"r\i!-5c) 1378 | s7$$i!-5d,rrN1@]n6:IrrN1@^$5Ou!-5c)s7?6l!-5d;rrN1@]n699s+:9?s8F@=rrN1@]n6:4rrN1@ 1379 | ^#T+o!-5c)s6BUc!-5d,rrN1@]n6:UrrN1@^"WJf!-5c)s5a1]!-5dArrN1@]n6:RrrN1@^$Pb#!-5c) 1380 | s+:9&s-Wic-DCG@!-5c)s3goK!-5d5rrN1@]n6:LrrN1@^"WJf!-5c)s7$$i!-5d/rrN1@]n6:CrrN1@ 1381 | ^%21)!-5c)s7$$i!-5dArrN1@]n699s+:99s8F@=rrN1@]n6:4rrN1@^#8nl!-5c)s6]gf!-5d,rrN1@ 1382 | ]n6:RrrN1@^"r\i!-5c)s5EtZ!-5dDrrN1@]n6:RrrN1@^$kt&!-5c)s+:9&s-T!-5aQEkR))kPkS`EkVAM!W[8S 1388 | K)^H&K)^f0r[+QC!W[8SK)a'p!W[8Sh>[NVEkR))nG`OiEkU3,!W[8SK)b-9!W[8Sk5PJ_EkR))df0@K 1389 | EkR))jSoA`EkMHn]n699s+:9-s8F@CrrN1@]n6:.rrN1@^"WJf!-5c)s7?6l!-5d,rrN1@]n6:IrrN1@ 1390 | ^$5Ou!-5c)s4.,N!-5dPrrN1@]n6:IrrN1@]n699s+:9*s8F@FrrN1@]n6:+rrN1@^"WJf!-5c)s7$$i 1391 | !-5d/rrN1@]n6:IrrN1@^$5Ou!-5c)s4.,N!-5dMrrN1@]n6:LrrN1@]n699s+:9*s8F@FrrN1@]n6:+ 1392 | rrN1@^"WJf!-5c)s7$$i!-5d/rrN1@]n6:FrrN1@^$kt&!-5c)s4.,N!-5dJrrN1@]n6:OrrN1@^&J$5 1393 | !-5c)s+:9&s,$dT-E@(I!-5c)s2k9B!-5d,rrN1@]n6:RrrN1@^"r\i!-5c)s5EtZ!-5dDrrN1@]n6:: 1394 | rrN1@^%21)!-5c)s7?6l!-5dMrrN1@]n699s+:9-s8F@FrrN1@]n6:+rrN1@^"WJf!-5c)s7$$i!-5d/ 1395 | rrN1@]n6:CrrN1@^%21)!-5c)s4dPT!-5d>rrN1@]n6:[rrN1@^%hU/!-5c)s+:9&s,$dT-E@(I!-5c) 1396 | s2k9B!-5d,rrN1@]n6:OrrN1@^#8nl!-5c)s5*bW!-5dJrrN1@]n6::rrN1@^$5Ou!-5c)s8;lu!-5dG 1397 | rrN1@]n699s+:90s8F@FrrN1@]n6:+rrN1@^"WJf!-5c)s6]gf!-5d2rrN1@]n6:=rrN1@^&.g2!-5c) 1398 | s4dPT!-5d8rrN1@]n67es8N(>^%21)!-5c)s+:9&s,@!W-E@(I!-5c)s2k9B!-5d,rrN1@]n6:OrrN1@ 1399 | ^#T+o!-5c)s4.,N!-5dPrrN1@]n6:@rrN1@^#8nl!-5c-rrN1@^$Pb#!-5c)s+:9&s,[3Z-E@(I!-5c) 1400 | s2P'?!-5d/rrN1@]n6:OrrN1@^#T+o!-5c)s4.,Q!-5aQEkR))g]%!W[8S 1401 | K)^H&K)^o3r[+ZF!W[8SK)`jj!W[8Sh>[NVEkR))lMgncEkUW8!W[8SK)a:!!W[8SK)a^-!W[8SgA_3S 1402 | EkRG3!W[8Sk5PJ_EkR))K)^H&P5kM.WrE,#EkR))`r?)?EkU[NVEkR))K)^H&R/d.4WrE,#EkR))_uBc!W[8SK)bQE!W[8SaSu;AEkRk?!W[8SeGfRMEkR))f`)!QEkR))K)a!n 1409 | r[+ZF!W[8SK)`Xd!W[8Sk5PJ_EkR))g]%UKrEkTHl!W[8S 1410 | S,WNiEkU!&!W[8SK)aL'!W[8SK)^H&b5_GfVuHeuEkR))_uBcmVWEkT$`!W[8SV#LJrEkTHl!W[8SK)b6'nEkR))f`)!QEkV&D!W[8SK)b-9!W[8SeGfRMEkRY9!W[8SZi:(, 1420 | EkS:K!W[8S]`/$5EkR))r;QfuEkVAM!W[8SK)^H&_>jK]U&P/oEkR))^&J-6EkV8J!W[8SK)aC$!W[8S 1421 | o)AakEkR))mJd4fEkTcu!W[8SQ2^mcEkSgZ!W[8SV#LJrEkT-c!W[8SK)YuRrr@)Qq#:BqEkR))K)`[e 1422 | r[+?=!W[8SK)`F^!W[8Squ6]tEkR))f`)!QEkUi>!W[8SK)bHB!W[8SbPqVDEkRb'nEkR))K)`[er[+6:!W[8SK)`F^!W[8Srr3$"EkR))g]%EkRtB!W[8SXoAG&EkSCN!W[8S\c2^2EkR5-!W[8Sq#:BqEkR))K)`Rbr[+6:!W[8S 1425 | K)`=[!W[8SK)aL'!W[8Sk5PJ_EkR))q>UKrEkTHl!W[8SS,WNiEkSUT!W[8SVuHeuEkV5I$31)+!!*$! 1426 | !<3$!bPqVDEkRG3!W[8Sp&>'nEkR))K)`Rbr[+-7!W[8SK)`F^!W[8SK)aU*!W[8Si;WiYEkR))"TSK% 1427 | EkT?i!W[8ST)SilEkSLQ!W[8SXT&>%!<<#u$?Ei[!!*$!!<3$!p\t?r!<3$!cMmqGEkRG3!W[8Sp&>'n 1428 | EkR))K)`Rbr[+-7!W[8SK)`Oa!W[8Srr3$"EkR))iVrrZEkU0!W[8S\c2^2EkS:K!W[8SVuHeuEkUB1&-)_1!!*$!!<3$!rr<'!!!(aQ 1433 | !W[8Sir9,]!<3$!eGfRMEkRb'nEkR))K)`I_r[*p1!W[8SK)`sm!W[8So)AakEkR))mJd4f 1434 | EkTm#!W[8SN;iqZEkT$`!W[8SV#LJrEkSCN!W[8Snc'.#!<3$!rr<'!!!*$!!<3$!aSu;AEkU9.!<<,O 1435 | rrN1@]pSg$!-5dDrrN1@]n699s1A=1-BeB1!-5c)s3L]H!-5d>rrN1@]n6:UrrN1@^!?WZ!-5c6rrN1@ 1436 | ]sdqB!-5cKrrN1@]r1lB!-5dQ!!*$!!<3$!rr<'!!!'J-!W[8Sg&D0T!<3$!gA_3SEkRtB!W[8So)Aak 1437 | EkR))K)`I_r[*^+!W[8SK)aC$!W[8Sk5PJ_EkR))q>UKrEkTQo!W[8SP5bR`EkSp]!W[8SV#LJrEkSm\ 1438 | $NL2,!!*$!!<3$!s8E!!EkSCN!W[8Sf)GjQ!<3$!h>[NVEkRtB!W[8So)AakEkR))K)`I_r[*U(!W[8S 1439 | K)aL'!W[8Sj8T/\EkR))r;QfuEkTQo!W[8SP5bR`EkSp]!W[8SV#LJrEkTNn&-)_1!!*$!!<3$!rr<'! 1440 | !!)Ti!W[8SVuHeuEkTs%"98H%!!(sW!W[8ST)SilEkUrA!W[8SK)^H&]DqjWN;iqZEkR))g]%mVWEkR))iVrrZEkU3,!W[8SLAq;TEkT6f!W[8S 1443 | R/[3fEkS^W!W[8SVuHeuEkU]:&-)_1!!*$!!<3$!rr<'!!!(FH!W[8SVuHeuEkTWq"98H%!!)0]!W[8S 1444 | U&P/oEkUrA!W[8SK)^H&]DqjWLAq;TEkR))kPkS`EkU*)!W[8SLAq;TEkT6f!W[8SS,WNiEkSUT!W[8S 1445 | VuHeuEkV>L&-)_1!!*$!!<3$!rr<'!!!'e6!W[8SVuHeuEkTNn"98H%!!)9`!W[8SV#LJrEkUi>!W[8S 1446 | K)^H&]DqjWKDtuQEkR))lMgncEkU!&!W[8SN;iqZEkT-c!W[8SS,WNiEkSUT!W[8SXT&>%!<<#u#BINX 1447 | !!*$!!3Q8&!-5cNrrN1@]ts^L!!)Bc!W[8SV#LJrEkUi>!W[8SK)^H&]DqjWKDtuQEkR))mJd4fEkTm# 1448 | !W[8SN;iqZEkT-c!W[8SS,WNiEkSUT!W[8S^Ae`E!<3$!rr<'!!!*$!!<3$!qu6]tEkSCN!W[8SVuHeu 1449 | EkT3e"98H%!!)Ti!W[8SV#LJrEkUi>!W[8SK)^H&]DqjWK)YuRrr@)QK)bHB!W[8SbPqVDEkRY9!W[8S 1450 | [f6C/EkS1H!W[8SWrE,#EkTj"&-)_1!!*$!!<3$!rr<'!!!)9`!W[8SVuHeuEkSCN!W[8S]Di!6!<3$! 1451 | p&>'nEkS:K!W[8Sm/I+eEkR))K)`I_r[*6sr;QfuEkR))q>UKrEkTQo!W[8SP5bR`EkSp]!W[8SU&P/o 1452 | EkSLQ!W[8Shu=,c!<3$!rr<'!!!*$!!8%5P!-5cNrrN1@]r1l3!-5c_rr`<%rr<&orrN1@]qkZ0!-5d> 1453 | rrN1@]n699s1A=1-A)9nrrN1@]n6:^rrN1@]uC!Q!-5cL"98H%!!'J-!W[8Sj8T/\EkR))K)`[er[*6snG`OiEkRY9!W[8S[f6C/ 1466 | EkS1H!W[8SWrE,#EkTEk'*&%4!!*$!!<3$!rr<'!!!*$!!;QQq!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3 1467 | !-5cNrrN1@^%D=*!!'S0!W[8Sj8T/\EkR))K)`[er[*6smJd4fEkRbEkUE2!W[8SK)^H& 1473 | p](6krm1JQgAh.!K)b-9!W[8SS,WNiEkS^W!W[8SVuHeuEkTEk('"@7!!*$!!<3$!rr<'!!!*$!!<3$! 1474 | qu6]tEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkUT7"98H%!!(4B!W[8Sh>[NVEkR)) 1475 | K)YiNrhKHkr[R[igAh.!K)b-9!W[8ST)SilEkSUT!W[8SVuHeuEkU0+('"@7!!*$!!<3$!rr<'!!!*$! 1476 | !<3$!k5PJ_EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkUK4"98H%!!(=E!W[8Sh>[NV 1477 | EkR))K)YiNrc%i`r^$O$q^1%sr[*6slMgncEkS(E!W[8SXoAG&EkSCN!W[8Snc'@)!<3$!rr<'!!!*$! 1478 | !<3$!rr<'!!!(=E!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8Shub8N!<3$!rr<'!!!*$!!<3$!rr<'!!!*#u!W[8S 1482 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkU'("98H%!!(aQ!W[8SK)^H&c2[Yf 1483 | gAh.!K)b$6!W[8SV#LJrEkSLQ!W[8Sf)HKc!<3$!rr<'!!!*$!!<3$!rr<'!!!)9`!W[8SVuHeuEkSCN 1484 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkTs%"98H%!!(jT!W[8SK)^H&c2[YfgAh.!K)b$6 1485 | !W[8SV#LJrEkSLQ!W[8Smf+%&!<3$!rr<'!!!*$!!<3$!rr<'!!!(FH!W[8SVuHeuEkSCN!W[8SVuHeu 1486 | EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkT`t!<<,XrrN1@]n699s3:T@-JJM!-A)9\rrN1@]qkZ0!-5cQ 1487 | rtbZU^&J'4rr<'!!!*$!!<3$!rr<'!!!'\3!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN 1488 | !W[8SVuHeuEkTWq"98H%!!)0]!W[8SK)^H&c2[YfgAgUgK)bQE!W[8SV#LJrEkTL 1507 | "98H%!!%WNK)_qPr[*6si;WfX!36&#!-5cQrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cN 1508 | rrN1@]r1l3!-5cNrrN1@]rM)6!-5dIrr`<%rr<%Ns+:9Ss8F?ss5!\U!!'/$!W[8SWrE,#EkSCN!W[8S 1509 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8Snc&Ui!.t6&s0D\(-A)9R 1510 | rrE*"XoAG&EkSLQ!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8S 1511 | WrE,#EkUo@"98H%!!%WNK)`@\r[*6sh>[TX!<3$!Yl=b)EkSLQ!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN 1512 | !W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkUf="98H%!!%WNK)`I_r[*6sgA_0R!3lJ)!-5cQ 1513 | rrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5d:rr`<% 1514 | rr<%Ns+:9bs8F?ss4[JR!!'8'!W[8SWrE,#EkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeu 1515 | EkSCN!W[8SVuHeuEkSLQ!W[8Sir9#Z!.t6&s2"a7-A)9LrrE*"Zi:(,EkSLQ!W[8SVuHeuEkSCN!W[8S 1516 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SWrE,#EkUB1"98H%!!%WNK)`mkr[*6sfDbjO 1517 | !42\,!-5cQrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6 1518 | !-5d.rr`<%rr<%Ns+:9ns8F?ss4@8R!!*$!!4Mn/!-5cQrrN1@]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@ 1519 | ]r1l3!-5cNrrN1@]r1l3!-5cNrrN1@]rM)6!-5c)s+:9Ds8F?ss4%&L!!'J-!W[8SWrE,#EkSCN!W[8S 1520 | VuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSCN!W[8SVuHeuEkSLQ!W[8SK)^H&T`>!!!!!!!!!!! 1577 | 1578 | %AXGEndBitmap 1579 | GR 1580 | GR 1581 | GS 1582 | [0.48 0 0 0.48 244.8 0.5] CT 1583 | [1 0 0 1 0 0] CT 1584 | N 1585 | -510 0 M 1586 | 286.875 0 L 1587 | 286.875 784.375 L 1588 | -510 784.375 L 1589 | -510 0 L 1590 | cp 1591 | clip 1592 | GS 1593 | 0 0 translate 1594 | 287 283 scale 1595 | %AXGBeginBitmap: java.awt.image.BufferedImage 1596 | {{ 1597 | /RawData currentfile /ASCII85Decode filter def 1598 | /Data RawData /RunLengthDecode filter def 1599 | /DeviceRGB setcolorspace 1600 | << 1601 | /Decode [0 1 0 1 0 1] 1602 | /BitsPerComponent 8 1603 | /Width 287 1604 | /ImageType 1 1605 | /DataSource Data 1606 | /ImageMatrix [287 0 0 283 0 0] 1607 | /Height 283 1608 | >> image 1609 | } stopped {handleerror} if 1610 | RawData flushfile 1611 | } exec 1612 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1613 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1614 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1615 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1616 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1617 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1618 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1619 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1620 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1621 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1622 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1623 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1624 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1625 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1626 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1627 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1628 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1629 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1630 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1631 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1632 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1633 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1634 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1635 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1636 | K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H&K)^H& 1637 | K)^H&K)^H&K)^H&T`5&nEkR))K)^H&K)^H&K)_GB!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H& 1638 | K)_GB!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_GB!W[8SK)^H&K)^H&K)^H&U&P/oEkR)) 1639 | K)^H&K)^H&K)_GB!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_GB!W[8SK)^H&K)^H&K)^H& 1640 | U&P/oEkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&T)SilEkR))K)^H&K)^H&K)_PE!W[8SK)^H& 1641 | K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_GB!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_PE 1642 | !W[8SK)^H&K)^H&K)^H&T)SilEkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H& 1643 | K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&U&P/o 1644 | EkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H& 1645 | K)^H&U&P/oEkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_PE!W[8S 1646 | K)^H&K)^H&K)^H&U&P/oEkR))K)^H&K)^H&K)_PE!W[8SK)^H&K)^H&K)^H&V#LJrEkTm#/-'_(!-5aQ 1647 | EkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkMHn]`<)d!-5aQEkR))K)^H&K)^H&K)biM!W[8SgA_EYEkMHn 1648 | ]`<)deGfdSEkMHn]`<)dK)^H&K)^H&K)^Z,!W[8Si;Wr\EkMHn]u'dT!-5aQEkMHn]n699s+:9&s+:95 1649 | rrN1@^$5P&!-5aQEkMHn]sI_E!-5aQEkMHn]n699s+:9&s+:9ArrN1@^$Pb&!-5aQEkS1H"TWSV!-5c) 1650 | s+:9&s+:9&s.fSq!-5dArrN1@]p8U$!-5aQEkR))K)^H&K)^H&WW*#"EkV/G"TWSV!-5c3rrN1@]n699 1651 | s+:9&s+:9PrrN1@^%hU/!-5c*rrN1@]n699s+:9&s+:9VrrN1@^%hU/!-5c)s8;m#!-5aQEkR))K)^H& 1652 | K)^H&\GlU1EkVAM!W[8SK)bHB!W[8SK)^H&K)^H&K)`Rb!W[8Srr3-%EkMHn]n6:OrriCC]`<)dK)^H& 1653 | K)^H&K)`dh"TWSV!-5c)s5EtZ!-5c)s+:9&s+:9&s2t?F!-5aQEkR))g]%rriCC]`<)dU&P8rEkMHn]n699s+:9& 1668 | s+:9JrrN1@^$Pb#!-5caQ:EkVAM"TWSV!-5c)s6]gi!-5aQEkR))K)^H&K)^H& 1671 | a8Z2@EkVJP!W[8SK)ag0!W[8SK)^H&K)^H&K)a*q!W[8Srr3$"EkR))g]%UKrEkVAM!W[8SK)`"R!W[8SK)^H&K)^f0!W[8SK)bZH!W[8Squ6]tEkR))X8`5$EkR)) 1679 | K)^H&N;iqZEkR))"TSK%EkVAM!W[8SK)_eL!W[8SK)^H&K)^f0!W[8SKDtuQEkV8J!W[8SK)_eL!W[8S 1680 | K)^H&K)^]-!W[8SLAq;TEkV8J!W[8SK)_\I!W[8SK)^H&K)^f0!W[8SM>mVWEkV8J!W[8SK)_SF!W[8S 1681 | K)^H&K)^]-!W[8SN;iqZEkV8J!W[8SK)_SF!W[8SK)^H&K)^]-!W[8SO8f7]EkV/G!W[8SK)_JC!W[8S 1682 | K)^H&K)^]-!W[8SP5bR`EkV8J!W[8SK)_A@!W[8SK)^H&K)^]-!W[8SP5bR`EkV8J!W[8SK)_A@!W[8S 1683 | K)^H&K)^T*!W[8SR/[3fEkV/G!W[8SK)_A@!W[8SK)^H&K)`%S!<<,RrrN1@]pSg$!-5dGrrN1@]n69S 1684 | rrN1@]n699s+:9Prr`<%rr<&WrrN1@]pSg$!-5dGrrN1@]n69SrrN1@]n699s+:9Mrr`<%rr<&ZrrN1@ 1685 | ]po$'!-5dDrrN1@]n69SrrN1@]n699s+:9Jrr`<%rr<&]rrN1@]po$'!-5dDrrN1@]n69SrrN1@]n699 1686 | s+:9Drr`<%rr<&`rrN1@]q56*!-5dDrrN1@]n69SrrN1@]n699s+:9Arr`<%rr<&crrN1@]qPH-!-5d> 1687 | rrN1@]n69VrrN1@]n699s+:9>rr`<%rr<&frrN1@]qPH-!-5d>rrN1@]n69VrrN1@]n699s+:98rrE*" 1688 | o)AakEkS1H!W[8Sm/I+eEkR))TDnrmEkR))K)^H&OoGOa!<3$!q#:BqEkS1H!W[8Sm/I+eEkR))TDnrm 1689 | EkR))K)^H&NrK4^!<3$!qu6]tEkS1H!W[8Sm/I+eEkR))TDnrmEkR))K)^H&MuNn[!<3$!qu6]tEkSCN 1690 | !W[8Sl2LebEkR))TDnrmEkR))K)^H&L&V/R!<3!"!-5cNrrN1@^$5Ou!-5c)s.B;m!-5c)s+:9&s+::M 1691 | !!.,RVuHeuEkU`;!W[8SK)_SF!W[8SK)^H&K)^H&r;Qp#EkVJQ!36&#!-5d8rrN1@]n69\rrN1@]n699 1692 | s+:9&s8;lu!-5dOrrE*"XoAG&EkUW8!W[8SK)_\I!W[8SK)^H&K)^H&r;QfuEkV>L"98H%!!'A*!W[8S 1693 | k5PJ_EkR))W;co!EkR))K)^H&K)bZH!W[8Sp\t?r!<3$![f6C/EkUW8!W[8SK)_eL!W[8SK)^H&K)^H& 1694 | q>UKrEkV,F"98H%!!'S0!W[8Sj8T/\EkR))Y5\P'EkR))K)^H&K)bQE!W[8Smf*:f!5/=5!-5d5rrN1@ 1695 | ]n69errN1@]n699s+:9&s7ZHo!-5d=rr`<%rr<&9rrN1@^#T+o!-5c)s/uA'!-5c)s+:9&s+::ErrN1@ 1696 | ^$,J!!!*$!!6+s>!-5d5rrN1@]n69hrrN1@]n699s+:9&s7?6l!-5d4rrE*"aSu;AEkUE2!W[8SK)`4X 1697 | !W[8SK)^H&K)^H&oD\jlEkUB1"98H%!!(=E!W[8Si;WiYEkR))\,QL0EkR))K)^H&K)b??!W[8Sh#@KW 1698 | !<3$!dJj7JEkUaWEkR))kPkS`EkT6f"TWSV 1706 | !-5cfrsJgI]`<)d!-5aQEkR))K)^H&o)AakEkSdY"98H%!!)or!W[8S_Z'Z;EkR))mJd4fEkTHl#QSnY 1707 | !-5aQEkSUT#QSnY!-5aQEkR))K)^H&qu6]tEkSRS!<<-!rrN1@]u'dN!-5c)s6]gf!-5crrriCC]`<)d 1708 | S,WNiEkR))K)^H&rr3$"EkSIPrVut>]taRK!-5c)s7?6l!-5curriCC]`<)dP5bR`EkR))K)^H&!W[8S 1709 | VuHo#EkVJQ!5JO8!-5c)s7uZr!-5currN1@]nuaj!-5c)s+:9)rrN1@]r1l9!-5dQ!!*$!!5ea;!-5c) 1710 | s8;lu!-5d#rriCC]`<)dKDu)TEkMHn]n699s,6mY!-5cNrrN1@^&%a0!!'n9!W[8SKDtuQEkTm#!W[8S 1711 | K)bQE!W[8SK)^H&NrK.\EkSCN!W[8Sp\t?r!<3$!aSu;AEkR,*!W[8SeGfRMEkR))nG`OiEkR))K)^u5 1712 | !W[8SVuHeuEkV,F"98H%!!(+?!W[8SM>mVWEkU*)"TWSV!-5c)s6BUc!-5c)s+:98rrN1@]r1l3!-5d@ 1713 | rrE*"bPqVDEkRG3!W[8SfDbmPEkR))iVrrZEkR))K)_2;!W[8SVuHeuEkUf="98H%!!(=E!W[8SO8f7] 1714 | EkU*)!W[8SK)a^-!W[8SK)^H&Rf 1716 | 1717 | %AXGEndBitmap 1718 | GR 1719 | GR 1720 | %%Trailer 1721 | %%Pages: 1 1722 | %%EOF 1723 | -------------------------------------------------------------------------------- /figs/coverage.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/coverage.fig -------------------------------------------------------------------------------- /figs/dubins planner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/dubins planner.jpg -------------------------------------------------------------------------------- /figs/dubins.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/dubins.fig -------------------------------------------------------------------------------- /figs/dubins.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/dubins.jpg -------------------------------------------------------------------------------- /figs/p1_diameter.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/p1_diameter.fig -------------------------------------------------------------------------------- /figs/p1_distance.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/p1_distance.fig -------------------------------------------------------------------------------- /figs/p1_polygon.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/p1_polygon.fig -------------------------------------------------------------------------------- /figs/pathexample.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%Creator: (MATLAB, The Mathworks, Inc. Version 8.4.0.150421 \(R2014b\). Operating System: Linux) 3 | %%Title: /home/irving/projects/wind_optimization/figs/pathexample.eps 4 | %%CreationDate: 2016-05-12T16:01:45 5 | %%Pages: (atend) 6 | %%BoundingBox: 0 0 554 473 7 | %%LanguageLevel: 2 8 | %%EndComments 9 | %%BeginProlog 10 | %%BeginResource: procset (Apache XML Graphics Std ProcSet) 1.2 0 11 | %%Version: 1.2 0 12 | %%Copyright: (Copyright 2001-2003,2010 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0) 13 | /bd{bind def}bind def 14 | /ld{load def}bd 15 | /GR/grestore ld 16 | /M/moveto ld 17 | /LJ/setlinejoin ld 18 | /C/curveto ld 19 | /f/fill ld 20 | /LW/setlinewidth ld 21 | /GC/setgray ld 22 | /t/show ld 23 | /N/newpath ld 24 | /CT/concat ld 25 | /cp/closepath ld 26 | /S/stroke ld 27 | /L/lineto ld 28 | /CC/setcmykcolor ld 29 | /A/ashow ld 30 | /GS/gsave ld 31 | /RC/setrgbcolor ld 32 | /RM/rmoveto ld 33 | /ML/setmiterlimit ld 34 | /re {4 2 roll M 35 | 1 index 0 rlineto 36 | 0 exch rlineto 37 | neg 0 rlineto 38 | cp } bd 39 | /_ctm matrix def 40 | /_tm matrix def 41 | /BT { _ctm currentmatrix pop matrix _tm copy pop 0 0 moveto } bd 42 | /ET { _ctm setmatrix } bd 43 | /iTm { _ctm setmatrix _tm concat } bd 44 | /Tm { _tm astore pop iTm 0 0 moveto } bd 45 | /ux 0.0 def 46 | /uy 0.0 def 47 | /F { 48 | /Tp exch def 49 | /Tf exch def 50 | Tf findfont Tp scalefont setfont 51 | /cf Tf def /cs Tp def 52 | } bd 53 | /ULS {currentpoint /uy exch def /ux exch def} bd 54 | /ULE { 55 | /Tcx currentpoint pop def 56 | gsave 57 | newpath 58 | cf findfont cs scalefont dup 59 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 60 | /UnderlinePosition get Ts mul /To exch def 61 | /UnderlineThickness get Ts mul /Tt exch def 62 | ux uy To add moveto Tcx uy To add lineto 63 | Tt setlinewidth stroke 64 | grestore 65 | } bd 66 | /OLE { 67 | /Tcx currentpoint pop def 68 | gsave 69 | newpath 70 | cf findfont cs scalefont dup 71 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 72 | /UnderlinePosition get Ts mul /To exch def 73 | /UnderlineThickness get Ts mul /Tt exch def 74 | ux uy To add cs add moveto Tcx uy To add cs add lineto 75 | Tt setlinewidth stroke 76 | grestore 77 | } bd 78 | /SOE { 79 | /Tcx currentpoint pop def 80 | gsave 81 | newpath 82 | cf findfont cs scalefont dup 83 | /FontMatrix get 0 get /Ts exch def /FontInfo get dup 84 | /UnderlinePosition get Ts mul /To exch def 85 | /UnderlineThickness get Ts mul /Tt exch def 86 | ux uy To add cs 10 mul 26 idiv add moveto Tcx uy To add cs 10 mul 26 idiv add lineto 87 | Tt setlinewidth stroke 88 | grestore 89 | } bd 90 | /QT { 91 | /Y22 exch store 92 | /X22 exch store 93 | /Y21 exch store 94 | /X21 exch store 95 | currentpoint 96 | /Y21 load 2 mul add 3 div exch 97 | /X21 load 2 mul add 3 div exch 98 | /X21 load 2 mul /X22 load add 3 div 99 | /Y21 load 2 mul /Y22 load add 3 div 100 | /X22 load /Y22 load curveto 101 | } bd 102 | /SSPD { 103 | dup length /d exch dict def 104 | { 105 | /v exch def 106 | /k exch def 107 | currentpagedevice k known { 108 | /cpdv currentpagedevice k get def 109 | v cpdv ne { 110 | /upd false def 111 | /nullv v type /nulltype eq def 112 | /nullcpdv cpdv type /nulltype eq def 113 | nullv nullcpdv or 114 | { 115 | /upd true def 116 | } { 117 | /sametype v type cpdv type eq def 118 | sametype { 119 | v type /arraytype eq { 120 | /vlen v length def 121 | /cpdvlen cpdv length def 122 | vlen cpdvlen eq { 123 | 0 1 vlen 1 sub { 124 | /i exch def 125 | /obj v i get def 126 | /cpdobj cpdv i get def 127 | obj cpdobj ne { 128 | /upd true def 129 | exit 130 | } if 131 | } for 132 | } { 133 | /upd true def 134 | } ifelse 135 | } { 136 | v type /dicttype eq { 137 | v { 138 | /dv exch def 139 | /dk exch def 140 | /cpddv cpdv dk get def 141 | dv cpddv ne { 142 | /upd true def 143 | exit 144 | } if 145 | } forall 146 | } { 147 | /upd true def 148 | } ifelse 149 | } ifelse 150 | } if 151 | } ifelse 152 | upd true eq { 153 | d k v put 154 | } if 155 | } if 156 | } if 157 | } forall 158 | d length 0 gt { 159 | d setpagedevice 160 | } if 161 | } bd 162 | %%EndResource 163 | %%BeginResource: procset (Apache XML Graphics EPS ProcSet) 1.0 0 164 | %%Version: 1.0 0 165 | %%Copyright: (Copyright 2002-2003 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0) 166 | /BeginEPSF { %def 167 | /b4_Inc_state save def % Save state for cleanup 168 | /dict_count countdictstack def % Count objects on dict stack 169 | /op_count count 1 sub def % Count objects on operand stack 170 | userdict begin % Push userdict on dict stack 171 | /showpage { } def % Redefine showpage, { } = null proc 172 | 0 setgray 0 setlinecap % Prepare graphics state 173 | 1 setlinewidth 0 setlinejoin 174 | 10 setmiterlimit [ ] 0 setdash newpath 175 | /languagelevel where % If level not equal to 1 then 176 | {pop languagelevel % set strokeadjust and 177 | 1 ne % overprint to their defaults. 178 | {false setstrokeadjust false setoverprint 179 | } if 180 | } if 181 | } bd 182 | /EndEPSF { %def 183 | count op_count sub {pop} repeat % Clean up stacks 184 | countdictstack dict_count sub {end} repeat 185 | b4_Inc_state restore 186 | } bd 187 | %%EndResource 188 | %FOPBeginFontDict 189 | %%IncludeResource: font Courier-Bold 190 | %%IncludeResource: font Helvetica 191 | %%IncludeResource: font Courier-BoldOblique 192 | %%IncludeResource: font Courier-Oblique 193 | %%IncludeResource: font Times-Roman 194 | %%IncludeResource: font Helvetica-BoldOblique 195 | %%IncludeResource: font Helvetica-Bold 196 | %%IncludeResource: font Helvetica-Oblique 197 | %%IncludeResource: font Times-BoldItalic 198 | %%IncludeResource: font Courier 199 | %%IncludeResource: font Times-Italic 200 | %%IncludeResource: font Times-Bold 201 | %%IncludeResource: font Symbol 202 | %%IncludeResource: font ZapfDingbats 203 | %FOPEndFontDict 204 | %%BeginResource: encoding WinAnsiEncoding 205 | /WinAnsiEncoding [ 206 | /.notdef /.notdef /.notdef /.notdef /.notdef 207 | /.notdef /.notdef /.notdef /.notdef /.notdef 208 | /.notdef /.notdef /.notdef /.notdef /.notdef 209 | /.notdef /.notdef /.notdef /.notdef /.notdef 210 | /.notdef /.notdef /.notdef /.notdef /.notdef 211 | /.notdef /.notdef /.notdef /.notdef /.notdef 212 | /.notdef /.notdef /space /exclam /quotedbl 213 | /numbersign /dollar /percent /ampersand /quotesingle 214 | /parenleft /parenright /asterisk /plus /comma 215 | /hyphen /period /slash /zero /one 216 | /two /three /four /five /six 217 | /seven /eight /nine /colon /semicolon 218 | /less /equal /greater /question /at 219 | /A /B /C /D /E 220 | /F /G /H /I /J 221 | /K /L /M /N /O 222 | /P /Q /R /S /T 223 | /U /V /W /X /Y 224 | /Z /bracketleft /backslash /bracketright /asciicircum 225 | /underscore /quoteleft /a /b /c 226 | /d /e /f /g /h 227 | /i /j /k /l /m 228 | /n /o /p /q /r 229 | /s /t /u /v /w 230 | /x /y /z /braceleft /bar 231 | /braceright /asciitilde /bullet /Euro /bullet 232 | /quotesinglbase /florin /quotedblbase /ellipsis /dagger 233 | /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft 234 | /OE /bullet /Zcaron /bullet /bullet 235 | /quoteleft /quoteright /quotedblleft /quotedblright /bullet 236 | /endash /emdash /asciitilde /trademark /scaron 237 | /guilsinglright /oe /bullet /zcaron /Ydieresis 238 | /space /exclamdown /cent /sterling /currency 239 | /yen /brokenbar /section /dieresis /copyright 240 | /ordfeminine /guillemotleft /logicalnot /sfthyphen /registered 241 | /macron /degree /plusminus /twosuperior /threesuperior 242 | /acute /mu /paragraph /middot /cedilla 243 | /onesuperior /ordmasculine /guillemotright /onequarter /onehalf 244 | /threequarters /questiondown /Agrave /Aacute /Acircumflex 245 | /Atilde /Adieresis /Aring /AE /Ccedilla 246 | /Egrave /Eacute /Ecircumflex /Edieresis /Igrave 247 | /Iacute /Icircumflex /Idieresis /Eth /Ntilde 248 | /Ograve /Oacute /Ocircumflex /Otilde /Odieresis 249 | /multiply /Oslash /Ugrave /Uacute /Ucircumflex 250 | /Udieresis /Yacute /Thorn /germandbls /agrave 251 | /aacute /acircumflex /atilde /adieresis /aring 252 | /ae /ccedilla /egrave /eacute /ecircumflex 253 | /edieresis /igrave /iacute /icircumflex /idieresis 254 | /eth /ntilde /ograve /oacute /ocircumflex 255 | /otilde /odieresis /divide /oslash /ugrave 256 | /uacute /ucircumflex /udieresis /yacute /thorn 257 | /ydieresis 258 | ] def 259 | %%EndResource 260 | %FOPBeginFontReencode 261 | /Courier-Bold findfont 262 | dup length dict begin 263 | {1 index /FID ne {def} {pop pop} ifelse} forall 264 | /Encoding WinAnsiEncoding def 265 | currentdict 266 | end 267 | /Courier-Bold exch definefont pop 268 | /Helvetica findfont 269 | dup length dict begin 270 | {1 index /FID ne {def} {pop pop} ifelse} forall 271 | /Encoding WinAnsiEncoding def 272 | currentdict 273 | end 274 | /Helvetica exch definefont pop 275 | /Courier-BoldOblique findfont 276 | dup length dict begin 277 | {1 index /FID ne {def} {pop pop} ifelse} forall 278 | /Encoding WinAnsiEncoding def 279 | currentdict 280 | end 281 | /Courier-BoldOblique exch definefont pop 282 | /Courier-Oblique findfont 283 | dup length dict begin 284 | {1 index /FID ne {def} {pop pop} ifelse} forall 285 | /Encoding WinAnsiEncoding def 286 | currentdict 287 | end 288 | /Courier-Oblique exch definefont pop 289 | /Times-Roman findfont 290 | dup length dict begin 291 | {1 index /FID ne {def} {pop pop} ifelse} forall 292 | /Encoding WinAnsiEncoding def 293 | currentdict 294 | end 295 | /Times-Roman exch definefont pop 296 | /Helvetica-BoldOblique findfont 297 | dup length dict begin 298 | {1 index /FID ne {def} {pop pop} ifelse} forall 299 | /Encoding WinAnsiEncoding def 300 | currentdict 301 | end 302 | /Helvetica-BoldOblique exch definefont pop 303 | /Helvetica-Bold findfont 304 | dup length dict begin 305 | {1 index /FID ne {def} {pop pop} ifelse} forall 306 | /Encoding WinAnsiEncoding def 307 | currentdict 308 | end 309 | /Helvetica-Bold exch definefont pop 310 | /Helvetica-Oblique findfont 311 | dup length dict begin 312 | {1 index /FID ne {def} {pop pop} ifelse} forall 313 | /Encoding WinAnsiEncoding def 314 | currentdict 315 | end 316 | /Helvetica-Oblique exch definefont pop 317 | /Times-BoldItalic findfont 318 | dup length dict begin 319 | {1 index /FID ne {def} {pop pop} ifelse} forall 320 | /Encoding WinAnsiEncoding def 321 | currentdict 322 | end 323 | /Times-BoldItalic exch definefont pop 324 | /Courier findfont 325 | dup length dict begin 326 | {1 index /FID ne {def} {pop pop} ifelse} forall 327 | /Encoding WinAnsiEncoding def 328 | currentdict 329 | end 330 | /Courier exch definefont pop 331 | /Times-Italic findfont 332 | dup length dict begin 333 | {1 index /FID ne {def} {pop pop} ifelse} forall 334 | /Encoding WinAnsiEncoding def 335 | currentdict 336 | end 337 | /Times-Italic exch definefont pop 338 | /Times-Bold findfont 339 | dup length dict begin 340 | {1 index /FID ne {def} {pop pop} ifelse} forall 341 | /Encoding WinAnsiEncoding def 342 | currentdict 343 | end 344 | /Times-Bold exch definefont pop 345 | %FOPEndFontReencode 346 | %%EndProlog 347 | %%Page: 1 1 348 | %%PageBoundingBox: 0 0 554 473 349 | %%BeginPageSetup 350 | [1 0 0 -1 0 473] CT 351 | %%EndPageSetup 352 | GS 353 | [0.75 0 0 0.75 0 0.5] CT 354 | 1 GC 355 | N 356 | 0 0 738 630 re 357 | f 358 | GR 359 | GS 360 | [0.75 0 0 0.75 0 0.5] CT 361 | 1 GC 362 | N 363 | 0 0 738 630 re 364 | f 365 | GR 366 | GS 367 | [0.75 0 0 0.75 0 0.5] CT 368 | 1 GC 369 | N 370 | 118.141 539 M 371 | 636.859 539 L 372 | 636.859 82 L 373 | 118.141 82 L 374 | cp 375 | f 376 | GR 377 | GS 378 | [0.75 0 0 0.75 0 0.5] CT 379 | 0.149 GC 380 | 2 setlinecap 381 | 10.0 ML 382 | N 383 | 118.141 539 M 384 | 636.859 539 L 385 | S 386 | GR 387 | GS 388 | [0.75 0 0 0.75 0 0.5] CT 389 | 0.149 GC 390 | 2 setlinecap 391 | 10.0 ML 392 | N 393 | 132.17 539 M 394 | 132.17 533.813 L 395 | S 396 | GR 397 | GS 398 | [0.75 0 0 0.75 0 0.5] CT 399 | 0.149 GC 400 | 2 setlinecap 401 | 10.0 ML 402 | N 403 | 182.948 539 M 404 | 182.948 533.813 L 405 | S 406 | GR 407 | GS 408 | [0.75 0 0 0.75 0 0.5] CT 409 | 0.149 GC 410 | 2 setlinecap 411 | 10.0 ML 412 | N 413 | 233.726 539 M 414 | 233.726 533.813 L 415 | S 416 | GR 417 | GS 418 | [0.75 0 0 0.75 0 0.5] CT 419 | 0.149 GC 420 | 2 setlinecap 421 | 10.0 ML 422 | N 423 | 284.504 539 M 424 | 284.504 533.813 L 425 | S 426 | GR 427 | GS 428 | [0.75 0 0 0.75 0 0.5] CT 429 | 0.149 GC 430 | 2 setlinecap 431 | 10.0 ML 432 | N 433 | 335.281 539 M 434 | 335.281 533.813 L 435 | S 436 | GR 437 | GS 438 | [0.75 0 0 0.75 0 0.5] CT 439 | 0.149 GC 440 | 2 setlinecap 441 | 10.0 ML 442 | N 443 | 386.059 539 M 444 | 386.059 533.813 L 445 | S 446 | GR 447 | GS 448 | [0.75 0 0 0.75 0 0.5] CT 449 | 0.149 GC 450 | 2 setlinecap 451 | 10.0 ML 452 | N 453 | 436.837 539 M 454 | 436.837 533.813 L 455 | S 456 | GR 457 | GS 458 | [0.75 0 0 0.75 0 0.5] CT 459 | 0.149 GC 460 | 2 setlinecap 461 | 10.0 ML 462 | N 463 | 487.615 539 M 464 | 487.615 533.813 L 465 | S 466 | GR 467 | GS 468 | [0.75 0 0 0.75 0 0.5] CT 469 | 0.149 GC 470 | 2 setlinecap 471 | 10.0 ML 472 | N 473 | 538.393 539 M 474 | 538.393 533.813 L 475 | S 476 | GR 477 | GS 478 | [0.75 0 0 0.75 0 0.5] CT 479 | 0.149 GC 480 | 2 setlinecap 481 | 10.0 ML 482 | N 483 | 589.17 539 M 484 | 589.17 533.813 L 485 | S 486 | GR 487 | GS 488 | [0.75 0 0 0.75 99.12778 408.74998] CT 489 | 0.149 GC 490 | /Helvetica 13 F 491 | GS 492 | [1 0 0 1 0 0] CT 493 | -14.752 12.067 moveto 494 | 1 -1 scale 495 | (-600) t 496 | GR 497 | GR 498 | GS 499 | [0.75 0 0 0.75 137.21112 408.74998] CT 500 | 0.149 GC 501 | /Helvetica 13 F 502 | GS 503 | [1 0 0 1 0 0] CT 504 | -14.752 12.067 moveto 505 | 1 -1 scale 506 | (-500) t 507 | GR 508 | GR 509 | GS 510 | [0.75 0 0 0.75 175.29445 408.74998] CT 511 | 0.149 GC 512 | /Helvetica 13 F 513 | GS 514 | [1 0 0 1 0 0] CT 515 | -14.752 12.067 moveto 516 | 1 -1 scale 517 | (-400) t 518 | GR 519 | GR 520 | GS 521 | [0.75 0 0 0.75 213.37779 408.74998] CT 522 | 0.149 GC 523 | /Helvetica 13 F 524 | GS 525 | [1 0 0 1 0 0] CT 526 | -14.752 12.067 moveto 527 | 1 -1 scale 528 | (-300) t 529 | GR 530 | GR 531 | GS 532 | [0.75 0 0 0.75 251.46112 408.74998] CT 533 | 0.149 GC 534 | /Helvetica 13 F 535 | GS 536 | [1 0 0 1 0 0] CT 537 | -14.752 12.067 moveto 538 | 1 -1 scale 539 | (-200) t 540 | GR 541 | GR 542 | GS 543 | [0.75 0 0 0.75 289.54445 408.74998] CT 544 | 0.149 GC 545 | /Helvetica 13 F 546 | GS 547 | [1 0 0 1 0 0] CT 548 | -14.752 12.067 moveto 549 | 1 -1 scale 550 | (-100) t 551 | GR 552 | GR 553 | GS 554 | [0.75 0 0 0.75 327.6278 408.74998] CT 555 | 0.149 GC 556 | /Helvetica 13 F 557 | GS 558 | [1 0 0 1 0 0] CT 559 | -4.135 12.067 moveto 560 | 1 -1 scale 561 | (0) t 562 | GR 563 | GR 564 | GS 565 | [0.75 0 0 0.75 365.71113 408.74998] CT 566 | 0.149 GC 567 | /Helvetica 13 F 568 | GS 569 | [1 0 0 1 0 0] CT 570 | -12.406 12.067 moveto 571 | 1 -1 scale 572 | (100) t 573 | GR 574 | GR 575 | GS 576 | [0.75 0 0 0.75 403.79443 408.74998] CT 577 | 0.149 GC 578 | /Helvetica 13 F 579 | GS 580 | [1 0 0 1 0 0] CT 581 | -12.406 12.067 moveto 582 | 1 -1 scale 583 | (200) t 584 | GR 585 | GR 586 | GS 587 | [0.75 0 0 0.75 441.87781 408.74998] CT 588 | 0.149 GC 589 | /Helvetica 13 F 590 | GS 591 | [1 0 0 1 0 0] CT 592 | -12.406 12.067 moveto 593 | 1 -1 scale 594 | (300) t 595 | GR 596 | GR 597 | GS 598 | [0.75 0 0 0.75 0 0.5] CT 599 | 0.149 GC 600 | 2 setlinecap 601 | 10.0 ML 602 | N 603 | 118.141 539 M 604 | 118.141 82 L 605 | S 606 | GR 607 | GS 608 | [0.75 0 0 0.75 0 0.5] CT 609 | 0.149 GC 610 | 2 setlinecap 611 | 10.0 ML 612 | N 613 | 118.141 539 M 614 | 123.329 539 L 615 | S 616 | GR 617 | GS 618 | [0.75 0 0 0.75 0 0.5] CT 619 | 0.149 GC 620 | 2 setlinecap 621 | 10.0 ML 622 | N 623 | 118.141 488.222 M 624 | 123.329 488.222 L 625 | S 626 | GR 627 | GS 628 | [0.75 0 0 0.75 0 0.5] CT 629 | 0.149 GC 630 | 2 setlinecap 631 | 10.0 ML 632 | N 633 | 118.141 437.444 M 634 | 123.329 437.444 L 635 | S 636 | GR 637 | GS 638 | [0.75 0 0 0.75 0 0.5] CT 639 | 0.149 GC 640 | 2 setlinecap 641 | 10.0 ML 642 | N 643 | 118.141 386.667 M 644 | 123.329 386.667 L 645 | S 646 | GR 647 | GS 648 | [0.75 0 0 0.75 0 0.5] CT 649 | 0.149 GC 650 | 2 setlinecap 651 | 10.0 ML 652 | N 653 | 118.141 335.889 M 654 | 123.329 335.889 L 655 | S 656 | GR 657 | GS 658 | [0.75 0 0 0.75 0 0.5] CT 659 | 0.149 GC 660 | 2 setlinecap 661 | 10.0 ML 662 | N 663 | 118.141 285.111 M 664 | 123.329 285.111 L 665 | S 666 | GR 667 | GS 668 | [0.75 0 0 0.75 0 0.5] CT 669 | 0.149 GC 670 | 2 setlinecap 671 | 10.0 ML 672 | N 673 | 118.141 234.333 M 674 | 123.329 234.333 L 675 | S 676 | GR 677 | GS 678 | [0.75 0 0 0.75 0 0.5] CT 679 | 0.149 GC 680 | 2 setlinecap 681 | 10.0 ML 682 | N 683 | 118.141 183.556 M 684 | 123.329 183.556 L 685 | S 686 | GR 687 | GS 688 | [0.75 0 0 0.75 0 0.5] CT 689 | 0.149 GC 690 | 2 setlinecap 691 | 10.0 ML 692 | N 693 | 118.141 132.778 M 694 | 123.329 132.778 L 695 | S 696 | GR 697 | GS 698 | [0.75 0 0 0.75 0 0.5] CT 699 | 0.149 GC 700 | 2 setlinecap 701 | 10.0 ML 702 | N 703 | 118.141 82 M 704 | 123.329 82 L 705 | S 706 | GR 707 | GS 708 | [0.75 0 0 0.75 84.6061 404.75] CT 709 | 0.149 GC 710 | /Helvetica 13 F 711 | GS 712 | [1 0 0 1 0 0] CT 713 | -29.504 4.5 moveto 714 | 1 -1 scale 715 | (-500) t 716 | GR 717 | GR 718 | GS 719 | [0.75 0 0 0.75 84.6061 366.66667] CT 720 | 0.149 GC 721 | /Helvetica 13 F 722 | GS 723 | [1 0 0 1 0 0] CT 724 | -29.504 4.5 moveto 725 | 1 -1 scale 726 | (-400) t 727 | GR 728 | GR 729 | GS 730 | [0.75 0 0 0.75 84.6061 328.58334] CT 731 | 0.149 GC 732 | /Helvetica 13 F 733 | GS 734 | [1 0 0 1 0 0] CT 735 | -29.504 4.5 moveto 736 | 1 -1 scale 737 | (-300) t 738 | GR 739 | GR 740 | GS 741 | [0.75 0 0 0.75 84.6061 290.49999] CT 742 | 0.149 GC 743 | /Helvetica 13 F 744 | GS 745 | [1 0 0 1 0 0] CT 746 | -29.504 4.5 moveto 747 | 1 -1 scale 748 | (-200) t 749 | GR 750 | GR 751 | GS 752 | [0.75 0 0 0.75 84.6061 252.41666] CT 753 | 0.149 GC 754 | /Helvetica 13 F 755 | GS 756 | [1 0 0 1 0 0] CT 757 | -29.504 4.5 moveto 758 | 1 -1 scale 759 | (-100) t 760 | GR 761 | GR 762 | GS 763 | [0.75 0 0 0.75 84.6061 214.33334] CT 764 | 0.149 GC 765 | /Helvetica 13 F 766 | GS 767 | [1 0 0 1 0 0] CT 768 | -8.271 4.5 moveto 769 | 1 -1 scale 770 | (0) t 771 | GR 772 | GR 773 | GS 774 | [0.75 0 0 0.75 84.6061 176.25] CT 775 | 0.149 GC 776 | /Helvetica 13 F 777 | GS 778 | [1 0 0 1 0 0] CT 779 | -24.813 4.5 moveto 780 | 1 -1 scale 781 | (100) t 782 | GR 783 | GR 784 | GS 785 | [0.75 0 0 0.75 84.6061 138.16667] CT 786 | 0.149 GC 787 | /Helvetica 13 F 788 | GS 789 | [1 0 0 1 0 0] CT 790 | -24.813 4.5 moveto 791 | 1 -1 scale 792 | (200) t 793 | GR 794 | GR 795 | GS 796 | [0.75 0 0 0.75 84.6061 100.08333] CT 797 | 0.149 GC 798 | /Helvetica 13 F 799 | GS 800 | [1 0 0 1 0 0] CT 801 | -24.813 4.5 moveto 802 | 1 -1 scale 803 | (300) t 804 | GR 805 | GR 806 | GS 807 | [0.75 0 0 0.75 84.6061 62] CT 808 | 0.149 GC 809 | /Helvetica 13 F 810 | GS 811 | [1 0 0 1 0 0] CT 812 | -24.813 4.5 moveto 813 | 1 -1 scale 814 | (400) t 815 | GR 816 | GR 817 | GS 818 | [0.75 0 0 0.75 0 0.5] CT 819 | 1 0 0 RC 820 | 2 setlinecap 821 | 10.0 ML 822 | N 823 | 299.656 192.574 M 824 | 204.917 362.989 L 825 | S 826 | GR 827 | GS 828 | [0.75 0 0 0.75 0 0.5] CT 829 | 1 0 0 RC 830 | 2 setlinecap 831 | 10.0 ML 832 | N 833 | 204.917 362.989 M 834 | 550.083 504.63 L 835 | S 836 | GR 837 | GS 838 | [0.75 0 0 0.75 0 0.5] CT 839 | 1 0 0 RC 840 | 2 setlinecap 841 | 10.0 ML 842 | N 843 | 550.083 504.63 M 844 | 536.726 256.607 L 845 | S 846 | GR 847 | GS 848 | [0.75 0 0 0.75 0 0.5] CT 849 | 1 0 0 RC 850 | 2 setlinecap 851 | 10.0 ML 852 | N 853 | 536.726 256.607 M 854 | 299.656 192.574 L 855 | S 856 | GR 857 | GS 858 | [0.75 0 0 0.75 0 0.5] CT 859 | 0 0.447 0.741 RC 860 | 2 setlinecap 861 | 10.0 ML 862 | N 863 | 204.917 362.989 M 864 | 204.917 362.989 L 865 | 204.917 344.722 L 866 | 215.072 344.722 L 867 | 215.072 344.722 L 868 | 215.072 367.157 L 869 | 215.072 371.324 L 870 | 215.072 371.324 L 871 | 225.228 371.324 L 872 | 225.228 371.324 L 873 | 225.228 326.454 L 874 | 225.228 308.186 L 875 | 235.384 308.186 L 876 | 235.384 308.186 L 877 | 235.384 375.491 L 878 | 235.384 379.659 L 879 | 235.384 379.659 L 880 | 245.539 379.659 L 881 | 245.539 379.659 L 882 | 245.539 289.918 L 883 | 245.539 271.651 L 884 | 255.695 271.651 L 885 | 255.695 271.651 L 886 | 255.695 383.826 L 887 | 255.695 387.994 L 888 | 255.695 387.994 L 889 | 265.85 387.994 L 890 | 265.85 387.994 L 891 | 265.85 253.383 L 892 | 265.85 235.115 L 893 | 276.006 235.115 L 894 | 276.006 235.115 L 895 | 276.006 392.161 L 896 | 276.006 396.328 L 897 | 276.006 396.328 L 898 | 286.161 396.328 L 899 | 286.161 396.328 L 900 | 286.161 216.848 L 901 | 286.161 198.58 L 902 | 296.317 198.58 L 903 | 296.317 198.58 L 904 | 296.317 400.496 L 905 | 296.317 404.663 L 906 | 296.317 404.663 L 907 | 306.472 404.663 L 908 | 306.472 404.663 L 909 | 306.472 194.415 L 910 | 306.472 194.415 L 911 | 316.628 194.415 L 912 | 316.628 197.158 L 913 | 316.628 408.83 L 914 | 316.628 412.998 L 915 | 316.628 412.998 L 916 | 326.784 412.998 L 917 | 326.784 412.998 L 918 | 326.784 199.901 L 919 | 326.784 199.901 L 920 | 336.939 199.901 L 921 | 336.939 202.644 L 922 | 336.939 417.165 L 923 | 336.939 421.333 L 924 | 336.939 421.333 L 925 | 347.095 421.333 L 926 | 347.095 421.333 L 927 | 347.095 205.387 L 928 | 347.095 205.387 L 929 | 357.25 205.387 L 930 | 357.25 208.13 L 931 | 357.25 425.5 L 932 | 357.25 429.667 L 933 | 357.25 429.667 L 934 | 367.406 429.667 L 935 | 367.406 429.667 L 936 | 367.406 210.873 L 937 | 367.406 210.873 L 938 | 377.561 210.873 L 939 | 377.561 213.616 L 940 | 377.561 433.835 L 941 | 377.561 438.002 L 942 | 377.561 438.002 L 943 | 387.717 438.002 L 944 | 387.717 438.002 L 945 | 387.717 216.359 L 946 | 387.717 216.359 L 947 | 397.872 216.359 L 948 | 397.872 219.102 L 949 | 397.872 442.169 L 950 | 397.872 446.337 L 951 | 397.872 446.337 L 952 | 408.028 446.337 L 953 | 408.028 446.337 L 954 | 408.028 221.845 L 955 | 408.028 221.845 L 956 | 418.184 221.845 L 957 | 418.184 224.588 L 958 | 418.184 450.504 L 959 | 418.184 454.672 L 960 | 418.184 454.672 L 961 | 428.339 454.672 L 962 | 428.339 454.672 L 963 | 428.339 227.331 L 964 | 428.339 227.331 L 965 | 438.495 227.331 L 966 | 438.495 230.074 L 967 | 438.495 458.839 L 968 | 438.495 463.006 L 969 | 438.495 463.006 L 970 | 448.65 463.006 L 971 | 448.65 463.006 L 972 | 448.65 232.817 L 973 | 448.65 232.817 L 974 | 458.806 232.817 L 975 | 458.806 235.56 L 976 | 458.806 467.174 L 977 | 458.806 471.341 L 978 | 458.806 471.341 L 979 | 468.961 471.341 L 980 | 468.961 471.341 L 981 | 468.961 238.303 L 982 | 468.961 238.303 L 983 | 479.117 238.303 L 984 | 479.117 241.046 L 985 | 479.117 475.508 L 986 | 479.117 479.676 L 987 | 479.117 479.676 L 988 | 489.272 479.676 L 989 | 489.272 479.676 L 990 | 489.272 243.789 L 991 | 489.272 243.789 L 992 | 499.428 243.789 L 993 | 499.428 246.532 L 994 | 499.428 483.843 L 995 | 499.428 488.011 L 996 | 499.428 488.011 L 997 | 509.584 488.011 L 998 | 509.584 488.011 L 999 | 509.584 249.275 L 1000 | 509.584 249.275 L 1001 | 519.739 249.275 L 1002 | 519.739 252.018 L 1003 | 519.739 492.178 L 1004 | 519.739 496.345 L 1005 | 519.739 496.345 L 1006 | 529.895 496.345 L 1007 | 529.895 496.345 L 1008 | 529.895 254.761 L 1009 | 529.895 254.761 L 1010 | 540.05 254.761 L 1011 | 540.05 318.338 L 1012 | 540.05 500.513 L 1013 | S 1014 | GR 1015 | %%Trailer 1016 | %%Pages: 1 1017 | %%EOF 1018 | -------------------------------------------------------------------------------- /figs/pathexample.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/pathexample.fig -------------------------------------------------------------------------------- /figs/untitled.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/figs/untitled.jpg -------------------------------------------------------------------------------- /fu.m: -------------------------------------------------------------------------------- 1 | function [X Y] = fu(t, W) 2 | X = cos(t); 3 | Y = sin(t); 4 | X1 = t * W(1,1); 5 | Y1 = t * W(1,2); 6 | X = X - X1; 7 | Y = Y - Y1; 8 | end -------------------------------------------------------------------------------- /fx.m: -------------------------------------------------------------------------------- 1 | function [X Y] = fx(t) 2 | X = cos(t); 3 | Y = sin(t); 4 | end -------------------------------------------------------------------------------- /getDubinsCurve.m: -------------------------------------------------------------------------------- 1 | function [P1,P2,P3,d,beta] = getDubinsCurve(Wp1, Wp2, r, dx) 2 | a = 2 * r + dx; 3 | b = 2 * r; 4 | temp = a/(4*r); 5 | beta = acos(temp); 6 | 7 | if(Wp1(1,2)>Wp2(1,2)) 8 | yh = Wp1(1,2); 9 | else 10 | yh = Wp2(1,2); 11 | end 12 | 13 | P1 = [(Wp1(1,1)-r) yh]; 14 | P3 = [(Wp2(1,1)+r) yh]; 15 | P2 = [(P1(1,1) + 2*r*cos(beta)) (P1(1,2) + 2*r*sin(beta))]; 16 | 17 | d = r * beta + r * (pi + 2*beta) + r * beta; 18 | end -------------------------------------------------------------------------------- /getDubinsWaypoints.m: -------------------------------------------------------------------------------- 1 | function [WPs, dist] = getDubinsWaypoints(Wp1, Wp2, r, dx, dir) 2 | a = 2 * r + dx; 3 | b = 2 * r; 4 | temp = a/(4*r); 5 | beta = acos(temp); 6 | 7 | if(Wp1(1,2)>Wp2(1,2)) 8 | yh = Wp1(1,2); 9 | else 10 | yh = Wp2(1,2); 11 | end 12 | 13 | P1 = [(Wp1(1,1)-r) yh]; 14 | P3 = [(Wp2(1,1)+r) yh]; 15 | P2 = [(P1(1,1) + 2*r*cos(beta)) (P1(1,2) + 2*r*sin(beta))]; 16 | 17 | if(dir == -1) 18 | P2 = [(P1(1,1) + 2*r*cos(-beta)) (P1(1,2) + 2*r*sin(-beta))]; 19 | end 20 | 21 | dist = r * beta + r * (pi + 2*beta) + r * beta; 22 | 23 | if(dir == 1) 24 | [X, Y] = circle(P1, r, 0, beta, pi/10); 25 | [X2, Y2] = circle(P2, r, pi+beta, 0-beta, -pi/10); 26 | [X3, Y3] = circle(P3, r, pi-beta, pi, pi/10); 27 | WPs = [X' Y'; X2' Y2';X3' Y3']; 28 | else 29 | [X, Y] = circle(P1, r, 2*pi, 2*pi-beta, -pi/10); 30 | [X2, Y2] = circle(P2, r, pi-beta, 2*pi+beta, pi/10); 31 | [X3, Y3] = circle(P3, r, pi+beta, pi, -pi/10); 32 | WPs = [X' Y'; X2' Y2';X3' Y3']; 33 | end 34 | end -------------------------------------------------------------------------------- /getDubinsWaypointsEnergy.m: -------------------------------------------------------------------------------- 1 | % Estimates the dubins path and calculates the energy by integrating the 2 | % power over the time 3 | % param dir indica si el path es por arriba o por abajo. 1 superior, -1 4 | % inferior 5 | 6 | function [WPs, dist, Energy] = getDubinsWaypointsEnergy(Wp1, Wp2, r, dx, dir) 7 | % distancia entre los centros de los dos circulos izquierdo y derecho 8 | a = 2 * r + dx; 9 | temp = a/(4*r); 10 | % angulo entre la horizontal y la linea que une el centro del circulo 11 | % izquierdo con el centro del circulo superior 12 | beta = acos(temp); 13 | 14 | % obtener la coordenada y más arriba 15 | if(Wp1(1,2)>Wp2(1,2)) 16 | yh = Wp1(1,2); 17 | else 18 | yh = Wp2(1,2); 19 | end 20 | 21 | % Centros de los circulos 22 | P1 = [(Wp1(1,1)-r) yh]; 23 | P3 = [(Wp2(1,1)+r) yh]; 24 | P2 = [(P1(1,1) + 2*r*cos(beta)) (P1(1,2) + 2*r*sin(beta))]; 25 | if(dir == -1) 26 | P2 = [(P1(1,1) + 2*r*cos(-beta)) (P1(1,2) + 2*r*sin(-beta))]; 27 | end 28 | 29 | % calcular Dubins curves 30 | if(dir == 1) 31 | % Superior 32 | % Left turn 33 | [X, Y] = circle(P1, r, 0, beta, pi/10); 34 | 35 | [X2, Y2] = circle(P2, r, pi+beta, 0-beta, -pi/10); 36 | [X3, Y3] = circle(P3, r, pi-beta, pi, pi/10); 37 | WPs = [X' Y'; X2' Y2';X3' Y3']; 38 | else 39 | % Inferior 40 | [X, Y] = circle(P1, r, 2*pi, 2*pi-beta, -pi/10); 41 | [X2, Y2] = circle(P2, r, pi-beta, 2*pi+beta, pi/10); 42 | [X3, Y3] = circle(P3, r, pi+beta, pi, -pi/10); 43 | WPs = [X' Y'; X2' Y2';X3' Y3']; 44 | end 45 | 46 | % Calculate the total distance 47 | dist = r * beta + r * (pi + 2*beta) + r * beta; 48 | end -------------------------------------------------------------------------------- /getPath.m: -------------------------------------------------------------------------------- 1 | % BUG que pasa si hay mas de una intersección con la linea vertical 2 | 3 | % Dist = [lb lf ll lr]; 4 | function [Path, Dist, nLines] = getPath(M, dx, curve_radius) 5 | %% Generate lines 6 | 7 | gap_y = 1; 8 | 9 | % left limit 10 | l_limit = min(M(:,1)); 11 | down_limit = min(M(:,2)); 12 | up_limit = max(M(:,2)); 13 | 14 | %right limit 15 | r_limit = max(M(:,1)); 16 | 17 | y1 = down_limit - gap_y; 18 | y2 = up_limit + gap_y; 19 | 20 | %nl = floor((r_limit - l_limit)/dx) +1; 21 | %LinesXY = zeros(nl,4); 22 | 23 | x1 = l_limit; 24 | x2 = x1; 25 | 26 | df = 0; 27 | db = 0; 28 | dr = 0; 29 | dl = 0; 30 | dir = 1;% forth abajo arriba, -back 31 | 32 | %% 33 | %Calcular distancia de la curva 34 | 35 | % Show the intersection points. 36 | % figure('Position',[10 100 500 500],'Renderer','zbuffer'); 37 | % axes_properties.box = 'on'; 38 | % axes_properties.XLim = [-2 2]; 39 | % axes_properties.YLim = [-2 2]; 40 | % axes_properties.DataAspectRatio = [1 1 1]; 41 | % axes_properties.NextPlot = 'add'; 42 | % axes(axes_properties,'parent',gcf); 43 | % hold on 44 | 45 | %% 46 | i = 1; %numero de waypoints agregados 47 | lines = 0; 48 | nLinesF = 0; 49 | nLinesB = 0; 50 | enterWP = [0 0]; 51 | exitWP = [0 0]; 52 | lastWP = [0 0]; 53 | 54 | while(x1 <= r_limit) 55 | % linea de intersección 56 | LineXY = [x1 y1 x2 y2]; 57 | x1 = x1 + dx; 58 | x2 = x1; 59 | lines = lines +1; 60 | 61 | %intersecciones 62 | out = lineSegmentIntersect(M,LineXY); 63 | intersections = [out.intMatrixX(:) out.intMatrixY(:)]; 64 | intersections( ~any(intersections,2), : ) = []; 65 | 66 | 67 | n = size(intersections,1); 68 | if (n == 1) 69 | p1 = intersections(1,:); 70 | Path(i,:) = p1; 71 | enterWP = p1; 72 | i = i+1; 73 | end 74 | 75 | % si hay dos intersecciones entonces tomamos las intersecciones como wp 76 | if (n == 2) 77 | p1 = intersections(1,:); 78 | p2 = intersections(2,:); 79 | 80 | % las ordenamos de acuerdo a la dirección 81 | if (dir == 1) % direcciń hacia arriba 82 | 83 | % ordenar los puntos para que corresponda con la dirección 84 | % hacia arriba 85 | if (p2(1,2) 1) 96 | % agregar un punto para compensar 97 | dif = enterWP(1,2) - lastWP(1,2); 98 | if(dif < 0) % agregar un punto a la izquierda 99 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 100 | Path(i,:) = intermediateWP; 101 | i = i+1; 102 | 103 | [dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, -1); 104 | Path = [Path ;dubinsWP]; 105 | i = i + size(dubinsWP,1); 106 | 107 | dl = dl + dist; 108 | else % agregar un punto a la derecha 109 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 110 | 111 | [dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, -1); 112 | Path = [Path ;dubinsWP]; 113 | i = i + size(dubinsWP,1); 114 | 115 | Path(i,:) = intermediateWP; 116 | i = i+1; 117 | 118 | dl = dl + dist; 119 | end 120 | end 121 | 122 | Path(i,:) = enterWP; 123 | i = i+1; 124 | Path(i,:) = exitWP; 125 | i = i+1; 126 | 127 | dist = norm(exitWP-enterWP); 128 | df = df + dist; 129 | nLinesF = nLinesF +1; 130 | else % dirección hacia abajo 131 | 132 | %ordenar los waypoints 133 | if (p2(1,2) 1) 142 | % agregar un punto para compensar 143 | dif = enterWP(1,2) - lastWP(1,2); 144 | if(dif > 0) % agregar un punto a la izquierda 145 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 146 | 147 | Path(i,:) = intermediateWP; 148 | i = i+1; 149 | 150 | [dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, 1); 151 | Path = [Path ;dubinsWP]; 152 | i = i + size(dubinsWP,1); 153 | 154 | dr = dr + dist; 155 | else % agregar un punto a la derecha 156 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 157 | 158 | [dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, 1); 159 | Path = [Path ;dubinsWP]; 160 | i = i + size(dubinsWP,1); 161 | 162 | Path(i,:) = intermediateWP; 163 | i = i+1; 164 | 165 | dr = dr + dist; 166 | end 167 | end 168 | 169 | Path(i,:) = enterWP; 170 | i = i+1; 171 | Path(i,:) = exitWP; 172 | i = i+1; 173 | 174 | dist = norm(exitWP-enterWP); 175 | db = db + dist; 176 | nLinesB = nLinesB +1 ; 177 | end 178 | 179 | dir = dir * -1; 180 | lastWP = exitWP; 181 | end 182 | 183 | nLines = [nLinesB nLinesF]; 184 | %pause 185 | end 186 | 187 | % title('Intersection Points'); 188 | % hold off; 189 | 190 | Dist = [db df dl dr]; 191 | 192 | end 193 | 194 | -------------------------------------------------------------------------------- /getPathAndEnergy.m: -------------------------------------------------------------------------------- 1 | % BUG que pasa si hay mas de una intersección con la linea vertical 2 | 3 | 4 | %Returns a path for a given polygon 5 | % Dist = [lb lf ll lr]; 6 | function [Path, Dist, Energy] = getPathAndEnergy(M, dx, curve_radius) 7 | %% Generate lines 8 | 9 | gap_y = 1; 10 | 11 | % polygon limits 12 | l_limit = min(M(:,1)); 13 | r_limit = max(M(:,1)); 14 | down_limit = min(M(:,2)); 15 | up_limit = max(M(:,2)); 16 | 17 | %extend the lines beyond the polygon 18 | y1 = down_limit - gap_y; 19 | y2 = up_limit + gap_y; 20 | 21 | x1 = l_limit; 22 | x2 = x1; 23 | 24 | df = 0; 25 | db = 0; 26 | dr = 0; 27 | dl = 0; 28 | dir = 1;% forth abajo arriba, -back 29 | 30 | %% Show the intersection points. 31 | % figure('Position',[10 100 500 500],'Renderer','zbuffer'); 32 | % axes_properties.box = 'on'; 33 | % axes_properties.XLim = [-2 2]; 34 | % axes_properties.YLim = [-2 2]; 35 | % axes_properties.DataAspectRatio = [1 1 1]; 36 | % axes_properties.NextPlot = 'add'; 37 | % axes(axes_properties,'parent',gcf); 38 | % hold on 39 | 40 | %% 41 | i = 1; %numero de waypoints agregados 42 | lines = 0; 43 | nLinesF = 0; 44 | nLinesB = 0; 45 | enterWP = [0 0]; 46 | exitWP = [0 0]; 47 | lastWP = [0 0]; 48 | 49 | while(x1 <= r_limit) 50 | % linea de intersección 51 | LineXY = [x1 y1 x2 y2]; 52 | x1 = x1 + dx; 53 | x2 = x1; 54 | lines = lines +1; 55 | 56 | %intersecciones 57 | out = lineSegmentIntersect(M,LineXY); 58 | intersections = [out.intMatrixX(:) out.intMatrixY(:)]; 59 | intersections( ~any(intersections,2), : ) = []; 60 | n = size(intersections,1); 61 | 62 | if (n == 1) 63 | p1 = intersections(1,:); 64 | Path(i,:) = p1; 65 | enterWP = p1; 66 | i = i+1; 67 | end 68 | 69 | % si hay dos intersecciones entonces tomamos las intersecciones como wp 70 | if (n == 2) 71 | p1 = intersections(1,:); 72 | p2 = intersections(2,:); 73 | 74 | % las ordenamos de acuerdo a la dirección 75 | if (dir == 1) % direcciń hacia arriba 76 | 77 | % ordenar los puntos para que corresponda con la dirección 78 | % hacia arriba 79 | if (p2(1,2) 1) 90 | % agregar un punto para compensar 91 | dif = enterWP(1,2) - lastWP(1,2); 92 | if(dif < 0) % agregar un punto a la izquierda 93 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 94 | Path(i,:) = intermediateWP; 95 | i = i+1; 96 | 97 | [dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, -1); 98 | Path = [Path ;dubinsWP]; 99 | i = i + size(dubinsWP,1); 100 | 101 | dl = dl + dist; 102 | else % agregar un punto a la derecha 103 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 104 | 105 | [dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, -1); 106 | Path = [Path ;dubinsWP]; 107 | i = i + size(dubinsWP,1); 108 | 109 | Path(i,:) = intermediateWP; 110 | i = i+1; 111 | 112 | dl = dl + dist; 113 | end 114 | end 115 | 116 | Path(i,:) = enterWP; 117 | i = i+1; 118 | Path(i,:) = exitWP; 119 | i = i+1; 120 | 121 | dist = norm(exitWP-enterWP); 122 | df = df + dist; 123 | nLinesF = nLinesF +1; 124 | else % dirección hacia abajo 125 | 126 | %ordenar los waypoints 127 | if (p2(1,2) 1) 136 | % agregar un punto para compensar 137 | dif = enterWP(1,2) - lastWP(1,2); 138 | if(dif > 0) % agregar un punto a la izquierda 139 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 140 | 141 | Path(i,:) = intermediateWP; 142 | i = i+1; 143 | 144 | [dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, 1); 145 | Path = [Path ;dubinsWP]; 146 | i = i + size(dubinsWP,1); 147 | 148 | dr = dr + dist; 149 | else % agregar un punto a la derecha 150 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 151 | 152 | [dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, 1); 153 | Path = [Path ;dubinsWP]; 154 | i = i + size(dubinsWP,1); 155 | 156 | Path(i,:) = intermediateWP; 157 | i = i+1; 158 | 159 | dr = dr + dist; 160 | end 161 | end 162 | 163 | Path(i,:) = enterWP; 164 | i = i+1; 165 | Path(i,:) = exitWP; 166 | i = i+1; 167 | 168 | dist = norm(exitWP-enterWP); 169 | db = db + dist; 170 | nLinesB = nLinesB +1 ; 171 | end 172 | 173 | dir = dir * -1; 174 | lastWP = exitWP; 175 | end 176 | 177 | nLines = [nLinesB nLinesF]; 178 | %pause 179 | end 180 | 181 | % title('Intersection Points'); 182 | % hold off; 183 | 184 | Dist = [db df dl dr]; 185 | 186 | end -------------------------------------------------------------------------------- /getPathAndEnergyMR.m: -------------------------------------------------------------------------------- 1 | % BUG que pasa si hay mas de una intersección con la linea vertical 2 | % BUG Todavia no calcula la energia 3 | 4 | % Returns a path for a given polygon 5 | % Multirotor 6 | % Dist = [lb lf ll lr]; 7 | function [Path, Dist, Energy] = getPathAndEnergyMR(M, dx, curve_radius) 8 | %% Generate lines 9 | 10 | gap_y = 1; 11 | 12 | % polygon limits 13 | l_limit = min(M(:,1)); 14 | r_limit = max(M(:,1)); 15 | down_limit = min(M(:,2)); 16 | up_limit = max(M(:,2)); 17 | 18 | %extend the lines beyond the polygon 19 | y1 = down_limit - gap_y; 20 | y2 = up_limit + gap_y; 21 | 22 | x1 = l_limit; 23 | x2 = x1; 24 | 25 | df = 0; 26 | db = 0; 27 | dr = 0; 28 | dl = 0; 29 | dir = 1;% forth abajo arriba, -back 30 | 31 | %% Show the intersection points. 32 | % figure('Position',[10 100 500 500],'Renderer','zbuffer'); 33 | % axes_properties.box = 'on'; 34 | % axes_properties.XLim = [-2 2]; 35 | % axes_properties.YLim = [-2 2]; 36 | % axes_properties.DataAspectRatio = [1 1 1]; 37 | % axes_properties.NextPlot = 'add'; 38 | % axes(axes_properties,'parent',gcf); 39 | % hold on 40 | 41 | %% 42 | i = 1; %numero de waypoints agregados 43 | lines = 0; 44 | nLinesF = 0; 45 | nLinesB = 0; 46 | enterWP = [0 0]; 47 | exitWP = [0 0]; 48 | lastWP = [0 0]; 49 | 50 | while(x1 <= r_limit) 51 | % linea de intersección 52 | LineXY = [x1 y1 x2 y2]; 53 | x1 = x1 + dx; 54 | x2 = x1; 55 | lines = lines +1; 56 | 57 | %intersecciones 58 | out = lineSegmentIntersect(M,LineXY); 59 | intersections = [out.intMatrixX(:) out.intMatrixY(:)]; 60 | intersections( ~any(intersections,2), : ) = []; 61 | n = size(intersections,1); 62 | 63 | % Si solo hay una intersección agegamos el punto directamente 64 | if (n == 1) 65 | p1 = intersections(1,:); 66 | Path(i,:) = p1; 67 | enterWP = p1; 68 | i = i+1; 69 | end 70 | 71 | % si hay dos intersecciones entonces tomamos las intersecciones como wp 72 | if (n > 1) 73 | 74 | if(n>2) 75 | [B, kkk] = sort(intersections(:,2)); % TODO: Revisar que esto este bien 76 | ordered = [intersections(kkk) B]; 77 | p1 = ordered(1,:); 78 | p2 = ordered(n,:); 79 | else 80 | p1 = intersections(1,:); 81 | p2 = intersections(2,:); 82 | end 83 | 84 | 85 | % las ordenamos de acuerdo a la dirección 86 | if (dir == 1) % direcciń hacia arriba 87 | 88 | % ordenar los puntos para que corresponda con la dirección 89 | % hacia arriba 90 | if (p2(1,2) 1) 101 | % agregar un punto para compensar la inclinación de la 102 | % arista del poligono 103 | dif = enterWP(1,2) - lastWP(1,2); 104 | if(dif < 0) % agregar un punto a la izquierda 105 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 106 | Path(i,:) = intermediateWP; 107 | i = i+1; 108 | 109 | % TODO: integrar la energia gastada entre esos dos 110 | % puntos 111 | %[dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, -1); 112 | Path = [Path ;intermediateWP; enterWP]; 113 | %i = i + size(dubinsWP,1); 114 | i = i + 2; 115 | dist = norm(intermediateWP-enterWP); 116 | dl = dl + dist; 117 | else % agregar un punto a la derecha 118 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 119 | 120 | %[dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, -1); 121 | %Path = [Path ;dubinsWP]; 122 | Path = [Path; lastWP; intermediateWP]; 123 | %i = i + size(dubinsWP,1); 124 | i = i + 2; 125 | 126 | %Path(i,:) = intermediateWP; 127 | %i = i+1; 128 | 129 | dist = norm(lastWP-intermediateWP); 130 | dl = dl + dist; 131 | end 132 | end 133 | 134 | Path(i,:) = enterWP; 135 | i = i+1; 136 | Path(i,:) = exitWP; 137 | i = i+1; 138 | 139 | dist = norm(exitWP-enterWP); 140 | df = df + dist; 141 | nLinesF = nLinesF +1; 142 | else % dirección hacia abajo 143 | 144 | %ordenar los waypoints 145 | if (p2(1,2) 1) 154 | % agregar un punto para compensar 155 | dif = enterWP(1,2) - lastWP(1,2); 156 | if(dif > 0) % agregar un punto a la izquierda 157 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 158 | 159 | %Path(i,:) = intermediateWP; 160 | %i = i+1; 161 | 162 | %[dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, 1); 163 | %Path = [Path ;dubinsWP]; 164 | Path = [Path; intermediateWP; enterWP]; 165 | %i = i + size(dubinsWP,1); 166 | i = i+2; 167 | 168 | dist = norm(intermediateWP-enterWP); 169 | dr = dr + dist; 170 | else % agregar un punto a la derecha 171 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 172 | 173 | 174 | %[dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, 1); 175 | %Path = [Path ;dubinsWP]; 176 | Path = [Path; lastWP; intermediateWP]; 177 | %i = i + size(dubinsWP,1); 178 | i = i+2; 179 | 180 | %Path(i,:) = intermediateWP; 181 | %i = i+1; 182 | dist = norm(lastWP-intermediateWP); 183 | dr = dr + dist; 184 | end 185 | end 186 | 187 | Path(i,:) = enterWP; 188 | i = i+1; 189 | Path(i,:) = exitWP; 190 | i = i+1; 191 | 192 | dist = norm(exitWP-enterWP); 193 | db = db + dist; 194 | nLinesB = nLinesB +1 ; 195 | end 196 | 197 | dir = dir * -1; 198 | lastWP = exitWP; 199 | end 200 | 201 | nLines = [nLinesB nLinesF]; 202 | %pause 203 | end 204 | 205 | % title('Intersection Points'); 206 | % hold off; 207 | 208 | Dist = [db df dl dr]; 209 | 210 | end -------------------------------------------------------------------------------- /getPathMR.m: -------------------------------------------------------------------------------- 1 | % BUG que pasa si hay mas de una intersección con la linea vertical 2 | % BUG Todavia no calcula la energia 3 | 4 | % Returns a path for a given polygon 5 | % Multirotor 6 | % Dist = [lb lf ll lr]; 7 | function [Path, Dist, Energy] = getPathMR(M, dx, curve_radius) 8 | %% Generate lines 9 | 10 | gap_y = 1; 11 | 12 | % polygon limits 13 | l_limit = min(M(:,1)); 14 | r_limit = max(M(:,1)); 15 | down_limit = min(M(:,2)); 16 | up_limit = max(M(:,2)); 17 | 18 | %extend the lines beyond the polygon 19 | y1 = down_limit - gap_y; 20 | y2 = up_limit + gap_y; 21 | 22 | x1 = l_limit; 23 | x2 = x1; 24 | 25 | df = 0; 26 | db = 0; 27 | dr = 0; 28 | dl = 0; 29 | dir = 1;% forth abajo arriba, -back 30 | 31 | %% Show the intersection points. 32 | % figure('Position',[10 100 500 500],'Renderer','zbuffer'); 33 | % axes_properties.box = 'on'; 34 | % axes_properties.XLim = [-2 2]; 35 | % axes_properties.YLim = [-2 2]; 36 | % axes_properties.DataAspectRatio = [1 1 1]; 37 | % axes_properties.NextPlot = 'add'; 38 | % axes(axes_properties,'parent',gcf); 39 | % hold on 40 | 41 | %% 42 | i = 1; %numero de waypoints agregados 43 | lines = 0; 44 | nLinesF = 0; 45 | nLinesB = 0; 46 | enterWP = [0 0]; 47 | exitWP = [0 0]; 48 | lastWP = [0 0]; 49 | 50 | while(x1 <= r_limit) 51 | % linea de intersección 52 | LineXY = [x1 y1 x2 y2]; 53 | x1 = x1 + dx; 54 | x2 = x1; 55 | lines = lines +1; 56 | 57 | %intersecciones 58 | out = lineSegmentIntersect(M,LineXY); 59 | intersections = [out.intMatrixX(:) out.intMatrixY(:)]; 60 | intersections( ~any(intersections,2), : ) = []; 61 | n = size(intersections,1); 62 | 63 | % Si solo hay una intersección agegamos el punto directamente 64 | if (n == 1) 65 | p1 = intersections(1,:); 66 | Path(i,:) = p1; 67 | enterWP = p1; 68 | i = i+1; 69 | end 70 | 71 | % si hay dos intersecciones entonces tomamos las intersecciones como wp 72 | if (n > 1) 73 | 74 | if(n>2) 75 | [B, kkk] = sort(intersections(:,2)); % TODO: Revisar que esto este bien 76 | ordered = [intersections(kkk) B]; 77 | p1 = ordered(1,:); 78 | p2 = ordered(n,:); 79 | else 80 | p1 = intersections(1,:); 81 | p2 = intersections(2,:); 82 | end 83 | 84 | 85 | % las ordenamos de acuerdo a la dirección 86 | if (dir == 1) % direcciń hacia arriba 87 | 88 | % ordenar los puntos para que corresponda con la dirección 89 | % hacia arriba 90 | if (p2(1,2) 1) 101 | % agregar un punto para compensar la inclinación de la 102 | % arista del poligono 103 | dif = enterWP(1,2) - lastWP(1,2); 104 | if(dif < 0) % agregar un punto a la izquierda 105 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 106 | Path(i,:) = intermediateWP; 107 | i = i+1; 108 | 109 | % TODO: integrar la energia gastada entre esos dos 110 | % puntos 111 | %[dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, -1); 112 | Path = [Path ;intermediateWP; enterWP]; 113 | %i = i + size(dubinsWP,1); 114 | i = i + 2; 115 | dist = norm(intermediateWP-enterWP); 116 | dl = dl + dist; 117 | else % agregar un punto a la derecha 118 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 119 | 120 | %[dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, -1); 121 | %Path = [Path ;dubinsWP]; 122 | Path = [Path; lastWP; intermediateWP]; 123 | %i = i + size(dubinsWP,1); 124 | i = i + 2; 125 | 126 | %Path(i,:) = intermediateWP; 127 | %i = i+1; 128 | 129 | dist = norm(lastWP-intermediateWP); 130 | dl = dl + dist; 131 | end 132 | end 133 | 134 | Path(i,:) = enterWP; 135 | i = i+1; 136 | Path(i,:) = exitWP; 137 | i = i+1; 138 | 139 | dist = norm(exitWP-enterWP); 140 | df = df + dist; 141 | nLinesF = nLinesF +1; 142 | else % dirección hacia abajo 143 | 144 | %ordenar los waypoints 145 | if (p2(1,2) 1) 154 | % agregar un punto para compensar 155 | dif = enterWP(1,2) - lastWP(1,2); 156 | if(dif > 0) % agregar un punto a la izquierda 157 | intermediateWP = [lastWP(1,1) enterWP(1,2)]; 158 | 159 | %Path(i,:) = intermediateWP; 160 | %i = i+1; 161 | 162 | %[dubinsWP, dist] = getDubinsWaypoints(intermediateWP, enterWP, curve_radius, dx, 1); 163 | %Path = [Path ;dubinsWP]; 164 | Path = [Path; intermediateWP; enterWP]; 165 | %i = i + size(dubinsWP,1); 166 | i = i+2; 167 | 168 | dist = norm(intermediateWP-enterWP); 169 | dr = dr + dist; 170 | else % agregar un punto a la derecha 171 | intermediateWP = [enterWP(1,1) lastWP(1,2)]; 172 | 173 | 174 | %[dubinsWP, dist] = getDubinsWaypoints(lastWP, intermediateWP, curve_radius, dx, 1); 175 | %Path = [Path ;dubinsWP]; 176 | Path = [Path; lastWP; intermediateWP]; 177 | %i = i + size(dubinsWP,1); 178 | i = i+2; 179 | 180 | %Path(i,:) = intermediateWP; 181 | %i = i+1; 182 | dist = norm(lastWP-intermediateWP); 183 | dr = dr + dist; 184 | end 185 | end 186 | 187 | Path(i,:) = enterWP; 188 | i = i+1; 189 | Path(i,:) = exitWP; 190 | i = i+1; 191 | 192 | dist = norm(exitWP-enterWP); 193 | db = db + dist; 194 | nLinesB = nLinesB +1 ; 195 | end 196 | 197 | dir = dir * -1; 198 | lastWP = exitWP; 199 | end 200 | 201 | nLines = [nLinesB nLinesF]; 202 | %pause 203 | end 204 | 205 | % title('Intersection Points'); 206 | % hold off; 207 | 208 | Dist = [db df dl dr]; 209 | 210 | end -------------------------------------------------------------------------------- /getPolygon.m: -------------------------------------------------------------------------------- 1 | function M = getPolygon(numVert, radius, radVar, angVar) 2 | 3 | % Specify polygon variables 4 | %numVert = 8; 5 | %radius = 1; 6 | %radVar = 1; % variance in the spikiness of vertices 7 | %angVar = 1; % variance in spacing of vertices around the unit circle 8 | 9 | % preallocate x and y 10 | x = zeros(numVert,1); 11 | y = zeros(numVert,1); 12 | 13 | % angle of the unit circle in radians 14 | circleAng = 2*pi; 15 | % the average angular separation between points in a unit circle 16 | angleSeparation = circleAng/numVert; 17 | % create the matrix of angles for equal separation of points 18 | angleMatrix = 0: angleSeparation: circleAng; 19 | % drop the final angle since 2Pi = 0 20 | angleMatrix(end) = []; 21 | 22 | % generate the points x and y 23 | for k = 1:numVert 24 | x(k) = (radius + radius*rand(1)*radVar) * cos(angleMatrix(k) + angleSeparation*rand(1)*angVar); 25 | y(k) = (radius + radius*rand(1)*radVar) * sin(angleMatrix(k) + angleSeparation*rand(1)*angVar); 26 | end 27 | 28 | Polygon_vertex = [x y]; 29 | shifted_polygon_vertex = circshift(Polygon_vertex, -1); 30 | M = [Polygon_vertex shifted_polygon_vertex]; 31 | 32 | end -------------------------------------------------------------------------------- /guiMR.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/irvingvasquez/wind_cpp/4cc9062d5fc6159dbe60b3627422ecc1df9decf2/guiMR.fig -------------------------------------------------------------------------------- /guiMR.m: -------------------------------------------------------------------------------- 1 | function varargout = guiMR(varargin) 2 | % GUIMR MATLAB code for guiMR.fig 3 | % GUIMR, by itself, creates a new GUIMR or raises the existing 4 | % singleton*. 5 | % 6 | % H = GUIMR returns the handle to a new GUIMR or the handle to 7 | % the existing singleton*. 8 | % 9 | % GUIMR('CALLBACK',hObject,eventData,handles,...) calls the local 10 | % function named CALLBACK in GUIMR.M with the given input arguments. 11 | % 12 | % GUIMR('Property','Value',...) creates a new GUIMR or raises the 13 | % existing singleton*. Starting from the left, property value pairs are 14 | % applied to the GUI before guiMR_OpeningFcn gets called. An 15 | % unrecognized property name or invalid value makes property application 16 | % stop. All inputs are passed to guiMR_OpeningFcn via varargin. 17 | % 18 | % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one 19 | % instance to run (singleton)". 20 | % 21 | % See also: GUIDE, GUIDATA, GUIHANDLES 22 | 23 | % Edit the above text to modify the response to help guiMR 24 | 25 | % Last Modified by GUIDE v2.5 12-May-2016 15:44:38 26 | 27 | % Begin initialization code - DO NOT EDIT 28 | gui_Singleton = 1; 29 | gui_State = struct('gui_Name', mfilename, ... 30 | 'gui_Singleton', gui_Singleton, ... 31 | 'gui_OpeningFcn', @guiMR_OpeningFcn, ... 32 | 'gui_OutputFcn', @guiMR_OutputFcn, ... 33 | 'gui_LayoutFcn', [] , ... 34 | 'gui_Callback', []); 35 | if nargin && ischar(varargin{1}) 36 | gui_State.gui_Callback = str2func(varargin{1}); 37 | end 38 | 39 | if nargout 40 | [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 41 | else 42 | gui_mainfcn(gui_State, varargin{:}); 43 | end 44 | % End initialization code - DO NOT EDIT 45 | 46 | 47 | % --- Executes just before guiMR is made visible. 48 | function guiMR_OpeningFcn(hObject, eventdata, handles, varargin) 49 | % This function has no output args, see OutputFcn. 50 | % hObject handle to figure 51 | % eventdata reserved - to be defined in a future version of MATLAB 52 | % handles structure with handles and user data (see GUIDATA) 53 | % varargin command line arguments to guiMR (see VARARGIN) 54 | 55 | % Choose default command line output for guiMR 56 | handles.output = hObject; 57 | 58 | % Update handles structure 59 | guidata(hObject, handles); 60 | 61 | % UIWAIT makes guiMR wait for user response (see UIRESUME) 62 | % uiwait(handles.figure1); 63 | 64 | 65 | % --- Outputs from this function are returned to the command line. 66 | function varargout = guiMR_OutputFcn(hObject, eventdata, handles) 67 | % varargout cell array for returning output args (see VARARGOUT); 68 | % hObject handle to figure 69 | % eventdata reserved - to be defined in a future version of MATLAB 70 | % handles structure with handles and user data (see GUIDATA) 71 | 72 | % Get default command line output from handles structure 73 | varargout{1} = handles.output; 74 | 75 | 76 | % --- Executes on button press in getPolygonButton. 77 | function getPolygonButton_Callback(hObject, eventdata, handles) 78 | % hObject handle to getPolygonButton (see GCBO) 79 | % eventdata reserved - to be defined in a future version of MATLAB 80 | % handles structure with handles and user data (see GUIDATA) 81 | % Poligono 82 | n_vertices = 4; 83 | polygon_radius = 100; %meters 84 | rad_var = 5; 85 | ang_var = 1 ; 86 | % get polygon 87 | M = getPolygon(n_vertices,polygon_radius,rad_var,ang_var); 88 | handles.m = M; 89 | % Graficar polygono 90 | %figure('Position',[10 100 500 500],'Renderer','zbuffer'); 91 | axes(handles.axes1); 92 | cla(handles.axes1); 93 | axis equal; 94 | line([M(:,1)';M(:,3)'],[M(:,2)';M(:,4)'],'Color','r'); 95 | %annotation('arrow',[0.1 0.1],[0.5 0.5]) 96 | title('Polygon'); 97 | ylabel('x(meters)'); 98 | xlabel('y(meters)'); 99 | 100 | gamma_w = str2double(get(handles.txt_gamma_w,'string'))*pi/180; 101 | 102 | hold on; 103 | ang=0:0.1:2*pi; 104 | c = [-polygon_radius+polygon_radius/10 polygon_radius-polygon_radius/10]; 105 | c = rad_var .* c 106 | l = polygon_radius; 107 | xp= c(1,1) + polygon_radius/10 * cos(ang); 108 | yp= c(1,2) + polygon_radius/10 * sin(ang); 109 | plot(xp, yp); 110 | ll = [l*cos(gamma_w) l*sin(gamma_w)]; 111 | p = c + ll 112 | lines = [c;p] 113 | line(lines(:,1),lines(:,2)) 114 | hold off; 115 | 116 | guidata(hObject, handles) 117 | 118 | 119 | function txt_u_Callback(hObject, eventdata, handles) 120 | % hObject handle to txt_u (see GCBO) 121 | % eventdata reserved - to be defined in a future version of MATLAB 122 | % handles structure with handles and user data (see GUIDATA) 123 | 124 | % Hints: get(hObject,'String') returns contents of txt_u as text 125 | % str2double(get(hObject,'String')) returns contents of txt_u as a double 126 | 127 | 128 | % --- Executes during object creation, after setting all properties. 129 | function txt_u_CreateFcn(hObject, eventdata, handles) 130 | % hObject handle to txt_u (see GCBO) 131 | % eventdata reserved - to be defined in a future version of MATLAB 132 | % handles empty - handles not created until after all CreateFcns called 133 | 134 | % Hint: edit controls usually have a white background on Windows. 135 | % See ISPC and COMPUTER. 136 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 137 | set(hObject,'BackgroundColor','white'); 138 | end 139 | 140 | 141 | 142 | function txt_w_Callback(hObject, eventdata, handles) 143 | % hObject handle to txt_w (see GCBO) 144 | % eventdata reserved - to be defined in a future version of MATLAB 145 | % handles structure with handles and user data (see GUIDATA) 146 | 147 | % Hints: get(hObject,'String') returns contents of txt_w as text 148 | % str2double(get(hObject,'String')) returns contents of txt_w as a double 149 | 150 | 151 | % --- Executes during object creation, after setting all properties. 152 | function txt_w_CreateFcn(hObject, eventdata, handles) 153 | % hObject handle to txt_w (see GCBO) 154 | % eventdata reserved - to be defined in a future version of MATLAB 155 | % handles empty - handles not created until after all CreateFcns called 156 | 157 | % Hint: edit controls usually have a white background on Windows. 158 | % See ISPC and COMPUTER. 159 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 160 | set(hObject,'BackgroundColor','white'); 161 | end 162 | 163 | 164 | 165 | function txt_gamma_w_Callback(hObject, eventdata, handles) 166 | % hObject handle to txt_gamma_w (see GCBO) 167 | % eventdata reserved - to be defined in a future version of MATLAB 168 | % handles structure with handles and user data (see GUIDATA) 169 | 170 | % Hints: get(hObject,'String') returns contents of txt_gamma_w as text 171 | % str2double(get(hObject,'String')) returns contents of txt_gamma_w as a double 172 | 173 | 174 | % --- Executes during object creation, after setting all properties. 175 | function txt_gamma_w_CreateFcn(hObject, eventdata, handles) 176 | % hObject handle to txt_gamma_w (see GCBO) 177 | % eventdata reserved - to be defined in a future version of MATLAB 178 | % handles empty - handles not created until after all CreateFcns called 179 | 180 | % Hint: edit controls usually have a white background on Windows. 181 | % See ISPC and COMPUTER. 182 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 183 | set(hObject,'BackgroundColor','white'); 184 | end 185 | 186 | 187 | 188 | function txt_radius_Callback(hObject, eventdata, handles) 189 | % hObject handle to txt_radius (see GCBO) 190 | % eventdata reserved - to be defined in a future version of MATLAB 191 | % handles structure with handles and user data (see GUIDATA) 192 | 193 | % Hints: get(hObject,'String') returns contents of txt_radius as text 194 | % str2double(get(hObject,'String')) returns contents of txt_radius as a double 195 | 196 | 197 | % --- Executes during object creation, after setting all properties. 198 | function txt_radius_CreateFcn(hObject, eventdata, handles) 199 | % hObject handle to txt_radius (see GCBO) 200 | % eventdata reserved - to be defined in a future version of MATLAB 201 | % handles empty - handles not created until after all CreateFcns called 202 | 203 | % Hint: edit controls usually have a white background on Windows. 204 | % See ISPC and COMPUTER. 205 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 206 | set(hObject,'BackgroundColor','white'); 207 | end 208 | 209 | 210 | 211 | function txt_dx_Callback(hObject, eventdata, handles) 212 | % hObject handle to txt_dx (see GCBO) 213 | % eventdata reserved - to be defined in a future version of MATLAB 214 | % handles structure with handles and user data (see GUIDATA) 215 | 216 | % Hints: get(hObject,'String') returns contents of txt_dx as text 217 | % str2double(get(hObject,'String')) returns contents of txt_dx as a double 218 | 219 | 220 | % --- Executes during object creation, after setting all properties. 221 | function txt_dx_CreateFcn(hObject, eventdata, handles) 222 | % hObject handle to txt_dx (see GCBO) 223 | % eventdata reserved - to be defined in a future version of MATLAB 224 | % handles empty - handles not created until after all CreateFcns called 225 | 226 | % Hint: edit controls usually have a white background on Windows. 227 | % See ISPC and COMPUTER. 228 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 229 | set(hObject,'BackgroundColor','white'); 230 | end 231 | 232 | 233 | 234 | function txt_b0_Callback(hObject, eventdata, handles) 235 | % hObject handle to txt_b0 (see GCBO) 236 | % eventdata reserved - to be defined in a future version of MATLAB 237 | % handles structure with handles and user data (see GUIDATA) 238 | 239 | % Hints: get(hObject,'String') returns contents of txt_b0 as text 240 | % str2double(get(hObject,'String')) returns contents of txt_b0 as a double 241 | 242 | 243 | % --- Executes during object creation, after setting all properties. 244 | function txt_b0_CreateFcn(hObject, eventdata, handles) 245 | % hObject handle to txt_b0 (see GCBO) 246 | % eventdata reserved - to be defined in a future version of MATLAB 247 | % handles empty - handles not created until after all CreateFcns called 248 | 249 | % Hint: edit controls usually have a white background on Windows. 250 | % See ISPC and COMPUTER. 251 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 252 | set(hObject,'BackgroundColor','white'); 253 | end 254 | 255 | 256 | 257 | function txt_b1_Callback(hObject, eventdata, handles) 258 | % hObject handle to txt_b1 (see GCBO) 259 | % eventdata reserved - to be defined in a future version of MATLAB 260 | % handles structure with handles and user data (see GUIDATA) 261 | 262 | % Hints: get(hObject,'String') returns contents of txt_b1 as text 263 | % str2double(get(hObject,'String')) returns contents of txt_b1 as a double 264 | 265 | 266 | % --- Executes during object creation, after setting all properties. 267 | function txt_b1_CreateFcn(hObject, eventdata, handles) 268 | % hObject handle to txt_b1 (see GCBO) 269 | % eventdata reserved - to be defined in a future version of MATLAB 270 | % handles empty - handles not created until after all CreateFcns called 271 | 272 | % Hint: edit controls usually have a white background on Windows. 273 | % See ISPC and COMPUTER. 274 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 275 | set(hObject,'BackgroundColor','white'); 276 | end 277 | 278 | 279 | 280 | function txt_b2_Callback(hObject, eventdata, handles) 281 | % hObject handle to txt_b2 (see GCBO) 282 | % eventdata reserved - to be defined in a future version of MATLAB 283 | % handles structure with handles and user data (see GUIDATA) 284 | 285 | % Hints: get(hObject,'String') returns contents of txt_b2 as text 286 | % str2double(get(hObject,'String')) returns contents of txt_b2 as a double 287 | 288 | 289 | % --- Executes during object creation, after setting all properties. 290 | function txt_b2_CreateFcn(hObject, eventdata, handles) 291 | % hObject handle to txt_b2 (see GCBO) 292 | % eventdata reserved - to be defined in a future version of MATLAB 293 | % handles empty - handles not created until after all CreateFcns called 294 | 295 | % Hint: edit controls usually have a white background on Windows. 296 | % See ISPC and COMPUTER. 297 | if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 298 | set(hObject,'BackgroundColor','white'); 299 | end 300 | 301 | 302 | % --- Executes on button press in energyButton. 303 | function energyButton_Callback(hObject, eventdata, handles) 304 | % hObject handle to energyButton (see GCBO) 305 | % eventdata reserved - to be defined in a future version of MATLAB 306 | % handles structure with handles and user data (see GUIDATA) 307 | % UAV and coverage 308 | dx = str2double(get(handles.txt_dx,'string'));%20; % distance between lines 309 | curve_radius = str2double(get(handles.txt_radius,'string'));%15; %meters 310 | %u = 15; %m/s 311 | 312 | %Wind 313 | w = str2double(get(handles.txt_w,'string')); %m/s 314 | gamma_w = str2double(get(handles.txt_gamma_w,'string')) * (pi/180); 315 | v = str2double(get(handles.txt_v,'string')); 316 | 317 | %Power estimation 318 | b0 = str2double(get(handles.txt_b0,'string')); 319 | b1 = str2double(get(handles.txt_b1,'string')); 320 | b2 = str2double(get(handles.txt_b2,'string')); 321 | %b2 = 0.0111; 322 | %maxb2 = 0.0111; 323 | 324 | % Generar poligono 325 | M = handles.m; 326 | 327 | % Obtener una grafica de la función energia 328 | disp('Iniciar rotación'); 329 | 330 | steps = 1000; 331 | maxrotation = pi; 332 | diam = zeros(steps+1,1); 333 | energy = zeros(steps+1,1); 334 | length = zeros(steps+1,5); 335 | gamma = zeros(steps+1,1); 336 | x = 0:maxrotation/steps:maxrotation; 337 | xdeg = (180/pi) .* x; 338 | 339 | pts_s = [M(:,1) M(:,2)]; 340 | pts_e = [M(:,3) M(:,4)]; 341 | 342 | axes(handles.axes4) 343 | %figure('Position',[500 290 500 500],'Renderer','zbuffer'); 344 | title('Energy') 345 | ylabel('Energy') 346 | xlabel('\beta (radians)') 347 | hold on; 348 | 349 | best_beta = 0; 350 | min_energy = Inf; 351 | i=1; 352 | for beta = 0:maxrotation/steps:maxrotation 353 | % Rotate M 354 | pts_s2 = rotatePolygon(pts_s, beta); 355 | pts_e2 = rotatePolygon(pts_e, beta); 356 | M2 = [pts_s2' pts_e2']; 357 | diam(i) = diameter(M2); 358 | gamma_w_prima = gamma_w + beta; 359 | [energy(i), D, gamma(i)] = f_energy_MR_poly_onespeed(M2, dx, curve_radius, v, w, gamma_w_prima); 360 | %[energy(i), D, gamma(i)] = f_energy_MR_poly(M2, dx, curve_radius, v, w, gamma_w_prima, b0, b1, b2); 361 | length(i,:) = [D sum(D)]; 362 | if(energy(i)= 0) & (u_a <= 1) & (u_b >= 0) & (u_b <= 1); 113 | PAR_B = denominator == 0; 114 | COINC_B = (numerator_a == 0 & numerator_b == 0 & PAR_B); 115 | 116 | 117 | % Arrange output. 118 | out.intAdjacencyMatrix = INT_B; 119 | out.intMatrixX = INT_X .* INT_B; 120 | out.intMatrixY = INT_Y .* INT_B; 121 | out.intNormalizedDistance1To2 = u_a; 122 | out.intNormalizedDistance2To1 = u_b; 123 | out.parAdjacencyMatrix = PAR_B; 124 | out.coincAdjacencyMatrix= COINC_B; 125 | 126 | end 127 | 128 | -------------------------------------------------------------------------------- /polygon_intersection.m: -------------------------------------------------------------------------------- 1 | clear all 2 | clear all 3 | clc 4 | 5 | % Specify polygon variables 6 | numVert = 8; 7 | radius = 1; 8 | radVar = 1; % variance in the spikiness of vertices 9 | angVar = 1; % variance in spacing of vertices around the unit circle 10 | 11 | % preallocate x and y 12 | x = zeros(numVert,1); 13 | y = zeros(numVert,1); 14 | 15 | % angle of the unit circle in radians 16 | circleAng = 2*pi; 17 | % the average angular separation between points in a unit circle 18 | angleSeparation = circleAng/numVert; 19 | % create the matrix of angles for equal separation of points 20 | angleMatrix = 0: angleSeparation: circleAng; 21 | % drop the final angle since 2Pi = 0 22 | angleMatrix(end) = []; 23 | 24 | % generate the points x and y 25 | for k = 1:numVert 26 | x(k) = (radius + radius*rand(1)*radVar) * cos(angleMatrix(k) + angleSeparation*rand(1)*angVar); 27 | y(k) = (radius + radius*rand(1)*radVar) * sin(angleMatrix(k) + angleSeparation*rand(1)*angVar); 28 | end 29 | 30 | % Graph the polygon and connect the final point to the first point 31 | plot([x; x(1)],[y; y(1)],'ro-') 32 | hold on 33 | plot([-2 2],[0 0],'k') 34 | plot([0 0],[-2 2],'k') 35 | 36 | Polygon_vertex = [x y]; 37 | shifted_polygon_vertex = circshift(Polygon_vertex, -1); 38 | PolygonXY = [Polygon_vertex shifted_polygon_vertex]; 39 | 40 | %% Generate lines 41 | 42 | gap_y = radius./10; 43 | 44 | % left limit 45 | l_limit = min(Polygon_vertex(:,1)); 46 | down_limit = min(Polygon_vertex(:,2)); 47 | up_limit = max(Polygon_vertex(:,2)); 48 | 49 | %right limit 50 | r_limit = max(Polygon_vertex(:,1)); 51 | 52 | y1 = down_limit - gap_y; 53 | y2 = up_limit + gap_y; 54 | 55 | % coverage parameters 56 | xd = 0.2; 57 | 58 | nl = floor((r_limit - l_limit)/xd) +1; 59 | i = 1; 60 | LinesXY = zeros(nl,4); 61 | 62 | x1 = l_limit; 63 | x2 = x1; 64 | while(x1 <= r_limit) 65 | LinesXY(i,:) = [x1 y1 x2 y2]; 66 | x1 = x1 + xd; 67 | x2 = x1; 68 | i = i + 1; 69 | end 70 | 71 | 72 | LinesXY; 73 | 74 | %% SPEED TEST METHOD 1. 75 | tic 76 | out = lineSegmentIntersect(PolygonXY,LinesXY); 77 | dt_1 = toc; 78 | intersections = [out.intMatrixX(:) out.intMatrixY(:)]; 79 | intersections( ~any(intersections,2), : ) = []; 80 | 81 | 82 | fprintf(1,'Method 1 took %.2f seconds for %.0f line segments...\n',dt_1,nl); 83 | 84 | 85 | %% PREPARE THE FIGURE. 86 | is_show = true; 87 | if is_show 88 | 89 | % Show the intersection points. 90 | 91 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 92 | 93 | axes_properties.box = 'on'; 94 | axes_properties.XLim = [-2 2]; 95 | axes_properties.YLim = [-2 2]; 96 | axes_properties.DataAspectRatio = [1 1 1]; 97 | axes_properties.NextPlot = 'add'; 98 | 99 | axes(axes_properties,'parent',gcf); 100 | 101 | line([PolygonXY(:,1)';PolygonXY(:,3)'],[PolygonXY(:,2)';PolygonXY(:,4)'],'Color','r'); 102 | line([LinesXY(:,1)';LinesXY(:,3)'],[LinesXY(:,2)';LinesXY(:,4)'],'Color','k'); 103 | 104 | scatter(intersections(:,1), intersections(:,2),[],'b'); 105 | 106 | title('Intersection Points'); 107 | 108 | 109 | figure('Position',[500 90 500 500],'Renderer','zbuffer'); 110 | sort(intersections); 111 | plot(intersections(:,1), intersections(:,2)); 112 | 113 | title('Straight Path'); 114 | end -------------------------------------------------------------------------------- /powerFitting.m: -------------------------------------------------------------------------------- 1 | velocity = [2 4 6 8 10 12 14 16]; 2 | power = [220 215 210 208 212 230 260 300]; 3 | 4 | plot(velocity, power, 'o'); 5 | 6 | p = polyfit(velocity,power,3); 7 | 8 | t2 = 0:0.1:16; 9 | y2 = polyval(p,t2); 10 | 11 | figure 12 | plot(velocity,power,'o',t2,y2) 13 | title('Plot of Data (Points) and Model (Line)') -------------------------------------------------------------------------------- /power_circunfleja.m: -------------------------------------------------------------------------------- 1 | function p = power_circunfleja(w, gamma) 2 | x1 = w * cos(gamma); 3 | x2 = w * sin(gamma); 4 | 5 | b0 = 0; 6 | b1 = 0.1; 7 | b2 = 1; 8 | 9 | p = b0 + b1 * x1 + b2 * x2; 10 | end -------------------------------------------------------------------------------- /rotatePolygon.m: -------------------------------------------------------------------------------- 1 | function M2 = rotatePolygon(M , theta) 2 | R = [cos(theta) -sin(theta); sin(theta) cos(theta)]; 3 | M2 = R * M'; 4 | end -------------------------------------------------------------------------------- /test.m: -------------------------------------------------------------------------------- 1 | x = linspace(-5,5); 2 | y1 = sin(x); 3 | subplot(2,2,1) 4 | plot(x,y1) 5 | title('First subplot') 6 | 7 | y2 = sin(2*x); 8 | subplot(2,2,2) 9 | plot(x,y2) 10 | title('Second subplot') 11 | 12 | y3 = sin(4*x); 13 | subplot(2,2,3) 14 | plot(x,y3) 15 | title('Third subplot') 16 | 17 | y4 = sin(6*x); 18 | subplot(2,2,4) 19 | plot(x,y4) 20 | title('Fourth subplot') -------------------------------------------------------------------------------- /testDubins.m: -------------------------------------------------------------------------------- 1 | clear 2 | clc 3 | 4 | Wp1 = [-1 0] 5 | Wp2 = [1 0] 6 | r = 4; 7 | dx = 2; 8 | 9 | [P1,P2,P3,d,beta] = getDubinsCurve(Wp1,Wp2,r,dx); 10 | 11 | %% Draw figure 12 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 13 | axes_properties.DataAspectRatio = [1 1 1]; 14 | 15 | [X Y] = circle(P1, r, 0, beta, 0.01); 16 | plot(X,Y); 17 | hold on 18 | [X2 Y2] = circle(P2, r, 0-beta, pi+beta, 0.01); 19 | plot(X2,Y2); 20 | [X3 Y3] = circle(P3, r, pi-beta, pi, 0.01); 21 | plot(X3,Y3); 22 | 23 | title('Dubins Curve') -------------------------------------------------------------------------------- /testEnergyOptimizationB2.m: -------------------------------------------------------------------------------- 1 | % calcula la energia utilizada para diferentes ángulos de rotación del 2 | % polígono 3 | 4 | clear 5 | clc 6 | close all 7 | 8 | %% Definir valores de la simulacion 9 | 10 | % Poligono 11 | n_vertices = 4; 12 | polygon_radius = 200; %meters 13 | rad_var = 5; 14 | ang_var = 1; 15 | 16 | % UAV and coverage 17 | dx = 20; % distance between lines 18 | curve_radius = 15; %meters 19 | u = 15; %m/s 20 | 21 | %Wind 22 | w = 5; %m/s 23 | gamma_w = pi/4; 24 | 25 | %Power estimation 26 | b0 = 0.0555; 27 | b1 = 0; 28 | %b2 = 0.0111; 29 | maxb2 = 0.0111; 30 | 31 | 32 | %% Generar poligono 33 | M = getPolygon(n_vertices,polygon_radius,rad_var,ang_var); 34 | 35 | % Graficar polygono 36 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 37 | line([M(:,1)';M(:,3)'],[M(:,2)';M(:,4)'],'Color','r'); 38 | title('Polygon'); 39 | ylabel('x(meters)'); 40 | xlabel('y(meters)'); 41 | 42 | 43 | %% Obtener una grafica de la función energia 44 | disp('Iniciar rotación'); 45 | 46 | steps = 1000; 47 | maxrotation = pi; 48 | diam = zeros(steps+1,1); 49 | energy = zeros(steps+1,1); 50 | length = zeros(steps+1,5); 51 | gamma = zeros(steps+1,1); 52 | x = 0:maxrotation/steps:maxrotation; 53 | xdeg = (180/pi) .* x; 54 | 55 | pts_s = [M(:,1) M(:,2)]; 56 | pts_e = [M(:,3) M(:,4)]; 57 | 58 | 59 | %al rotar el angulo del poligono se debe cambiar el angulo del 60 | %viento!!!!!!!! 61 | 62 | figure('Position',[500 290 500 500],'Renderer','zbuffer'); 63 | title('Energy') 64 | ylabel('Energy') 65 | xlabel('\beta (radians)') 66 | hold on; 67 | 68 | b2steeps = 10; 69 | for b2 = 0:maxb2/b2steeps:maxb2 70 | disp('b2:'); disp(b2); 71 | i=1; 72 | for beta = 0:maxrotation/steps:maxrotation 73 | % Rotate M 74 | pts_s2 = rotatePolygon(pts_s, beta); 75 | pts_e2 = rotatePolygon(pts_e, beta); 76 | M2 = [pts_s2' pts_e2']; 77 | diam(i) = diameter(M2); 78 | gamma_w_prima = gamma_w - beta; 79 | [energy(i), D, gamma(i)] = f_energy(M2, dx, curve_radius, u, w, gamma_w_prima, b0, b1, b2); 80 | length(i,:) = [D sum(D)]; 81 | i = i+1; 82 | end 83 | plot(xdeg,energy) 84 | end 85 | hold off; 86 | 87 | figure('Position',[500 90 500 500],'Renderer','zbuffer'); 88 | plot(xdeg,diam) 89 | title('Diameter') 90 | ylabel('Diameter') 91 | xlabel('\beta (degrees)') 92 | 93 | %figure('Position',[500 90 500 500],'Renderer','zbuffer'); 94 | %plot(x,gamma) 95 | %title('gamma angle') 96 | %ylabel('Diameter') 97 | 98 | figure('Position',[500 190 500 500],'Renderer','zbuffer'); 99 | hold on; 100 | plot(xdeg,length(:,1)) 101 | %plot(xdeg,length(:,1) + length(:,2),'r--') 102 | plot(xdeg,length(:,2)) 103 | %plot(xdeg,length(:,3) + length(:,4),'b--') 104 | plot(xdeg,length(:,3)) 105 | plot(xdeg,length(:,4)) 106 | hold off; 107 | title('Path length') 108 | ylabel('meters') 109 | xlabel('\beta (degrees)') 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /testEnergyOptimizationMRB2.m: -------------------------------------------------------------------------------- 1 | % calcula la energia utilizada para diferentes ángulos de rotación del 2 | % polígono 3 | 4 | clear 5 | clc 6 | close all 7 | 8 | %% Definir valores de la simulacion 9 | 10 | % Poligono 11 | n_vertices = 4; 12 | polygon_radius = 200; %meters 13 | rad_var = 5; 14 | ang_var = 1; 15 | 16 | % UAV and coverage 17 | dx = 20; % distance between lines 18 | curve_radius = 15; %meters 19 | u = 15; %m/s 20 | 21 | %Wind 22 | w = 5; %m/s 23 | gamma_w = pi/4; 24 | 25 | %Power estimation 26 | b0 = 0.0555; 27 | b1 = 0; 28 | %b2 = 0.0111; 29 | maxb2 = 0.0111; 30 | 31 | 32 | %% Generar poligono 33 | M = getPolygon(n_vertices,polygon_radius,rad_var,ang_var); 34 | 35 | % Graficar polygono 36 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 37 | line([M(:,1)';M(:,3)'],[M(:,2)';M(:,4)'],'Color','r'); 38 | title('Polygon'); 39 | ylabel('x(meters)'); 40 | xlabel('y(meters)'); 41 | 42 | 43 | %% Obtener una grafica de la función energia 44 | disp('Iniciar rotación'); 45 | 46 | steps = 1000; 47 | maxrotation = pi; 48 | diam = zeros(steps+1,1); 49 | energy = zeros(steps+1,1); 50 | length = zeros(steps+1,5); 51 | gamma = zeros(steps+1,1); 52 | x = 0:maxrotation/steps:maxrotation; 53 | xdeg = (180/pi) .* x; 54 | 55 | pts_s = [M(:,1) M(:,2)]; 56 | pts_e = [M(:,3) M(:,4)]; 57 | 58 | 59 | %al rotar el angulo del poligono se debe cambiar el angulo del 60 | %viento!!!!!!!! 61 | 62 | figure('Position',[500 290 500 500],'Renderer','zbuffer'); 63 | title('Energy') 64 | ylabel('Energy') 65 | xlabel('\beta (radians)') 66 | hold on; 67 | 68 | b2steeps = 10; 69 | for b2 = 0:maxb2/b2steeps:maxb2 70 | disp('b2:'); disp(b2); 71 | i=1; 72 | for beta = 0:maxrotation/steps:maxrotation 73 | % Rotate M 74 | pts_s2 = rotatePolygon(pts_s, beta); 75 | pts_e2 = rotatePolygon(pts_e, beta); 76 | M2 = [pts_s2' pts_e2']; 77 | diam(i) = diameter(M2); 78 | gamma_w_prima = gamma_w - beta; 79 | [energy(i), D, gamma(i)] = f_energy(M2, dx, curve_radius, u, w, gamma_w_prima, b0, b1, b2); 80 | length(i,:) = [D sum(D)]; 81 | i = i+1; 82 | end 83 | plot(xdeg,energy) 84 | end 85 | hold off; 86 | 87 | figure('Position',[500 90 500 500],'Renderer','zbuffer'); 88 | plot(xdeg,diam) 89 | title('Diameter') 90 | ylabel('Diameter') 91 | xlabel('\beta (degrees)') 92 | 93 | %figure('Position',[500 90 500 500],'Renderer','zbuffer'); 94 | %plot(x,gamma) 95 | %title('gamma angle') 96 | %ylabel('Diameter') 97 | 98 | figure('Position',[500 190 500 500],'Renderer','zbuffer'); 99 | hold on; 100 | plot(xdeg,length(:,1)) 101 | %plot(xdeg,length(:,1) + length(:,2),'r--') 102 | plot(xdeg,length(:,2)) 103 | %plot(xdeg,length(:,3) + length(:,4),'b--') 104 | plot(xdeg,length(:,3)) 105 | plot(xdeg,length(:,4)) 106 | hold off; 107 | title('Path length') 108 | ylabel('meters') 109 | xlabel('\beta (degrees)') 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /testIntersections.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | clc 4 | 5 | % True if you want to display the results. 6 | % WARNING:If the number of line segments is high, display might take too long. 7 | is_show = true; 8 | 9 | %% SPEED TEST 10 | 11 | % Randomly generate line segments. 12 | n_line = 20; 13 | 14 | XY1 = rand(n_line,4) 15 | XY2 = rand(n_line,4); 16 | 17 | % Add parallel line segments. 18 | XY2 = [XY2;XY1(1:5,:) + repmat([.1 .1 .1 .1],5,1)]; 19 | 20 | % Add coincident line segments. 21 | XY2 = [XY2;XY1(6:10,:)]; 22 | 23 | 24 | %% SPEED TEST METHOD 1. 25 | tic 26 | out = lineSegmentIntersect(XY1,XY2); 27 | dt_1 = toc; 28 | 29 | fprintf(1,'Method 1 took %.2f seconds for %.0f line segments...\n',dt_1,n_line); 30 | 31 | %% SPEED TEST METHOD 2. 32 | tic 33 | % Insert your favorite intersection function... 34 | warning('No method given...'); 35 | dt_2 = toc; 36 | 37 | fprintf(1,'Method 2 took %.2f seconds for %.0f line segments...\n',dt_2,n_line); 38 | 39 | %% PREPARE THE FIGURE. 40 | if is_show 41 | 42 | % Show the intersection points. 43 | 44 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 45 | 46 | axes_properties.box = 'on'; 47 | axes_properties.XLim = [0 1]; 48 | axes_properties.YLim = [0 1]; 49 | axes_properties.DataAspectRatio = [1 1 1]; 50 | axes_properties.NextPlot = 'add'; 51 | 52 | axes(axes_properties,'parent',gcf); 53 | 54 | line([XY1(:,1)';XY1(:,3)'],[XY1(:,2)';XY1(:,4)'],'Color','r'); 55 | line([XY2(:,1)';XY2(:,3)'],[XY2(:,2)';XY2(:,4)'],'Color','k'); 56 | 57 | scatter(out.intMatrixX(:),out.intMatrixY(:),[],'r'); 58 | 59 | title('Intersection Points'); 60 | 61 | % Show the parallel lines. 62 | 63 | figure('Position',[20 90 500 500],'Renderer','zbuffer'); 64 | 65 | axes(axes_properties,'parent',gcf); 66 | 67 | [I,J] = find(out.parAdjacencyMatrix); 68 | 69 | hL1 = line([XY1(I,1)';XY1(I,3)'],[XY1(I,2)';XY1(I,4)'],'Color','r'); 70 | hL2 = line([XY2(J,1)';XY2(J,3)'],[XY2(J,2)';XY2(J,4)'],'Color','k'); 71 | 72 | title('Parallel Line Segments'); 73 | 74 | % Show the coincident lines. 75 | 76 | figure('Position',[30 80 500 500],'Renderer','zbuffer'); 77 | 78 | axes(axes_properties,'parent',gcf); 79 | 80 | [I,J] = find(out.coincAdjacencyMatrix); 81 | 82 | line([XY1(I,1)';XY1(I,3)'],[XY1(I,2)';XY1(I,4)'],'Color','r'); 83 | line([XY2(J,1)';XY2(J,3)'],[XY2(J,2)';XY2(J,4)'],'Color','k'); 84 | 85 | title('Coincident Line Segments'); 86 | 87 | end 88 | -------------------------------------------------------------------------------- /testPathOptimization.m: -------------------------------------------------------------------------------- 1 | % calcula la energia utilizada para diferentes ángulos de rotación del 2 | % polígono 3 | 4 | clear 5 | clc 6 | close all 7 | 8 | %% Definir valores de la simulacion 9 | % Poligono 10 | n_vertices = 4; 11 | polygon_radius = 200; %meters 12 | rad_var = 5; 13 | ang_var = 1; 14 | 15 | % UAV and coverage 16 | dx = 20; % distance between lines 17 | curve_radius = 15; %meters 18 | u = 15; %m/s 19 | 20 | %Wind 21 | w = 5; %m/s 22 | gamma_w = pi/4; 23 | 24 | %Power estimation 25 | b0 = 0.0555; 26 | b1 = 0; 27 | b2 = 0.0111; 28 | 29 | 30 | %% Generar poligono 31 | M = getPolygon(n_vertices,polygon_radius,rad_var,ang_var); 32 | 33 | % Graficar polygono 34 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 35 | line([M(:,1)';M(:,3)'],[M(:,2)';M(:,4)'],'Color','r'); 36 | title('Original Polygon'); 37 | 38 | %% Obtener una grafica de la función energia 39 | disp('Iniciar rotación'); 40 | 41 | maxrotation = pi; 42 | steps = 1000; 43 | diam = zeros(steps+1,1); 44 | energy = zeros(steps+1,1); 45 | length = zeros(steps+1,5); 46 | gamma = zeros(steps+1,1); 47 | x = 0:maxrotation/steps:maxrotation; 48 | 49 | pts_s = [M(:,1) M(:,2)]; 50 | pts_e = [M(:,3) M(:,4)]; 51 | 52 | i=1; 53 | %al rotar el angulo del poligono se debe cambiar el angulo del 54 | %viento!!!!!!!! 55 | for beta = 0:maxrotation/steps:maxrotation 56 | % Rotate M 57 | pts_s2 = rotatePolygon(pts_s, beta); 58 | pts_e2 = rotatePolygon(pts_e, beta); 59 | M2 = [pts_s2' pts_e2']; 60 | diam(i) = diameter(M2); 61 | gamma_w_prima = gamma_w - beta; 62 | [energy(i), D, gamma(i)] = f_energy(M2, dx, curve_radius, u, w, gamma_w_prima, b0, b1, b2); 63 | length(i,:) = [D sum(D)]; 64 | i = i+1; 65 | end 66 | 67 | figure('Position',[500 90 500 500],'Renderer','zbuffer'); 68 | plot(x,diam) 69 | title('Diameter function') 70 | ylabel('Diameter') 71 | xlabel('\beta (radians)') 72 | 73 | %figure('Position',[500 90 500 500],'Renderer','zbuffer'); 74 | %plot(x,gamma) 75 | %title('gamma angle') 76 | %ylabel('Diameter') 77 | 78 | figure('Position',[500 190 500 500],'Renderer','zbuffer'); 79 | hold on; 80 | plot(x,length(:,1),'c--') 81 | plot(x,length(:,2),'r-') 82 | plot(x,length(:,3),'b--') 83 | plot(x,length(:,4),'g-') 84 | plot(x,length(:,5)) 85 | hold off; 86 | title('Path length') 87 | ylabel('meters') 88 | xlabel('\beta (radians)') 89 | 90 | figure('Position',[500 290 500 500],'Renderer','zbuffer'); 91 | plot(x,energy) 92 | title('Energy function') 93 | ylabel('Energy') 94 | xlabel('\beta (radians)') 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /testRotation.m: -------------------------------------------------------------------------------- 1 | clear 2 | clc 3 | 4 | %% Definir valores de la simulacion 5 | % Poligono 6 | n_vertices = 4; 7 | polygon_radius = 200; %meters 8 | rad_var = 5; 9 | ang_var = 1; 10 | 11 | % UAV and coverage 12 | dx = 20; % distance between lines 13 | curve_radius = 15; %meters 14 | u = 10; %m/s 15 | 16 | %% Generar poligono 17 | M = getPolygon(n_vertices,polygon_radius,rad_var,ang_var); 18 | 19 | pts_s = [M(:,1) M(:,2)]; 20 | pts_e = [M(:,3) M(:,4)]; 21 | 22 | %theta = pi/2; 23 | %pts_s2 = rotatePolygon(pts_s, theta); 24 | %pts_e2 = rotatePolygon(pts_e, theta); 25 | %M2 = [pts_s2' pts_e2']; 26 | 27 | %figure('Position',[10 100 500 500],'Renderer','zbuffer'); 28 | %line([M2(:,1)';M2(:,3)'],[M2(:,2)';M2(:,4)'],'Color','r'); 29 | %title('Intersection Points'); 30 | %% 31 | 32 | [Path, D, Lines] = getPath(M, dx, curve_radius); 33 | 34 | figure('Position',[10 100 500 500],'Renderer','zbuffer'); 35 | line([M(:,1)';M(:,3)'],[M(:,2)';M(:,4)'],'Color','r'); 36 | hold on 37 | plot(Path(:,1), Path(:,2)); 38 | title('Original Polygon'); 39 | 40 | 41 | steps = 100; 42 | diam = zeros(steps+1,1); 43 | LL = zeros(steps+1,2); 44 | length = zeros(steps+1,5); 45 | x = 0:pi/steps:pi; 46 | 47 | i=1; 48 | for theta = 0:pi/steps:pi 49 | pts_s2 = rotatePolygon(pts_s, theta); 50 | pts_e2 = rotatePolygon(pts_e, theta); 51 | M2 = [pts_s2' pts_e2']; 52 | diam(i) = diameter(M2); 53 | [Path, D, Lines] = getPath(M2, dx, curve_radius); 54 | LL(i,:) = Lines; 55 | length(i,:) = [D sum(D)]; 56 | i = i+1; 57 | end 58 | 59 | figure('Position',[500 90 500 500],'Renderer','zbuffer'); 60 | plot(x,diam) 61 | title('Diameter function') 62 | ylabel('Diameter') 63 | 64 | figure('Position',[500 190 500 500],'Renderer','zbuffer'); 65 | hold on; 66 | plot(x,length(:,1),'c-') 67 | plot(x,length(:,2),'r-') 68 | plot(x,length(:,3),'b-') 69 | plot(x,length(:,4),'g--') 70 | plot(x,length(:,5)) 71 | hold off; 72 | title('Path length') 73 | ylabel('meters') 74 | 75 | figure('Position',[500 90 500 500],'Renderer','zbuffer'); 76 | hold on; 77 | plot(x,LL(:,1),'c-') 78 | plot(x,LL(:,2),'r-') 79 | title('Diameter function') 80 | ylabel('Diameter') 81 | -------------------------------------------------------------------------------- /test_compensation.m: -------------------------------------------------------------------------------- 1 | W = [0.1 0.1]; 2 | T = 0:0.1:pi; 3 | [Xu Yu] = fu(T,W); 4 | [Xx Yx] = fx(T); 5 | plot(X, Y) 6 | hold on 7 | plot(Xx,Yx) 8 | 9 | wx = W(1,1); 10 | wy = W(1,2); 11 | %fun = @(x) exp(-x.^2).*log(x).^2; 12 | %fun = @(x) sqrt( (-sin(t)-wx).* (-sin(t)-wx) + (cos(t)-wy).*(cos(t)-wy) ); 13 | fu_prima = @(x) sqrt((-sin(x)-wx).^2 + (cos(x)-wy).^2); 14 | longitud = integral(fu_prima, 0, pi) -------------------------------------------------------------------------------- /test_integration.m: -------------------------------------------------------------------------------- 1 | % ok revisada 2 | 3 | clc; 4 | clear; 5 | close all; 6 | 7 | power_left = @(t,b0,b1,b2,w,gamma_w, u, r) b0 + b1 * abs(w * cos(f_gamma(gamma_w, u, r, t))) + b2 * abs(w * sin(f_gamma(gamma_w, u, r, t))); 8 | b0 = 0.0555; 9 | b1 = 0; 10 | b2 = 0.0111; 11 | w = 5; 12 | gamma_w = pi/4; 13 | u = 10; 14 | r = 15; 15 | t0 = 0; 16 | t1 = 4; 17 | 18 | steep = 100; 19 | 20 | i=1; 21 | for tmax = t0:t1/steep:t1; 22 | gamma(i) = f_gamma(gamma_w, u, r, tmax) * 180/pi; 23 | lateral_wind(i) = w * sin(f_gamma(gamma_w, u, r, tmax)); 24 | p(i) = power_left(tmax,b0,b1,b2,w,gamma_w, u, r); 25 | q(i) = integral(@(t)power_left(t,b0,b1,b2,w,gamma_w, u, r), t0, tmax); 26 | i = i +1; 27 | end 28 | 29 | tt = 0:t1/steep:t1; 30 | figure; 31 | plot(tt,gamma); 32 | title('Gamma'); 33 | 34 | figure; 35 | plot(tt,lateral_wind); 36 | title('Lateral wind'); 37 | 38 | figure; 39 | plot(tt,p); 40 | title('Power'); 41 | 42 | figure; 43 | plot(tt,q); 44 | title('Energy'); 45 | -------------------------------------------------------------------------------- /u.m: -------------------------------------------------------------------------------- 1 | function [X Y] = fu(t, W) 2 | X = cos(t); 3 | Y = sin(t); 4 | X1 = t * W(1,1); 5 | Y1 = t * W(1,2); 6 | X = X - X1; 7 | Y = Y - Y1; 8 | end --------------------------------------------------------------------------------