You are on page 1of 22

#pragma mode( separator(.

,;) integer(h32) )
// Graph 3D v2.32
// by Han Duong
export
export
export
export

transmode:=1;
wiremode:=1;
contour:=0;
ccolor:=0;

colors:={#FF66CCh,#FF0000h,#FF9900h,#FFFF00h,#FF00h,#9999h,#FFh,#6600FFh,0};
g3D_setdefault();
g3D_getfunc();
g3D_getsettings();
g3D_getwin();
g3D_setgrid();
g3D_getangles();
g3D_rotmatrix();
g3D_compute();
g3D_feval();
g3D_triparms();
g3D_draw();
g3D_drawsurface();
g3D_drawcontour();
g3D_drawbox();
g3D_keys();
g3D_trace();
g3D_drawtrace();
g3D_recolor();
g3D_zcolor();
g3D_buttons();
g3D_makeptdef();
g3D_makeldef();
g3D_maketridef();
xmin3D,xmax3D;
ymin3D,ymax3D;
zmin3D,zmax3D;
grid3D,zoom3D;
rotx,roty,rotz,RotM;
xc,yc,zc,dx,dy;
Zvals,zColor;
tridef, ptdef, ldef;
recompute3D=1,init3D=0;
minZ,maxZ,minD,fxy;
pmode,tmode,cmode,showbox=1;
boxpts,blines;
zclip;
rowtrace,coltrace;
xtrace=1, ytrace=1;
winx=-160, winy=-120;
triparms;
//---------------------------// START FUNCTION
//---------------------------view "Edit Function",START()
begin

if init3D==0 then
g3D_setdefault();
end;
startview(0,1);
end;
//---------------------------// RESET FUNCTION
//---------------------------View "Reset Plot Settings",RESET()
begin
g3D_setdefault();
end;
//---------------------------// Symb FUNCTION
//---------------------------Symb()
begin
startview(0,1);
end;
//---------------------------// SymbSetup FUNCTION
//---------------------------SymbSetup()
begin
msgbox("Use X and Y as the input variables.")
end;
//---------------------------// PlotSetup FUNCTION
//---------------------------PlotSetup()
begin
if init3D==0 then
g3D_setdefault();
end;
g3D_getsettings();
end;
//---------------------------// Plot FUNCTION
//---------------------------Plot()
begin
local func;
if init3D==0 then
g3D_setdefault();
end;
tmode:=0;
if g3D_getfunc() then

iferr func:=STRING(V0); then func:=""; end;


V0:=fxy;
g3D_compute();
V0:=func;
end; // if g3D_getfunc
g3D_keys();
end;
//---------------------------// Numb FUNCTION
//---------------------------Num()
begin
if init3D==0 then
g3D_setdefault();
end;
g3D_compute();
editmat(Zvals);
end;
//---------------------------// NumSetup FUNCTION
//---------------------------NumSetup()
begin
if init3D==0 then
g3D_setdefault();
end;
g3D_setgrid();
end;
//---------------------------// g3D_setdefault
//---------------------------g3D_setdefault()
begin
xmin3D:=-10; xmax3D:=10;
ymin3D:=-10; ymax3D:=10;
zmin3D:=-10; zmax3D:=10;
zoom3D:=5; grid3D:=15;
rotx:=15; roty:=0; rotz:=10;
xc:=0; yc:=0; zc:=0;
showbox:=1; cmode:=0; tmode:=0;
pmode:=1;
recompute3D:=1;
g3D_getfunc();
init3D:=1;
minD:=30;
xtrace:=1; ytrace:=1;
boxpts:={
[-10,-10,-10],
[-10,-10,10],
[-10,10,-10],
[-10,10,10],
[10,-10,-10],

[10,-10,10],
[10,10,-10],
[10,10,10]
};
blines:={0,{1,2},{2,4},{4,3},{3,1},{5,6},{6,8},{8,7},{7,5},{1,5},{2,6},{3,7},{
4,8}};
g3D_rotmatrix();
winx:=-160; winy:=-120;
end;
//---------------------------// g3D_getfunc
//---------------------------g3D_getfunc()
begin
local i, ftot=0, fnew, fsel;
if init3D==0 then fxy:=""; end;
for i from 0 to 9 do
if ISCHECK(i) then
fsel:=i; ftot:=ftot+1;
end;
end;
if ftot==0 then
msgbox("Please enter/select a function!");
startview(0,1);
kill;
end;
if ftot>1 then
msgbox("Please select only one function!");
startview(0,1);
kill;
end;
fnew:=expr("STRING(V"+left(STRING(fsel),1)+")");
if fnew<>fxy then
fxy:=fnew;
recompute3D:=1;
end;
return(recompute3D);
end;
//---------------------------// g3D_getsettings
//---------------------------view "Plot Settings (all)",g3D_getsettings()
begin
if init3D==0 then
g3D_setdefault();
end;
g3D_getwin();
g3D_getangles();
end;

//---------------------------// g3D_getwin
//---------------------------view "Set Viewing Window",g3D_getwin()
begin
local xmin,xmax,ymin,ymax,zmin,zmax;
local zoom;
if init3D==0 then
g3D_setdefault();
end;
xmin:=xmin3D; xmax:=xmax3D;
ymin:=ymin3D; ymax:=ymax3D;
zmin:=zmin3D; zmax:=zmax3D;
zoom:=zoom3D;
if input(
{xmin,xmax,ymin,ymax,zmin,zmax,zoom},
"Graph 3D View Window",
{
"Xmin=", "Xmax=",
"Ymin=", "Ymax=",
"Zmin=", "Zmax=",
"Zoom="
},
{
"Enter the value of left side of the viewing box",
"Enter the value of right side of the viewing box",
"Enter the value of front side of the viewing box",
"Enter the value of back side of the viewing box",
"Enter the value of bottom side of the viewing box",
"Enter the value of top side of the viewing box",
"Enter the zoom factor (must be > 0)"
},
{xmin3D,xmax3D,ymin3D,ymax3D,zmin3D,zmax3D,zoom3D})
then
if xmin>=xmax then
msgbox("Warning: Invalid Xmin/Xmax! Setting Xmax:=Xmin+1");
xmax:=xmin+1;
end;
if ymin>=ymax then
msgbox("Warning: Invalid Ymin/Ymax! Setting Ymax:=Ymin+1");
ymax:=ymin+1;
end;
if zmin>=zmax then
msgbox("Warning: Invalid Zmin/Zmax! Setting Zmax:=Zmin+1");
zmax:=zmin+1;
end;
if zoom3D<=0 then
msgbox("Warning: zoom must be > 0; reset to 15");
zoom:=15;
end;

if (xmin<>xmin3D) or (xmax<>xmax3D) or
(ymin<>ymin3D) or (ymax<>ymax3D)
then
recompute3D:=1;
xmax3D:=xmax; xmin3D:=xmin;
ymax3D:=ymax; ymin3D:=ymin;
xc:=(xmax3D+xmin3D)/2;
yc:=(ymax3D+ymin3D)/2;
winx:=-160; winy:=-120;
end;
if
(zmin<>zmin3D) or (zmax<>zmax3D)
then
cmode:=(cmode+1) MOD 2;
zmax3D:=zmax; zmin3D:=zmin;
zc:=(zmax3D+zmin3D)/2;
if recompute3D==0 then g3D_recolor(0); end;
end;
zoom3D:=zoom;
boxpts:={
[xmin3D-xc,ymin3D-yc,zmin3D-zc],
[xmin3D-xc,ymin3D-yc,zmax3D-zc],
[xmin3D-xc,ymax3D-yc,zmin3D-zc],
[xmin3D-xc,ymax3D-yc,zmax3D-zc],
[xmax3D-xc,ymin3D-yc,zmin3D-zc],
[xmax3D-xc,ymin3D-yc,zmax3D-zc],
[xmax3D-xc,ymax3D-yc,zmin3D-zc],
[xmax3D-xc,ymax3D-yc,zmax3D-zc]
};
end;
end;
//---------------------------// g3D_setgrid
//---------------------------view "Set grid size",g3D_setgrid()
begin
local grid;
if init3D==0 then
g3D_setdefault();
end;
grid:=grid3D;
if input(grid,"Graph 3D Grid Size","Grid Size=","Enter N for an NxN grid",grid
3D) then
if grid<2 then
msgbox("Warning: grid size must be > 1; reset to 15");
grid:=15;
end;
end;
if grid<>grid3D then

recompute3D:=1;
end;
grid3D:=grid;
end;
//---------------------------// g3D_getangles
//---------------------------view "Set Rotation Angles",g3D_getangles()
begin
local rx,ry,rz;
if init3D==0 then
g3D_setdefault();
end;
rx:=rotx; ry:=roty; rz:=rotz;
if input({rx,ry,rz},
"Graph 3D Rotation Angles",
{ "X-angle=", "Y-angle=", "Z-angle=" },
{
"Enter the angle (deg) about the x-axis",
"Enter the angle (deg) about the y-axis",
"Enter the angle (deg) about the z-axis"
},
{rotx,roty,rotz})
then
if (rx<>rotx) or (ry<>roty) or (rz<>rotz) then
rotx:=rx; roty:=ry; rotz:=rz;
g3D_rotmatrix();
end;
end;
end;
//---------------------------// g3D_rotmatrix
//---------------------------g3D_rotmatrix()
begin
local a=rotx+90,b=roty,c=rotz;
local Rx, Ry, Rz;
if (AAngle==1) OR (NOT (AAngle+HAngle)) then
a:=a*PI/180; b:=b*PI/180; c:=c*PI/180;
end;
Rx:=[[1,0,0],[0,COS(a),-SIN(a)],[0,SIN(a),COS(a)]];
Ry:=[[COS(b),0,-SIN(b)],[0,1,0],[SIN(b),0,COS(b)]];
Rz:=[[COS(c),-SIN(c),0],[SIN(c),COS(c),0],[0,0,1]];
RotM:=Rx*Ry*Rz;
RotM(3,4):=minD;
end;
//---------------------------// g3D_compute

//---------------------------g3D_compute()
begin
local minz, maxz;
local c=cmode;
if recompute3D then
dx:=(xmax3D-xmin3D)/grid3D;
dy:=(ymax3D-ymin3D)/grid3D;
// zColor MUST be defined befor Zvals
cmode:=0;
zColor:=makemat(RGB((I-1)/grid3D*255,1,(J-1)/grid3D*255),grid3D+1,grid3D+1
);
Zvals:=makemat(g3D_feval(xmin3D+(I-1)*dx,ymin3D+(J-1)*dy,I,J),grid3D+1,gri
d3D+1);
recompute3D:=0;
minZ:=min(Zvals); minz:=min(minZ,zmin3D)-zc;
maxZ:=max(Zvals); maxz:=max(maxZ,zmax3D)-zc;
minD:=10+(max(abs(minz),abs(maxz))^2+(xmax3D-xc)^2+(ymax3D-yc)^2)^(.5);
xtrace:=IP(grid3D/2); ytrace:=xtrace;
g3D_rotmatrix();
if c then
g3D_recolor(0);
else
ptdef:=makelist(g3D_makeptdef((X-1) mod (grid3D+1),IP((X+grid3D)/(grid3D
+1))),X,1,(grid3D+1)^2);
end;
g3D_maketridef();
g3D_makeldef();
end; // if recompute3D
end;
//---------------------------// g3D_feval
//---------------------------g3D_feval(x,y,ci,cj)
begin
local z;
iferr
z:=V0(x,y);
then
z:=MINREAL;
end;
if TYPE(z)==3 then z:=MINREAL; end;
if z==MINREAL then zColor(ci,cj):=0; end;
return(z);
end;
//---------------------------// g3D_makeptdef

//---------------------------g3D_makeptdef(y,x)
begin
return([xmin3D+(x-1)*dx-xc,ymin3D+y*dy-yc,Zvals(x,y+1)-zc,zColor(x,y+1)]);
end;
//---------------------------// g3D_makeldef
//---------------------------g3D_makeldef()
begin
local x,y,g1=grid3D+1;
local m=1,n=1,c=2;
local row={},col={};
rowtrace:={}; coltrace:={};
rowtrace(g1):=0; coltrace(g1):=0;
ldef:={#0h};
for y from 1 to g1 do
m:=0; n:=0; row:={}; col:={};
for x from 1 to grid3D do
if (zColor(y,x) and zColor(y,x+1)) then
n:=n+1; row(n):={(y-1)*g1+x,(y-1)*g1+x+1};
end;
if (zColor(x,y) and zColor(x+1,y)) then
m:=m+1; col(m):={(x-1)*g1+y,x*g1+y};
end;
end;
if n then rowtrace(y):={c,c+n-1}; else rowtrace(y):={0,0}; end;
c:=c+n;
if m then coltrace(y):={c,c+m-1}; else coltrace(y):={0,0}; end;
c:=c+m;
ldef:=concat(ldef,row); ldef:=concat(ldef,col);
end;
end;
//---------------------------// g3D_maketridef
//---------------------------g3D_maketridef()
begin
local x,y,n=0,g1=grid3D+1;
local td={};
td(g1^2):=0;
for y from 1 to grid3D do
for x from 1 to grid3D do
if (zColor(y,x) and zColor(y,x+1) and zColor(y+1,x) and zColor(y+1,x+1)) t
hen
if transmode then
td(n+1):={x+(y-1)*g1,x+1+(y-1)*g1,x+y*g1,-1,128};
td(n+2):={x+y*g1,x+1+y*g1,x+1+(y-1)*g1,-1,128};
else
td(n+1):={x+(y-1)*g1,x+1+(y-1)*g1,x+y*g1};
td(n+2):={x+y*g1,x+1+y*g1,x+1+(y-1)*g1};

end;
n:=n+2;
end;
end;
end;
tridef:=sub(td,1,n);
end;
//---------------------------// g3D_triparms
//---------------------------g3D_triparms()
begin
triparms:={RotM, "N", {winx,winy,minD*zoom3D},
{xmin3D-xc,xmax3D-xc,ymin3D-yc,ymax3D-yc,zmin3D-zc,zmax3D-zc}};
end;
//---------------------------// g3D_draw
//---------------------------g3D_draw()
begin
if contour then
g3D_drawcontour();
else
g3D_drawsurface();
end;
end;
//---------------------------// g3D_drawsurface
//---------------------------g3D_drawsurface()
begin
local cyan:=#FF88h;
local t,l;
g3D_triparms();
dimgrob_p(G1, 320, 240);
zclip:=triangle();
if showbox then
t:=triangle_p(G1,boxpts,{{1,3,5,cmode*cyan,64},{3,5,7,cmode*cyan,64}},
triparms,zclip);
end;
if transmode then
t:=triangle_p(G1,ptdef,tridef,triparms);
else
zclip:=triangle();
t:=triangle_p(G1,ptdef,tridef,triparms,zclip);

end;
if (NOT(tmode) AND wiremode) then
l:=line_p(G1,t,ldef,triparms,zclip);
end;
if showbox then g3D_drawbox(); end;
blit_p(G0,G1);
end;
//---------------------------// g3D_drawcontour
//---------------------------g3D_drawcontour()
begin
local t,i,z,delz;
local minz, maxz;
local cyan:=#FF88h;
local ctridef:={0};
if ccolor then
ctridef:=concat(ctridef,tridef);
else
ctridef:=tridef;
end;
minz:=max(minZ,zmin3D);
maxz:=min(maxZ,zmax3D);
delz:=(maxz-minz)/8;
g3D_triparms();
dimgrob_p(G1, 320, 240);
zclip:=triangle(G1);
if showbox then
t:=triangle_p(G1,boxpts,{{1,3,5,cmode*cyan,64},{3,5,7,cmode*cyan,64}},
triparms,zclip);
end;
for i from 0 to 8 do
if ccolor then ctridef(1):=colors(i+1); end;
z:=minz-zc+delz*i;
t:=triangle_p(G1,ptdef,ctridef,
{RotM, "N", {winx,winy,minD*zoom3D},
{xmin3D-xc,xmax3D-xc,ymin3D-yc,ymax3D-yc,.95*z,.95*z+delz*.05}});
end;
if showbox then g3D_drawbox(); end;
blit_p(G0,G1);
end;

//---------------------------// g3D_drawbox
//---------------------------g3D_drawbox()

begin
local t;
g3D_triparms();
if transmode then
t:=line_p(G1,boxpts,blines,triparms);
else
t:=line_p(G1,boxpts,blines,triparms,zclip);
end;
end;
//---------------------------// g3D_keys
//---------------------------g3D_keys()
begin
local key, run=1;
g3D_draw();
while run do
key:=wait(-1);
case
if TYPE(key)==6 then
if key(1)==3 then g3D_buttons(); end;
if tmode then g3D_draw(); g3D_trace(); end;
end;
if key==-1 then run:=0; end;
if key==9 then g3D_getangles(); g3D_rotmatrix(); g3D_draw(); end;
if key==27 then g3D_recolor(1); g3D_draw(); end;
if (key==48 AND contour==0) then tmode:=1; g3D_draw(); g3D_trace(); end;
// default
repeat
case
if key==2 then rotx:=(rotx-5) MOD 360; end;
if key==12 then rotx:=(rotx+5) MOD 360; end;
if key==4 then kill; end;
if key==7 then rotz:=(rotz-5) MOD 360; end;
if key==8 then rotz:=(rotz+5) MOD 360; end;
if key==1 then roty:=(roty+5) MOD 360; end;
if key==3 then roty:=(roty-5) MOD 360; end;
if key==37 then winx:=winx+5; end;
if key==39 then winx:=winx-5; end;
if key==33 then winy:=winy+5; end;
if key==43 then winy:=winy-5; end;
if key==38 then winx:=-160; winy:=-120; end;
if key==45 then zoom3D:=max(zoom3D/1.05,.01); end;
if key==50 then zoom3D:=zoom3D*1.05; end;
end;
g3D_rotmatrix();
g3D_draw();
until NOT iskeydown(key);

end;
end; // end while
freeze;
end;
//---------------------------// g3D_trace
//---------------------------g3D_trace()
begin
local key, run=1;
g3D_drawtrace();
while run do
key:=wait(-1);
case
if TYPE(key)==6 then
if key(1)==3 then
g3D_buttons();
if tmode then g3D_drawtrace(); end;
end;
if tmode==0 then run:=0; end;
end;
if key==-1 then run:=0; end;
if key==9 then g3D_getangles(); g3D_rotmatrix(); g3D_draw(); g3D_drawtrace()
; end;
if key==27 then g3D_recolor(1); g3D_draw(); g3D_drawtrace(); end;
repeat
case
if key==4 then tmode:=0; run:=0; end;
if key==48 then tmode:=0; run:=0; end;
if key==2 then ytrace:=ytrace+1; wait(.1); end;
if key==12 then ytrace:=ytrace-1; wait(.1); end;
if key==7 then xtrace:=xtrace-1; wait(.1); end;
if key==8 then xtrace:=xtrace+1; wait(.1); end;
if key==37 then winx:=winx+5; g3D_draw(); end;
if key==39 then winx:=winx-5; g3D_draw(); end;
if key==33 then winy:=winy+5; g3D_draw(); end;
if key==43 then winy:=winy-5; g3D_draw(); end;
if key==38 then winx:=-160; winy:=-120; g3D_draw(); end;
end;
g3D_drawtrace();
until NOT iskeydown(key);
end;
end; // end while
g3D_draw();
end;
//----------------------------

// g3D_drawtrace
//---------------------------g3D_drawtrace()
begin
local i;
local red=#FF0000h, white=#FFFFFFh;
local tracedef={white};
local l,t;
if
if
if
if

xtrace<1 then xtrace:=grid3D+1;


xtrace>grid3D+1 then xtrace:=1;
ytrace<1 then ytrace:=grid3D+1;
ytrace>grid3D+1 then ytrace:=1;

end;
end;
end;
end;

g3D_triparms();
dimgrob_p(G2,320,240);
blit_p(G2,G1);
l:=rowtrace(xtrace);
if l(1) then
t:=sub(ldef,l(1),l(2));
tracedef:=concat(tracedef,t);
t:=line_p(G2,ptdef,tracedef,triparms);
end;
l:=coltrace(ytrace);
if l(1) then
t:=sub(ldef,l(1),l(2));
tracedef:=concat(tracedef,t);
t:=line_p(G2,ptdef,tracedef,triparms);
end;
textout_p("x="+(xmin3D+dx*(xtrace-1)),G2,1,230,1,red,106);
textout_p("y="+(ymin3D+dy*(ytrace-1)),G2,107,230,1,red,106);
if Zvals(xtrace,ytrace)==MINREAL then
textout_p("z=",G2,213,230,1,red,106);
else
textout_p("z="+Zvals(xtrace,ytrace),G2,213,230,1,red,106);
end;
blit_p(G0,G2);
end;
//---------------------------// g3D_recolor
//---------------------------g3D_recolor(msg)
begin
if msg then
textout_p("Recoloring...",G0,0,0,1,0);
end;
cmode:=(cmode+1) MOD 2;
zColor:=makemat(g3D_zcolor(I,J),grid3D+1,grid3D+1);
ptdef:=makelist(g3D_makeptdef((X-1) mod (grid3D+1),IP((X+grid3D)/(grid3D+1))
),X,1,(grid3D+1)^2);
//
g3D_maketridef();
end;

//---------------------------// g3D_zcolor
//---------------------------g3D_zcolor(x,y)
begin
local r;
local minz,maxz;
minz:=max(minZ,zmin3D);
maxz:=min(maxZ,zmax3D);
case
if cmode==0 then
r:=RGB((x-1)/grid3D*255,1,(y-1)/grid3D*255);
end;
if cmode==1 then
r:=Zvals(x,y);
if r>maxz then r:=.9*maxz; end;
if r<minz then r:=.9*minz; end;
r:=IP((r-minz)/(maxz-minz+1)*250)+1;
r:=RGB(r/1.5,r/1.5,r);
end;
end;
if zColor(x,y) then
return(r);
else
return(0);
end;
end;
g3D_buttons()
begin
local i,key,getmouse=1;
dimgrob_p(G4,320,70);
dimgrob_p(G5,320,70);
blit_p(G4,G0,0,120-35,320,120+35);
dimgrob_p(G3,320,70,0);
blit_p(G3,13,3,"xyicon");
blit_p(G3,90,3,"zicon");
blit_p(G3,167,3,"boxicon");
blit_p(G3,244,3,"traceicon");
for i from 1 to 35 do
blit_p(G0,0,120-i,320,120+i,G3);
end;
while getmouse do
key:=WAIT(-1);
if TYPE(key)==6 then
if key(1)==3 then
if 90<key(3) AND key(3)<150 then
case
if 15<key(2) AND key(2)<75 then cmode:=1; getmouse:=0; g3D_recolor(1
); end;
if 92<key(2) AND key(2)<152 then cmode:=0; getmouse:=0; g3D_recolor(
1); end;
if 169<key(2) AND key(2)<229 then showbox:=NOT showbox; getmouse:=0;
end;
if 246<key(2) AND key(2)<306 then

if (contour==0) then tmode:=NOT tmode; end; getmouse:=0;


end;
end;
else
getmouse:=0;
end;
end;
else
if key==4 then getmouse:=0; end;
end;
end;
for i from 35 downto 1 do
blit_p(G5,G4);
blit_p(G5,0,35-i,320,35+i,G3);
blit_p(G0,0,120-35,320,120+35,G5);
end;
blit_p(G0,0,120-35,320,120+35,G4);
g3D_draw();
end;
ICON xyicon 89504E470D0A1A0A0000000D49484452000000400000004008030000009DB781EC00
0002FA504C54450000001111113F3F3F767676B2B2B2C8C8C8C6C6C6C4C4C4C2C2C2BFBFBF8C878C
5B5B5B232323ADADADB9B9B9B7B7B7B0B0B0AFAFAFB3B3B3B6B7B5050505CECECEBCBCBCAEAEAEB6
B6B6D5D6D5B4B4B4CACFCAD3D3D3B3B3B2B3B4B0D0D2CEA39CA4B8B8B8B3B3BAB3B0C9D0D0D0BABA
B9AAA6B6B7B7C7B7B7BDB9BAB59F86F4B4A1E7CCCCCCCFCFCFBDBDBDAEAEB89C95B0BDBDBC998DE1
AAAAABC0C0C0ACACB1C2C4C0AD8BF3C2BCCCC1C0C2CACACAC3C3C3C4C4C3C6C8C0A598D6BABABACD
CDCDA8A3BFBBC5C4C9CBCAC8CED1CAC9CAC9C9C99D98A0CECEC7C9CBC9D4D4D4CFC9CAD2BCBCCDCE
CDA6A6A99E75F0CCD1CDCDD7CDD8A3D0D9DAD9D24249D78485CFD9D9A9A9AAC2C0D87059E6D1D7D2
D0C3CEE863CBEF2FCEEF33D6D64D55B1A9BBA8A0AED9DBD6D1DDD3ED3ACEEF2AD6E74AD3D4D1D3DD
DEDDD8D0D0D55561CF2F31C95669DBE1E1B0B3B3D3D2D6DEC1D6EF29C5EC3AD6D796A0A795B5D7D4
DEEF2EE6DED3DCE1E1E0C3202999879AB0A8B1BAB2BFED81C6EF39E7E4E4E4E84B4BACAEAF979797
9160E3DBD7E3E1EDE3F030BBE849EBE75858BD141AD06273E6EEEEE8E8E66C41CEA368E8EE3434AC
7AE7EF29E6EB91E9EF3A39CDD4D48A6EB1ECF1E9EDEEEDE3B2B2E0363DB5B9B89C7892A480A88952
C9D385DDEACACAE54046B34B58B7BBBB7A42AED02FCCECE1E1A70B1BB470D9D54CD5E517B5E767E8
F1F2F29C3746D039E8D22FB4EF1FEBEFFBEFEEF7F5AD6790B072A49340A9B659CFCB18B99C657FAA
4CB1C268C7F02DEEEDE4EDC8718DE53BE5F032F1EF38EFC35D7EC665A0BF5796D7029CC216C5EE2E
35CC53AEEA269EED282CC44362C84A81D34490E449A9E338A5E4CBE9F13030BB19D7D25794D34B6E
D25684D44BECE7498CEE3390E73CEFD33A70DE6A9DBEC7BECEA0ACE74A56D64F78E43980E93B53C5
CFC4EF247EC2CCCAE74B6FEF367FC7C0C7E83F6AC3C7C3EF2232EF3144C1C6C5C1C2C2EC3275EF38
4CE73065B9C2BEBDB0B3F11E6AEF2B4FF03267EF3963EF2F5EF11F3CBBA3A4B3BFBDF1235BB1B6B5
AAB3B2ACB7B5ACAEADDA113DE4000000FE74524E53FF000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000B9B3A4F500
00099F4944415478019D957D5892E71EC76F8B07C417444B02645307073B84C88A4648CBD08AB36A
5182BDAC126DE561663B9BB2A5764AE62AD3546CAC98931C953317D5D9296B566AE659A7176B952F
BD2CD39AD6E6A6B5657BB3755DE7773F809A6B76ED7CAEE70FEE9BEBFB79BEBFFB511E44E2316224
85A0D206E3E982F624A804DDCBDB07F5E3E34B30FC28CCC7F077C17C2294805154C27BB42BEF1DC8
A2F8FBFE49C630D9849707991FC1C177F7FFB33099DC202FDCC187C7E2065002DC3CF34CC01FF1EC
635F5102B8EC606F8446875043D9FDF8053CC7F6633F99517CF6A8C777FCE88407F211D019FDFC85
21E4878D653C91BF8689C6850ED963894722EF703ACB8D2474AC901F21A53FCFFA3DCFB3C68B4463
877C432742D004B1A7CC8DE7C4E722847C69185DF67B5EE08BE4A24943BE51502548124953BA993C
2122420A8230E5EF98FCE21491483EEEC521DB041D454D25A82E08E5C4900869982A4CA5E8DFEB27

5A440A86EC46CA104B10332D667A2430432C9BA81E2B0C8BE0ABF8914398FE373EE445E362625CEB
98A0A0972015A840F499B3664F7F792A46CCA6CC81538406FC49CE9D0182C76BB040EC5CCD9D3737
3636083E086848A69DA58B9B2FC0D0D48C05CF092384112A7ED834C163042F5C0479D138E7EA95C5
B14B96C6C7CE13087854A4D406EB75B3E7F3783C0E295027242648557C3E87379865531689A0C238
72F16AECF2A54B57C427FDFD151E6706A2195E4B5E99B28A03BC3CE7F58942758230412855A9388F
B16CBC460E02F93FE0F3AB6FBCB97CF9D2F8D4F8251C8E568CA8AB5E4BD6AF4C5BA5D56A050B2873
D4890909D204A34ABA503B98858BC68B347291E6AD65B058028215A9A9F16FAFD61AA622221D04BA
8CD9ABB486C039EC90CC35D204E93FE124F98641F9743C815CA391AF36680D6BDF5C8A0BA4AE5807
824034236B9949AFCFD01956A547CE7927247B8D7A8D54050D5493D20D6ED2DF5AB4482397BF2B97
AF376C88DDE82AB02267B5215D80C459E99B747A5D6EDEE62CF1047548C89ACC44A3D0A8324A5586
AC7417F9E30BDE2D946B0A35F2F51BDED8E83C81D4156FAF5B9D9EC543E2FCCD6966A8903B7BF354
A65ABD26315318A2320A5552E994FC2C27F90B0B0AE4E38B3445727956FA1277812DEBDE7E6F43D6
4C1408020BAEA0CB7A9FAD9E90A8560BA55269A64A6ADC3A691BA9D8B6BEA0605151D1BB729862FD
DAFE02EBB0209F83C2ADD60F4CC57A7D6E6E4AF087EA356A7548626689D1A6B2A98C5BF9F9DB80B7
B617146C2F2A2A94176A34A51B070A80605BBE1609AC9B3F32D98BF52B737377EC54C309A8338D99
5860346EDDB5750A9F3FA500E73545A0282C2A1B54000BAC5AC4B35A3FDE64B2EB74B9B9E53BB217
78856496249618336D369BD1B675170916EC2E2A0443C5271B9727252D751658B7650F297058AD71
161822030C7B33D55E9925EA125B094C617309B6EFDABE7D375058B4EF93FD905F9E1A1F8F0BACFB
D77B9F3A05FF4EB39BECA695B919E5E57B13BD424A4A4A6CB603B683076D074B76EDAAC402881F02
C1E1C3FB219F94841F214CE01258AD8E0FEC2653B12E0304E57B3F837CC967B603070FC2555559B9
ABB2727BD59123B842D9E1C365904E4A4A220B1CCD39660501C761757C6402566664E496938A03D5
9F551F388005070E56565655561D3974E4D0EE43903F5CB61C0A24A5D640832DB5C78F591D064438
1C8E8FB1C04ECE505EBE2325A5AEAEBABAEE447DFD891327A04315143872E8D0FEFF1CFEFCF332A8
9094545303031C3D9E73CCE110205F6266BE635331184EE6E20A90DF51070670D483A3BEBEEABF98
FDA74E41FEF3B20A30D4E480E0E8F1DA3D566D2413D166CA24F3E34EE30AF81032F252CE9CA9AB3B
535D77F6043480AB01E7CF9D3FB5F68B322CA8484DC5822DC741A0783E5C8C3CB51CC1B4B40B1630
1443838C1430C08505755001E2709D3F77EADCB14FBFB878F1624545594D4E4E0D0C0082600EFC22
29383CC1FC0F2CA7F18380063A7D3229A8AB3B5B7FE9ECA54BF5971A2E359C87026F38ACD85051B1
2F070450E0F8D1D25705330924E30804736799CC663C436E865E9F9C7CA631EF6C53D3D9262C6868
B874AEE13C0C0067EDF8B4F4E2BEE666DCA09614CCC33FAAF499E1E1E1EFC75D30C31F537146865E
D7A83F9392D758E71434605A5A2E9F8A35F002891758179B9B2BE008AE40FE78ED7BF3C2B180073F
EF20B09841B0B258A74B4ED637369EC10D9ACE5EC515207FF9DA97321A95889CB71B37A8B98205B5
A5412FE3F7828427168BDFBF6EB1C010C5F656BBAE1104371AAF36C17503E66FBB0CF996C573C937
4F70ECBE8AE67D353920A8DD332B482C162891442016C7CC9D6D315B2ED8EDADADAD767D2329B871
E36A535343435B4BDB65283037126E238E099AB40F2AE480A036677110EC857B225620411031C426
B3C57CC1DE6A6AB5B7EB1B756EC1D5B6162C38373D8620796952733329A8AD8DBD390336C40AFC76
06A6C12158CC274DD0A0B55D77F5465EE30DA00DF22DB72E5F4E9BE6CC13D49BA5D0E00A084A6F52
F18658861862FC9AFE2ACD6CB1C01F0308DAC1D0D10802B83D18DA3A6F9DBBDDFF3ABF594A36A8DD
73BBFFF5EE12C0294285D3A6D6F6E2D6D6F63B1D77E0EAC082CECE5B695FD1DC82AFC34070E5CA9E
DB5F3BB766D0112392A6542A27D3ED58F04D57ABBDB883147474DCC10770ABB3B3E5F6B74A3793BF
2C857CA9E23BD79A90A05042E9E9E9F9DD5771A7C170B2ABD8D40E0D200D86EE968EEECECECEEBDF
CA3CFB7941515A1AFBA5C2BDA4B2901FA19001D1F8142D277BBAF0B3C40DEE7674DC6D6903C1B568
D960E8F7EEDD1B58D158884DC8E8802C7A13184EF6F4747581A0951474747783E07A34FD8FA14521
3695FC2489FEDE648611C0E09A011A747776FF702D5A328C40C9405C9A8445120D4FD2FC0D087A7A
DAEF83E06E6F2F086E5DDFC91A064528A278B2A2483EBC07FF9258D0D5DE73FFC1831F1FDCE9EDEC
EC6E92440D079D8D288A2886939D6C93191FC24FEDED58D00B0DBA5BBEDFC9180E1030658C50277E
3B7F761E428F5370A7F787CEB45FFCFC428741C246FE743FB69B5FE24E0F087E05C1350A973D2C2C
2EF2970C2CFB3E4C26053D2EC1DDEFFB86CFB3A3B8680C8BCD7513D0372AAF0B37200DBDBDD57DDC
A7C0A0A06C3A973240DFB3793D5DF7DBEFFF8A05D57D0194E10960F8226FCF00E6C00EF3F5BEB8AE
9FC8197EADE6BECE1C3ECFA4B0B2910F9DED3F9887BF55B7C3083F7654FB33FD9F0645E98D46674B
986306F3E8E1A39FABF3AA7D7FF31FF334FC43A33C10F291B0C7F80EE6D13BEF3CFCEDE123DFA743
517823C03B8AEB3BE1FF8142F71A8D05C83B34D4FF71C502CC53E2BE6C9697079947A347A8D97EDC
A73CB1A10F90EDB7C0DB797F8CC788915ED97F8E91DE3E64F47F3871955142EFC7D9000000004945
4E44AE426082;
ICON zicon 89504E470D0A1A0A0000000D49484452000000400000004008030000009DB781EC000
002FD504C544500000003030337373C7C7C80C5C5C5DBDBDBD9D9D9D6D6D6D3D3D39696996767672
02020A7A7A8CECECFC9C9C9B9B9B9B1B1B1B0B0B0B5B5B5C2C2C26C6C6C0404044E4E52CDCDCDB3B
3B3AFAFAFAEAEAEADADADBABABA0D0D0DBDBDBDB4B4B4D0D0D0A2A2A2C0C0C0B1B1B2B6B6B68D8D9
1B8B8B8D5D5D52B2B3285858C818185ABABAB747474D3D3D4BFBFBF88888F5D5D645F5F676A6A716
E6E76C6C6C661616959596173737B515159CBCBCBC3C3C366666D68686F56565EB5B5B6CBCBCCB7B

7BC63636F65656C6B6B73A0A0A99A9AA46F6F8162626B69697ABBBBC066666F91919682829465657
38B8B9B56566060606D747485757586AAAAB250505D9C9C9DA7A7AB6C6C74B2B2BC6C6C806969717
9798A454559676777737384A5A5AEC1C1C2ACACBB6C6C7D7A7A8E7373877C7C8C63637769697E535
36D7676895C5C6A777787DEDEDE5C5C73717181D5D5D6DCDCDCE0E0E0B5B5C26E6E867F7F8978788
4717184DFDFDFE3E3E3707078A5A5BB6F6F887D7D954C4C67E5E5E5A5A5B486869E72728B84849E7
9799275758EB8B8C0B0B0B85D5D7B63637BC4C4C7E6E6E64242468989A36A6A8781819A7A7A968B8
BA09090A84F4F71EAEAEA8A8AA36A6A827373928888A185859C8787989B9BAD8787A193939F8E8EA
76F6F8F82829C8A8AA57F7F9A7E7E98545474E3E3E5EDEDEDCFCFD57E7E919595AA7C7C997676988
D8DA67979986060839F9FB4C2C2CFCACAD557577CEEEEEE3838517F7FA18585A27B7B9C8B8BA48C8
CA58585A05B5B8562628C676790F1F1F18B8BAD8D8DAF8585A48888AB8282A683839E8888A774748
240405E9696BE7D7D9E8686A88282A2BBBBC477779F8585A76D6D97CCCCD08686A2BDBDCAD4D4DB8
686A5ADADB4C1C1C7A5A5C68383AB9E9EBFC6C6CA9595BA9191B29696B78B8BB39999BBA7A7C8898
9A49292B5ACACCD8C8CBCA2A2C4A6A6D79D9DC7A9A9DBA3A3D1ADADDBACACDEAFAFDF9B9BBDAFAFD
19191B99696C19A9AC59999C2A1A1C2B4B4CDA2A2CD9191BE9E9EC29F9FC99E9ED2ABABDDB5B5DEA
EAEC4A9A9A9ACACAC1C1C1CACDCC0EE000000FF74524E53FF0000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000001F6
C5ABA000009B64944415478019DD50B5453471E06F05B4C20B426BC56794843E411C016081224C9E
22260033E08106B01D1883C178DAC510854018144458CD01014146308960A5EDD165173219098605
150DCBA2A4512A0508516F1D1D6ADD5B67B7672E55D570EFD9173989993F9F8DF99CB0C847ACB681
E068B359ECA648CF16B6171A66FBF034D309A8F2798994F6731C6FCF52CAD7084BF2C189BBFD01A6
3636BB7686EEC2CEC71A6EFBE9A8F239A5BD8CE9DB90369B121C1C8DAD1C6C9C966CEC01C679CCB0
268C1626BB2B3E59F4326BA1A416E24477BB34936EEA63666AF475EF2DECC2122691EF4BE8727719
2BD17C57BA91DF1B54C293E6633C7A89690BDB595E32497A514DF657E0E8EAFE144A37813670E62E
8109ECE98C2E7AFDEBECBFCE711197F64BA9CB6F46F3307A97828C09A3A6945601008F00D5E49FD0
38C1FCDDB67FECC51021EC293E884091F3043BC7D29B4E0D0558499C8344AD0EA353347034810098
7B71E475FCB0C09A281803016DD7A069785E1C1112B678E923C209C2B89E465434211229981410B2
934FF30F63AD274F40F6941BEA12BC7BB84F57E1F197EE34C200F630F9C6F140E151DC30CDC10CE0
C0D0B63C7E271D3D86DDC4489E06C7ED58973F1A378FB6140CBC41832C19AB8FAD14C5D0DB630230
357C727242625A724AF709D66CDDF53B7866EFB006D53FD434296FB4779915C5D8DB19031176BEC1
7B4106FF82F8F4E64476CD8169B9890C2DC6E3AED24C06D8F49D89E96C6F600ED7F2C59B69AE2ED1
3ECBFD2D8780717C2F27660FD7C68FE5860E72E66727A462C3F761B9F9F41C74EB1622333252D2DC
5CB04B43F5A6E28203838623316CBCD84766471B91F472D355AC3E57277EF894F71CF8865266627A
6F23FC0722760F9393189B1C9E92EC65CEEBA105080AF4F5460E83A2E379307717379BCB4D51F2F7
7B3E5F1F6E6A5ECF2CAE0E7E717640BF285FB7813F6E71C285CCB617A79617907FD97870485FB470
547F0D7F178595910AF282B6B730428E15066D66E518C2029F6709EB0B8E4937C8138336B0C2FBF5
42064E727B9BB64662EF1A60451C27DA222E2D92BB3B27273219E2437777F7CE0C73437D3DC2D654
74AE2138E9667670B2B04C7128EE78E11971EA814ECCA8B4D77C972090A470BD810C6E69CC8CD2D2
A82B224454507D961C1416E6E715BA4276547AAE4D50256EC3156854CB0B308157DEA544AF13161F
9AE0CD6667F5F50C0324301919C1345459222E8D31A89E4B3D4F8C00D87DCDC4ED7D6559E81ABEB8
A59A78FB164F0D973FFFCFC8BCF3E2FA8AF3F20587BE2B4BC580E07FA2FF30D0105AC0605704E480
028F7BC44F2E936F6A6E07037B706C1858B174497AA0A2AF2640A39D278A649D97C4ED9D4D474585
ACC2A1655556D0F0F094C0BA3F9446D654672382C89A4460215B5D4D4484E4472C2828C8C1A1A8EA
AD4973517B5AD57CE563636369E6D562A9B4082F228DC2A6A94890F3744304FC77EE913B46113288
0595B5373BE060DA889E644C6071E6A686B68387955ABBAD6DEA1D25E56B522F24BCD4D60BAB2595
6505E27AA2B6FFBB03021E9CBF474DF402687C3DFB37B32E03A87C3DE446BD8D8D0D07654DB7E437
3A3F3728758A6A8AC3BA36C5636DFBCA9D2821FCD819C9C94D391F3DCBDFCB68202625A77A201929
6F33535FFE27022995B37E6B4B535B4959EBCF095BC11292993954B651DCDCA9BCDCD1D97559D9AF
6C36DA772529232DCDDD3F39323394C81F81608380F65B58084CC6DA084888D3920A1AD345FC8FAA
4422C2F50C8555FC9AF81029A1595DA4EEDB986D2FA73F9292020A9AE90CDDFA3806F9D6F6991405
44FECF9969A0AF050691F1A4A2815640B586B8BE1AA5669AB467D4174EDE42545491E4B509873AAB
EFEDCD1EA0CF774596572E4915629F2EF965C8C156482673002B0D7F3F91C7672CEA9D2B6C2B26C2
18B955029ADBB72FB82BAB351D12A2BCB5BBB56F8E59D5BCAA6FA33E28474012C1686668B11E42E8
641359C48AE243A715D410C279273607B4ECE11595E49C1B1D44A6949BBBA5DD57EA9522A031555A
79A4A6A3EBFA13C23AE482D07014710188157E13DC0898433C19170B8BB620133927FB8BEB430A1A
4A25AA4C8BE28BED6A9D26AD4ED8DAD22594275AAFB41B0595FDCBC59AED68810B1B0588A20623C8

9E46102020C876340AD624F1ABB50591F73BAAA5220105769D51AADBAB353DD7EB64C21930B333E6
A31E8BAF175B75A842097CB1004915AA3872AC9958407B6480BF89129679489E90A69B50029D3AA5
59D6ACD0D8DB6A34CAE80B393EEF176B8065891BFEEE9D689147A5D3908386E8DC7E35CC7EF85681
811A6F14B6E96B0E552F8B6EA76070850A9C1335C2B51C072E4B8150383C150E93DBD7DFAB3BA7E4
340EDDD57F7021E671D005C47E0722633BBE31BA1508C5C19D06B75031A9D5EA5D2682E4A5B2B6B0
9D6E8B70206BFD5F769EF1B02A4FB0C7D3C0E0404D0817B3022AD4E118861C5A56FE0DB8600BD0A7
C3A55FA0E7923BC973EE6DE83A1E1EFD08068B46F0818BB1B8F8355D9B34B81C01A15F21598AA460
3B47A7D671D2C8D1BBF0BEF7D3FF2100DD83B71375AE309E83D7B0704141C688411CDA8FE824E3FA
002013ABD463FD07B11DE3F791D3FFA1E0DA865BCEAD227AFF768C3C69414C0F095D1EE819EC73AF
5C0E3DED16E9D4ED777451A373560C410B06AF27AA70750C1FA6230AB604342BB02BEDDD73DFAE4E
90FE0D3DBDD3DA0EEF9B1731D66D25D3460E778170410E80C541C78B911459FAE0C0D187AFA6468A
80754004276AF624CF1D3C8B3FEEB133D6A00442030AC507B418048DFA56AECEDEEBB3A34F49FA74
33D7DA33DBDDDA3FBACA68ABB753D6EB287A14354429C230ABC4A4899AEFFC72B5FA301DFFE3074B
56FB4FF71F76E4FC7FF8F0102A88E9E2847B09148FBFDFED1DED1D1C74F879E3C19BA7A7570B0677
49FE71B30082060AC4D24D622C8ED9FFBBB9E3FEFEE058B7075E897E78F1EFDBC9BF8A6002B0284C
110C7DD91228AD1FEAE6723C34F9E3F7BF6F4C1F010088826BE8923156230EC276C46AAFA40052F1
EBEF8FEE5CBE18786802E33FB37F1C4408C387BB371E45A911E040C8FBC0A18793638B8C2EC8D880
CC82ACE8C3C49ACEBEFFAF197872F5EBC7CF960F8E183C168F29B8100474FB2F3A43BE2AEAEFBBFA
08F0002BEFBD57916F6719023D1D9728ABD5D5D601547865F05445BCEC22C0EF2243A3B4CB50504B
C1879F0D0B008BF3ACC86EC08FDE6E9E034CD16C3360C1B02769A3BCD866C06BD4F75B0309FE6CEF
D17E836F49BCFCE7E3E641447B6B09DEECEAF83838F7EDA6F3B3B73C63CE8DDF59E16767FB46891D
DEC6C2DAD0E41D021A2B3DDA2DF17CD199862EEB9E65D088228448745EFFD09BFDB1217FF17CC871
6BC4D24DB8181DFE602CC7722AE7733CC87A0B796CF27926DCC2DE6C2C992485E82FE7DD43B0B97A
C5F3C27EB5DDE36323C3FF43FAC0F605F6B9F54480000000049454E44AE426082;
ICON traceicon 89504E470D0A1A0A0000000D49484452000000400000004008030000009DB781E
C000002F1504C54450000000606062D2D337A7A7FB2B2B2C8C8C8C6C6C6CACACAB1B1B1ADADADC2C
2C2C7C7C7C5C5C5C3C3C3BCBCBCAEAEB1BEBEBF8B8B8D4A4A520D0D0D9A9A9BB9B9B7B5B5B55F5F6
85B5B636A6A7272747AB7B7B7B0B0B0B6B6B6888889A6A6A6AFAFAFA2A3A3949494B2B2B1CDCDCD3
A3A48BDBDBDB0B0AFAEAEAD9E9EA164646D54545DB4B4B38F8F906D6D74ABABAB1A1A1AA9A8A8676
76FACACAC020202847F82BABABA95959D84848CB6B6B5B9B9B98F909E858596D0D0D0646464BEBEB
D646474A0A0A9C0C0C06C6C7D7878895555688181927E7E867575866E6E81737384707183B1B1B5C
FCFCFD3D3D3D6D6D6B7B7C067677A7C7C8CABABAF42425F7C7C93B2B2BCBBBBC68C8C94D8D8D8A6A
6B0D4D4D3DBDBDBC4C4CD76778FD9D9D9C7C7D08080998B8B9B8989A2E1E1E0DEDEDE8D8DA672738
B8C8CA4BEBEC958587B82829C6D6D8BE8E8E8E3E3E39999AB86869E9393A54A4B6C8B8BA5626280F
0F0F0EDEDEC8B8AA4ABABBA84849FCBCBD38686A269699263638C8F8EA77777979191A99F9DB37B7
C9A5A5A848484A5F5F5F48A8AAB7F7FA2656B8AD6D6DA8F8FB48C8BAE8888A68D8DA89696BB8686A
9A5A5C69C9DBF717193FFFFFF616A84B0B0CD6579846A7F92708798707B8D687E8A6B838D748D956
D8395738C9CA4A4D66F869183959C6D858F738C94738A94718892728A935E737D8A9CAA768F97839
7A77C94A55E687A586A75798FA3647B7C52616C7272A57D8E97676E767B949A6A82824B55647086A
1748BA46E868790B8A8B8FBDB94ACA4CCC7C8768D88B3F4D5C2FFE4A3DAC2B1B0DFBDFFDEBFFFE1A
9AFAA97C9B2BEFFDF7A94AD7EA49BBCFCDDB6F8D8DA2A2BA9E6CA94BFB27A83938FA1B4B8F6D9879
EB6849BB58198B38EAB9EBFBABB839AB4818D9C8095B1849CB5859CB8BEBBBCBAFCDD90B2A2ADA9A
BB8B6B68CA5BD9BBFC6B1EDD394ADBD8599B1ADE2D28E9E9780869C8EA4C2AFACAD839CB393AACD9
5AED2848D89B4B1B2B9F1D79DB7D8BCFFDFB1AFAF779989869C91AFB2B1A87081AA8BA8B6B3B46D8
77B4C91F5FD000000FB74524E53FF000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000003B39A1E400000CAF494441547801759
57B5C53679EC64F21100821060A24E11612012189207180C8658A24929B48A144A5D2D8104CA2918
B5248D360B888E01081E2B41192803121E112095D572A74665B1446EC8EAD14E95A70C70E1D3B168
B3BE3CECE7676FFDADF49D0A153F7F9E4F0E1BCEF79BEBFDFFB9CF79C8378F4928F2FC6CF1F1B108
8F30FF2C77B14BC21FC26051182FD82B66C21E20370C490D09791E7F209C312C2311161243225322
40A13802A7A43019B14134B8DF325937D2368B1F4ADF111092F6D94F7C5266E4B4ADA964C6130196
4263D20F0FF132B96BA9D4C26A7246D4B0A8B8D4D8D0FDBE10130A9E118A89496426193190C329BC
E8A7EB10276C606FA9249E414DAD6680C86161B9246437BD89146DFC9C26022924929143289C1645
3681198178A450D0960304924F6F628F42C6A5B6C722882FC2C9D46A713626232324929290020332
89198F09817293C951EC62493D96C4E94E73C8AC0DAFA32B22398BECB378B9041C866B0534824067

448CAC978A10871745F26CCB3293104F43C2B8B981B8AFC3C988EA56388AF1072F2D82910020AC8D
B9D9FF802E5A786408450869B45F48E10B121482A8EEE47A3E2F3093C2E090530C814C69E820C5CF
E4F850FE333C9CC144A1E8FB0318D0B8A42122368D82C7A907F9440E84D91CCA6908499FECF77D2D
F850D6333A1010697477C36EB474488B40C2C368C10BF45246250BC29A630843C2236E827CA0D491
033D8943C9168EFB3D9F87C04474B8C2FA4B272F78A05100289C11571C5795CD16EEC4FB5CF770F4
F4862080110BF3154884370D4FCC2426272D1AB5C413184202CE0894B047942CE6BB9F1FFA0425CA
95824C9630844A2FDCF26F7E1103C15B72F379E967B402C12C2A3202801004F2CE61CC4EFCBFDB1C
A924B0582126EB140C47DFDD0C6D8213CE29F862FDA574EF37F432A14E43138025E89187E8282CCB
0A243FB36EB5051719EA84424E60A84DCD70E6F0C960521D89D7E6545E544CC9B320044866C00782
5157C4279D16695134B850281A884CB15F0B73C9B2AC722F8C0DCC365E5F1A96FCA8502AE88C32FF
6AE81972DA9283B5CB6499515A56281B8A444C8E5F0B71CD9180440565C6579797965D201855224E
4713810A1B240A22CC951498FA233CF74A4F0D831F57141498918AAECF5CC1C3972A4AA102160AAE
19F6A56728D54A89470383C914452AB96C86427248A2395479EABEAC449A104C03C290F00D595D5D
5D5B9B9FE81E10821A6AAB2B2B2FA30BF4E5DAC94F1393C69AD4486FE4ED42A55D5D5951BAA3ABAE
72D616DAD5424510320AABE881017179D9455844588D4B22AA035BC2ED3144B353C8E54E205A86B3
2738EBF8D4EA16A78E3D83151B15C2D91C8B53CBE6F66389D7EA8A80AB40FC19123CB1AAAABABDE9
128845A4D49894EA69529D5390515276A6A658D6F5735C0550D0D6F9E3AF65681502B2B902A8579C
5C2B70F57D757A1F0AA222498CCA4E4C259658EBE49A7974A9A653299A4A222A722BB45A16B3DAD7
BF5CD77DE39DA7CEAF469A524AF98C7831CA4756D47C1E051433C921F0B84F2FAAAFA1A759BAEB95
5A797418615150515B52DCD1A5DD3E9538D8D8DA78E9D3E75FA78B14496939D23516935BA031B80F
A343A42CDA0904329F5F567F64BDA65FA0E9D5EDDAA97E754C8E47535351A8DB6F154235407C0598
D52AE91D5EA9A9AB5F20D40C3192C938ED0722319E484C8FA33BF907676EA0CE7546D3ABDAE55A55
22B9A5BD46AE5F15328018E56BD522D57CB556A15008E9E69009D296430C310DA110E9B12EA13597
E26A7AB5BD7D9AEEB3CA7EB69D3689BA44A954C2A53B7367AA5D62B65CD3AAD5E2D97AB6B3D80331
9F082CC44F0F5618C144AC28E84C2D7DBDE6DEB6DEFE9ED69ED387FBEA9A955DDB55FA5D12A9A208
5538D3AB94CA9D37669BBCEB5379F3B8702CE6C219319B084A25FEE45DF443E3ECCFD1DEFB677F7F
4749C7FEB7C4787A1BDADBD1D6254EB34E701705E2D7DEFBDF60E030C1ABA3BBBDF6FA8FF657E281
9BE63C9885FFD2FF8949494501F9FD0E3DD3D6D1DAD3D861E83A1A3DDD0D6D3DEDCA251A835DAB36
7CF1A2FF4F55D6835F4B4B719DA3B01505F4F65160BC414522682C1E666F3D90CA68F8F4F4253776
F6FA7C1D066E8696BEB3AA7D56B6A34FD4AA3C96CB258060607074C4D006FEF01C0817A7E02BCBBF
81C4608822784718B294C36D327C127E158CF4500747474C9B57A79537FBFF592D966B60FD96C768
7D9691F307580DF60E8EC7D9F97202A11F0399CC8830826DD7F37971749A1803FA1B4B4B1A3AD4DD
75AA793F61B874D36CBC8A8050876B3DD82424C265D4F4F6777672737945B20023F47908DA4951D2
68A041CF82EA2FED2849367652562A3D1647258CC43D63157DFE0C090C56A763AAC36CB90A95FAE6
DEDD0E6ED116667839D5320CB44E2D28A722B84227E24BB140594EEB93C0CF6518BD989161D1D81B
5DB9C769BC3EE84538B91A7CA11C3856AB93E13FC726D26124CCD2FDA2B16F3F8294C14303E3E6C3
39B4CCE21ABD56287BA236E68C16E719AAC768BD564B2F5571470F79436EAF4752738B2AE2E00E4E
36945F90211BCA848A1A5274F4E4C0C9BCC6693C3E1305B2CE6BEC1C14B9E16AC369BC56175DA2E3
93E108A39CDFFD4AAAA6B3E215729B4D908615F32BE3047281294F8EE293D393E0C0090D53204D93
900E0720FF65D70408866F873C5611EFE674E6AA1A1D3D0DDDBA25229D400288AA01EDA2D14098B2
329A5278727C63F30DA4C46286F75D8ED03837DEEB1BEC13EAB053A725CBDE4304F4C0E73E20B7BB
BBB7BBB6B9A559A73BB11422E362C284A24CC233123C9A5E313E31F7A42B0DBADE8DEB936756DCC3
D3878C1E6B03887AEDACCC6C9C9E98F08F10700D0DBA29077F7D62084C2F8646A104F041F2C01E7C
30F26A72786CD1082D3EE18989ABA766D6A6A6C1000A8FF0A6CC989E9898F7EF5EB7F79E322106AB
ABADF054046BC1F6E3B0E6E242044BCF1E9C969230A800503600A00B0866B5303F6AB97466DC689E
9C98F3F99B94EC3DFB8D87BF15D50E76E241C8BC76EA3BE060014313D3D393969B5DB4C668B1DFAF
7B600A081AB972C76A7C938397D7D6676EEFA6F6EDCB878E37D00186A90182C3E184FCF92A00481D
078050868820383A30E0FC0ED1A71431B579C76A77968C878736676767EF6E6DB1B803A00F805E3F
CA9D496E362B487CBCE4BD393262836E882FB07C794CB3576EBDAAD11D84C6687C5F1E9BFCECFCEC
ECEFDF6D70040D7A0DB8D44F8E1F27144FA6B755220082EDB46AF4C1B9D767B9FCBE59AF2025CB7B
3C75C830EABD5EE747E3607FED9D999EBBD176F80BFB78580B082F289C4605A728D87701936F0A56
91BDC44704EB93DC7EDDBB76FB95C176C16BBF573AF1F08373B6109FB5FF5CF40587862622291406
FA95348E1033F3C6AB7DFB932EA74F4790183EE9185DB63D0C63587DD71F58B6780D9B99BAF1F482
4BE820F4730F844028180A327372B344A11771C004EF7C255FB80DBE586045D238B7717175CEE5B4
B7D762BDC81E7802FBEFC373006672101C1E02710A2D36BEA1475D2E20F0060EFBBB730F215A4E71
E5B585C5E59B937E272DFBD3F65FB7C7EFE390062A0FD3B81404C43027019595959E1C4E4837A954
221FD1036807DE8D6CAE2E2026871E5DEF2BD957B0BAEA595FBEE4D0BF0C6404D4C844F5B34313C0
A14BE2B56054F57D765740D0E37EA5C59595E82E31EB4B0B0B2B2B2B46901A8E67FF7E0EBDFD3039
03862540C2A02BD40AF5235F7BF070FA1736A65E52EDA3B1C4B4B2B775717EEAE2C7FF3633FB4F08
78F6961E10088894015B38DAF50A9F4FD5697C50921784AA3807BCB77571F2EAC2CAD7E31FF63FFD

CCCECF5C8DFB390C0449657E1DB657A55D79DE1C545B7D3B1ECED7DF9EECABDA5D5870F1F7EBBF8C
71F05303F33F3C9CD2F1FFD868041E8F92C8C47ACC0823A95E2BB71D7DAEAB7431002F40E21DC5F5
B03FFC2B77FDCBC80F999DF5D7FF028F9F12E1681863071ACE80054D1BB0EAAE14618FB565757176
FDDFF7E69F9FBEF97EFAF3F594701DFFCBDFEFCDCCC6FAF7FFA1FD43FB102A231445F64C72B31715
E6D4D562A545D26DB2210D6D6D756A1F8FAFAFA13B483877F9E7FEEFED5671F3D7A94C68A8E060B0
B9F80FC2C9D189DE4D5D68332BDBEDFB6BC86029EACAF3F7DFA1400EB90C11FBC0DCCCDFCE767B07
2DA5FFEE2B93E302E3CE96504D9911593B4D3A3A434BEBEEB8EC90D1DAC3E07ACAFAF3DF40608AD8
33B39EDF163EFE53B0331F90908889CCF0A4CF5282E36B3F93BE3200A587BF264FDC9D3A780595F4
377D0FCCCDC2737FF2B84FA7867EA33ED0C206E7F0905BC9412151EE71D4B8E4DCD363ABF5D585D5
86B6979B201F8666E6E6EE693EB0FFE1A96F6F8B93B353529262B6407EA07824F082B3C02DD0BBB4
268FFFDE9E8D80F3FFCD0FDB7BFA180A7F0670672FBFC51D8D7FFC3DAA488985DB4044FFD0DC4CFD
343B683627DB7FFF563417AFA9D3B3FA47F85EABBAF1E3C78F0BF91E9DBFF41E9EC84973DD6FF030
62C582AD99AEB230000000049454E44AE426082;
ICON boxicon 89504E470D0A1A0A0000000D49484452000000400000004008030000009DB781EC0
0000201504C54450000000505053636367B7B7BB3B3B3C8C8C8C6C6C6C5C5C5C3C3C3BBBBBB8B8B8
B5252521010100101012727279D9D9DBDBDBDB8B8B8B2B2B2B1B1B1B0B0B0B6B6B6BABABAC7C7C74
141417D7D7DCBCBCBAEAEAEADADADCACACA999999161616666666CECECEB4B4B49F9F9F040404222
222D2D2D2B9B9B95050500202028C8C8CB7B7B7C1C1C10C0C0C1E1E1ED0D0D0BEBEBE4A4A4A64646
4CFCFCFBFBFBF8E8E8EAAAAAACCCCCCC0C0C0C4C4C4D1D1D19696967171718888888484848D8D8D8
98989878787979797959595929292ABABABBCBCBCD3D3D3CDCDCDA8A8A8A9A9A9D9D9D9FAFAFAF1F
1F1FFFFFFFBFBFBFEFEFEF7F7F7EFEFEFF0F0F0F4F4F4D8D8D8AFAFAF8A8A8AC2C2C2D6D6D6C9C9C
99A9A9AA3A3A3E4E4E4F8F8F8EEEEEED5D5D5D4D4D4949494ECECECF9F9F9D7D7D7DBDBDB909090D
CDCDCF6F6F6EDEDEDE7E7E7DADADADDDDDDF5F5F5E0E0E0E8E8E8FDFDFDDEDEDEDFDFDF858585E3E
3E3F3F3F3E6E6E6E1E1E1FCFCFC8F8F8FA7A7A7E5E5E5E2E2E2E9E9E9A5A5A5EBEBEBA2A2A2EAEAE
AACACACF2F2F2B5B5B5919191989898A0A0A0A6A6A66C6C6C828282A1A1A19393937F7F7F8383837
979798181819E9E9E6B6B6B7777778080807E7E7E7676766A6A6A7C7C7C5F5F5FA4A4A45454541A1
A1A0A0A0A1C1C1C4444440606066E6E6E1414143131314242420808083232326262623D3D3D0F0F0
F41EBF8A0000000AB74524E53FF00000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000499DE990000056D4944415478019D95E
B43D35618878FB3B9B18BE9258D4B5BB606974E7B36B2F508499DB829B4E5D20205BAB6034A2D2D5
A445406DE915BA79B6E0E75B2B9FBCD5DFECAE5D296841607793E10C8797FCF39BC39C9011A075E3
A68C370C208598568068E512D2FBF026ABCFADA218CB63B9C265C559CCD61DCACE3F081EAF4AF73B
4CBE3F1EE0F8FCBEE6B7D4313BCE9671C2E0B3879B6ED88927F4B08F00E4BF08CFF6D008E1EC3824
1C61A4148BD03DE6D170301B7350274FB7BE0FD10A22D23FA8E838E4E285906B241407132691D0C0
1CA8FB1D6E9940015E67C8DC81D278E7F70B2ABEB54CB872A1F9D387D46A5BB07211A37D48520884
4FD31139CD4DBDAD7D33F10E71289C4E05042633839A2323AC6B8531F0BDBC5421AA04CFB3659CFE
94FC6A989814935C4E612CD88A73BA7EA813C01E058B40A76EA6CAA7FB236E7AE02BC308DE56B992
20BE452468168EB9EE93B77DE54B98B402E2766C3992A177C80981B533866C78B422CAB3616CF169
239858B64B2B9603491B8101DD339C7017CBEA490BFA476AAAC0693852CAE3DA143BC2A24A2F373F
397B7F33956FD7925A3A64AA58518C026AE2C2C2C94E8C6A9F29F0EAA0B41278F77CBFA5E591CC98
DCC07469794C1CCBC925A58580C01DFD56B2AD8F506C1951BB5DF86B4FF29971308D697BAC9292A4
C1ED762B7C2809B5DBCADC0CD350896DB9AB5C0974C0C28AE699B9ABA7D5500B14BB7546E638DB54
D1F0359D62ED34E2D369B07A1C2EC251579724F82913BFA3E898B5A6A250342E5650D21B327417E5
5BFC26B5AAA5004EDB995350D7E702F82EABD21510F95C740782457D6882DEF45506DC1F0BA1ECAF
58370BC2A58E176164F080DF9016240BB96E6F450D22028BB077654EB9BCE4459D6AFF44A5D90AF0
BE68B7B16CCAE5633232580259792BA620DEEA84ED2C3A343E65B63FDDA8528EAF36FC443C021476
7E34B49F56FD6FC3A27CEDD18EFE50330948C2FD5367A5AEF215550FAB7B1B15C242A40CE10A21C5
D5B8A277319DE942F7D269152CA63EBB97BAFD7C9C0CE6B2BCA831951473648C5592EE2282D64815
4CC476381A07F616D23EE34E6A73FAF4084A084209986366FA5ED8BFB8C97D186A6A60AF36137C34
5F3455C1184C3423E448808177CC6372AD247A23A104AE92C4CB539B42144205A8EE58570780AD73
EAAA1F6F6B010CAA669C31B151A9710129111897455D4A14117E617C25A4CF9A88AF9905F27146A5
F1FAEB7BB550F9914D0A3090A7C2DE28F9280369E0BE26C353F394E49A6D98D02396D3C172242ACB
30E47550581F534DA4D70F9CE76209C0694603CDA9825BD010F48715781E0311D6D54288B6DC36AB
B71F1CB086AD20204BDAA8097B7EB6370E7E9DCA67C15CEAF32E926F1DA0A5CE6D3D91D637103EC8
54422E5686880A8B9245590B319CA3904EC1C211B20E944E76AB3066A2B4829028236946769C0F86
4D208533C03EBF3EEFC27A4DED184376DA86629C06064DA88F8154FF870496CBE84DE8BC31DC66A4
550C1A064E2CEC3AF37EF4A9D38941A1680E0CDE97EDE58AC0878B671CBD18F1E3FBC1BC038191AC

65419BC791DD1C64AC20D6C84483721D0BBF9E49B0711D64742E30A3A26664C65A45DF922D1915D7
03F7ABA75BF8F62F1BA037A648FA9241D044E3242BD00E6CCE6B78F685F56D624D039EE360D43063
8A13BF062F8B3DF6D3DBC27653112CA8756CD63A8025CC81EFC7F1CAD4FB68EF5A268F7B8F93ECD8
3140A327BC33BB375F059CA7C2FA20844A6621DCA06BC346FB38EDB01BA259BC33AD4F7E007D2E67
25AC4E5404FC18F2293B28C4D3E0C8E762197C71ADE54C0F313003F0718CFBA25BC0EF40B507826F
1DE1E0BAC3BD1CC1155F0EB6F417BAAA7639FF4789840CBEF6A1E80037FB4F0F6CAFE36408561EEF
DF91CD478FED7DF9BA76EEC87AEC7FFFCAB45FF033BEA82B87E621A7F0000000049454E44AE42608
2;

You might also like