Index: tags/BN68/libraries/libArcIMS/.project
===================================================================
--- tags/BN68/libraries/libArcIMS/.project	(revision 0)
+++ tags/BN68/libraries/libArcIMS/.project	(revision 8301)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>libArcIMS</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Property changes on: tags/BN68/libraries/libArcIMS/.project
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/lib/.cvsignore
===================================================================
--- tags/BN68/libraries/libArcIMS/lib/.cvsignore	(revision 0)
+++ tags/BN68/libraries/libArcIMS/lib/.cvsignore	(revision 8301)
@@ -0,0 +1 @@
+remote-clients.jar

Property changes on: tags/BN68/libraries/libArcIMS/lib/.cvsignore
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/lib/junit.jar
===================================================================
--- tags/BN68/libraries/libArcIMS/lib/junit.jar	(revision 0)
+++ tags/BN68/libraries/libArcIMS/lib/junit.jar	(revision 8301)
@@ -0,0 +1,822 @@
+PK
+®»$-	META-INF/PK®»$-META-INF/MANIFEST.MFóMÌËLK-.Ñ
+K-*ÎÌÏ³R0Ô3àår.JM,IMÑuª´RpÌ+
+šèòrñrPK/c„10PK
+rº$-junit/PK
+Êº$-junit/awtui/PK
+Êº$-junit/extensions/PK
+Êº$-junit/framework/PK
+­»$-
+junit/runner/PK
+Ëº$-junit/swingui/PK
+sº$-junit/swingui/icons/PK
+Ìº$-
+junit/textui/PK
+®»$-junit3.8.1/PKÊº$-junit/awtui/AboutDialog$1.class}P]KA=7I»&®MLšÔÔ¤VÉƒFìÆ·‚R¢!´BJÞ'›©NXwew6ÒŸ%Ø|ðôG‰w&¡H1÷cÎ9÷Ìý{{‡,ö°E¨OÒPiO\éTyÝQ”ê#%‚è¬µï€¥‰˜
+/á™÷m4‘¾v�%4m—9žœÊP{]_«(ì«DËPÆ^^ês•´:< ¿`Â!?øês©•Ï„CÅ°O„ÆöBÆÎ��ëEcIÈnï]°R@¯\8XÊ#ƒ¡ØW¡üš^Œdü]ŒÆ–û‘/‚¡ˆ•©çÍœ1HX_4¬µÏ‹ÂþìTÆ?¢øBŽ	ìî©Ï›Ü,þ{Ÿ	9X#8c•\F‰tñÖX®c�@ì¢ñœ¡0ˆÒØ—_”q\zäîƒ¡Ü“�ÞD’È^@¼J¾e³Žy˜“á[À2×.g¹¶�öÛ»¿°zm1e‹2/«SáÌåhº¯QåH¨áÍ\å3Gƒ]jß`õ7ÿkTÙAÍjÔf¸¹†ÉšxgÙ–ó›–5ÓÊPKØ‰ÞäŽ¡PKÊº$-junit/awtui/AboutDialog$2.class}�]KA†ßIkÓÖ4+Ë´ìÂ5Jñ*H,±‚@º1ìzÔAG¶]Ù�¤Ÿô]ôúQÑ™Q""[Î÷sÞ³ŸoïáûéQ`K¿Ì'~ Ë�®øç’[Î _5À²#~ÏUµ,î…í—o¥Ýw&�>ûÂ5bXò‡ÒËWˆÔšƒ:aˆ´l(|Ù£�š¤¶:±s'Š†pÓé†P¡Ø1±Œ•(Â0M,b)‚¬2Ä[Ò×Á]W¸7¼kQo²åô¸Õá®Tñ,V2ó–å«$06Ñ‡5-Ç“ö€!GÚþºüBùZ^ü»>ÅH1}é�O˜ØV‚·�f`¤!û�!Úv·'.¥Ò›ø¡íH�1˜W¶-Ü¦Å=Ox¨Ðùat¯úd
+¨o�Þ2"GÉ;¦Xe¢¥WÄJÏˆ?êž„ÊéJ�(kä™dU6‰uÍÝÀæŒrFVsKOˆ¿`ç7£N»O5#5Û?e(/ƒ¬žÞÕ3{Èé©)H~PK€¸àeu†PKÊº$-junit/awtui/AboutDialog.class}VKtUþn›d&cè#¼¡¡@ZByÖPZ
+ÂC
+Å 
+“dšLIgj2¡ñýB|¿qãJ÷ºhâ1ç°å·ºõ¸séÖ�ÇïÎ´%-…žöææ~÷»ÿÿþöß¯wÑŒ|'°v¢b[nÒ˜v+VòpÆ©¸G,£èä�Ö	ãš!uÉya³@è€E�C+ã©ýÑ’1it�	†œœA!
+¨‘²éž5ËÖ
+#S4©�_ì‹@ÃcRX³äXÉÊ
+ù”1C
+ZšãÒ6ˆ6
+­hˆ.Ø9¶kX¶YR°R Ì¾›ÀºX¾ì¤ay³4 c­Æ
+«°vq¬É)Ç6mæÔÆµnj0>2"}Öa½†'ÐA‰Ç�Š�*ÍÎY®<Òê¹ŒEÃÎ'GÝ’eç½\Ob“<ãæF"+®ëØ
+¶0ØPÑ)›*¶ÉÒr+ºô‡ÜGg¯‚íë™jyƒŸ©
+ÝØ!Ðnär‡³®åØ)«ìš$J`S3æ5ž7¹ØÂ±½Ê.�–3fQÁb>~žÙUìÓ°WÂ]q¿ÉßS¬�œ‡GÅ«kf|Nƒ8¨¡‡|¾¥3o¤± (ñð<ƒÃ’üÁùBi5X—p„I=\1G5K`«|šJ›KŽ™¥²%ih²rTÇ»DÁ	¤4ÇI4¦¦L›–ÝË]î"
+#œÆ‰à9�ŽXf&v‚,ÇÍìÕ˜açbÃ%+[ˆ3&'
+£¬!×ñÝ#8/3ƒ
+ÔÖxÁ)'ï(x^CZ–ÿº¥­Â.(»%ö�[Vð‚†KÒ*˜§òº€‰à%\SzeN:AÆ—dÙ4R2måÜB¦/Ð¤´`Zù‚AÁ[’;[pJ\õEE6'KL «áÒi � Ó™	3ëß¥
+G6ßTcCŒØ¼¢g}*ì·ùêp5”Qa^ËÓ³ SK\Hö4®K,3�h›]
+^ÑpS¶Äýœ,;çL+xÍïÿë£úd±…w–7ð¦†×ñã¦ø�ªLfÌÒ9ÿ�‹¦œ¬Q3J–ü>'¸‹çÐÚÀ<ì”Q2e'´-}Y©Ëx/Ç""üÇD*‹²C{9zM» c?˜Ä‘à–�Ú³÷+)5«#õˆr[Î‡9¢
+2�ÕhÈ|i£N¥”5�Z’™¶vÈœ#²o‡ŠF¹l–CßQùÃª–£…«4ÝâªQXLl¯!œh®bE¢ŽÖt
+Ñ*O´‹ãí¸]Å†D4VEg[ÓÑx
+‰“Ýut§5$«Ø]ÇÞtt
+}§zêèOG4·uÖðtCRSÇp:z¬†gÁ©*ÎFÏq©âÍûz`Þ¡eÞ!ÍÔûƒu\âæÅþ�
+ÍÂÐCÍ³Èé¡À,òÞ:¡‡Ú´YL&zôP/Ï›+º”æJ@šË}ÞÛOèŠo®t¥Á^ÕUÏ^®9oÍëªg¯zöºZG9Ý¦6ó·†k³¸‘èÖÕ†a=ì{øÂ¾° <—0¨‡iORoJ¾^­âíŸyMx‡ë÷ØÆUã}Èq¾‚£µ9§· ID9IV¢�Ÿ|¾‡9DÏ£lÀ{¼ÏO±	w°? ?Ñ£Æ‘sqÜC~Ga;þæ$û;ð/’¢;E+zÅ¦8v‹$öŠ>ìG°_œAŸ¸ÀÉs™ç
+ˆ?¯bïÝ¸_Ìù¾W>EÜÂ¬ž¤8ˆÛø�'Ûð>æÿCfú„»ÑýÉ¿Ïx²;øŸãVÜ=üˆ/¹ShUÁWÜ©D°_sfœo<^¾¥xæ&b‡·»éþPK×uÔ˜Lt	PKÊº$-junit/awtui/Logo.class…UkWWÝ#è@œF-)‚EM‚€ÅGmcm%ŠbZ@û°C2$ƒÃ�™€Ú÷ûý~¿Öê7¿Z«ÑU×jû©]«_ú�ººÏäAx¸š¬äÎÜ{î9ûì³ï¹ÿûëo¨A~TÐ4›·M¿O_ôóf_ÊÉ:*�³ú‚.“}IÝ^Ð=5
+6ÌÍéYƒ{R•å`&!k“fÆÏ)P†¨3'
+3›óù”¶tÏëÚ«`Sq�¥ÛÙ¾¤LrSýØeÛÏ¾™¦ƒÃ&qQP�M(¨M:CÃ=h¡M
+ê,bëÍš3us§åè™š®h•ë1ß5íl"¶¡†fl	aZ4¬Ç†z>mU°¥b5ldL}ÜÕÓ
+WÅ½
+Z£K.’ÎÜ¼c¶ŸˆM¦Hm¸�˜ôLDsteÄ!±ÝŽ±íTZÔMÐq�Z–†û%­6t)hX¾KÅ.ºÍ~‰ÍÎ*·¦ÍNO{†»`¸‰Ø�†(b!ìF\ƒŠ:Ilù¡‹b
+4ô×û4Ô×P^�›Š}¬—gøcæ&´>:dpCØ�l^bùø¥´1ï›Ž­â!Š%eÚÆH~nÚpÇõi‹›Ã)'­[ºkÊ{i²ÖÏ™ž¬­T• úEêÉ{jÍš$D©å…qÇ±.šD|”ºb¦ÇŒ=où¥i)FUýK³T@ÇBÀq
+!l"N(hÀôºyÛ6ÜÞÝ3Æ
+Ï
+^ë0T>	K²Uñ¸ÜqGô9&µóîâ«’º†aŒ„�ÂiíK‹#N°LøƒNÞÎw]‡â{bÕã9×YUŒQEÌvØð¼’æb«ƒk8‹‰Æ1Iy¯.PðT£8¯`#ý�ž“wÓt¸ãîÉØ†ßwv4E÷OáiÉäZõŠŠg‹ð’ŽíSN+á�žž5ÒR…i¤CÐ‘QYKÚg\'“OË!œ!¼´kè¾Q:c{×>åkúL)ù¬‚Ž5qü"éKR¶¨Q;¨jx5¢Ñ²¾Â«ÕÅ¾•wé a9]<Góº)l´T�?áêó93í%¤Ó5TyÖ@�—NµHq¯Ú¢â2OwÆÕK¤XÝxøùŸ®q^Ãóx!„+x‘;KÁ­Ž¬LŽ]ö|c.éX"ÐW¥¯³Ê®Ã„[Rk‘ú×ñF=^Ã›ìgž¨‚³Œ³¬«Š¡èñm¼#XÞ-ö­aÁÆª
+:Jñ°–õ}| -éÃê6VYWñ1I_”ö©áSixŸà3^/¹R7ü¢8õ%aÍ˜–%û˜NTH(_ã�ò-µ<œŠASzW½ô©^‰†N–¦ào�Ü$|Z'�7ëƒ±Núx>€ÀN‘kŒÿ�|û‡÷n
+Çtü6ÅãáÍ´ÞÄ¶;h›âL{ª;~Ûj
+ØÑ]ÀÎ«¨–÷?Ñ—1^@÷Mô”Ÿ÷ÞDÿU4Æ›šeRþûe©‡¿þýÌ�lü»ñ0¡%ô �€Pj	¥MhÅ&Zl¦E3o‘Vôa+í¶áï¦3ˆ`í<®Ûq˜»Zèƒ°ñŽplex�1‚"k)¹Ÿ˜šPsè6‡¯ãäÔ_ˆL†OÝÆ™©_p’Pï`ôü…ÎÝÂ“¿3Á#{z
+0þ@¶€‹×F”kŒ¡ÓVÌÑÏ~ËÈ[H5°ƒ³]ˆa'Wv1›h€,^ŒYB&O6"ª¥Fæñ=ÄèÕ…Gt
+|äKhu–MrêŒÊ¥"Ï­EþkÊ4’å—&j+0ÂA¨=Ó¹X;HÙ9��x¯ä,TÂ�ã.±Št_Ç[¼×Í(|tŸ‡¯
+øn)RC ’~BÜÇbì¯Š©D‰T¢|ìûá?PK(ä�QØ	PKÊº$-junit/awtui/ProgressBar.classuV[WgÝŒ	Sn�€
+à¥¶
+ƒ%´^¨¢UAÑX@JÅÞ“�Œ†'P[{¿_úXú|P–
+]íZý}íÿéê>3Ã$MíC¾9ßíœ}öÙßYùóïßþ@/á…¾›Õ’ífÌ
+·jg.9åÇªT&M'
+¥ÐqÓ\7e/3e–ÖÍJ…Ëg§ì(¨k2¹\vÍ"'Y…Øò¶…xh_å©ã6ƒ¼¦I/*hSå¼¥£
+zÚu´bG-èÔÅN±ºuÄ|«GGÜ·’
+Ýu<åÕµrÉ*¹Qô+D+–»`ß³ZÓÙìð¢Žg‘Šc˜ÃŒ]²æª«7,ç²y£È3Ý3åœY\4[æÁ¢ælÂÞ5ó?|L(´¯0ŠkºÕÊT¹(t§‡gqMNý{%ŠýLÛ±ò
+�Í‡u¼€cxig «¤ÃðWF¸²fÚ%W!™®ß;ç˜k;W™;¼“fîÖŠS®–ò:2�“©1…6oÏG«ãý Ë´¢�xŠ?…žpqánÅµVôãd7W.¹N™ENÎ<íó8Šc1¼
+ºéú�ï(N(ìd…Öéf¤`'q*Ž×pš*"Í“’OEro`xÞÊ¹fi¥h1àÎH}Ï6j"Ü�âéÛ°ónAGVÔs¨Â‚e¯\3þÒ,a-ÛÅ¢Üc–TŽ¯�‹¸$PÞàvÞtn1�»:üº\–EÇÜQéXôO¾)Ñ
+¶Ë•%ÿ_†bª=O¿ÏI9Þ•'@çq�Y³ÖÅ±¼™ŽœìïÅ³£âšŽË·¤Y¥<?­Ô¥EØmdk›i…ÞF¾Ââê°qSüÜÒùè=)¬ÒC…¯@”ŸÎg·u[$ÆÌ¬é¢¸MÝ®šw‚7•ÕQ�‡ƒ*WÖÍb•Wc•íRé¸ãC%Ue¬Iˆ÷Éo«»ümðW��’„’D¤´à3n¸~Ñ*Zúšìß�GÜ‚¯ÙM*Õ\Žq¹ÊCñ…rÕÉYÓ¶ ïlx££’öòŠð§¤±ÐRÒV¼o,øÆ½o-6!ŽÏp–cKTüî5¶ÐaD~A—	zeè3:{:‡j|ÌC-â8DÇ �ab´Ûé6A«Ÿ÷p¶ÛÛõœr¾×»ÇâOó+{Ætý„è&†mâÀ£Ð};]tÜMœ‰w�;%õÜ�ã­ÉÊ©áe=nrÕGBú!eWIÿxàJ¬Ã8âaÊ„NÿbfróöÈ&Ž×0iÔ0=;‰x‚×ù›«až;W¸,jùH
+W9‘Ùœ–—É&Þ’Á¶ÿ©ï›–ëÐ
+ÈÂ ³bkßíÑ9Êq‚tN’Ð%ìÇß�¤µÇ¦u;HK‡…·ñ½*iˆA‚÷‚ÇFXö÷ówœ_ŠDX’>É•p¶`ÎŽhZ_+ñÍ×ñu{jK³ôÃDh�¼‘c!Ž±Ç +éãh…8®8FJHåƒØÊª‡Š{eÈLCˆD"�eÂPžµBKR-„Ÿ÷æ@¿¡‰š·uÝe0X±†R=N’:IjÅAÆ<D¹¦vŽ4°? _{àÿ‰|C$/ñ3úµ”Ÿi+ÈRñW¬?L=lÒäQöË;Ñ É¡0£!lx)é/Aœ5â|I#50Ø«mážaÐo
+0¯fÍŸä{<…^¾6ñÈ¿úOâ~ÀXzŒ‰õ­ˆg}LKÉ'ø4ˆ><³¸‘’îPÃçÍÏ0ÆYF�nÈ(FŒã‹ £/ñUàóGÞ“›ãÆóÐ®Ke(À�yI“x€öÔFfýº´Æ€ÚÂ7uû¼¾–e�,ÚÕ5Çÿ©ÈKìó,áBƒpÆCPãø–úã_
+êø~ œï<¯ßÿPKäž;lx-
+PKÊº$-junit/awtui/TestRunner$1.class}P]/A=WË¶k)õýY¤TXÞ$Dˆ�Héût
+�¦Ý�ÝYâgIñàøQâÎh"‘2Éä~Ì9gÎ½ŸoïÈ`
+K„Éf*í‹{�*ÿR&ú<
+C—7a¨)î„ßá�ZoÊ@;Èæl—)¾¼“¡ö÷­¢°ª-™ê —Ð§*)o°~µûÛ„üÅC¨R«€ñ;ŠQ»„™å¿+5Bö º’„ÌòJÍƒ‹Yzp�Ë£C„BU…ò$m×e|)ê-Æ«Q Z5+SwšYc�0ýÇ_åM¶Wv¬3_Gq[^Jì­Ûä‡&·þÆ»ë9˜$äDÈ„—âaý.¦0Cèµ:„Ùÿ”	îE”Æ�<RÆ|áGxÝ°Þ±)Z"Id‚
+^E¼S¾E³Žy˜ÓÃ×E?×g[\ÛNå…Êê3†-¦hQæåÖêŒpæq4ÝQŒqäA1ÑQÙãh°¹Ê†_1û[#aÚjŒã:&›Ã¼e—,g‹–õ­¿PKf†¯sƒ¨PKÊº$-junit/awtui/TestRunner$10.class}U[SUþšv†’0€¢.XˆšÄ@"Y71²ˆ¯‡™³ì�açâ-ú|Ó oV%6D«|÷ZZZjyû)–}fHÈª†9ÝÓýu÷×}z¿ýïË¯‘À0>"t®„ŽdÅFZÙyés¡ãH¯l4	"´¬ˆu‘µ…³œ�/yR˜I$õAÉòûG	GòÕÝÇ	
+…M'(ÉÀ2MëÂîøk!´Iè¨¸=±*7\ïJäÊNõëÏÆ2!WwX ÔN¹&ƒ'2:44i¨Å!u¨o@
+Zt¤Ð NiBsÞräÅpuIzóbÉf¯tÞ5„½ <KÉe­ª“Ðu@.LçœðB‡Kªn’D'“h0s�Œ´Òí€p,3Pµ�øû¸Ž.tk8Šû	�ÅÛ»ïíÖƒÞvë#=Ø.‰V˜fÞòÉYú2UqwÆ¥áa
+ýx„É*^òÜeOúþŒcZ†\†è¼ƒ¥ƒœð8­ª´ŽÚ«…Ib˜pÈpC'Pâ”ð¥5rFG£�ÁáðøI<J¨óá1?µ™•ëã8©á1œ"hª–³<22’Â„”0öëgÀá{ÙîØ�½#Æ1¡zröŽkQØdŠV“x’Ðj„ž'¹kU^°lÛŠ‹˜Õq9
+“˜"ôT'ºÒ@åžVOsê~É
+m³¸kÐeÏbFõ`–�Tê5i¦�ß+ê„Ž‹q’Ï«‘ÜWD.,ÕH¾ÀÐÓ|Ñü’4Ïô¦P Ü—©^²†5Ì�oWWœ¶”Íq‹nŸò—	mÒk¾4UõçýCÏÜ
+­ã2^Ñ°ˆWùÎ.Ã1	CÕr¸KÁ¯ã
+•Ú›\}¯/
+×1ý–X
+Ü�àí™ª±MHåYäi)Î©ËÛ[ñdsa¸•`©‘]aæÙ&›·Æ>«$Ø7åË /–¤­cM‘åâ-nN1&Fí•ý”±}
+;$Ô,:6Ô®šÄÛ¼4£)VH5™‰‰¥$Ÿ´‚z†œ¶Ô†jÞkÂˆ
+DÐg”0eŸ/FyßÕjë©E‚úK«e¸+Õð£¡‘e�OgYNð»yð&?Ç·Ð:8´…¶k‘a{dÊô
+sYÖùÍæèÀa~ó¯šb(:ÉAUˆëƒ7…Ÿ2Žmáuº¿ÊÈÄÒ¿Úná¡ŒÓJ•>³�sÛxjR}¨xÜÂ35¨œËxîÎOY^ØÆ¥Ï1ÊÆ¹¾yªN)¿ÂÜbzþ&^RBG]¯•!Òÿ+c™‘•švs¹’^-Ã«èÖ·±¹Wm-\Éw8Dß£›~@–~Äiú	ô3_½_°H¿BÒo°èwž‡?ð1ý‰Oé/|Fãú×èßˆ¥Á¨×+,M`ïà]æÉâíøŸpøf¿Ï§:ŽüAÿ*>Œø¦¨EÜ¶ÿPKM
+¼31»PKÊº$-junit/awtui/TestRunner$2.class}�Q/A…ÏhkYK)ªª�­„‹D’&D›¾OÛÁ4ÛÝdw¶H„ßä‰xðü(qgÚ„^öÜ;{Ï7gîûÇëRØB™¡ÐO©\~£é¶D¬.’ ÑÆ®Æ0ßçCîú<¸rÏ:}ÑUResJWE Ü£®’aàÉX	²ZÈ0LîKÂ2¤*Õ6Cºö„S6Ò°²žÄi2èˆ¨Å;¾`Èya—ûmIÝ�ÓêZÆEï¯”5Bqsý¹ˆ.Ãh zëï×„Çº®é<ßÞÕ¼£Ø9ºMÜJERiTÛ–°lcy†Œ�0”þÃ2ØÍ0‰ºâDêäÙ¯”ÛÚÅà4tS÷y‹;˜ MÐ¢ª WCÝ4U{¤Œ4³ùŒ™'óÛ¡¯mÆî�i–*g4„9dIéIXHõl&õ‚•Ÿ€<@~44èª€Uc-ÏJÆ5‚¹OPK§
+qG\7PKÊº$-junit/awtui/TestRunner$3.class}R]kA=·‰Ýf»ÍÖ´ÖZ£Õ6–4EWðEP	ÁSâó4Û)›Ù²3›´ÿDÔ?!ø…þ”xgÚ"èÂp¿Î=÷žËþúýã'J¸�-Âêq¡•MÄØ*Ù—Æ¾.´–yãQ"Ô�ÅH¸b"GRÛä�Òƒlü| N¬Ì”Õ‘Ho•én.†’°Ø9ïñ™'„J÷LÛ#iUŸ0ûTñ¼g„¥æßÀí¡ÜÎLRjn÷"Ìa>DQ„+˜­`UBÜQZ¾*†2ß)ck�¬/ÒžÈ•‹§É²=R†°Öù—<^kaìÕ´ÓÌ(}HX¿´Ñe¹/œï·‹Ïë“J€B0Pæ$32ÂªÛ÷:nð<0ú0éž+‡nòRòTY6Í=§în‡¨c�@¼pý³	a7+ò¾ÜUN\|!ä�ë"D{.h§Âið�OUÀ·q—cÀ}3üæPá8dï1Ç.¶¾a¡µóñ'�Yt9_yÇ,„«ìEl]¶†%Ï»ŒkS–—l6j}Fük¥ï¸sÁSåßxÏó?`=×Ê?årÞ]lx–Mß×À=?kÂÔþPK_£Zh²¯PKÊº$-junit/awtui/TestRunner$4.class}P]KA=×Än·�F�ßµ•<hÄnò (¢ˆ‚TÉûd�Ö	qvg#þ¨¢‚àƒ?À%Þ‚Ä÷cÎ9sî}~y|BkX"LwR­L .Lª‚™˜ß©Ö2®Ô=a´#z"è
+ý78jwdh<d®Ë”@ö¤6ÁNhT¤*1’©†	_Ì™J*5Öoþ`ƒ�o^js&�
+¿©µE˜[þŒ°Ò"dw£SIÈ,¯´|ðµ€,¾ùð�Ëc£„bCiy˜ž·e|"Ú]Æ–Q(º-+[÷›Yk�0ûÉ_•:Û+
+7Ö±ŒÿDñ¹<%,²·A“ïÙÜù+Öó0MÈÅ©n¦ÊH³ÖùæÄfæÿ§J(4£4å¾²Æ‹ï¢¿,‹àØb·+’D&¨ñ²à}ò-Ù½pÌÃž!¾Œpís¶ÎµëTP¬®ÞaìÆaJe_þ9�qÎ|Ž¶;�IŽ<$¦ú*Û-6W½ÅØ=æ?j\±ƒk§Q~Ãõ5l¶€ïŽ½è8?ðÓ±Þô€Ò+PK±NÓâ‰¤PKÊº$-junit/awtui/TestRunner$5.classuS[OAþ¦­.]VzAÄKÕm,^ªh”Š	I£‰%}ðm[†v›eÖtgQÿŒ¯>›Ôb|ðø£Œg¦•Ö›LfÎ™ï|ß¹ÌþþóóâXÁ+†¹N$<é¸eä9{<”ï"!x7W2ÀÒ÷Èu|W´œ·�oJq†í¥‡q!)ì“¬z¡ähàÃEÙöÂÜ±WÏ¦/3$kŸ…lsé5	¿áj“˜íóòu†D%Øçq;_·`â’‰¦,˜H"†4Cªê	þ&:lðîžÛð	›­M×¯»]OÙCgB¥Ç0ŽV®Dé¥%UwýˆWÚT>ßgX¤äN¾£N:½Ù³éÌ‘ä™Ãv$e Êæ±�ÄU\c˜<¨Ežä¯=î“Üô«t´—à×±¤à7”Þø}%8üÊÅÀ-£Å¥ò��¯Ž¦X“]O´ˆ&‡;&nãî3Ü°i$>-ÙÖÝÞµP@ÑDËÔÑÕ1ÅU3ärG¨Sî	û½šÑî›pð@—&]…j@
+j(1`OÆ9O*5ð”ªÿU1cŸ.B)”±aâž30®'zÞ€(ÁZu›Ô]õR£ù¬ªkWß
+CRæ1z\ÔZYõÂhOB}1Z&&É¶è´N¶öŽ‘*¿#óMc²¥nzšç2�,Ú•w3´ÓüpeÈÒ²,zÈô°8Ønöq¯�•/0_‘ˆ÷ñpàœ]ïcs¤3Eÿ2ÐÇŽQÄ­5;àj©Ó^�Z/uÜ6*:¦q@ö/PK±þ*»NPKÊº$-junit/awtui/TestRunner$6.class}P]kA=7Ú¬Úm5¦5©&5
+>DC»>I !¤HIK
+¾�ë¤1³°;kÉÏ*$-ôAš×þ¨’;£(&Ãý˜sÎœ{ÿþû=Co±KØ§Z™@|7©
+Îdb¾¦ZË¸Ññ@„ÒXLE0ú[ðy8–¡ñ�!l».S9•ÚïC£"ÝS‰‘Lõð„°j.TÒh³~où‡„|ÿJ›iTÈø#Å¨cBmï!Bs@Èv£‘$döš<+ ‹ç><äòXA‰Pì)-OÓË¡ŒÏÄpÂØr/
+Åd beëE3kíªüÕè°½¢pc}‘ñy_Ê¡ÎÞ–MþÁæÎ_e¹ž‡MB.Nu?UFú¨Zç¯P#›ÙzL•PèGiÊ�Ê/Þ‹¾³,‚ÿÉÝ‰H™ ÍkÈ‚÷É·l÷Â1{Vøð”kŸ³®]§õÅÖþ
+Ö~8LÙ¡ìËÌé¬sæs´ÝxÉ‘‡ÄÆBå„£ÅæZ×Xû‰­ÿ5þ°ƒ[§Q™ã6ÛÆkÇ®;ÎÞ8Ö\(ßPKqø·‹¤PKÊº$-junit/awtui/TestRunner$7.classuPÛJBA]“ÖQ;¥Ùý~Á‡4êôVPD �dø>ê.GŽG8gNÑg] ‡> ¯ˆú�hÏ$•Ã¾ÌZkÖÞ¯ŸÏ/H`k3í8PÚ“7:VÞEú<
+;„@®-¯¥çËàÊ;«·©¡$æm—)]S ½M�ŠŠ41ÑÁ À�n©¨°Íê•ÿå÷ÒÕÛ@·H«ã÷£Xy½¡XH–»MH¬k.2É ‰QRi '�­¨€NãN�ÂY÷›¯tÒ¯ÉP™º×L{s}þ*ì°½œâ¡ªZj*·x|j
+,²¹¿ƒ™ÌÚ›ú_ÎÁ;»”Ê�Cª’Ï[¤¦‹9ãó‚¬—~Ò™j7t¬Œùì�ò–á¸'¦(û2Š(Â6¯"	Þ)ß¼Ù
+Ç4Ìà›Á0×.g»\ÛNé	ÙÒÆÆî,&oQæåÍêŒsær4Ý	LräI1ÝS9äh°©Ò=Æ±ð[ã�|X�©o\OÃd‹X²ìeËYÁªe}ëù/PKD´Ü‡¦PKÊº$-junit/awtui/TestRunner$8.class}PÙJ1=×VÇÖÑjÝ÷…>hEÇÇ‚"Š(EE¥ïé5¥f`&£øY‚øàø'¢ß ÞÄ‚ Õ@¸KÎ99÷¾~>¿ ƒ,Æ©V&7&UÁ©LÌqªµŒKDèoˆk4…¾ë
+Â´ë2%�×R›`;4*ÒU•ÉT�„.s©’ÒëWÛ°NÈ�Üjs)�
+¿¡µI˜\ü‹°T#dw¢3IÈ,.Õ|äÑ›G}><tçÐ�~B¡ª´<H¯ê2>õ&c‹Õ(Íšˆ•­[Í¬µG˜øã¯R…í„ëHÆçQ|%Ï³ì­Ýä»6wþFÚëy#tÆ2Nµ�	k{“b'SÿIò'Q‡rOY×…ÅUË"øû¶ØiŠ$‘	ÖxYð2ùíR8æ`Oß<z¸ö9«pí:å'ÊË¸s˜¢CÙ—7§3È™ÏÑv‡0Ì‘'ÄhKe‹£Åv—ï1ðˆ©ßïìàÃiŒ|ãZ6›ÆŒcÏ:Îæë[(~PKREI‚¡PKÊº$-junit/awtui/TestRunner$9.class}QËJ1=×NG«õ­-n\´‚ŽàJ|€ˆBaPQé>�FMig`&ãã³\).ü?J½IŠ¨›œs“{NNnÞÞ_^QÀ:ª„…N+ˆ;�«àRfú<�c™®n» ÂdGÜŠ +âëà´Õ‘‘vQ Tí.Ky+cDZ%q¨2-Yê¢HÞUl»O(ÔêM‚s˜´¥#x„R¨by’÷Z2½­®$”Ã$Ý¦H•©›Ž¾Qa)ü+å[	{ý™L¯’´'Û„•ZøkÂ#ÃwLžoïºxàØ=e¾MÞ+ÍPkÔ›>f0ëasâ$•ÿ,	ÞE’§‘<V&ué+á†Qü†)»"Ëd†MñxH3˜±p5Êl‹‘‹kO{´Ç>¯žmû°¢qf~¿	(1òs050Øc4½ÅÂ3æð:4d
+æúMÃ°h¥KV³ŒŠUõÍ€ò'PK³Ž±ÊZ3PKÊº$-junit/awtui/TestRunner.class•z	|TÕõÿ9wf2“É#	IXÂ-b˜Â¢ˆ	Š!€F³ a1(ê�¼„ÑÉLœ™@[[Ô*u©k´T­–VÑ
+šlE+.­ÚÍ¥ÖRíbkmµÖ­Z—ß÷Ü÷fK&öÿçÜ÷î=÷Ü³/÷Í3Ÿÿd?9h¦ú‚iì9}¡@¬ÆßëÔ¬4£±}¡�q3M´Ö"z¦f±?jf8˜òº–Eü=&SqÓ9þ�~ÁR£gê˜
+º–nê0{c�p(ÊTbôÅÁšÕfG,ˆÑµÌš�‚0î.u
+:èu×¬Ü1ý�¡>ÝŒöcL“š,âºä¸þpäÜšô*€½]+#þ³{™JÓÔ­47ÅdRãkëÄÌe3ØÉT–
+£gäš˜F§W÷Åbá–Jº–GÂÝ3mu:üà‰©¼)SžI€Åþ4»}³)Eiœ2WWS¸;¬ÙÏ@"sX,êjéëYoFZ»–F"áH4KèMþõf@£S@öQ•š+QáûTðm±!D­0¡àä+„óÇú¢M��)èVEÍ¦°¿3êNê&C˜
+ÌŽs×‡7‰¼—7Õ7¶œµ¬µeegËÂ!áÌqbýr&n5
+°‡˜?[íö™"rBóA4:mvJÐZó
+2‰Íùm›C±
+f,ÐÁäYØ@6ÇgåŒÕPPC¸”ŽÊ:ÑM50ÎÎ€?îöÐ</´7�«Ì8 -cu��3V4�ŽòÒl:Ú ¯Ð´|RtŒ01XÒ[é_4E5ápµ?�w=)[gzÉIb.±
+ˆx|Sn¯û×‡û ýq™õ2·D“ë¦rQžP°Ò®êY­K¼TOKAaj5¹ýD)jÆšÃ�þ ª\+éd/�D§€�´öÂ=½á�)Òj†â±Gx••–PZi¹—ZèT(ë«Ñ€f¸MÐµÐÊ¡öžÁ‡8XŒÃœ"16&‡äE�c‡Î.îëê’øÒÍ‹Ø0U[á¡Ó…íÓ¼´–ÖAŸþÞ^3¬Õ¹°›²PÖt�-<±°µ×¯¾°Ô)°¦ÈsC¸¿1Ô6¨[HP´A€»ýJ†oí²¾4Ôiv4™&Š>{2h”<ÁÉ'Œ¿ÜtðÃ+Â}¡˜¶ôFƒ¢óR„ú`ì¢+ñxíCÂÀÐH •×O›„ÖÍ•Ñ9õ|lí÷GÛú::”ºú‚õZƒ¾J_Ô1ËŒðå¦oÀ˜¢1³× ‹Dû[éb…ðhÅp¦šÊÆœ1¹.;˜‡ûÅi´O°Är™Ó4»}ËbôrDƒôÎÆPÌì³¸RL©q�}ÛKWÑÕL…ÙòpÓµ2�š„vƒ®%^G7ÀÎu,õÐ��ŒeRvÜd:!‡eýò·�vˆn6h’Åéw%ÞZØ¼~ÏâõV�gŸì¡ÛaßQ…% ˜’+Ææ>!‹crŒþÎÎ#¨ff†�,÷‡` MÃÃâ`cã’FñÉ‰©UÙ¿Øß­ƒvÄÅ¢nºÛK»%Ø¹º±¸É {iz>f~lÏÀÞöX3{á2ÓèŒm0èkv@Ü7Ô±!1(aMí±ýf {ClXZbÐOhPæ’
+Úo>’Ä), Ç2£`cZ�?`¥0d…Ëƒ^z‚žÄÁ½ž•Ð­-0Ÿ§éÁ÷³ì Š�m1¼gá-�(ÓŒÊ\ÒËPBëúsPâhxž~á¥çè—`«7+c[j`Rá¬â#�[D›ñ¯pýò‚8¹éK”ƒMÅC­ÖM¿‡06J¨híbš^™ƒÒ\ÞôzÍK‡èuœ-ñ÷OC‚íˆ[3‚í_$€¾�,–Ã@Ýô7ø}72"Œ¿Yåïpß¤·Àg­‡þ)!1)ÉBõˆq‡¾Cÿ’\ü®AciœøÜ{™Å�Znú@ô‚ð!}d�›<öqRr%ª›þ¡ó¥A³Ç”H<&— æÏès/}J_”¯Ñ1ªg¼5ÆÌËÓÙ!žþ!;Å¹Í 6Jróä<vËŠGj<+´idöJi¡¸Àç$á9z¢HYE¨acæÉ«šÍrÂèd6eª.“o™póhx¨ÞâáR/—H"�"äºy,$¯3ù¬Y³<<ÞËãr|î’fÚ7ODÄ¨©äÑÈ“½<‰§à<H³¾CŠQ…©+ÊÃ3üÉÜ9×dC
+®àÃ@ÎTYÙ4Œèº9æ ež>ù(ç¶™½þˆ”é	±b¡b]ºIäá™Á¹n®öòL]ÞõhY
+“´ê	dUÆ)PYª’™hÚ€’@Ò{E\,z>:i…ënF%Z1dßP†5³Çzy×
+5ëSEIæA@n“ÙHMÃ¹•’ì„�kã*TðÓFvÅÌþ¯0{ÆÍ
+^^"†4*ˆ†BÏ5vH­Y’i¹�=u/ãE'AsˆÎ¨W²bXÄw2ŸìÜ§µp¤ÓŒ4ù7Ã’ÝÜ"i`¹—[�H¾. 6ëB|bVñ$sÍþðZzYÁmˆßŒJ·,Õ¶9ªÝ:ˆÁ«¥{A’ˆ„ƒ:Mç;§q{>¯áµVí¶Øßqnwa¡3›ZŽ=ƒ×¡Àæ3G¶Êyn>ÛËþì`
+BD¸ß-iBÍzý2GË†ÐG›ÜååNî†-(ŸÇG‰"Î±:Û’bï�I	Qº�«A©µKuµ.3�¦Zj7ƒòpÌËQZgP1�–pÙŸì’ÀéæD`¾1ëQ	ðùâº[øXFÄ<¯O
+ÐpG_Ôà¯I¨lá­JOÚ@±­!­¨pø
+Þ*€Y,Aè}=!ì¿a˜£üÍ‘e~”›/óò6ž"p‡�w´›¯ðò•ïŠ á'­„ŠaJÈ\×~›¯¯ÉT­Õ »ù:¤ãá¼|½H°„JE‚7YÜ,
+InEâØ¡[4¾yd*ç»ù»^Þ)Ü\/ÜLì‹š+Ì Õíœ¾‘îß„Âo“ÁÉ·g¦Œdÿïæ;pŒµ×²3ZÞ"›+"Bê ÝAc­•~èå;ùGF‡#w#ØB«ëO¸Á÷XÇÞ+
+‡àÙøãá=¹ZÅßóãPE2°B—NÃfD×]C‚ŽU‹¼�[ÿ	œÝºc©ð‡:+’7)0ì‡½NÖûG–ë1n~ÔË’Ú—4ðeÚÏ\×Úœ*'<aÐTKµOŽ|Ö7?íågä¬ÂlvÜüódÝ•,“¡ð9/?OO
++m^~–Q›úrV´3rMJžùµ„ÄßdZBòZÍÍ/zù%Ä
+*¤"¡ý·–7®÷ÃÃ~'ö¿*ÿ}Sà*¬ðšu±´3Ów*üGØ/|àO™ŒÙ!÷/p�ˆtœÅCC§Áå¿åóü¦h—…#¦h
+~Ë
+©ÿ0hŠ%Ö·Gë±nþ——ß%]N¹Šsó{^~_HOå‚çÃÌØe—äIQÿÇËè�è.±,”“y
+¦˜¡‡?ƒ5÷"ü…D´NEçÄå¬KW—uµêè,Y<4íÉg äÚ7°^½Uw»ÀÓµ^€¤c„ôVÔ6þdjCtéÞ^tõÚ£ÜÖzT¡•KV†³è„ÿ÷–rIcã°n†®ŠÕhE•ä-zaÊ¾Sßºd*lÅò;‹"4?íyj¼ô
+�íÝüj‚îÕD�}5]�TÎ•‚+ÝÁQ�3UR«
+	)JË’{½ª/‹
+õ]m«i7Š÷ä–ÆP§¹ÉPÓu¯ŽÌ,ÑV†ÃÁs1·š)aË³Ë�ªÉžÎ¸ZÊ®3T•ªö*ŸšiÐòÁ†TMò²}–uÙ>+û²Ý£æ$sAúfÔ­æÉ�y8bÙËÿ£C²nS
+u´šïUG)Ô”SÒ‹-a½ò—‰·h™¸Õ±^U«+¶h�?Âøguº<j!„fQ!†û"fº°ÈqvÈŒÕ¬ZÑ„ƒ�W‹äà`™+nµØê¥ÕÖMVö}œÝej‰ZêU
+jÓ¤”Hâ
+–C,�„;û:Ð¨«“RE·]3ÎÎ°Õ;ê†×ŸêduŠheÅ¶„c–Œ’_7Üª%«ÃÍX@©éŽ%m¡d¸% �õEàL…Ù²’k3–¼pÏ‡ý9Ä /ˆåœ&]	l]2âé¹nXåJ.k¢rk¨uêt1qT–N¤Ršc—XùìQV9Ì€äzÈ
+êÄèÕ‰–:ÅÓZ/zSWÄÔ›óM«k®�
+»±Kéôu.úf”ò:GâV‚Gã[©ïÁÊ+s_„I8éUç	�˜+ ›
+ïÙ°
+ð,·’Ž-ØY
+Ç*"VéâQýY÷'™nµÙ«¶È=°h%V+Rm“ýylHÅæ.P_Eí¢¾†‚FÌ[Ä'õ~.§üºúÎP[Å¶¿©[]ŒbQ;¤³µ“÷7Õ¥êu™WmT`¢<—Pônu9<1Ý!2Õ
+?!§£çR‰¡®TWyÕêÛLSs«Ín1EyëÕ5*¬®E˜«è÷G+¢©;j�º¨bôãUè{b�úŽ$<oëc•¡nÒ×òj;\É‚¬°SœGÝ¬‘˜õ¡‘iBNbÄ.äZ&¬­3ôDY—¬)¯ÓÚ°úhw�u�¥9ÎPwH6ÙªîÔ&ÜÞhJÿ¢vÉì‡ê‡°{Þ�G®¡ó¡îä5º'y¹o¨{À_¯îµ>héKøp¯¡öšˆÚ+
+ò1d«ü6ÔVz°úûã�¡Ò8Õ> h�B•[Ô1üÁÀ€Èe�zH¶Þ)×£âº³¹èµG,Ç×WèêŸ·¨Ç’s"W_î,�Û8~ªžz¦røÅÒl·zŠiÎˆ7K#†š§žñª§ÕÏ²¼ÙŠœnõ,‚ „§žSÏÛ_ilÉŠ—ŠA!šý
+Bä;Õ¯!Ä@h#$Ô©§_Ð-¦zÑ
+Ëý�¯ÆVfUÊö…1x|YýVÀ_ê4ŽWÇsê÷°“ U¹6ZŸqä¦£-YJy,(¢mR�,QçÀ2¥XI_Cýð�ãVTýYýE¤ý®JÑ©þ¦eõ¦äÊ é�´ÙŠ{#añ¼úHwŸDoL™3±ä:æêŸrÌÛ×ób1¥êuË5ÿm¨û¬êê}ˆÃ¯½{ÚlƒY“¥'çXß+FÒy®oˆÉ­s¡¯6]“@VQQzç,Ù7ÊKƒÕ£¢åTä$¢1øßEyò1Zîƒõ˜o�È³z4h”ÑØè±˜Fëý·Ë€EÆ±4N�èô8�&êq’=N¶Ç)ö¾©öXaãCŒq’|…Æ8�Ž éèŽÄ³¢JÐ„ŠïU$¦á½šfâ}ÞŽò§x�f·—Ìu	š?-Ø£÷‹ÿ¥ `(µµz–°w^
+Ã<ŒŒÑåKÐÂ¡ÛªAÜL½Í°€è8:^Ã,J!0É¡a¤úvßÔ� eMUÎ85U�æjü�Ó
+y]•F>VS=Hç@s!�y�ÅQú ±2û ^D«5�kè4ûÈf�%Pc|ƒ´¶½äŒ�Y§õqêJP`(Ç€ñ¨ÇØ¨åé:W£¦Po7òŸ¬„ð¯7N´Å×ÞüÞ.°f¾§KªßEyÕ�?²;K¡°éCØ«ƒÈbå80³
+X”Aƒ/Eƒ/EÃ7éR›†{Áž˜hËÄ»4L“V™¥:1´y b›EÈûèš8}ÇWrSõÌÝ²‹&a~§µv[ríûz--—)0x¢Å0×% k)”°Â?	O�m“¦ÓgQ�¢³…îÐF)OwÒ4--´‹~i9¥×µhçràçé¤Ýí	º§Ö[î�<@÷•{Ç8è~®ŠcÈ Ë½ãÝô0ÞòèÑ1yÎïQþ˜¼¼[)¿Ü[4@�—{é‰ö1Îävï"§cròÁíNÐSôóªêroœ~•fm–>¼ž¼¢>ž·ÓßY	;[fVƒé50ÚÓ ôvÍj§Xí¡_Óo4«=ô½¨Yí¡—À¾C?½Œ'§~ú-ž\úi?žòôÓ+4¨ÅÛ#:AG>uÒïèUmŒÛi‡­â7�Kv†Å€«öÑaÂ%†
+Ã[þ
+;nš§Ô:Ë�ij&ÈÛ)wî£[æÞM¿ÓÿÆOfÆ‘�`U­Gz?Î.ç­T$�Ž8çûâlÔ°�u°‡3zÎ‚…úéDZñu@D�x2a�]¢
+ZPV°	§æQÚve.iaÛ&¦Ð©\ˆUX²|è°ÙÞ‡wâÉƒ\Ò^Êe	Ó4ÈãðXžà	ÍÕƒ<©Ý—à©qþJØ˜¾¦*Î3,€*`f{‚g¥×ïKq4_ëø
+Cõ½ð”óh{ZûD7#–mA,8±àpz>ì+lþ"ÍY…E•ÍY-âž
+šÇÒQ<‡çJÊ�[q›‹Åx^½U�éü8×­s.…Ú/ËðwoJf^^ÈÇ�“�çE6>Á/RôRÜ��æ)OÏ+#{lLNI·Ö~W
+ðDŽ†A^bIui3¤ØØ2ó yªa"·Öv‡#Á§ÆyUõ^>=ÎgU×:1ío/w&x}œ7ò¨uùÊ]q>·Zþ
+ÒuÀØ›àójó|ƒm¯:Hî*¾RîKðÆÞ‹Ûç¯ZÃ×eØKâ|±<WÆùRyäm¢×oÅùrëõJy½*Î×éõ8á;	¾q€·cq;lõy§}/Î·BÌßŸïè�Ý5Æ�à»x÷>þñv*èn²RÁVÐßb´Eõ^W‚t¤ÜVÊ		…x²©Ë‘€¹3²3ˆ¤‚P
+$dƒÄy°ÖcÁ=,2ÊÇ¦Û=	~d€ÞÇäÂÄcq>˜ÅéS û)›Ó§ùú8ägÛùùv‡Ó�s‘à_I 8¿°(^�/ð+˜zÅçßËX¼0Î‡´vü‡~s¯§”ð:Nù³žá¿ÇùŸ6UšŠw0ÿÎ ¿‹}ÿ1òûxü`€?²èøoŸ
+¾ò‚ò<‡Ãå**çOñ*zt8³'¶»œNWa±75±;t�#/{ËG®<§£°¸Àš(÷8Ü.¼ÚëåùO8"YqžË™š)÷ºŠó²�|ÅQìÎ€Ð(ÖXÒ0ï¸Š=É]Õå¥ü9’Hu\quÊõx-2ÑUßFÝw5ŠˆkPÝ]‡˜~=JŸP½ÜˆÄy\óF¸ä­H¡·!uÞŽ|s'Âé.Š!ž�Ä¸©ñ
+º;v#þß¨ÝH¥÷cõºãýÈè!zš¦g‘G^Àø2ý”Ñô6¤÷éIú”žaù1ÊXzŽ+èyöÑ/ùXú7Ð¯¹™^à3èEî¢—¸—~ËéUÞJ‡ø*ú_K¯ñŒß¥7ønú+ßOã½É�`|ŒþÅ/Ò»ü½ÇoÑûü}ÀŸÒ”›>V£éUNÿU_¡ÏÔú\M_¨…±[�Ì^µ–
+àBµ…‹Ôå\¬náÑê.Qû¹L�Jõ*�Soóxõ9—;Šy¢ãpžä8Š§8Žã©Žzp ál‹²’�ÑÑ ”N&ŽÊ�À§¨Ø1O9•¡y¶£TåaÎIËÔg:€ºèLõÐ:³‡”©<*ŸÜ¼‘ŸU^änoåª«ùü"÷(s šÞT£ðT€à¹�´–ý(Ñ$DÊ6ù&_•ökU¿v8œÎB˜‹CÊþ úH¨R_•„'ËT–]z¹Øã(®LX8Æ‡+€2‘lËûßH�!Ïs’�žáHìõŒ4¹‰�xñTÌÓi4I¹’ã4
+–Uƒù¹\Móx&’ß,ZÀ5t’aÏ¡å˜oãy´©pMgñ|2ùÚÀ(†ù~®¥M\G›y!}Zº„�§Ë�ænÀüM\OÛ‘²vÀjïà%t/¥{x=ˆù‡ø$z˜i?ŸL�ñ)°ö&X{3¬ù$XskF"=dÛK=¯5Íè#‹a¯–.'ÃV¤SkMŸ…å…ºø,´ŠÏB«ø,D¹©&•ZÅgáø|)5ÇHEZ8Æ@)Z^X>Ê*/³ÊË¹b´|Ìª\Kcùtš÷›Æë¨ŠÏ„àÎ¢cùl•¯§îÐÄ_¬k“ÖTÐª&Û%f«šb—˜­ò£:]‡´Ê�ét‰Ù*? ÓUW«|þÐ%f«üRN—˜­òs8Tò$Å¦UúJ)jè§§éœ›§™Š´�X~Z”QÃÈùÅ’[|	u¸ä¢„:"Ík¡ÐÂÝTÀÀk £)Nv�ò]ÅÆw¬�O—›qU©¾G.çnÇîìR†ƒhŠ’hä—6šívûU·OÍjÚ«f·?I“×”ª¹ûÔ‚öûÕì]T4¨j×ž…â8¡ê)UÇÅU}3JAuâ£ª1®šïkæûp |"/W­�áZ NÍìË$�¡jŽÂ´cÐÖÆŒ
+°.Y]Ñ1j…jQÕd¨•j•p§V«56™5©¦ùÕ>¤\ã-9æ|¹,·7×Ú¢2Iµ'Ô¾¸:kHÉ_ƒØ/ÌÀc¨³•_ãY¯:†tÁ£�Ó¡vÐtµ5UíS†êp+|œýâG�4åÓè]5øQ�”uD#ò¨°µ¹p¢º•œ{¤»˜W=�ªp³¯:¡¢é“&ˆmò¥½—Ñ(ÞF…|9Mà+h*_™!ß
+[¯bºŸ”}Vï ä6ßvä›ÀšØúËUÔÆhj¥*U›t£¯ÎO÷úÜ\õ¨ÚØÞ/ÄÂEªmŠ¤mšWßÚ§®nÞESj�#î¶ëmÂåÎÕuŠ`Hç×ºÊ�èð·ÓT½¯Üeµ^¥ê†ÔÆ]T/0W ½
+t£
+¤vì²ÉN¯Ý’ZÛ£¯w¨!e›-r%ÄW#‰]™]K|=Î7Ð‘|#Í‡<x;-E2_Ç7Ó™HèÝ¼ý×­ÔÇ·!ÔÞŽÐú}º�ï@ý
+�]Zæ+ôuÖË©¨ó²–4£#Š«ïj™I{ õ�Ð
+º'¸¬týKá9·ªÛðÔMç©ÛAœÔGêûHÏ.rÊ·m%w`EŒsµÜ•lsÈ-‰¤¡äCH? æ‹«¤Ë]±§A0Ÿ¶{ê®ú$ã…•Tpè-âêî´mù¤Aç»uï¦Þ�tuds/ùøÇ4þ~<ï¡Sx/RÒ.³:éËjwêvg•Ý¹�ñUAR±¢ �«ûx@µ§,‘à‹JÉÅûú¤2þIî$-¦ÃäžÓ>â„$P~	
+©LîbÒ(}%£îßE§øfãqõ >]
+Êé¥êaXŒx?•GÝN©ÇãêÉ&t\ã|ƒêév¡ùç SÇÕ/†f¥‡ásûi<?
+Û9Ù<Ù<NGó´�Ÿ¤“ø)jâ§©ßÙü§vü6;'Á'©íCÉ›�ãíHW†nk‡DwÞW¿Ùž3¸¿‘!ý²ÔMa?m²q�iG•²ªIÖÕ¼ñ%üû]\*ü¿#’¼…¸õ*å·3"HYJøeê(ðôYê5Ä‰Ð¯§4]ok:_$‰3þ84Â¾‹þ�!†üâ|õ'­U%¿
+°Ñm²IŸ>4 Ò': Ò›Íb¹ÕûÔ_³L×
+‹à¬?‚Š>FXü„Žàÿf05=§¤Â¢¡/R„‰îSël¦&gwx{•îìð”Í¨%É/PúŠŒ˜&¡ÄN3<9ÅðdÛŒ�ê­Ãó“w>éô%be‰e¹%ùð{	%ßåþ¹ü%ä¢Ž÷¢²+Cõ>	u{Nrxô•©|Ø¶�ºÂ®æú€ó�fŸ‘üÝj�ûèÑôþÆi…¼ÈEtõA2à=xÜéó—p‰Z2O•P‘*Åùe4M�¥J5Žfªñ4%XZgsSôÌµhUëF‘G}ˆZTiÊŽHß¯«ÿ¤³nvjRWòÖå¾G}¬>±7N·¥—¿Ï¼Õ¶|íóa;ÿ›sg¦æôNå²S©OõÿŸ©ÏuÎðò$=_‚Àýö¸Í¯´Ç�öxÀŸ±Çw­Q=m�ÿPKk1nv{:PKÊº$-(junit/extensions/ActiveTestSuite$1.class…RMoÓ@}‡¸qIÓ�mi)¦$vƒÛ3	*Uª8�(=»ÉB¶8¶ä�¿¨åX©Áîü(Ä¬eP…¢Æ–wgvÞ¼73Þ_¿¿ÿ€†ÂöiÈÄÄ2b÷Å0‘SÑqÒKe"¬}D¨�zSÏõ½à�ÛGÂéÐ¥d,ck�iº‹xžÊ½OA2‰–¦žo%$4óÜ·‘7Âè½«’o(L$âÔgÔú\Ô›,ÊØÒ3ÉÑç„ãÖâRæ^'ÐŠáH´V{`ÂDÕ@57P*£€º‰%”•Õ0a ¢¬&¡Ú•�x�NNDÔ÷N|Î¯wÃ¡ç¼H*??,ªA¬…µ[ûÜ¬¥¡1¯^„ÍÖõ½˜XÇf÷±EØZ¤¨c›PaÅCžp<#ÂÝùü³…Gb‡_/L£¡8”ªÁÆ¬OÔ}"˜GA ¢ß‹cc�gVønÖÕXAÐ¡žºí�ÇûÏ+ðgâ&û·Øz™34ì¯X¶�VìÝnÛ�V/2ô^�,Ëb$÷’å“ÊÁ=¬ñÎw
+ÕœoÂH�wÇ¾d–K¬~ÃƒÎP~uŽÊîÏs”Î°ÜåÀŠ|ÁãÏt‘‘Õøý+×äf€6ŸØØ€ƒvØê\‘vréÇÔÚæ¸*“²B¹å?PKfc”Cî³PKÊº$-&junit/extensions/ActiveTestSuite.class�”ÙRA†ÿÎÂ@Mˆˆˆ
+QC£"n(Š(�Z%ˆå�ChÌ`œX3—ÇñÊkªª´Êðe|õïž‘`Øªäbæ¤9çûÏÖóã××ïˆcr+
+ÏUEù^I/pë^Pœ®(÷­œ—�šk¸JZ‡C¯eßy-ßÕýWÅMÿŽ\nÝ–ŽªÎÔž%�¶k.C§âù‘�ÄL}IÚ°ÐžB)�tÙõä£ÆëEéÏ;‹5)�-×+NmÁñ]ý;:L¨ª•÷ÊwR ;_^qÞ:Åšã½,ÎÔœ ˜YÐš­Ù%Ð®ªÒœtmqe9›ãç”ïz/#ÀA
+èa6¡3Ýâ'pr«úN¸>�;ÂÖø
+O` _Þ®ÍOdÐ¨)‘D[b°qý:v�¼s\õÔSnm–�ªrÉÆqÝÝ†Ù}ßDÝ�-`1} 0±}“»çÆÉì5˜ás
+Ïò{�ð2Ðý<�Â(Æ2Í~ÏW}é,Y(
+$åøÊÆ9Ý�³8¯—Ê”Ü³½÷Wý;ã6ù�ÀãÅYQ.§Gaãªæ_Ý:4?º\ÿ’�ë˜Òs»!ÐßD”<%}¿ñFÉ¥;ï+ò�bS,LSŸ;–+ïîH™NïïðyWw R‡WWîò‡éZÍÆÝ0Í{©¹zÃ¯ÈYW_´î–aœÑòvÉó¤oÖYäv%ÜÒKI«�¶ežü5Î·à;YXGç*�l>õRûšÆ>ZvèÄ“´�ñ†F€)zjß¶Âè:²­„,cBOè´uÝFœ—u;Ö¡VVY‡v`õâpÄê‹X%~7ã|[…ÑÓë8Ú
+ëcÐË…n0+JL[£ÍKaG)¦ñ/Èé<‡
+k8ÑÄgM»û™ë¥rÄnÊ9½!“ÆIœ29ç1Á_0JGg¾aô¹ÉûÌ£±5Œ7éûM²ÃèD‘„³†\c6È\À„) c4bôNâ".16§¿8‘Z5*¥÷lÖpí’åÕÂgVµ†›ÿ\¥_œ5¤¸:¡zŸY qžNðô"¹—x>Î©\ÝTco”I'ãgp›ÏAÜÁl¤ú€ÑaŸS*ñâ‹Ñ+µ–x�S´oìÐ¼°Äî›¸(›É
+~Uô_öPK�øŒôU9PKÊº$-(junit/extensions/ExceptionTestCase.class…TkOÓ`=/«vt•;äâ@„­ïEŸ���è·2Þ�âh—¶~€Â_àgFýî�2ž·ã&%1MßKŸÛ9ÏsÒß¾ÿD
+³X˜ÜmzndËƒHz¡ë{¡½zP‘�ˆÇ
+F+N(u�¡¶_5pöä¾¼·Ï¬)�ÎêêACV"¹-Ð[Þu>8vÝñjöJÝ	Ã�«‹.£—¦óç¬ëQàzµ…„aS@[ñ·¥Àà%þ…M:2&®àj':pM »ìzòUsoKÎV�Ñ}e¿âÔ7�ÀU÷ã�Z´ã†Såÿ3'rÍ#a•)ƒ¬åI€€4ã0�T^á7N“±VÿYðÆNàï+ :†Mdq]Ñè9sy½µËVêH×d÷„9ò…D£LÜDÎÀ8&Èþ‚QÇ-fuÃå0tkžª¸ø{ùd¿ß™¸�iS˜È^dú²Y­Ê@G� NÆœ;¥žK£hÀB†Sv
+éQ¥ó5Út
+‰¶ó’Äl•až|#¿mS8“ô½‹{Ê÷¾ÂyA‘d*öí!§VuÜº‰ÇJ%�ðäŸ	œFg(”ÈÊ—Xi3ÖýfP‘k®’M6¡Ž9…	ŠO øR‹\;xÖ‘æÚÉÛÞSÜ3Vñ¦UúŠ®ÃØ©›kWlaà(Œ¡‡·\Û½èâS?âô²€*GÝpâ7�–q¡�Œëà>oaô3IY_ÐUla²…ü'h‡Å_?`½í+aVYZ¸ÓÂƒoxzçÖù,£çƒŽiÒ˜aµ<ëYF	6
+e¶]ëešû3,1“Àó˜Ý‹¿PKŒ�—ÞjePKÊº$-#junit/extensions/RepeatedTest.class}T]OA=ÓÖ¶¬K�–RŠ­¬¨Ø¤ øÉ‡ò¡I“F $ø¶m§eq»Ûìòü&¾øÄ‹š(5’è»ÿÄ?¡ÞÙn€PàefîÌ�sî9swÿýñAÜÅ*Cv×54§È÷nØšiØÅuÞâªÃk›Üv"`×»RÄÑ*¯š–ê˜VA¹¾©5¹Ý¹ËÀJáy�®-2ŒäÊ„º¥6ù[ÓzãÌ•ò[¡³ÆÒää·dD Iá*ÃØ®º§uÕhKºÎª¾d5Ü&7œûUÞr¨¸z2¢G±R5]ÃQš®í(®,*ÓQô1$‰ïkÃ±4£ás
+Hˆ!.ã
+Â=`�¡¯¬ü•Û¬pkS­èTm¼lVU}Kµ4û›!gG³FË—::'if:_1gù.Æ¼ÚÅîŠjsÂæò%Y\~ŒRl¹1žïÝ:·]]8H/pñy7${ÇtõÚ†c¶<’×2nc\Â-Ü‘qc‚.ï&®�¿—ÒëkQÇìØÊ0˜Ëw›MúÏî-»õ:§vš–1…¢à¼ÇÐ6+‚Y†Èžª»|­Î0~ú!×*»¼J’»éd<Ä#	ðXÂâ$9gù¯’�B˜®¶ZÜ¨1Lž×][�Z	v‹ñ™¨\iÃt­*©‰Ž8ýðS‚Ì�.€ÑLF«­#ˆÒØCQƒ¾Ë ÍéÂDræz�ÛŽ÷·‘øUÈ|Cò0Dã½4ÆèjèÇ0�¢]¥BqðV#¸Fb•!Ú­©�|ÒY/¤BJá+’;ŸŽYÂÞIÂC•;Y>*�á#X”-•àÂ’‡È½Gø	¡¢ð.À2õã¿?'Õ�xâ…†áSýiR<Juž(PŽ(˜À¤g[–~\Ô%>ÿe‹ÚRG˜Ù&÷¿ãIOãó‡x~ˆ¥ÏgädOÉIËYö²VþPK‘›éâÒPKÊº$-$junit/extensions/TestDecorator.class}’ÝnÓ@…ÏæÇN“¤¥$
+„6…ù¡XBÜUBA•�"�Ú*÷Ž»
+©-­mà¡¸	ŠÊÀC!f×+'DQeÙÞ™�óùÌŽÿüýõyà€ag–~ìðÏ1"?"çŒGñkî…Â�Ca‚14Òšá^òO¡øà¼Š".by†­Õ=)7Qd(^È%©GëJŒ—>å�ZÝõ%½1Cažs†|·7¶Q†m¡€[6L”ÊÈ¡ÆPù›\N¸8s'sªÝ…ž;»Â—±Nâ÷~ÄÐÝÜï¡¬T¶K7ò½“$`Ø]ïï„GÉ<u™I`cÍ
+´¨5¡öÚ7)ª^˜±L
+ÝˆGªÏ76îcG‚vm4Ð´¨Ï=ò‡§±ðƒ)�y·7š¹]gîS'Í¬¾È½›Ì¸Gcxdã!ö-<ÆsÊãt$Û°~(Öi˜�ûê$ÿ;›g’�=²SµHwAÎPë2,zV(:¦Š½­þOTûƒ¨£(‡
+zVé¿j¤¬“b›5ÒjÜÆ VwˆÊè¢î5s¨™•þwÔ×¸›Ãj©­½›KÀJ¬àÚ
+H«�/T,Mð†/ÏP;-Å²Ó*ÍbrÆšp¤-ýÁ¬ºi£H_[¸127Fæ†F£YÏµ›’ts…î×/�%/¥ÌK}­w´¾(õ«âý%q1TÕÓPK9!éºPKÊº$-"junit/extensions/TestSetup$1.class}QÛnÓ@=“¤ucL’†KZZ.÷âö¹ÀKRUÓæ}cêàÚÑzÝ–ÏB¢Eâ�à£³›*á�ÆÒî\vÎÌœãß~þB›+Ã<‰t /´L²(M²àHfº'u>jí8 Bu(ÎD‹äsða0”¡vP$,�qŸ”8•ç©ú¨Tó£ÄÒÁa^ŸDYk›'to±K(÷¾&úDê($¸g"n)™å±žâ¦#ìÐ¾2nþeÄ¯¯	»íYf5éô	¥½ô£$Û�¾%T=8X(£€š·Œ·D¨t£D¾ÏORš„Z7
+EÜ*2ñu²dˆVglÕÚaÎh¬Ó~sÊ‘65„úTîIÚÁ
+¡ys?«„¹Lêã‘‡G†Äó
+ÿEìË0UB§ÊÁSÂÂ@dQx˜'„µöl±<<Ãs-¼`˜–Bí§ç‰‡ÎxžÏ<zi®Bù622,N¶Û2ŒÞ»$‘j/Y&3l³¦%ðo4*¹Ù/Ã|5#ù$*ðñp›ãEö^q\d[ñàŽ¿~‰º¿q‰Æ7[x—o×ª¶õ=%SŽûxÀ–Ed¿€eöMÅCÛô€3¦ªéGý
+OŒáÓ¸B{œYŸö¯1vá:ßKÜµñÏœæõœ6ì½‰-»Ù­÷PK^?úVézPKÊº$- junit/extensions/TestSetup.class•’ßnÓ0Æ¿ÓfÍ¥[[èþÐu
+t-PqÃMÑn6��
+Blqée2²¤r¶×â$�x
+qìDíi%"Ù>>þüó—cÿþóãÊxˆ>aó,�=”—ZFIGÉðH&úPêtâ‚�ÂõéÇJèX¹(*OÖì6zãLþA‰sy«ÏV=Ú=&8ûñ©¬b	–	+ã ’¯Òó©ŽÄI(	�qì‹ðX¨ÀÌó¤£?	¡=žotdT<!´ŠÏ'”U¶‹ý½‘If.ÛóOé>vÑ Œz‹œ,æ›ß¿î¡‰ÓÂ)]¬ªìøµŠµôµ<%<™SÚ²ùS<{â6=¬ã&_“²ôY-]hBØZÈ%,%R¿e]¹gªæ=»ôåD›Zšgâ‹†"ú8œ¦]t	ËZ
+u_ðEx‡qª|ù<07\›–ï‘ÙÊ¿þ"Š¤ÚE’È;(ñƒ1Ÿ2ï‡{—g{œ/ñXé¾ãÊWŽJð¸÷lö+k¸ÊQ+S¡Ê9Ø¨†fVQÏYï˜]æ±þÍ÷†×z9è?ø†ö[³‚UŽ×¸_·è[Ù¦)ºŽ-té1t›W�ñÜæñNnÿ®=nÀ�L›á+6Ñ±Øj¶˜cÜûD·QÂ}Û÷°kÄ—dý6þPK`V‘è
+PKÊº$-junit/framework/Assert.class�—[xTÕÇ×&—™&C(á’$WŒ Òr1˜Ìd4qÐ¡`ÒÒö$9	“98 Z«B[¥Š—ZÀˆZP*J/B­ÉT¼´ÚB¥íEÛ~_ûÒ>µO½<µýú_{ŸœLNöˆ_ó0{f�uþë·Ö¾­\þï«oP­¢?Z°;›ŒgZ‡RæˆµßNíimO§­TÆGBÐÜÝæ>³5a&‡[7÷ï¶`-Tº1Ž7Ú54nT²­•P©AÅä4'OZ=Ù‘~+µÍìOX‚*£ö€™Øn¦âüÛ1gvÅÓ‚Fõ¦ü¶-•…û‚†èM,“Š'‡7ôÉøCf<!(¨yÞ¸=@sé*ƒfQ¥ ßˆ•N›Ã’g†« ²;9ÏÄí¤ ÑÝ†>~¿‚æðû4[áDÌDùV+ûbA+ô	@(2k°3•²S>ZÊ5Ë2ªPZ�wd¡&h�>ê-¾ÆÂù—ZŽÈ´
+L:ôh]Í3³RP9—ªÇvÂ¨�ê8‡FA~ëÀ^ø[ƒÓ‹ã¨ ˆ9�Á;‚ê5At\Z®Ä[¯˜]Ag7×kõÑƒ®ãlj½uÙ#{±ÆÒªðÙ”å£¸è«
+ZK÷°HTf_Íìë±<5ï„ÃaZØÎbMûèF,Úxº+9Ä;„×xC˜g`ÝdPµ+Ãvf
+±!,¨bJä63³ËGì+³?­\Ãº…ºº™º±(á^2h%2&æ£AB0éF&Ý¬'�D"L:gêA$a›ØÆŸdýˆbÛfPŒ>¥’mnW†ô1Á§AáÈR”#oåÈŸT¥‰ÜÝÍ�ó²‹Ú<wý¬Ú­Â4@(’@n%
+ÝÝJÔdÑ¸^´Onø«¦ì¶�°Ì¤�,¸Ð J²X_ŸÛÃbwèÅ::<„£La†	;á>ƒ²´„,ÚÑ¡DÓ,z—^4bÑySöÐ.3…½cáø"+‡”ò½ÝC÷A9ÄÊ¡�R¾›•¿¬WŽÅ<3Ûeó1ý«Æ”êW
+:LB5Æª±˜R½ŸUÑ«vuy*Ú•ÌXÃLû5ÖíRº_7èq:
+Ý.ÖíêRº�±îNu–á\éÉ&¼'qÞAu…í—wtœ §Yû¬6[ZÝ»€#è”zþ¬kŽáÀíoü+@ßTçÏó:­¾½��ªÞðóÊý[êžøv€Î*÷ï
+"?�ãÒCÝ‘â}wÊ>3‘µ6	Z©ËzfÂú>½ÂØ¸A/óM jüô>`÷îµ’8~[t÷Ø“B€Úz�…^G.[=4¿AùMú!ûþ>yÜ×$íLMðÓÛ¸‡ìÔˆ™‘×À×…¯ßè§‹¸‚IæÁý”¾ƒ©i«Ùo¦9+ýi·ùéH[EÔýÿÞ€ºDß¥÷x…õ1™‡ý�äèÏf˜…
+ïÃ!fgSV$Î-Élus_Ã’T…bâ¿zŒhoÓ�_×aÄÒ ’¦	*;�/³ÈÀ'$š
+×>	ŸÒ	c9Æ2î#�NŒì[Vý$ùšr4oJ¤]Ñ<ˆÌÇÚJ¡Ê– ¤)ƒ¥
+,¹Ð‘¼>®T,ÊÑ"/T50çA•JVªv¡"ðdßŠ¦ê1ò�¡âb�Òr$S—GUáRU¸TÕzª%^­FP5i©Ð²¹µ.’ÏÊ.Ð²^Ô»öMW¤T>hÍ˜,LNV£|‚yÓê¬n@�×JUat,Îk6âòL,i¾Dþ–KT|¾ù"š[Æ©~?šš[rÔ4%·ñˆ6bÊn„L(6!™›Pôv)_£ÄÜb-¡fj‘dKÐ„·@…ƒ_ãßoò‰¦æ]ë¥¾ÁnÉ›Ÿ#ùm•”e±Õn&%2xíŒL®çL.ÐÚ^d3AŸ˜ªì¼Bt²é�Ôf0o�mk^&µn&µ”™Ô"xÐÉd�6“
+ÞLv “Û=™ÝL‚N&±Sð–Û§>GcTSßx|ŒÖ7] ¶Þú	êä±#&æÕÕ7çèÖ…%O<CU:ïÜ™�îÇâ@·<H×’Ea’hMòèt3îdTfÜ	È¨¬G'ªEÕ·ÇÁ½Ÿ¬\&V6,Ä^ÚâÍ>��äµL
+«ÎÂjM²p±ÞêŸD F
+×åh;êP·âè­C’±Þº	êåqFY‡åu+†rô™«�©2Ìðð–a"ìG £Ø\wRˆîÊ+CØ-C´;eÂ Ý)iÃ Ý‰\˜ö³m7Þãìü,9ú¼·
+÷Áë`^üR—ä·UN¿ÔUKËttyíð2
+"­�Þe4Äc-FÍ–yØ‡ó‚Ý4‚7,ƒnØ�ßå®_UjŸXZ“£Ý^Ù‡Áðˆgý»ëwØ!Þã«�ÈÄ#½Õdó¸£†ø(�$®r‰«œ {gì¸EÕ9JyeO€ø)q•K\åì¸´†8ËÄxñ
+ñ³ |® ñ¨K<êß©%þ‚Wö¿è!u‰Gâ»5Ä÷0ñAA|PCüÏ$>ärˆ¿¤%þŠWö�{ˆ¹Ä‡âû5Ä‡™ø!Aü�†ø5¾^�øˆK|Ä!~XKü¨Wö-¿í!>âqˆÓ?ÎÄÇxñ1
+ñ; ¼\�ø¸K|Ü!~BKü¤Wö]¿ç!>î—Ä'°Ò½}º­oxµÞG>LëCNÊû”žžÑáöô£;*ÒtGÄÉù§ÝÑIçf>¥§zÎ«õgPýEKuJGu©0Õ_Aõ·+P�v;ŸNçSÞÜòüd§sfJ²Rž‡Ü?€ôOÀý+ovË]ér·Ã)w;œÓ:œ½Äÿ†ô®Ðáœu‰·À‡ƒLÌýôw<ý´àöïˆYy¨†‹j¸¨†‹z¶êKTáÇô•}(ªÁÿY:bû±5•ç£M©ê½Üà‰	ÊU¾:NoŒÓ[Q¶5;¶+Û´ÖUvg"@E¢PT-æÐj17�a�“Z.ðŸÈ6Êà††§`—Wyåùž=l[åØ.ÁÖ<N—+Ž/-üå—©æ�j>¨‚ Z@!QU°uhq[‡9}í’´Z
+.iÔYŠ†\„¿žÙÀ‹E˜Ôê�8©~þ¯ÐQ>êÔ ý#Öà·“5øÀSƒsÓ7†XŠ,CjP€Ú¼äÛ]°v¬ÝM¾ÍI^Ðï¤ÞïÿPKÚ!5#K	 PKÊº$-*junit/framework/AssertionFailedError.class�OMOÂ@}C…‚ (&MŒŒöàCbŒœ/˜ÞXëb?’m«¿Ë‰€?Ê8[š˜¨÷0of÷}Ì~|¾½ÃÂ9„“u‘¨Ü{Ð"–/©~ò®³Lê\¥ÉL¨H®nµNµ"ôÖâYx‘HB¯º´�+Åò)ÁŽ‚}“®du4\Øh²ÈW‰¼+â…Ô÷bIBßO—"
+„Vf®.íüQe„Sÿ?ÛLƒ¡ÿ½Í<×*	'£ÀwMp�àÄ2ËDXþ¢ÜyZè¥œ)“~ôWÊ…Qá5ö3§2ÿâêðtÉHŒõñ­×òÙåê2M–´Ðæ®³%1î0ƒne0e¦á6Ægìþth—ãp¸eU¦ÛC¿ß/5_PKG�ƒœÍPKÊº$-'junit/framework/ComparisonFailure.class�SÍOGÿ�½°Ù1˜â°Î'¡¶›’”œ
+�)„JDH•©‹=¶ì]´^'½UŠø*µçT¡‘�*UJ¤Æ Tê±­zë¹·ª=öÜ[é›õXm3óÞoÞ×¼÷›_þyõÂÃ‡—6¶åeJ®Yã�w33çÔ¶L×ª;ö‚iU.WÁ†NšÍÖëÜõ¬–/Î»®ãª3t–æ?Ýâ�"KæC3S5írfÕs-»|‹A-Í¼†YeP¦-
+šc˜Jœ6|$¹Æ Í9EÎm"¹¦£g4HÐuÈP:B—µ%õ0t/Y6¿×¨­s÷¾¹^å¢d§`V×¨B@É«Xu†+KÿÛ,ñ¾¯×Í2¹uð£N(fðf­Ì½åCƒ¾D²]‡z�±û×y$ŠP1¨#†sÄúÛÏCÅÊUrÜšé1,þw[WÖ7¨º6H›¢t\Âe
+q…¡çä­Š«”µÊí²Wa'’yo!¡aI†®cóeÓ«¨!›še3È‰|^ØŽ!­a
+R¨˜î,•.%òÉ9ocBD¹F´ª7Öë~6z¼ðkWã;˜æ7DNÜÞi”Jœ:EÉÓétniÈB“ÙÚâ6�h´ƒNA­8”+‡Û"Â»4fÏiÝé¸#”Å±à¡Ymð•Ãpâ5;<�QýûT¡_ËÓ²hmÐÚ$ê¬:
+·À,AÉþSÔK‹�4¦Ñ´‡ã}I
+N*�´k¤»žÔÈÞH�¾Dwjì%Î¾ð-#´Güû^ŠÒGQt£Ÿ4 Õò#4
+øR?Åg¾ô&I!_ )L(Q¶•14J~*ÀSß¡ûGhtœý	½©=œˆP÷1ô\ÈM¤„JÇ>Æ§Ã3»0l4q]àâü
+Ê.Îl‡˜1øôàÏÀI*æ?©8)íâ¢Àã�WT:tëÛ–¶ÃQÉxŠŽ¸±sðm }á’U„CVÞÅ—~Þ¸ôI7[¨•Zšl~�1ã	’ß#ûQdz31¥‰Ù&ÞË*Ç�@rü¨ÈÄÄ}LÙÇ]2‰LzE¥£òmä6²èWLøÐó£YÙ¤ýºè‡žÇeŒc¸Jbwé/~@ò*’x@Ó«`›ôÝ>£÷˜ä/Èò	®á®ã[LânàgÜÄ¯˜ÂDæ¿1Ã$äØ9Üf	â{ŽX.xð1q‰¦ð`œîóX¤YO°Ê·H•=À_X")L9Ç2I¾!MpC¦�éEÌQ(÷ç�ÄpÏÝÊ¿PKÞ×Qd¶­PKÊº$-!junit/framework/Protectable.classMM;‚@}Š&–TvZèžB[M4öËfUY².âÙ,<€‡2¡ÐI&ó^æ}ÞŸç>’¼.3'ŽV^ucìEl­qZ9™:Æ¹¼KQÈò$6iÎŸ>!ª:ÁŸÍ„xõPºr™)o„ÉÏ²?[ÓtY}VíLm•^g…æà¿¦eë§ð 
+=„à"fßoÌØÃðPKdî?/š¿PKÊº$-junit/framework/Test.class;õo×>f]nF‘¬Ò¼Ìý´¢ÄÜÔòü¢lý�ÔâvFF�¬Ä²DýœÄ¼t}ÿ¤¬Ôd (3#_r~i^	H‘sbqj1#³†¦'�,*Ícd�×ðÁf\PjqiN‰µf#Wp~iQrª[fN*#'HRd
+›"0±02°2°10iv P!Hœ�PK(gØõ˜¸PKÊº$-junit/framework/TestCase.class•VëSUÿÝHX–Ré›HQ1<Úh­�J¥Z,(-ú°ê6$°dq³´¶µµ¾Z£Ž~è¨£Ž3TÇíŒM«öƒ~ò�rüÝÝe	IhÇa²»÷Üs~çœß=ç\þù÷·?Q�øT`ód.“¶cIK›ÖçLk*6¬gí-«‡ 6ïÈfuË¡B`}9Ë**“”	ÔÇ'µY-fh™‰Ø�m¥3]U{Ó4ë¨ˆ¶�{Ìq]E5A¨*BW#€5uñtFÈM�éÖ°6f8€fB3F4+-×ž0h§ÒY�†øj™Ðé†hi(Ž÷Œèš„™ËØKúY'¶>5aéš­×³9ÃhŠ¶•õáîÓKÃê»!4(Ø
+•ÐV.£b3¶(Ì²I 9z?Ð¶�ˆHÝíäÎòBÙvÿ@Ëc:d¸ˆ�ÊhZBŒæ f‘åð|BŸ±Óf†ù¯[fk8e™s’éÚy´YÝ>1£¢SžW;\	®"æÊÛºf2ç˜è.Wø¤@­æÔÎ€iä£èLŽŽMê	7Ý§ð´,…gÖï‡°‡àºÝcŒaÊñua—Š.ìUðžgm†°O šöýº�2Çö—©‹3%�…N,=i0’˜‹@opPÁ~ôÈf)‚:˜K&u+„ÃÚÕ�´„ñ‚¬öõ
+zÁ«Òffô#é,W¡%"‘^_B\"ôÔ´D2¦I²‚ÇÃ8*É7]e¶h´‚ÆÇp\±þ“ZÚPqBÆÄˆ«dÂI6„¤ÎO'Óº•Uq›œÂYù¥fž^gS:;˜3Ò	ºŒöµ�Vñ*^Sð
+46uK$›2sÆxdL�Ì8ZaP±*�™5§X™{ÊÊ™2µS*R¡#)C$k“iÃèËÙZbjØÒÞ´‚¿Ði–Æ¤‚L	t”fÖÇ¸šì”aÍ"#~ã„0Ít()’«0%^3l÷e¼s(—H¹ô`X‘e¥>ÃÐ'4ã@"¡g³ZÕì¼¥BnX½DsÝ€cêí(²j²Ôo‰?(Î®£¤ ü·88ˆ&ï	d=pqEÇ»ÕÂ%jÎjFN?šh-73Ê•ø;¸¢à2ÞeòÑ0Þ—JxÑÆUâe]ÏzCfÎJè½iy‘Ô.ÍÈ�0¸�!Á:ä/ ¯%µüæUÅg
+W{)|+íwPÛ.n£îW¬ås
+/X`�Çhqq¥ºÚ¨Ç:¾%Òz©—V©£Ò‘FiqÒAÚèj{Hòkãc‚ÜÙäav:k¢ñ±ªÉÙ‚hFP^Ižå./¯ð]l=uÛnÙëöa?›Fßþˆ—�ÚžGs¼½#�–Ž›EùdPÉ®P0S��êaU’í‡ñˆ?/?µÛC­ê ìcËü(Žt–VsXU>7U>VÔÑms²eg;¨:¿d<ÍÝÉß¨î¿�šÎ{7Pµ%NÙîŸÄ-ªiPã»m 0pžÒ‹”^"}—±�¥Ü„+ô4ûôÆJ�‹Fº–ÎÏµÿŠºE<+¤·n¹yŠ/ ¹ÿ.zOÕ¹ƒ¥4��úA>ò^Ä(y}yc×ÑT¢4¾¬Ô^ñöç‘]ÀÆþÎ<ŒQ>^¿ç}Þ»Åªyr[�å<Ÿà_Æy[Èy‰v£ŽÏ«<“kÔüŒšŸ3ù/xO‰}øŠÚ×©ÿ5RøÓø––ßë{Ìã¼‰2vót˜¦GF5ufyZ[ü/doÐSŠôÌS?@Û¿Î9Ý×¹‚´óýNµñ·\nYþ\À»ðyßõ n–�ò¾ôjp�lÉ½VÉ8ÏêíE¼GÚë? ßòèòøPÒÍ¥¿¸on ·úè|ô˜×±•ò‹�/0®ô�?òGˆßEãÃm�¿hó÷*í±4:>vl>ùPKÛæ[ PKÊº$-!junit/framework/TestFailure.class}TkOA=C-e¡P ”Wå¥öE«ˆ¢€( øZ	
+¿mË´,”.ÙnÅÄ¿äM¤$’˜øÕe¼3»”R¿ÌÌÎ½çœ{ÏÌìï??~Âƒil3UËº•)˜Ú	?3ÌãL–W¬uM/UMîcè>Ò>j™’V.f¶rG<oùàaè(ˆ~ ²ÂªË�ÙCÓ8+¯}ÊóSK7Êýê5¡j¹§Ô¶E�(–Ò1w6W\|—Á»jpO,¾« J^t*hE[;ZTàƒ_¬z‚ª^æ›Õ“7³ÏR�¼VÚÕL]|;›^ëP¯0Œºâ˜C%
+
+­æN#±øm¾ˆ�«
+~ËØ±L½\dè»‘dïRF¸yo¥Z(pÓ‡Ñ¢è$'µÓS^>`HÅÔæÃ[ø—Ò†/(Ã¸`˜`h™ócª‰À)à¿÷Á}†^—æ|ˆ“eEnmðJE+rIŒ�@JÁ°XE‘¦âs’�Ü»M‡¡Õ2µ<SŸÌÐ
+'¾gê–ðáQ³Â‡Þ«ð6E­«è
+8mQÈÞ]°oÎÓæðLACº/¤<ÐKËgmÍÈ5¶�V<Ç’hçC;u¹âô1ärŠuÇ–±"Š]eP*
+=ÈåÒ›x&gNF¿kôäøÕ
+t|¦rôŠsiå+ùÀ0Õ|/—+n
+�ý¬×LÓ ¯T:°£jæùº.ÞEwÃýOyŒ“O^@ŽôàhåÏ�fúy�¥;èkŸ2<4èJ$ÏÑ�H�#ôMB{iIš>û	Fèt§$ŒvÃ€\
+�“«	µÐzƒŽL†fkM|G÷×:¹
+‘„Š�à2qØ.àP3xÂL÷Ö—©Îšg.Ý¿À5é,D%5L†îÖÄ5LÓª†�{Iš¯•ºd¯1ê*N?ç„TÛ¬Ž¢Ÿvà¡,t¦®ý™pÂ½ÉKÌ’äcõsûÉÌo$jXLÕð’t^mNßS ?Òè¡Þ‰8JÔB4aÓÕE‡±†uë¡cz�7Ä%´(ÄC»oë…Ì8ú….5Úlâlƒ‰þº‰ïðÞ
+ÿ_šðs®øM™µõPK€4Ò»1ÖPKÊº$-"junit/framework/TestListener.classu�±nÂ@†C �R#K·v(yÔ¦HŠØâ¶IÓ;Éw�wëÐèCUÜ…¡þ-Ëßoûç÷ëm<bH˜–µ.\ú*ê“F>Ò5[—Ö±f‰A„Q©ö*­”~KŸ·%ï\Œ6¡§ò|)b„0»Ï.™Ì³?pý.æ ¶Ï6„Ä³+UTµ0aq•>ë>YËâ
+£Ê§å�]Ì:arÅ+Lõ­SâNsÉ‹©eÇ+ïCÿÿxnîÞ¡…!¢ˆÐA×~z�ö‘4z„�Ï-ÜPK�©bÔVPKÊº$-"junit/framework/TestResult$1.classuP[/AþN[¶­¥U÷û%¨P^DB<hH$
+BÓ÷éºµvev¶ågI\~€%Îl+D˜dæ\æ;ßùÎyÿx}CkX$L7#ßÕ¥K%nd;P×¥ªõ™#O/mZ B¾)Z¢ä	ÿªtRoJG[H¦~×�ª@ó§¨{ÒB!ÝÞ’f2Âdå¯&eÊBæüÞ×
+©]‡Ð»ë2n�0³üÉJ��*’�\^©ÙÈ¢?‹lXHg�@ž�«¸¾<ŽnêRU�$B¡8Â«	åš¸›Lé†fÿìöµiÝv¦#dîy«ÝÀçº¡ïÕT*hw†'Œÿ§ÞÂ$³©ÈßJÚ˜6Ò§0Ã¼çA¤yèY¹ïöë¦Á>ò}©ÊžCbƒ‡L�÷Å·`¦f›�9	¾Yôql³·Íqœ)¾ W\}ÂàCŒ)Ä(óÓˆy†Ø³Ùšì0FØFÑÏˆ1ö
+b"æÛbÏ ÒÅG>cö7[“µ\ÿ`KwÙ˜‹ßy,ÄXŠÑ@áPKcÌ#_„ŠPKÊº$- junit/framework/TestResult.class�VkSW~6ÂŠ4h�p©X´¨k/ˆ€@+¨EÛêJ6$º›¨µV«­µ{ÓV§~h¿t†/¶Sg*Œu¦:õ[JûÚ>g÷°‰qa€™sNÎyÏû>ïó^Îþõïï QÜQžÌ¥“ÙŽ¸¡Méç2Æ™ŽQÝÌÖÍ\*ëƒ¢ jR;«u¤´ôDÇÁÓ“ú8wK”Çûµd*gè¦‚à %’Ë&SG)�1ºøâ}†‘1xˆ&Í¬žÖÅ�òøá\ZXàZÙ§ 4>’ÍLs}\AYw’Hv((iYT�·7ÓU,Ce^TÍ#)0ãC0€jT©(EY9<X©Âg¯jTøíU­ŠrÄªNET±jP°|0™Ö‡sS§ucT;�Ò…™q-uT3’â·ÜôfIB­\˜%:ë×b1Ë]í-®¢]ƒyGFæœPß%Ü¬s—äú°VÐÀ:¼L&…™”>¥§³
+V¶G†úT¬GD�Òª r<•Iëä¯hYÿ|¨T¦A{€¤tÐÝÖNÙÚgdûÒ¹)ÝÐ²ÉLš6b“0ñ
+A¸ŠøÐ© "­ŸÏ:hÓ…pU¼Š­Ø‚×È°
+óØ} ìKh®@7¶3v	ÍÊzŸƒ–s\ÅNìÚzDØx[AÈ=L7A kHxÆ°×,à»;vÑn�iê†Ð ®êv®XÑÚ‡ýÂ©
+Ö-í‰%‚yb4¹C˜°RÌŸrÄ—fÒúTæ¬ž7°ÌÞX<ïHþFERaM[y§â¶Š�7ØôtlÔŠHíŒ	.Žã„àâM’¬_{39a�±e£ðšÉÔy
+'…N�ÝB—ýE�Ûá�âþ¸Ó˜JŒ\ZAƒ»É^Í´°ÜÌjFVl©Hà„(…äùh|óFÎˆºœ …)" �CF&K*ô˜‚-KÍ
+yG¶Lëïˆ�,„ÆÍ,eÓlXT#© .ÉÊs]¦@Ò‡óÑ´½¡â*+ð.Þ(ˆ�×¼”Üôáò|G˜/*]‹íÑµlÂ‡+
+ª]êÍ‡�j+¾$ªÍLdr©˜ýF¬p£Ã‡ë¢Ó	/çÙ1U|Š“øŸ‰|JŠŒ´Yðš–¢eç4s$7>®›f<—RIåÁ×*Þ¶W7iy$“3Æõþ¤x–çƒß. 2äûÒ¬ŽÞ”FL4ñŽà3äOW^ñY³_Î|„8{ÄÄ9E¼l—ó—ÁÇXá¼!2‡"�P=6‡Ê/Wå—áHÉÔ‹¡ñ¾¥ñEŽ�´„h§†W!ŒZ¬åA:P�Õ<UmD»†s“h¨Òþr 3òV=Âº±Ö¶9´Ì¢�x6Ìbóðª£±MÁt·¶=Ä~<<Änwÿû;"D5 ò*ª®£òVÎ›ùt	ãÛ€4.V½ØcêDú©aa`/©hmÑZh)Ð�ÖFhQBk'´(¡mX´¡"hÃ8(¡õðÄÃ¹œÐÂ­„”7°:ü-–‰�-è˜(Ç!¼N5M8ì¨Û-Õ¤º£ÇŠõuñ^w�¾€£/ õ­�¹Ô×ÉY8Q!ôÍbì	ªu–YG=yQ!•)¢KiJ—pn–dÍ Øæ�ýoyÐ&¹þ'6hñ9@�{™�L‚ý–�Õ¶.t³äÙÏˆv=<aJÛ›$|¿ÈÉYœ¾W„ý`v¿“ÓãÖ=—û›‹}?âz?æj?äbÿ„ë}ÝÕ~ÈÅ¾ærß‹8&äýÙ|…#Ì…ÉGH�µÎ!=im›…!öÌâìžà˜`O™Â
+>%µ˜.`=ì°&ëYÚ¨¤íÎZ¬Ÿs¼î�¨K‰º¾Øå\äR']øjÉË¿Ð”}#“â¢‚ÔGZ£³xË†£�í—î[€Êùÿ�5Wãª5‡ð‘´¶†„¹w‰™}™WèÒUK¢×Ð€ë’Vkmt\kt
+·Qº ÄK¸„÷=\]ãªÆÚë·Šùcìrq¼±Øñ®Ž'œ:ùY:ÞÃšø\ÁöÈØðŸ‘12XŠ­:úteÑ§�ó+-(¢§a±ˆø}Ç…67ÙÞoñä[¬äÜ€ÛhÁ~=ß&þïšX�ÃE�äÂ‡mì¡¢¬•e&üþÒyz6óD¸Uñ>ó Øçºûc�óeN¢å0×-™FfñÍ]¨œnÝE©÷^I1�?h
+JMú$Æïè‹°ªð“JüÿPKäÊ×O|¤PKÊº$-!junit/framework/TestSuite$1.class}�MK1†ßi«ÛvW«õ«Z?.µ~T/^A
+‚P¼´ôk¬Ñm’ÝŠ?KPþ”8YÅC›ÙIÞyÞ™¼¼¾!‹¬ª7‰VqãÊˆ�¼‹Ìm£#mÜNT,kûˆPùKÐVzÈü¡ki­èKB¹u#†¢
+Ýo´c£tÿ�PhßëøZÆªG?R;&¬oü–þ>ÙìrÍè’Ñslväá‘C`ãd0I(µ”–çÉàBšŽ¸ÓÆ¢ž»Â(—æâke	+­ž€û÷kBGú~%v�à™D»{BvÃµ7?Z|b­4±‡6¸*°èZ¬`‰PlG‰éÉSåì'lvÝd„àLkiš¡`‚ÅÏ’ÀÍ»Ñ8zp+Ã_Î‹ü×ä<ËÑ¯o?c¢¾õ„ÒC*šâ½èÄ4Æå„iÎçÓbŸ�3)ÊÇ,ƒ�Íß}8’³¨?¢ô‚ê(ÍƒGù”|é¾i,§û
+VS-¥^@ùPK¯�$ŠxmPKÊº$-junit/framework/TestSuite.class�Y	xTÕ=7™ÉÃ°…$�„eØ'“
+PY"È¢Ñ$¢A ØªÃä…3qæ
+‹U°Ô¶¶*µÕVƒ]\[±²HRqi+.]´Új7kk[±«ÚÅVzþûÞlÉúùñÞ›{ÿ{îÏ¿ÞøÜ�C!jÕb…ò�ÉhØ¬ïˆ7[cñMõ«Œ„Ùš›†JaäÆà–`}$ÝPÑú�FÈt¡P¡$ß"œ
+Eò™P(nÒ+“f8R¿šëbñ
+ÎŽ®HOjØV3Žnà¤+	&Sg*ŒÊš^*ƒœÒº=jvf8”–œÅí†©HƒB¡¿jµ‚ci¬ÝðbFzà@qJý,%\(¡˜¿±jµˆ•yPŠ1^¸à‚”+Œh
+G�–äæõF|Up}Dë#«ƒñ°ü¶fg˜‡¬l”=ª<Ý?àÏ-j—´ôóy¨Õ$8a˜s¥þ|^LÁT‘�¦à&KƒZFõšýÀ]¨"ä†d‰¿j ¦Õ¨ñ €Z/†À#ìÔ“.’.�Ef<)„*ÌÎ£}ÖHÜèˆ�úú¬5DŸ…Ù¢ï
+eý÷>7ÙÑaÐPgÑ¼ÎçÆ\aƒ'œƒ³9ìê2¢í
+5ùÈ0dáqÏX(‹|�Á„/óu%×GÂ!_(£›OŸ/˜0üÖjŸpXåËž¨rãá9fIx±D¨šƒsÉêÖ`<Ê1…@~Ýò¸5[†åÂÆ
+ÛÛe��éÏ/-Ö>�"�‚—iŽµ‡;ÂF<¡Ã Ñ‹&4‹éZ*Ú!%íÂJ"œX©)°‚b�— Õƒ‹±Ja¸/,™6In¬–h)¶¼`™ÁŒíÍ†ÙkçÎãýU—å±º5Ï#¶a�èt™Â0ûˆÖ”Âbÿàë&‘¼‘òa\.|\ApêÖšì2â!+Fç8·µÂ‹ Ö‹2!/†Â+¾m¤rZ]ší:ÑÑ
+šÒÕ‹[¡2í4—Âc£àoR˜�™l‰ééeFÇŠX2Ú¾<—t´™:fdVuÆc[%Å¸Sðˆq�D"¸�Ií*q².Ä=ˆJŒ'–$á
+Q‘^�mÎŸFhÑ$¶ˆ2[iâDøj"m÷(ÅÕ´dKÌgJ¾öuˆJ¾p”±v�ÂÄl­[“¡NËË·…Œ.3‹º°CÁ×o³–˜i,#u�‚"m“šNƒÇdéIˆÕìÄå” ãÛµ9å^•§p.næ¿F‚Ðµ–GŒÍFÔì—*­â¥�åÓ¸QŽ“dqieù�Áe{ªNè,A"nk8v0m\øœ·²¶ÂÍ¬bÃÑÄ ªÐ4ŸÇD•Ûi‰T fGÆøSD†,ïÆqû;©i8‘YèÅ—¬‰/3È°Ï¢‘ñ�‘
+çù´ô]d,7‚¦a¥œÿWÁ,‰Ýƒ{eÓûh
+:cÅ©ì5þ”åÁ…ØÐ÷We“¥x{—¸CInŽIEÛ×ñ _Ã^…¡Qck#q‚Ñí5ÃYÚyñ
+<,ûÄ®y'Yß…”;ai0*i1¬72Ã¤O‘/D1¡õ�B�ÏïFOa¤\|•]-ª²YN|žÂEÅŽàQáô(9eÕyŒ´¦cF‚5«nÉÆ�+Td¶1º…ŒÖ!'«Yñù¤]ÒsÇÆädÍŒŽ^|ßöà)|‡õÉ¦!
+1Eå2p<';4¦‰"xÖîÏæJE"Æ†`d‰†Ë’zžf
+e÷OÓ\ä¶—¶�&7�N#
+ÕæÁ”¿þ y°@*‹È„c¶Y×Ä™Mèä/yð²”ÓÑ©é•œ5S³?–ÚÕ”š²Fí®ðU^ÁOØ×uÉ‚V3Ú´*�›Y‘¦—ý?—òñÙ”�Š’™×ÆL&‰,=uzÌ£?åŠ¶Ú¥yweb=0S$yÝ´.å)ÿÒ•}y4¹Ùˆk†éaoâ÷âò l^ÞÒ�¾ÍLgúÜ6ÕoãOCqöâwhŠ"ü•œ±ñkŽÅ
+{­Õ21•þïˆì»ÔQ+ÍDCæÌ´q^·ˆÛw�:Q¡Î"Ê�ÿ�zLN»|†`;}¿üN²ˆÓnpÐ	å~5EêN‹<öZ}Ð%†™ŒG%wzU‘t<·*—»s.u–¦.å‘
+lãfbMØìäž±Î«¼j˜G
+UÃy°ÌüêX¸Ý¥FR·Um+—{U19Q£ÔhºˆqU2IxU©T:‡*ã6]©¬ÎSxâii‰x’¹gbþ¾÷#‘Œ˜úºT1ø¼K�“ƒtÆ’‘öV3ÖåUðŽG�WÙLÞªsg
+ÒZŸzc¯š¤&Ó5Õž+®GÆ�j�WU¨J:žšÁâúKt_ß8H	e‡aXn¹D·/�ù¼ZU+ö�¥Š
+†3m7¶¥úËkÝ6)Ÿ%�Tªô=«VîÃûÊAï«Sg¹Ô7–IÙhúü—Îêl�š«æëFM·©$¿5–Œ‡Œa¹&OÃ×	SKc4jwyF“¨™ƒ.]Äg�\Â¾yÝäÛ-­9ç†ú×ð¬_eüâŸÏQüµLcÅ�>ŒEiÛHOÆBÅ~�WÉçpò9�’>®™�qüåµVa<&ð-ˆmÄ‹¹Jä‡ªû09PÓ‹éý¡êàD=�©¡|–¸
+%_3lø¡ðC ð>^õR�"Î� p ºu‡0³ú0Î\Óƒ©Íœ�ÓV<¯óe¦
+Å‹ùèÅÒÃ8¯îçèE‡qéL(¹&W²Y6êÃÚ–È‰>4ßQ8ÇÙƒQ�rG©sv-OzåõNUê,w»ûäÛ”ho>€Ž¶ã·¦¸ó0"mÑÑƒG]wE/}0§Ð¶='AE/>²ã-%®Í(‘Ù_þ¼BƒOÂN<€‡ð>jó¹ŽææÙ¦9›R(µ“±ˆëœËgŸ›°¬àíç<lá
+x;‰u>Žqßw¢wqü8.Â‹X‰·hF±Íùt,r�¶Í	Û6“¹ß.|ŒZD±×s¬€¸[ˆç¦5wR‡Oà“Ôj5ºŸ¢½Å†SmY£]“×†YîRLA`µ}¼5<ìZ­V™µ<­Öí(’ày¹·7YB‘"öæ¬GO\N]¯È‚’†‚ÝøŒ†»%åwXnë<Œú´‰kkÃäB$¢#rXr>«‰+�ë¶
+ù!�|7Q»Ûæ;jÊ½¸£Žý9_ÜƒéòþJwÊ3î¶<ã¶ÏÐ‹nÔ–;ãþ�:„,Iý&F|c±™Šb>bt”«ÈQœ�ÐŸié’Ö¸	_E�Ã&mÖý%æ/$æ
+Í¸ƒTñæb‡æ1"Æ«F`s|-é°
+À}ôÿ‡ŽíÁ„šÂÇÀ3ìo©}»Ñ]ûò˜�ô`w�ƒSm…Õ­2Ýƒó°×"¢¡ø0rðoÊ�ch[î‰\¹^<=¨è3§ƒ¤VEû´7ºùßNL£'®Åsú}-)ïñ]›û2\CÉkÉÐÎîB-ÃeCeÙ<ŸÁ±–a±Ž÷éëp#goâê›Ú»ñ�NìÑÅôG.5ãÐ_–�;Éÿ÷ð}ù{%¯TÖ×®�p,äÅÄø¿.å?ëë%®±¾Ö1‹ïÂ:0«øïE~=¤Ç~È/�Ü˜lß4(-i¹ò(^fâûQÓQ¼"^ÿÓfÉ¯‘«_îë¦·ó¸wpq7�OVf¯Äëø•&n4~�ßè
+<ø-ÞÐ™�Ý¥½åõº þÂ…t—?Ò�ÊjŽà/
+¤¾¥²öþ¦påB½§°çä›•{ÓûWèŠpÝKäûP‚ûéÆ÷ò`=Z�€…k»vÇÿAòYxY´váŸ)±c¾�ïY˜Í‘QRJãN­Û
+švfZzd ­ðÞ·rû­Üþ~¿ÜÞÚÄD¦Ô¾æ�; _DÎóW0sûYÿêˆ›ÍÝÃÝÏÑ¬‹‡²È<Ûü~ŒTªP'�n²k1v��âÊìD1‚›Òw/í†Ó±·0ÃO‘ã#Y¸eé0/³Ã¼@þîaãÞÄ_Èu’nš	êláÃ=ßQË€­¨­†ôªÝYî8 JzÕ˜þûYgzŒÇh�Ç™zžÈJ1ué½ëì½�tF«Ò{0U�Uâz#1A•óì´�4‚iÍ
+5v�í!ã©—¯E´sÆWµ�šr”×3)q‚®fÇé‰Ï0@Ÿ¥žÏQ¯çYÍŽ£š¡”ñ•š´Ž5jšš®uœnûÊ8òiùŠ’¦6Ëâ!îêš#Ê_€þ¥áîýbVT¸Ó;¸íjÃ/½£BU©€�»Ø¶±WÊXe¯ªÓ‰(×²¯dYÖ›ÆõªzíåJÍLÇØl]Õ¸“Ývô÷‘×²š;wº¹ã­2ïzuFMÞÈ»~	ù´Ö/µ×�bPœù4aøÚèSge€¬ñ-Òur
+ÍŽJNI·
+6=E�j¶~ýI—f{/‹œ¢49EéŽ¡:­\½­œ“‡›Ùÿdd)â´a<òÿìÅsìFÚ{TÍmŒVóúÔ‚~Ê™…áUu�.P‹ô³A�£•š«,þPKáy»+
+hPKÊº$-!junit/runner/BaseTestRunner.class•Y	|Tõ�ÿý&“Ìd2�‹+�@@ÉäR�Ã¹AI8Á€Š/ÉK20™‰óÞpX{h©mñD©ªR•6ŠØÐI4Û=JÕmíîÖÝvw»=í®]·ÛK·{¨ýþþïeæÍdÒe™�yÿ÷ÿÿîûÿ|íƒ—.RÕò+L3÷ÅÂA³>‡õhýZÍÐÛuÃÜ¡^=ÄLû´Z}H÷ÖoíÜ§w™Êbše¡õDµ~ý`$º¿^°šƒ†©+¼làµ]ßÔ¾aoË†öM[×·®iÙÀTÔœ¤ÕfFƒáÞF¦Ië"aÃÔÂæN-Ó™²�XÐÔ½äcò÷l‹ê=zTwéÓ4=fCõÛ¢‘=ju$Šzz[´C-ºah½z³î5û˜¸	´{z7C¦m3µ®ýØÛÍäíiŽhÝà�åŠ®Pj¬dÊª¬ÚÉä^éÖý4™òsÉEÓüT@…²šÁäë×õ[¼T
+Ò½º™”ÂUŽW®©ªÉO³¨Ì³™ò›ƒa½5Öß©GÛµÎ�.‰ti¡�Z4(ïöfÎ
+%“ŸæÑ¹é
+?Yb,€„f_¦(kþnƒEraÑ¨)[L%•Í™œÕ(
+{Íˆ%+Ó”Êªñø©šjDˆZ¦<XmBWïfššAßª�~ª§+EÝ«DTÅ~ZfîL“
+§
+KÐL²~š$X1œ8“{ÓˆÌSc|˜LÉ´ï¡>º–®`ò„¬¸ðÒ*>ƒ£×0'±6iFŸ)NòÐ:„Ì@ê-wÚÁJ�Æñ;Uã·ü´�6úh=]�zT”¥^BàæGu­Û¡—Ÿ¶H0¸¨g†v@OÑÙ·áP—>`‘Hcò#õM[ÛÚËŒ %ô­1âÃoºÖï¡ÅTC
+rxÌ˜6„n§ëEÄNaeê™¸iÝà£6êðS5
+Ü&òÒM’Öf$
+’ÕI,§�™£i/Ý"ÞÑ€ßŠÈÍ.±C!³z"P·´y"µ¤¶©Iº0CÐfb�(L$‡Óœ<1^&'ï£ý¢Aòî×A*û€Uæ<z¸ÛÊÏ\É“
+án½ÛO·ZÙEfjÝÝ¢Ñ–u$°ƒ]{_4rP"S	ïŠ5Øfª¯lú¡ûé!¡^B¼©áÀ
+�˜xuÕ„"¦í®1É»HØOi¨d®¸<P�j.�©MTm
+ÒA=tjmÈî¨ÿ¨ÕŸ¤#>º“>ÿw…tMÚ†Cò}ÚJ¾Ï ÞH‘h“µ.¤ˆ¿™…Hl)0ÄÁQº[HÜ3– ©öôÐ}°(4³›˜Ÿ�º{?CM§¿6ÖÓ#Mö!ä "_Ž˜å=‘X¸»|ž—>'iˆ0:N�@Am`‘ÆTóÈé$
+qOÐI¡ðÄH>&k´€\ôË~ú¢ªOÀ#Ê5
+å^zJD\~šþú2�•zf_Ò¬Î ÍžqVsÊ‡,!£ê-
+�ðizÆGƒt}#“Ë•�<tVÛxÂªT}ÅGÏÑWÇ
+c.:‡!DÄŽt{‚(Ð~º !ržžGåÉ€fÃy(Ž?Á.t“Ê¦ªÝ~¡}4L/¡+ñ*«Êû£òþ˜a–wêå†BðÒ×à¹`ø@d?rëšfÏe¶˜‹ôŠHûui~Œä¡?ƒù,�–›‘r‹e¹a	×à¥¿@Á¯fÀº4IÍv-
+ó8úÌ7­N’¶Ï4=eºHÖ?}‹^õÑ%z�©<ÍM­s£µƒü_¥¤�ãà;)èM¡�Þ«…Öt¡“¨ïÊÔ‘HÞV˜Â.¿v2Ž‹Ä?`æ¥ï�­Qu(í¶ÛR¦ó<OqË€Ò‰c›©6Ãá„FoL•/³î*ÖCÚ€¡w·ûõ5ÆØØ7µrs†¹o¬ê˜ú!³ÞY7F¢ý"æGÐì›ÔÐ.MµtÌµã€áÝŸÐO}ôcúYÎêûW“üC`÷¨Ca½>ãÈù/ô¯‚ó6*ê�ˆ/lF	ˆFD©5ÑÞX¿6
+iè{.§¬I»ª
+GÞ@
+ýÖ˜2ÒÙ±\B²þ†~+½àw@Å,�¸3¸+wKõx—Þ“ê÷Ÿ(Nßþ‹ÉU‹þH‹Dµ.Ón—U‡a…÷éáðajë:ŒV¿‡q/ËŠÄ’ÝãÏ6à�M>~Îbw.»÷°é-AÃÉrIøò.«_@/{Ã¢ÛÃ¹°ü€l„Â~ÎC�gû¡:âNÌ&—‡D·¥#Å¾aë:S¼^ïÑb!³|ÖAkC£Šz¹XÌ*w	cWPúoÆëÄn?OåiðOÑ:/— ö ‚¯[?´µg´&?ÏäY‚V¦äê4±Þ”ÉÔ<‡Ëz. »’žòâ
+FÆ©Ë]ÓD˜³Ss�ÈT‘) 2!Wr• àËº:hW%
+«OJ¸éýÊ+«Roz‰ÖfA€J=Kæ«wòÌ�^Jøy	Ý�ÇWóRÜþc†¾C·ó"
+C
+EpÁr¾F4`ÖIa0ž‡WøXÝ¨æ§À£†»µh÷8ðU>^-·ÜY*ây­´ÎðÎ5›a1?¯·¸o€] k´®/"¡{�U„Æ&t?7ñŽ*áwÞ<Ü,ù#bÔ
+$î|^n•þôqãbäšH'bS8y=â6·Ë�f-Å,ÏHÿ%²rñ
+rßLd G&^Â»|�óNæ${“�o–‹ŒKnôS3’IÙOÞç….t-t”ý°©÷Š5AÐ; E
+¨`ú¹‰€†àŸ“„uÖèdw”¬uw÷„Leÿ±Ï1³»"ýuÁÎþºØ�þ:3	uëõÎXo[l` 5½Ü�ØGJKÎø9"Sî Àèp�õí5¤ª*3ŽËõ”1­­�]QÄ”3}“ÈJ­[c§q�t‡µkÍz|ØÇ‡Í9À*t¨E¶T:ˆ)ÞÎÅ@Ë³rÒš�ý.ÃÜÌŸà; "ßéç¨ÍG‘†C‡Äg¬4Ý sÎAbjF‰Ði‹0c"0…˜–Z~£/rPé¹C;èç{­4ºoœewèV>àãcra˜6vlQÔ»ÇJ1®µk÷s>>Î£¢[}P>sùùóR¹]|B�æá•/ÖÉ£¸Úá1ñe­ú2 >Î¹øÏ5 Œf²9â´3i�qr6J‘ÔG¾ÈŒ¯j@bü­“*´N3PKž‘Q>ÃéÝ@Ûòò³c7Œ´sUÃ¼üœTŽ´cëêŠ’þÕgã tˆë’Ÿé¼|NÌ­NµƒfÚÙ…Y«Ò_°§Ý:‰€:{B¬³ÆÇ:kˆ¯ôò023huJ?¿huÄ—Tu0á%ùVäk‹Ä¢]ºõ±§8õ+b�0pÏÅâ–¡�²©„<äÅ:cœ‹òÈ'_åH¾ïL¦|õ, B5ä©ç\ìÓ`LÅÛZàÈ¿i…üû4Ý}�JŠfž§é#4¯çÍr…ëÆßBp,"iSÁc®:•áq^‚Þ
+ì0ž¾À0Í¸_ Š$�É”…¿“@©ÒZø~šR¥’­Š6¥5Àê¹�ê8ÕÅiQ’�O”@‘REdšh‘ÕbºdTG°É-ÆSXe.ÐòtRe�i¶CžlºFÙP}0³	hJz¢Úó´üUŒÒµÃ´Äð^´ºhmœ6í’åfk9B-xJ0*…éDÁ«€® ™4Ÿ*h^˜0d.µÂ�.ÚŠµ¸w»b|+ëêQjë¡]Ã´{ËÝ(º9N�ƒ”Ûò4åÕ¼ò4å’¯9'ý>ä<šŽ_*ûjìÖb·Ìëa¬Xûª„Þy€ì¡^åÑ>
+Úz7Ûì}àY]§þ]éÖ»‚/QTÊ-È„#|V±)«V.@
+Lèa#�ðr \ó'=<—LŠÙä6ÃfÂÞp‹œ‡Ó©­@¢\ëÓ› æµ©Éê6úˆóvúè8ºÙé®Ý5—A÷cär³|‰‡sY¾)ªç:¨þqú„ÅÏU~â¬w`•»ƒuâôYâ±Ò½-ƒ´©µ6N6¸KÜ—(§ºÁ¥ãEÓçKÜqz´èqü‰Ó©8=ÉC­ÖáiéKŽn­)ÊËz™ãôlë �øŒÒs5Ã44èFhô$åŠ^¶Üµl!|ãëôçÿõ%î¡AZÙ�mñùK";N¯§òJ?vž	WAÊåÓü¾­žëè
+ÚKýø½AÇè~—ÔóUúkÛöG‘GDÛ`ûíÜH×v`îî.T†hu ÈwÃ{à�Añ&ZO7ãm/Vþv�z7Â²‡ýíø»hÝCûé>œÃÉ)ëixê Î"Ò.!Ö^…¿^§Cô3:LoëmÄ‰ø~RÀg	ß¿C£B?Ÿ~HKßƒÔ%ü7éï#s ÙßãÔ
+‰J°÷}ìí¥{éôXE ‹ì¹!ÃAnp/ÃÞ?ÂJ¯#•ß¤ÂŠAùŸ©”m×úùœ£Sè­Hœ~™,>9*�8RiRBÐIôo
+šþ�~e“ûÞ¤Þïã–¬•ƒtsuÙ¢¢_Çé÷'Yqú‚P¶þ[mù²Ð4i©ìü¯ÚYX}±Ì}Ëi*Tã¹(Î„°õŸçœböÆyÒ‘,$À[°*«¾øÄ‡OÖ$em@Ÿ ¸ÁƒxàŠ"º*?€RyõêAZFÑ*:Žºô0]O�ÀD'”ñúèQ¥_À’<¡ß>žÌùÐËE}\ j�ã}!“…Ýwé=[ç•v5Ê	ÌLéZV’?ŸvØ/'A?‡¥¯JsyŸ>°iím�*­.æ)qžq‚
+«±,�ól÷-qž7T�Ô×êŠÏ€Ïï³¥	¥|…Õãy~‚‡¦B€¨ÝÚuŠª�HwayšæH®²°ŽóÂ®FÒs­•r[éŒÏCøh
+Ï;Ú_=×�¹Ýò9Yõ¢£t·£/}[	°Ê6X^ Î‹ª_äe.J�¸o8´ÉKh“g§†[¾àÛÚT«"ˆÿÎ¥‘ø–C.¶I°\¯mÄ&{à˜)Ÿ£Œ¾Ì+‡Fy5žkÒÕýbê
+øþ»²Óm²n¹TÛd7Ùdg­áuÒÒ×E#¼ñ$ùÏSÅ	ÊvŸÍ:›&ì÷TgÛT}ò?çiêVgÅÅ¼i„·lå–Ž@1oæíIA­€û>ýA‚œ‡ü¼C|‚Ó-	£=l·æEJíj6àë·Èd‚^=Ì»FX0Ì�ƒTÐø¦rÕÞAr·œS¾›�ßv$Ö•øm·¹W¨Aò‡xûJÃ�„?ÔOõsÌ*oòÞN8ÖEWò-¬ám$}“;Õ(:+¦‹lCz-IºÒCä‡É¼j\ …_fãß�g6ž%ø¡eæÊšK”]v¶f„ûP˜²Üeg0	 SyŸMx6ÌEôk ý«ß"Þ~ˆwó|ýG•(±bÅû)_±šbO**â�ª¹ò¹Ã§Å#ó‹9<Â·î¤œ-YgÝgí!Ç‡àrÌïcçCÊÃá$v9-—ªðÐ”£lØ¤ï+Ñtá(ÇºšGùPGõ0¤%Pç�WÇù“ÒùOIçáO¥�–œK^öQ!çÑ4öÓLÆ|Í“Ë«-²j´#Ïá»øÓ`ZÈÏðgAe&Âë(ß
+0 ò=ª5åÊ]Ù�sp"6máûù�¡q"Žò±ŽÀ0?Ø:ÊÇ;j‡ù‘÷ –d�ðÉ“”[ƒ®Ï_ÀxÂ�w4d_úð—¨ÿ
+9�!ètj<jÔ[¦[*³7O…$Ó Ó*àø§WÚ™TÃsPžÊiÏ¥k±Þ‚ÊØ‚ª¸•+”®7ªðmç/*¿Ðz~BéZB�ü¤ÒuÒå)>
+�j¨’¿Ä_†®õ4-É;mWkµ•²íU.ÌOÃ]9¤nì¶»–Ù7§éE›“"÷<•œÌT8�˜ò½r	·‰¼fÏ–íÞ—éÎŽ¬b>ÓÖá.æ³mÙÅü•¶´Ì¡¶O1ŸoëðóómØŠã�½‘¶æ¬k1»ªg¡ÉŽ>.Œ�¸x–´Ô_9$X)AÔt×#¯¤b¾
+]„@XLøju	-æ¥´0Ëy9{
+]Ç
+Ô„õ^á˜mÛ•Id2ŸÅ_Smµ�f¨fŠ,ç—…#_ü#PKõr—@ÜÉ$PKÊº$-)junit/runner/ClassPathTestCollector.class�Vk{e¾'ÙÍ:MÒ
+I›RZj[ØcB©4	»$ØlkZ*L6ÓdÚÉn˜™­ˆâë1Q<ÕCÕ´è¦­¨×åÀà°ÞÏ;“í&Ù(¹®ì;óÎóÜÏ}?‡wæŸÿyçÚ‘Ãß5ì;[«X^Þ©U*¦“/Ø†ë7¼¹IÓõ
+UÛ6Ë^Õ‰@ÓÐ}Ö8oäm£2›?6}–û´kØ¹Æ}�WXÃÖ“OŒ��?ùLq´ôÈä£´q
+Ñ‘²mÑëˆ†ödê”†P¡:cjè(Kø(ô5ÑNzŽU™� “¶Y™õæ”ß¸Žnl‹£	DchÃmºŠVÅ,Õæ§MgÒ˜¶	›(VË†}Êp,¹6;F;�#„~²ðæ,WÃ�âûÈÈ°½ìßÈ>Ýú“©¢â\ó,;?Z©Í›ŽáYÕ
+M»ä�/n`�PQìY«ðy×3ç#Ø«aË¬éwª¦ã=¯á®dq}†S·tìÃþ8>€TÐ³lÓ¯s
+©ÍqÝG
+wÎ“Äên$ãLeJCOƒ2, i›ófÅsuöÐî8²Ð+¯fJR¾!Sî˜nÍö4ô¶Œ¬¡Ó]°-¯pæÈWÎ§üZè8ˆû…ó!r^+ÿDµ*ÅYÕßìµ™þpX°†ØÉñÔ)é�‘øàjÉš@"øP‰z]=²ªy	ÁQªlÙ
+<Ì"WÌÞ¨ŸC
+·%›KêÏyŒá‘-g¦·U±Çâ(àq
+ˆbBz‡Y3%]Ã�WÀix#FËð1—|„�;g¸UÇÈºjòžÒq“Bî	
+aÇOqbc†9íœ´í›ŽÅ¾ÿËÐWù´¨ü(ÈrÅNÇÇ1)[ÏP²åª¹”žÙ$Qdk`Zô”5lSMZ2æÍ1§:ï£™2;m8Cm5ïVâšË±q§eÍæ`I«œeïØ–+­žL=Ýj^mÌ‹‚Š†¾õO�ÖÎœ1ÙY"ç
+»f;³nZ0h;påHôâxNc«k.LxÕ)ÌRÐñ	\ˆ16�—caÁ¬Ìh¸=YØˆæ!æ'ñ)�û´†ìû:�š_ÇÏòÄðªþ³õíÞ þ9|^l_^=Hdry$¬í
+RåFŠ(À<´}ÛX£¶Ü.W+žß°=-
+ÀDX2¸<õ;å@h¤)Šoð,¿Õ±¾ÃdõœY±^�²|SÃÝ-²°Yï~+Ž‹ø6ÉÉÈ+ß©ñ=
+qcf¦qô¶ª1AqI¸þ€âƒiT8<|(spo¾!€×Þ*[¶¸©”a9Ç+3îiË›ÓñS‘.üŒMgUfÌÒtrþñ-û\–G¿ä†ÌZ¿ÞdÒ”í±ý­0ªM»AÉû’ãã-‹þ{,‰ùUFuÌÛ(›b\hÑŒ4~ã?²xQ,3{®g8^ àm_À;Âm³`‹?ÓŸmÑæádµæ”Mi'æªõ«~@ B{yB„À‘áÿùÜãoqîlá]Ž«üÅ[ëèy½WyÓ†>þÊñ~­DÑ‰íj
+fÕõ>®âN/cçz·ãö(7Ý7ÂíØ¥îÀîà4-Û¹nKÜywÓ™:ÒÙ:òK
+°NeÐGÛ!�)€wúN`¡îÁ½„Ôd�¬ÚxÍÏ� H‰Öb¯§ÿƒuOd—Ö‘ÝÅõŽ&l=À–+[ì|lÈ«6À~�"C\® ;Õ=³Œ#ŒñáÒeìL¯ 0•{üp|]Ë(&JTv‚;ür¼tó_MvR°ò)ÔÅo¢ö#Åu§´£Áé ÷¤â”8uÑr
+O)î|úì´(óáŽ-T2Ùe|l(ÔªãÙEìJ“ÌÌ"zd�
+çúÃýá:Î�¾*Õ!Þý‡Úu\F2�YÁsSÙë¨-ãü5¼PÇgúÃ½ƒu¼TÇrõr‡ÖÛÑ¾ñæÍ÷nµÁ sêØB–=È�}–úr¼Êóê^òd&ïÃêy–ë9RjO¨&µjm|_R-dãËôkSW¢»�Ø¾Â§!"ÇðU>
+sÿ0¾†Wx5ÌÚ½J´•³ûƒš-Ò:Ì5¿‚‡¦–ñõ‰Äkl¾Ò
+.NerËøÎPè2ô¬¤áûu¼.ë�.ÝüwS¹v«¤&ðÛsý!ÕY‚Ê;¢DôC4Däƒ6Š²1Y¼6zîÅ�¹×Nÿ>¼‰Ÿ¨Vâ+? Y¦�HÝ“‘Áüù"¶gº÷×ñ«×Ñ™Iü¦Žß½�pèJû•­>²À<<Ìeè©Utú|¨�=*“<å+"øRÐË©L;{¸çzgê¸6‘eÅ»ê¨—r‰ëu¬,"–cNn,å–Ö…~Œšçˆ©l‚:KMÍ›j„N¡;¹óUÎåwU&4üUaþí¿PKLÑÍLê
+PK‚³E, junit/runner/excluded.properties]�»ƒ0Ew$þÁƒÕ–¾–L¬ù+1¯RáPøü¦H•&KçÞ{œ¥IUË`;ñàjàUÛÙ°�é'5®oj7�µŠÅ—$\Zy82<CšüfxP2�˜ÿ‘£ÒnÀ==)75è†&¢…êéMkÄÎ_ã¡ËV‹Ðuó-…F¾ý'·-Y‹²3ßÕÈûnì0ÿPK¿Cûö•	PKÊº$-$junit/runner/FailureDetailView.classeN=Á@}+ˆÏ•ÒÐ%÷”ŒÊŒ‚ÑŸÌ"wæ\ä¿)ü?Ê¸�ÑØbßî¾Ý÷öùº?àaŒ.a�d*¶ÂdJ±§™á9[WlcÎ}¡—È›©T±Ú%Y¡s`;Óç‹V¬,¡„ËÏžÌ­øÍ§„öõ¨óR˜0–_Ç½‘gÎµ9‰
+_mÉOÃ-¡¥,
+ÁŠ®µÖ™‰x§îºÿ÷à¤ð¬�PAExU'€:àÐGãƒM´ã>q¹‚ÎPK�ê´ë¿ÿPKËº$-'junit/runner/LoadingTestCollector.class…U[WWþŽ‰$Æ	—DEP¼ 7Am«T¬‚A�6¡¶P(Ø–É�Œ†Œ�™hûúèkxáÁÞ€UWÛ·v­þ¨®~ûLš‹¤‹ÌZsæœ³÷þ¾ýí}Nþþç×ßÂ5¼TèZ.Ùþ¸[.•,w<í˜9»”_²<?å‹VÖwÜ”Â¥³TÑô¼Ç¦_xÃ0¤Ù”–«p1Ýà£MMÏÒ¾�Í$Í³2½|]¡#ýÔ|aŽÍR>ˆÏÝ‹ß”ü‚åÛY…–»6£ÝS
+-+„SNÎ2ÃÉÂˆ+ô…A[íˆ8Ž–8†„B[Ú.Yå­
+Ë]27Š–B"ídÍâ²éÚ2¯,†ý‚íQ„ô‘b‘ôIÛÓK‚¬pz°.¯Eß¥ÃäÐÓÓ™GÑ­Ðþ¦Eç¢V)ç­Ø~Á@/ºbèÁ…¸öšu�­Y[˜]iþ�’úq1Æ”/)œ<´=´fà,®ˆÁ€Ù¸½àø³N¹”{øuÖzîÛN)‚A…ÞšÕ‚£íf¬ÍÀÎu¥†«dItÁÜÒÚâÊû5±bUN:´·xÖÒ8"ÝÊ’�ë¸!}q“1m�Q‹åœ•3ð¶ÙŽw[dõ*°Í¢®5Sñ6&Äý]ºWÉ)´Lo±lûVÆòQîZ¾g ‚¨tÚ}Ê®[glÓ¥ËKÇ}6&=Å4{ð
+œRrŒW¢x(•›Á¬V4Y³]*¸ÎKiÏæ™eÞò3–ç™yKJÜT“�Žá}dþ§)—å4}Ã#<fKÚÞ´çÙù’ ˆþ>–¬f°¨`˜“³7mËõô�œ7ð	–e{E¡»Ûµ6å\ŒÿgÁ*Ûö—7Šr¨ÃƒóÒ|OðYkøœÔ©e°™bønY•�õ@Ñ/Ž{¢t¬�ÎY$W˜j’Ñ“Ã�žnBMG <9X’ÀfƒÊuM_PP÷tºÉ.û¸+¸ªÖW�n‹Šì}’
+nŠjZ
+7›œÅ&ë|È³'†-<W¸PËÙB�Kgbô§�°"÷Ø¢Sv³VpÆºšÝkc„·È1*ð
+¹DùŽJ‹ƒµ€üZøÅ™oƒ³ü�QÛ‡÷Ñ:üí«ûèøÉt„S|·Òè`ÌÚ�ÄiÎŒÀgÐÉ1Ì‹©«ï[z‰ýÐHâÜú¶Ñ?<²‡Ë™Ñ?ÝÃÕmï†vwÍì œ	íj¢ùéq#ànM¾“´Ï¸‹{ç¹Û‹«èÓ$ú 
+	ùåß¥Ò$Ç˜°Äå•Êq\“T´Šyú‰g�0{+3ü3’$vë;”ÏÐî¼R¯ªù'´š—Iæ
+UÀ9¨Á÷Tá{*ð-œOòKàyaWtùžÖ²2' ÷´?bjõ/œ_I<8ÀÜêO˜ÚAÛk<Z[ßÃÂ>>úƒ†KÛèäðé¾Ø&=~šý6A ^æÐÐåaÞ£,ï5Ü '™ýÇ¯Û‡\êg*UêsZ/)éÝ*a«¢Rr$‘
+ý†™=äWvÐÂ‚…wµi+»A£[\¹Mù'¨Ó�:�’U d¨�~OñLÓX¯B®sûøÈ¾j‹òñÀîseŠ9O³•Su`ñ*X¼vBƒù|+”uY_üPK®2HÄ¯]	PK1�‡,junit/runner/logo.gifs÷t³°LTc�bøÎÅ
+`Ü¦À, `ù„,þüa£`èƒüRÿþƒ©ÿ`(þdad`àbÐ)å	Ž…¢2læ–r90aa‹€²“ˆ†á£m¼âI2¸¶*8wétl\rx¢†wÑ�	O]§ê¯+¹¸Äs†FnÞ™™Á©Gûí…'ØX†<sž.¢.d²òbÆÙi^³ï¹4d„Ì‹¨öS�%ªxn×þ¦¯».f]êÒ,—Û[5MýÜrã¥Aº^"y·—&‰îqÝ5M/|oõÍoS­¯.=X÷_ÎÅz[¡ƒ5PK´XWYóÄPKËº$-+junit/runner/ReloadingTestSuiteLoader.class�“ÛnÓ@†ÿMÜ81vCJ)PZh!mí”Ö·E•PD¯¬"‘ªR¹Û8«àÈµ‘ˆÇ‚›T‰à¡³kB7;ÞÙ¾9ìúû�/ßPÇŽö&ydn’G‘HÜ7"Œù(ˆÆ"Íy�	�ö"ÑÁnOøî†<»¯‡ág:ê[*q+�)Nê¶sÉ õã‘0¡£i@ƒÁÐö‚Hœç×C‘\ða(Ö¼Øçá%O¹/�Zö.H¼ÿªø„ä	uh{¿d	iOœ9W?äiJrãÕG_¼Ï‚8¢,;ççqvçÑh¦Ñq‡ÁôÁedèÚŽW™FŸ§B!ÊºLÜÅ†�îÉ,ÿPëxÀÐ’}('Ãþ’fÞV»1ñ[6±Í°šÊ©]ðk5Ý
+‚.)Å¸ºv…¶lZí—Ž§úXdEŽuÛ©f1±‡}]P>^vÔ©ÀeÝô,ŒAœ'¾8äåoÿíž�e4vižˆ
+(K�‹Öí\²ŒìJï·>ÓG
+&­
+ålÀ¢Õ,XE›,½stHµV¢Öæ”þ—Y£7ÅýCmŠGŸX-ÅÚ(T%K~=ÆŽ*aO*Ô—%ÕRÔ)ìe`klÍÀôè\“Ï©ìõ9idDó+6¯np¸HêÌµÛœµûL©Ž~PK…È"”íPKËº$-&junit/runner/SimpleTestCollector.class…�ÉJA†ÿ2“ÅILâ¨‰{Ü‰Asð¨x	BP!¢à­�´¦e2#3ñUñ	¼x‰àÁð¡Äê&nØ
+UÝU_UýÝoï/¯H`k„¥«¾¯âFØ÷}6ÚªwíÉcÅÍÀó¤aDXýB5=EG"î~„ÔŽbp—�¨ÖNV3èÈ’HÙ°�!ZÊ—ýÞ¹�Å¹'	N+p…w"B¥ïÃ wUDXiý§n›�U‘	iQ„©jëJÜˆ†'üËF;•¹];ca›®2(Šß‰4BFú�èTÅÝ&Q°1�)BZùy{xÁ’ªûµýÊ˜Ö©è©Ìý1Ó°š]$Œ™á{Ê“¢gý£€`·ƒ~èJM¦yì¦.Â2Fø/õé¯e›æÛ{bŸ\Æè“IÛlmö@–KrlÁÖ@ìÇØ[È£0là2©ÙJÝ t‡r½¸6Àì=òug~€Ê’Öcâñ³u‰ÛEŒbï9>/r»¬É™VÃ1ú´ÄÊµÂS¿úPK¬l‹…PK1�‡,junit/runner/smalllogo.gifs÷t³°LcdøÎ
+`Ü¦À, `aaùÆ£`}pàÀ�ÿ@ê?Ã0õÌ�$(/8pD0rÈxlXàØÈ%Äç³Â!¡‰…Y^nŽG¡’3¿jZ‹Ç„…‡š$µ•>ÜXr°[ÂrÙ›…OÜ;ùBgÍñV99‹;~UKf`ºËL�ØiON
++žœ¤-û(&ÊX�ÁPK›¾#GšsPKËº$-!junit/runner/Sorter$Swapper.classmN;
+Â@œ—Ä¬ù‚……•`¡…î,! XÒ¯a‘„�„Ý�ÞÍÂx(q-}Å¼�fæõ~<áb‹	aQvua¸êêZ*ž6ÊHµJï¢m¥b Â´7Á+Q_ùùRÊÜ0¸O[a¾>
+rgŠŠgVlÔ>I6!L›NåòXT’}sw½—'}×¡ZKM˜ýYÀØo†¿„ý‘GÁ·ÌpŒÀþdy„Ø>PK'ï\}®ÝPKËº$-junit/runner/Sorter.class}SÉnÓP=/ql2@KÒ´»”N�Ò”A]„@ˆHQJ‰8©I]9vä!üÁ�X³)Ã¢bÍ×ð”óìŠ¡Tµ¥wß{î¹÷]ÿùõi4pK ´¹vØô#×µüf×óCË× ¦÷Ì‰ÙtLwØ|Òß³¡†´€z×fø=�tµÖP6½«€Ôœ˜êØ®µ�ú–¿möK Øñ¦Ó3}[ÚGN%Üµ�rç„ê-�|@­ú¶;dÔíj'æ…¶Óì‘‰ç·Úí“RWº¯Ìñ˜’Ûôñ$
+ÓYË±F–>Y¾Ú®uŽ·Ù* ˆRç1óÏ:f‰1ðFcÓ·¶=‰Ñ9Óªµ¸€Js¸( ŸBTƒÁa4æNl³Ö+àò˜ÇåÎa*‡–xÓ‰¬@Î÷¿,B:ÖK6(ÚßîR×‚¤¤Àü©£c†—d«ÞQjzdïü.ôw£¹®ùë‘-o5Ÿ@­É8�B[Âo:fHžÚQ,²òIAÈÕá©ÑjR
+ÊLý²ãÏ9žjì, ŸqåYÊ¬G’,V)A&ú†bldêºñ"ãì£ü
+swÔP_Q×»¢îCsøCzS‡µn$þÄ«ïPl0ÿ0�1ºñþð ¬o‘¯S4>cY/g¤E!­?l·PâYäßU"ó¾³Üîe�KÑ@ë”÷éy�ñžòn·±€gÍs,aˆeŒ°‚«q×�“ÎèY�Ç6Á\�'1A•Z*ÖjÄOó
+p�>…ÕÇ¸N-C}Ö]£'Å!K¦ë¸A™#Æ<­›jöPKL+ÓÓhPKËº$-*junit/runner/StandardTestSuiteLoader.class�’ËN1†ÿÈ(â¼+^£$:;£qct5ÁÆ}aª–ŒÓéKW>€e<*hâ¦ç´ýÏ×ÿ´}ÿx}C»Ø`Øl'JO'J	í5W×Á…ˆM#‘Fø„vÁ&Ûüž{!W×Þy³-ZÆE†¡ü£~ nˆ!w$IqÌ�©T/²'Q 
+p1œGy†	_*QOn›B_ðf(J~Ôâá%×ÒÎ»‹Ys#c†mÿ?†IRÆ°Uñ¿|7Œ–êú°úmé$äqLòüéCKÜ):d­o¿™³(QAOãbŠŒ÷©\Ì0¸W‘®ó[êpÅ<f1Ï0[gmÙ<Ñ=iÑ±¼Yð÷›ãO3†âoí4¢D·Ä™´WWþã–ölÖáÐC OÁìËÐ8B3�"£8´óŒÑ'JhÌ¥‹9ŒÑXè0Ž	ŠôIP$U‰r‹œN1”9VU{ÁÂcf4ÅÌv]ŒÍ±”ž^Æòp¿tjý´â7šÓ£9XÁjJ[KgëŸPKGd¡Ñ‰PKËº$-&junit/runner/TestCaseClassLoader.class�W	xTÕþïì^Xˆˆ˜L6�2 J h 	
+XqH^`Èd&Î¢@k«­µu_(´.¨mÀ5T™€QÜª¸W[—ºÕÚÚjm­µû*ýÏ}o†	ê7ßÌ»sï¹gûÿsî}Ï|úÀn8Q«f(LX“ŽERõ‰t,f&ê—˜ÉÔìpÒœ
+'“-ñp§™ðB)”­	Ÿ®�†c«ê‡,9ü]Ã©ÕÍ)³'©PÒ¢Ó©H´~©Ù‘Š'¦+Œê4»ÂéhªimG4�ŒÄc,]Þ²OåâT"[EÉâ¦3f·œ6§iÎŠ¹Í-M9uû	Í¦†T8–ZŽ¦Mª2Eo§ÙY×›ˆ÷š‰TÄLú`(u5Ù+
+ž†9SÁYYµTÁ5;ÞÉ­#D}]‡DT×Ë(|(Q™gs]’qy1ZaØ*3µÐÒ¿Narå�žU8e ‡øQ†1La¡-K
+ŒÀ¡~8PAoZ"1³-Ý³ÒL,	¯Œš¼#]NDä¿=éJ­Ž0ƒ[>¹é¢|¤.>4*mÜ‹#dVtÔu%Â=æyñDw�G0kÖ\›2c/NÅÄ[Ó–ANUðÂWDç«|ÉŽpL˜` ÖŠ¨NatÂwfAXîè¯2“¦ˆWMˆtîe›ÂpA .iö†aÇ‡c³^çÑÉ‹f ²ÙÊÜ	~�iÜðˆ$G`ß+Ì%ñn3Y/d=Qá¨ –“ü˜‰“écŒ‰ÐjPeA”1[„ç°Â��MQ³ÇŒ¥öƒ|ÁÊ5Œ@ëž‹SÄñS™ÒÕádk<ajõIÍÎeæa¾¨k¡í\:Iª¬h9h€Ó-’.2“ñt¢ƒD™xp’ÆÌTýi‹Z¤8¹Å¢yv£�ÅX$¬YÂLÇH–XžÞYIª2Ã=
+U×‰×7ÇzÓ)KTp9ÀLV��vœ!æ–1{‘ä¾’-X0ÌÎpì³˜ÓÊô,�ëæª³màl„%×+©œM#‘JžŽvâË~L‚”S’ÉÓ™o6°
+«E:¢ äÛLQÖ’.ªÂU¿,ßª–c´~Faö¦¬V7a¿õ¶xjn<ëÌÉxÑËâïŠÄ:uÝf­ù9=Æ2f �¤¤/eàL	Ê�smmV¾µ˜�µ–{×ˆh<Þ�îÕósÂ©°By!KË
+|_…çûqŽô�alälQ¶…à_ÞØÜ\ÈÇp¡Xÿ†‚‘ þÑs³JFW -²‹ü%
+^[žh� ªƒŒ-�pW§Ä±¼‘ÑìïUcº«Kêÿ
+­­7–â(¯œ=»`-_…«…×Pø\9`tí|¶�m¾×Ëæü¸R:ºÇ:[|ØÄq¸·×Œ‘×5_èì°œ¦Êïáû¢íF¶ØTÜZ3p³4œ+q‹‚;’œN¸ÕÂþ6¢$Œåœ…måëx‚öðCQÑG�DÅÜHÔ¶Yw
+*²M»MwW¯îÝ¾.
+Û3ukÂlÞýœd¸v¹ýÈ*·ûdy}¤×‡T#[›b©9id»†õb§»¤õzÌµ‘dŠì”Ž¸R’�$�º%•-ù[­@vãañ÷Z¿x´R8$ÿ^§òâÇ$Øþ:õqð¤O`�Â¸ìZãº”9+‘¯[�Nå)xÚ�g0�Àœ—ˆ¤hÛ[©‹‚:žÃó²öÝ’s‘"\’®ó"^å?åLG4žd~YNÈ'ðŠÈ¿BHSñœ59þt”?Çë²üÛs®ç.Èk*o±\È]OÒn×�–ƒÍ|8ãiöÐÃZ>36Ê)öQ(*²—B}Óúe‘^½ßúñ¾dÊG¨l|?ƒóùûµ49ÿ;|(:~Ÿ-æd¼øˆ™•3%Û¼çøòã�ø„xs%/@…úÊƒ+|`øþ*.ü-?»ù<ùGY
+à¿üø'þ-;^‘1ó®·òA²hÛ¦aÙANKo8Ñ±:"MÏ‰Û0ÅÜ¦•Ý1Ž™é�³Ë*sÈÐê`^å³0²[qie�Î­üj˜_)Ã¾,ç-zÕp§óìV#ÔHvò}>,ÌÝÃ½ªÄ¯JåìpIK¡«•Cfy¨2UNYuoEöE~�tz¨ÌçJS,ÝcòN$90T@*»†Ò1OÄ«Æ±~ä
+—»–
+½Äeo
+ê05a˜¯—{Eö�Â§ŽÿÇÈ­;é1Ôdi¼“oÃ*èSU,¯¨[Å§ªåê0IÕÈ¥-½2©9.ÇÌÐ1{R¨:U/âS˜Wûhû—4Ô1˜/žLø=^Ê[
+¥wúPråg†Ðw›ä†±¾mYLSà-¡NöãpöKÀ¯CnÓ9ärÏçÁæPÏó;\¯sŽ¯üÅ'p^ñé–”îD`c·kùq2Ç'PC=µÏ‘aIâ0LàS´jkYGÛ"{dpƒž‡0©ÝY2yq»«¤rq»»$¸xj‚Õ¨çú1ûL¦j`*�Gãèêx:vß»& Çò÷8>
+Úx¹eÀ6.£©:<‡¼¶Øn\KM’Œ©%Ç1–Öà Žoé@hfbf{uÍfµõaxð~Ì¨Í )ƒf>Z7ïýdŸSã™?`sB)¦snMžˆj>�ÁIÚ™ e&çÌTÛ�iÓyG‡`!ßÖ¾„E¶ƒÓ´Ã€»z'NëÏ™ôèÄ6æÅéÎ©vc©V­¤d¨Y¾¿š¹Ÿ£†—M[ÍyôÎÉg•óÄ>ZÍ¤¬›AÇ#˜”A×&¸]wmp¨±2�Áš-{ßuÞ•3UN…àûŽóqZàø(,¦'XJs¦«lÓbÖ�(Ÿ‡£1>ãš¸Š·qçj­­ÁêÒmµOÂ]Û/ãó6¡XžëÛjûC®Ú=8B¸ôµ�+àÚƒaƒ8§}_8Xp9®Ý\Ô6v|A"ûÍÚ~ª�±üœc»>“¼Nc¶Ä­Ó!×ïÑ8‹$ZA©³B'&Â¤Û]¨ã‹EVš5Ìk7ƒ�ê�µÍ…Øj‡(£Kñ-Zòà\†o3ULÎwp¹®PÞËûc»n»U«sf7ÇY0„\ƒ¸²½zdÝÈú®Ý‰�ønÉænÊ`KÈ¸2¸}Fpp`kk{|gk
+ÓWÓ¿Á©Æ‰B
+àVI3w×Ã9ët{èå¿sHû‘ä[~ŠK£‰ici/Âz,áúJ:?^'P»›¾wÛøFt Ò�ÎÒH;©ïdÜy%˜ÂJ¾—#IÜ­9
+Î£´µ¼ºd{÷o†Q]’á@³/�oµ/È£vyÎ~9lû¼ïÚz{ìNÄ.]ö´‘mBQ°v�ö«}US¢7PÅÅÜz	é|i^�rf:¥G÷ê÷“I�áq†é�««mú
+î“ÍÄ’í§ZñLû(çx¶��}!�ª%[ËÜü¤F`üY{ƒÛqËÞ�j2x•Ž¾Æï›ý­ª_Û›ÅÏÛC»œ�ó
+&—/+¸šÞ^Ãâ»š¬¼–ýü:ö©ë¹c#Y»IGrªîhsr‘ÌÁ/è5Ï;J¿ƒ_Róhö­wñ+FRÁ¦ükÍÖñ\� º	Ý({ä�w
++NõÿK%mSmJˆºK‚ýMÈ`Pm†[õâýv!ãl¹Þ�Gõ×2¼?„<ÏYx2øó¥
+ÞZü=ä*ó25>gCQ*Èb_YQÀ·»¬¨3ƒÿ4øËŠÊüg7ñáÝ²÷=¦ç¿_¨x+�âþ�¯ÃBÆVãá­ðô¡<4,àzÅ’ÚÿõÁ¾m“é"t“ùy›¬¼�y^DÈ�p?Ù$'Ø€ùï&y3Ã¼…´ØÂÝ·q÷í¨d‚èÃÑØÊö°�i¼ƒšîb¢ïfÅÜÃ†/+¦ŸMd;Óv/kê>ÖÒý´¸ƒÖ2´¶“¯‡»¨íjº“šÒ@màáÌ„æ€Ú–£Ü6›r|ËÃ§ØK Üôã%�d6+E@ÝôË¡ÊIú�µÊ¥¤±œÌª\E/¼ôlª®Oý›¢<œ+¢‡^
+­Ÿ~8”—{‡ÓÆ”ìõ@=FýBžçòÏÒÎ}(•s�ßšŠcxŠnPªBþìÞ²÷Ã`F—gÔ¨–ê=pmT¥íjtkMuF�éÃÈ¶­(ÙrZn­‘!Wµ�“g›«&£Æ’0‹kw©‰
+º\¥Ê:“N”jQGj–©Jy”ª î%·S&k]�u´%P{"ÝJ6Sß±
+›÷Þ±�Ùkdç™G¼yf-`|+Øì»rø¯áa<J4c{xœx<Æãÿ	ÞFždgÜÃ‹ÁSÜù5<Ç#áyjx�^¤†—xX<Íý/“C¯à|¼Êfò®â;ßF¼Î¾÷ñ&‘‹_Æ³,?ÁýL}zÎÆ}Ù'ÝSÑÞFuœ’«V#.S
+êxú7.�““–,Ä<<PÎäèÎ��&5M÷Û«xY¹G÷[¥BÒìÔôÿPKZ‰Ãù?PKËº$- junit/runner/TestCollector.class;õo×>f]NF©¬Ò¼Ìý¢Ò¼¼Ô"ý�ÔâçüœœÔä’ü"vFF�¬Ä²DýœÄ¼t}ÿ¤, 8;3#O2DH}1#ƒ¤†¦X]iIfŽ¾k^injQbIf~ž5#Wp~iQrª[fN*#ƒŠz =lŠL, ÀÈÂÈÀÊÀb1°I&PKÅsõë�«PKËº$-"junit/runner/TestRunListener.classmPÁNƒ@œ-ÛZµ­1ñâ
+Êxj$’&@{5k»i di`ñã<ø~”qk´§Ù™ÌÌ{û>>ßÞaà—×y#3åU�”¢òRQ«¸‘QV+¡¹
+Æ0Îù+÷
+.·Þâ%keÃ`$é<]&Ï~/b2KY+.ÕŠ�0J�:_0£eì“ÚÓªú”(^)±a˜¹Ñ~L¢ªLnÂÛ•žÓ9}¹!Ÿé>‘ºÏ—»é'$ü´M´Q¬O®®É¡wÀ³‚ˆë†ÿ‡;œ¤lªµt�aòç`÷±nÐƒIÅŽ`�ÁnÙ±æý_Ü�eêÕ141jñ´Ã1ÎZ<ïð:)¦mvöPKC {íÅPKËº$-"junit/runner/TestSuiteLoader.classm�MŠÂ@…_™Lâ?.\ºPPpcàrÐ•è"^ �…tÝÒéÏæb0‡¦ƒ ¢E½÷Q�úý»ü Àº„Aî”´‰qJ±I¶\ÚÔIË+-ölb¡—‹“H
+¡Éf—sfc„°ða2]ÝíÔ©óÏé»e9'4çŒ�VjU†OþZÛ¥vjcbÔ	‘ákÆxúrðmDª�Éx)&ôŸ>™U|4B
+!ªª…„D Ä~ýlx¥‰Ö£â»]±èüPK¼ÔŒðÄ2PK®»$-junit/runner/Version.classmOMKÃ@}“4M­ÑÖX¼‹—V0Az,½ž‚*¹oÒ¥nˆØ&þ.=	üþ(qv-â.Ìç{3o>¿Þ?àã“!ŽBÄCx"ì!$L¦³¬Ï"­…Þ¤«Ö(½¹&øÓYNæÉUrIè/”Ví’Ð»iÖ’0Ê”–wÝS!Íƒ(j®œdUÇ�ÔtZK“æÒlU£yPœ5¥¨sa”îÐÃUÓ™RÞ*›D;pbe<µ&Œ%Ý•,[úßVÔ>ª-NùBöyüù0ðÎRöÄ>8CïÕµ÷Ùö]1ÄÛè€cŽÀÔ±ëZò™ë~L/¨‘£Ú�„C�¾PKëãY›ûhPKËº$-!junit/swingui/AboutDialog$1.class}P]KA=×D×¤«‰ÑúcK4¢ß
+-EÑ
+¡
+JÞ'›1NXgewÖàÏü€>øüQ¥w&ADªÃý˜sÎ=sŸþþyDÛøLXégZ™ (ÝËT°ß‰3s¨D÷ê»ˆPî‹+DB÷‚£N_†ÆCŽPu]10�¼’Úû¡Q±n©ÔH-ã„	s®Òz“G´Þœñ•P8¹Öæ\2å›bàwÂÚÆ;œÍ6!w%!·±ÙöQÄTyLûð0YÀÊ„RKiù;»èÈäTt"ÆVZq(¢¶H”­GÍ¼5Éßy{\}—M–„ûß±LÎâäBv	5vø¿ü°¹³Xz~
+yX$x]•^Æ©ô±lM/a…@ìcõ=5Bñ$Î’PþTÖsù…»K#ø¿4¯ý i*S4yyð:ùVìN8`Ïß">písö…k×i< ÔØºÃÌ�ÃTÊ¾T�Î,g>GÛ�ÃGŽ„y,ŒTö8Zìdã3÷X}­QcëNc~ˆiØ¬Š5Ç®9Î:>9ÖP¨üPKìW�©PKËº$-!junit/swingui/AboutDialog$2.class}�]KA†ß£Ö¦­iö]¦]x‘Fmt‘XR Ýv=êPÛnìGÒÏ
+ú€.úý¨èÌ(Q.,çcÎûœwæãóíIlb�°r{*rÂ¾ò®båÔ;~)áúW•D(Þˆ{áˆ~äÈ{éEÎ¥òz~¿Þw‘,$	ãÑµ
++ÛÌjýÛ#¤Ï¼èZFªË’}Åƒ„ÒúMµMH5üž$$×«m˜Ì ÛÆÆÓH`Š�k)OžÅ·\ˆŽË³…–ßn[J×ÃfJ›$¬þ¿®²Ã&³}s½†ë‡<@(³¿¿î¬sc0÷}>ÀX˜'X=Þù¡´±¨-/`‰@ì¢8ŠFÈœûqÐ•M¥çxÛÒ2‚}êy2h¸"eˆm~€¾±~Žô—ài®3œír­;™Ú+²µ�gäÍL^÷ÌI“)„iÎlŽº[ÀŒáÎbnH9äh¸µ'ä^°ü›qÂ»O
+c~¸ÀÐÙ
+ŠF½j4%”�jÀ
+_PKïŸ„yŽPKËº$-junit/swingui/AboutDialog.class…Wù[×=3Ë6ÈŽm“¨‰ã€XdÈâÆ8�Gà.Nët�i1CG#0N—$ÝR»¡{Ó=é’ºkš¥H4J“®I›&ÝÛt¯í÷õèOmÏ›‘@Lýù›½w—sï=÷¾ÇKÿyæ9Ô¢ÿˆœÎ[¦ÏÍ™V:oÆ{'í¼{ØÔ³vZ�ØvZŸÕÏøÛñc•�Z%™Õs¹=ûR&žÕ)Ñ/{‚£ó–›1\3)PÐ¤‡×	ìlI¬²6àèÓFOë¸@ ßNÛ}�¸>çÆýÍ“­ã!¨Ø¤!€�ÀÖåí
+’-¡œáŽ9ó¬>™¥‘@‹§Ô€F
+[Ø’6Ü~Ûr
+Ë½C·(±£¥uÅ�ÜÑMËpzBØŽ+¤£YÞ?ê˜©>=�Ðç™»j[|PWjˆ I ¼Ö–‚fæ€¸|5�¦ªÈüµ!ÝÒÓô*m]�¨†«ðšÕ¶¦gl‹˜\ËlÓÖ¨y–àëZ¥ÎuØ«a®çŠW3­*ÅÆLW¦áŠ–ª²Œº3îùjC»ÌKGu2O˜VÊžS§šm'u×´­#Ë÷¬1f/×n54Ï`º5ìÃ
+W®¦Ò˜‘sG�¬‘tm&ä&*IÃñ½…°_*ÞŒ×^J²¾¼ëÚ–‚­?kçe¾‰»¤QÓe»§KÁ!�«ˆõr"=~íú4ô¢_B®òÜ;™s=éV!·õTª7)“‘0sd�á\S•
+c–!ÅWKx.Žâõ0(°‰ô±í2÷"eî-G[Ù"ýnGBÒoˆUXWDÁq�è°1¥ç³eœ».é+ÝƒñŒh¸£ef-‹$ôI#«àN¦øØ�L•ŠÆev7¯t -Éw’
+œòR§âM+<¨¦•OH§4Ü…»ËÍ³ìªŠÈºOdi˜€ª›Ý.“)‰”†I•¬rÓ—Ÿš’�•& sT…©!#Ao÷ëíä-æ?>n89S0+Pc¦ä\i]‹:¶†iÌÐ >3cX”l_¯kÖ,ùPhÁAN"`4ÍÑÉùèíŒ2Úg$ï‰êV*zÄ1“™èQ}zZW1Ëætm_=„3ÒsóZÒ1t×HØi{e0­.ýÜ‹·i¨ÁÛ%ù/Lœ9’µ¦åæ¼SÃ}r$Õ¥¹yF@†ðÞäê»Ë«ó!¼×_yG”\™3Sn&„÷û«çˆI®f3�qCø€¿ü�L’•ÌØNô—>ÄQÈöh]w6TeíøäiN¯ÀÁGå¨ûXõø´H
+¢ÿéÁéV¡Ó'5<ŒOÑ¯éí/4+*ÌÌgðY‰åsŽ…n�hxT6¼lhmÔÐ«%<à_Ä—ä˜ûr¥^`Ãöh>™2ÜŒ�:â8rÎ}…‘%xç§'
+gÌ?“Âr¤fÇuÇ”¿Ë‹7c2ª¦
+†ƒŸÑC¶ËöõÎNV˜†š ¢L]RNQN•uÇ}d%ÍºÖøðÙWÙï&â¬GÓÆä
+çeÕæÄÄìYG‡æÂUk>j¨¤»®êP$ûK•wú}ÞÙ§çyÈŒx?U|¯Bª•«ˆ‚çIª)Ûfº®û?íí__Bø~¨áûøÏ’êÔzÛ¾vÞªÔû'åãË—Ë8öœ,¯‚e#î�‘Ëñ ág²çŠ—4¼ G–*sÙ™6§T¼Â¾öèô£RðKFE;ƒIy çì¼“d û[Ö ¾\d•rJí×ø�†_á·Ë7„Uû~çý^žˆ^âcØvýÐÏ$�×±$+Ì¤<…Âk­1£àS¾¡ŠÚ�R˜W‚A¤gÜÈ!Ê*0;²è|+�ÿj¼• Ÿ¼ÌU¾ÅB¬-PÄæXmÛbì,!2QÄî®‰5Šc�8W@K,Ì�ÎX[7^€:[Â-%ôL„o-â¶¡öz'bE.àÅ†Û+a|"üÆ"&†;J¸k"üæÚ†=E¼¥€)¹SBf"|ºˆ{–ðÖòá9>
+8Kñ�H ¢°ÅW Éw¨+á>¢ºÿ@}¤¾~ï‰Ô×.âÁH}`ç½çB¤¾A[Ä‡e‘ú>^ÑP"J�ÔPRC~Ÿ÷¾"Ê²F$QªTÔˆê©ÈçƒÞó|DõTTO%¢–ððDƒZËÿE|zŸ—FÚ#j•�`$èÙz@ƒÐ g#¸â¶.¤J¬„Ge¿PÀcO²:­¼váëõUVíqÞ5�-¬c6¡‘—å0®Å6Jí ÔNtc¯M8„Ý¼Œ5c�ï%Æx­=Åû­…ë±€<‚C;íuàt²}âx…£øUZ¸ˆð/Üˆã&ü7�×Ém¸E\ÍÛczD7ŠÃ¸Uã6q‚wÃ$z…�>1Ë³à~^ðÀ€8Ç÷Côü5¢�!R2_Ç7$ñøõM|‹‘u“—�ãÛŒìm=�'ùuJìÃSxšH-à;ü
+ç?±È¯:J_DEF‘ßKüRˆì^|—_*±ìg,Er: wŸÙ°i«†ïøSxvâEì>~n	?žxÏ^ÀÖ^8yw?/âåçÃ¿XÂï’‘mE¼ú„×›ùçËŸÊ©×<3ÃØ‹ã^X;|³å°öÒíŸñjÕà¯^{ý
+ç;Ì¯^¯áÂ<,½÷ÿPKœí¹
+²*PKËº$- junit/swingui/CounterPanel.class…VitW½cY–4ÙŽ“8qm'éâD–Ý8iÚ8Mˆ·F‰,§±ãÖmC3–FòY2£Ql‡¥ÐÒBËRÊV(ûVh�ÒM²CYmÙ—R¶rà7œ?øÉî{3–e[>G~o¾÷½û¾w¿í½üŸKÏÃƒkñgWœÏgL»;7cfRy³»/›ÏØ†uJÏi�çõú¬³Þ}Â•{Ô'cù©	ÃNXVÖÊ)Ø]¡:jÌÚƒ¦‘Nô(ØPRÔÍtÞ2¨,ÉNç3üÖ–Ö"ñl†ç®@2â¨ÎaŽFMr4këiJ„‡M^ãˆO¨cLAu_6a(hÝúŒÝ}“e&zõTTŸËæm6h¨C½ŠFlTÐŠ–ô…!=£§«§cLèmVQ�&
+R+­Óžá‰óFœ8[øS†Ý—Ös¼ÂÆPGtYG
+{4\�Íh%
+&
+Ïu'�{îN™I?¶‘¸•.5r6)É–;H4ñÅ…O¹lÞŠóVCkN)ŒØqz:Öò§á*\­âJ\£!5€*ì$¾c”!ˆuL
+i¨u–Ã´9nºmçíé¼ãOAX¤c=gkèÂµ*÷îÖàE�@Ù£ÁçÌöið;³×­Ž¬¨>!"ë:^‡ü¸žþ­½XÄqÊ!Á�¨/¹.’ÉvÎ‡øBþ9ŠGUÁëôDb4+â@Áž2�÷e§¦³#c÷ˆ=ýý‘Ht¤ƒ^ô‰[õ×}eÛÂÍ»w;Oq"Ÿ¦Wª`êZ¸6�ÆŸ¤MKé@Œ!Þ%jf'+Fõ‰´!² ×ÓcºeŠoWXmOšŒ¶Öèú©ÛãÆþZù0ÂŒÙãÇ£‚ÀÆ×)ËH2ŒÄˆyQ¤ÍRúÍ)#“3eüÜŠq±ë¶Õè%}¸CAIb:Nå§¼-¡Jp‚Š7àNgqÎÝ¤Ï.mÒ0á,Åy—Žg-ób6Ã|?–6SbØ$"$ù4�V¥ÖdÒˆ­Ûùœ Õ“l÷GûïŽ�
+ªK
+–w{#ÒœÇýÊó„�ô‡V©‰ã²˜Ç½IÁörl2ìð\ÆÝTK´�„i»¾Ý&0ò¸ ÂÆŒ‚ærŒÞ¬•0¬A=ng­9æJé705mÏ9«
+ÚB+³oBÊÝÍ¼É›ññVÞ˜g/íÚºÌ&aÓ]x» üÌÀ3aOrLºù¾ºŒö±bØ–nfD¾Ý«â>QF½).Îjx7‚Jîw%sÞãHÞKƒ„D¢kx¿#}�e]H'
+35ikxÈ�~˜‘¢YÆk¿†ã#BþÑ’œÀsdgý×3ñÉ¬¥áÎöO’ê¤™Nkø´#øuL™Î$uM†kø>/Ô¾àÖ%·40àLYˆ¿ÄÎÂ¢ £béˆ®n
+’Ñ/ã+*Åc´%NU›*íeˆÄ—ù¤{£—¡›Ú^ÖƒÁäY5Çôtž¡ÕZ¯&Ë,yO‰ö´M0R…gÙ»á6QïE„+°‹Ù´º¦õæ“IÁÇsdqy-ÂÂ“âEbÚYGUÁæ¥>±¢*jøžWñM|{EKuV}ø.,mN*ØªÀl%Èïã*¾‡Ä¡š¡¬º?Rq	/2šºýxY„Ìô´‘¡K»*íX#rnÎ£~‚Ÿ
+ Ÿ•õÁuô~!ô~I·‡Ö¡á×Bá7NÅîÒð[a¥�W÷Êãº¢^T%§]¸oZxŸé3"ƒ¦(0ÊÛÀnq*~0@
+G¶dÎªDC–£ßù�c­;2F8 ˆwÿ7Ê_ù\R8Ö‡Ñ8>�MóØÑÖ¸}íìr>:äGg8ìŸGw{—&ûÃá†€œ ÀÁñÆ<ó8ìñTW×Õ5¨žE÷ðoÇŠ‡ŸÅ�j®mÂ W½rµÁ_Z–*uzçõ®)S£ÂÞšÿƒ£Ò.�â»Ê~ÿº(OIÂ†ùÿ	tòÿ&’X‡­¤­›±Mìõ[pŒOÀ^þ¢|žFÎ çøGüMb¦±9ì`%nÃÝ|¬ÝÃßC¸ã<B´GùývâqþžÀ.ÂsèÀü~‘g¿Äß«|½Æ§ý_xòßùýtãŸüý{ðoìÅ±O©E·R‡ý8Ek5Ç¥¸™V‰{ðõæ¸2h<,bt¼q¬e·uuq{º;&º¼ELv=�LV—§ˆÙ®¼­ˆ»»ž,‘rc¸Ž¤\��¸�W?Ä+öÐüÃ<ìFšqD²Ã9Ì5DÌîa² !ŒwÊØUÄ#Ì�ÅFj×Q+¶ˆûŠï:l¶ð@s°­€÷57WðÞ>ÔÜZSÀÃü<B¡ZÀ§8ÔðÙæ`³VÀÃ�ÍÁ"_vå>ÜÄ8NGFèÈtØI:#J{†HdŒ÷ÆQÚ>H›‡hµ¸ÅE¹/VºE_Å×Åœ±1]ÌØåmc¢	ÊÜŒ‰¾Çì3v:™•1Ñß${1ÑÖdfÆD?#'bÆ–ñ’À×‚«o,å*n'¾8õJ™ŒÔgd/MÈ‰§€Âò•›äñg8ÆD¿…Žº•N_ŽçZ
+#/ét„»Å¥jÂ-+ÐT)½ƒ˜g%B“£U"¦óÒd%¬³¤Bhµqi¼eßYÀçñRã�‹ø9Å…"~UÄ+EünõQç˜$zÙQí¥£ÚKGý¾tT/ùZªä‡±ýÌj¼‰0ÊðÔžZÂûCe¼ý•ð&‰g^¯Jôhï$¿D„:[ÉA…ë¦Se‰(ÁðG²«ÈÙ¼9’»_ûPK«É×2ùPKËº$-?junit/swingui/DefaultFailureDetailView$StackEntryRenderer.class�TßOAþÚ;8O(…V+TAÛ‚TE�PÂK±±¦Ñ„’>ôm{¬¸¸½kîà¿ä“¾@âƒñÙ?Ê8{­ ã%»377óÍÌ7“ûþãËWŒâž1lF®ËÁ±t"YÞoy¤Â—*òÅŽIiIq¼Ô¹óþ…úv…»/|á›`‹‡üˆŸôÃ7dV…RŽ£Æ–¤<Û£…b‹!Qõö…�$	Œ1L6¤+^GÝŽð÷xG	†tÃs¸jq_ê÷�1¾“C¥ñßeWæÄP‘U¯Ûó\á†Û…Æï]½Ò®•ØTVœo:‡Â	+õv»Ø·òã°|Oø©ßfè†‰ƒé‹žâ5‘-T«ÅÆŸNiL[˜ÂŒ�	Ljb²DÃåZxG(7	.áž8¡z3…a¬bËÆ-ÌZÈaŽ^Â8/ÕÄm†	�ãyjOö4œ�yvD¶¢Î¦¯ ƒ!yÄU�iˆ«KãUu¢ö„�ÕÉ ƒ¦PôQì“¡Í`;DþKÔ<'
+ô\ãVÒÃ��»Ã0s5ÓVÓ‹|GÔ¤Þ�üß¶`MÇRÊºëÒ A)—ÿm…L¬S]Ã{D<�Ð„ô3B‡64ÒÊ$™¶”Î0þ9þlÑmÄÆu\£Ûî;�¼N’éi‚?’ßÉÒê7L¥ÆSó§Èl¥•œ‘Ï$2É3ÜØ4K9ãùø¾›3?�gÈ"ðœ070‹M, ‚ûØŠ3îöQµ¶ˆ¥¸Šîa9n¡DÞú/h­H'k+t’•Ç*ý1BžÄ5iRÌÃ8÷#<&iÚžà)Æ~PKXÀ`a`PKËº$-@junit/swingui/DefaultFailureDetailView$StackTraceListModel.class�TÛRA=“â†KB¸Š\L6H¼rS£A bÁÛ&`aÙTíN€²üÀ´J“*©òü¿@íÙ]CŠ‹eù�ÌôL÷éÓ§{öûÏ¯ßàÇm¬1ÌìWL]¤ícÝÜ­èé%¾£U±¢éFÅâK\Ð&¯óãÑ
+¡6-­Èsº-ÖÊ%nÁöµ#íÄ�O/lA.¢ÁÅÏÐ¼“ÓMn3DsÒ9]º‘Îó¢([³t;§�"™gd(NA¡03´Ÿ�	B!·D6™—n­aDÐ¦ 	Í-ð¡ƒ¡Mf{U9,pkS+\æ-5#¯Yº´½Ã€ØÓ‰Ó\îÿ öÊ.Ë?ä¦Xq¢åih¤ÇzaŸ(“[ÿã£ =’sC“n–ø	Ë2	hCÃÈØd(Â tfÙ\8ée–†Â"æ³ŽvvQ3Œa4LRŒ3Ävt‹gÊ¦ Ôvf�Üy‰¡;q‘bÖ‘3�¤T]%jÂM½˜‰.‹×,†‹–�ø¢axØ
+Ò²qÜaè=kœ¹Y>à&UEœbð…#!ÜcH\RÌÅ“m·ÛÂ˜ÆCÒÓä'ÂÁcèL$/ú+xŒéLtýZ©tN4¯êä¶‚y,HÂO"{š½V¶¸ƒk;� ûE<“8blS‡ûsW–E©ÂåŠUä+ºœ°�«fiRBÐìdM“[C³mù:ÆÿmƒxA�½diV|Ô<€˜Êç@;ù£—D'-´[¢[FkT­ášzŠÈV{g
+í_ýD§>Äè¿•¾ ]�è µ“,Å�B]z7z<ÄyŠòÑÚ¢~F´¿Šþ�u f'¨Ûèr�<¹»Žºg¸�AjÊ±��„ªbäÃ9¤þ*¡:•›õâ×‰²ÌSS5ÜRU¿‡SEê|uƒ¤ÎÕ3Ü@.V'Ã}%™Éºr«žrqôî_áGIò1‚o`÷à}òqz o‰†ôW=ÐSLo¥¢÷ý5<Z{�6y:QÅ\O_Óºôî×�³L}Nk“”I%;EØ¡5IÔeÖ!¹^”ê£Ž,cÅiÛªƒöYZÃÎÐ¼D¡ßPK˜±¨p0PKËº$-,junit/swingui/DefaultFailureDetailView.class�TkSÓP=·SB”—UQÄjT|RÄGK¡XAÚZAýÊ‚!q’ÔêÏðŸèŒGf¿9ã�rÜ›¤¤:ê‡ÜçîÙ³g÷æû�Ï_Å<gÞ¬˜º«:UÝ\¯èjš¯iÃÍhºQ±yš»´(é¼*�1tlj¯4ÕÐÌuuae“—]	Q†~Á®˜&·ÕžÍÍk9Ýq:sâµN�‡I†C“:!L1D#%†¦”µÊ´@–Ñ…¡=§›|¾²µÂí¢¶bp†£9«¬%ÍÖÅ>8lr7t‡!‘û»”(°²ÎÝ”µõÒ2¹Iìz#?U«ºjxžT !Ö‚ºŽà/¡‡aâïB\­ü¢hke.\Rž†„c2â"Íã‰}ê„É‘’Pã„Œ^œdh)f,“Â÷“€i]3¬õN1ôú(~™
+®MPÉlÖ‡8-cg(Ñ}Y„™J8Ë 9ÜÀ$r"·/”Çã2†1BÝ@†nPè–)ˆR^ 1œ\/Ù”tG§úä­jÊª˜®Õ¿¾Äpë_d›6]ûMž›«Üæ¶„+2Æ½æ )nõ†Áƒ:î5ðÒ¸†ë‚Ã
+†VgÃª!NÕ»gÍÖ¶xÕ²_¨EîÔ)%E{Æ¨i¼º0L‰†ùïÊSc%1)ScÝf8ñ‡°îÐr…3CW½I÷XÁ=Ü—q©)x�÷5‡¨¼·•0M…£2ºá’«Et¸AÓ43ƒYdIÒ=ðînäM"?@N´öCjªµºÀ}Ô—Ò,\³,Š×Gž!$|ð]ýŠ¢Œ�ä‚U±ËœòA~W†‹ˆÞ}Vˆ‘24ÇáôÇèlPêÝƒ]‡A*VèÁÑñ[ ±™Öô¯¢±•v*Íâ®ytmïiÁa}‡6´Ó¨øèÀš):ç·�ÝÂètCft½Ë;ˆ/oãø6ú>¢[\ì``ùè`´CÙÆP
+£â(ZÃE1Çj¸ì›Œ“ÏÕnŠÝ»�F?qÒ4N“¸œ§‚^Å,&‘ÅÕk—ÞBHï&z3„¡¹�r›«!ý	s5Ìïf){×yZ<¨ß<€«<òZ» 5~E["²Ë{ˆÅ´ˆx<Æµ£Ud[Cé+â»9û’>ßÑB<ñÆ%
+*C„4‰à)…§ùb?PK­V>x)PKËº$-$junit/swingui/FailureRunView$1.class�Q[OAþFÐÜ*Bk­RC0íê›I›Æ„xKˆ&Åð>À	Y‡d/¨?«I«Iüþ(ã™�>èÃ¦›LÎe¿Ë™3OÏ‘Âl”F±V‘Þ(=ˆ•w"•ô3ÖE7ÕB 7’éùR¼Ëîˆz‘ƒ”À®éÞN™MHG^K…Q›|F¨±6i
+Ì,DCV÷Ù¯•døM Ó¾ÓÑ�"ÕcÖwÅØ•Z2­ÞH7Ç}HÕêY¼Ë"�e3˜CN`¥¥4]Ä×]
+®d×gl¾5îI¿#eêY3mF(':VxTw"ý˜šC^õê<dòJŽMË[Lw°ÎâýcRßÅ†¹Ð'l
+žqçÿœ²íqôèD™›^Û|5lt®ù•š¾C
+±Ï»JƒWÏ'o–Ç1óÍñÉb‰k—³C®m§ñ€•ÆÞ¬þ²˜¼E™?ÇV§À™ËÑtßãG�5|œ©q4ØÅÆo¬Þ£øVã”'8³kSÜLÃdŸQ²ì-Ë)£bYS= ÿPK8§’åPKËº$-:junit/swingui/FailureRunView$FailureListCellRenderer.class�UkSU~·M¶[ÚBÓ6,–.©ö‚&ZÚÔP0Z¼nÂ	]ºÉÆ½Î8ÃïðøUg40:ãø‰þ(Ççì¦‘@ê™aÏ9ïy/Ïû¼ïyó×ß¿ý�nÌâ;�;;AÍò3ÞžUÛ¬Ì²iÙ�+×‚ZÑ’{ÍcÁòü%iÛk²¶%]éjã;æ®¹YfÈŠØþYÅn£Òt“/;5��ÂIC%Ë	è•‡®ë¸‘Fß}‹˜ºSSE�ž%gKˆ!®£çâ¶cn)UÏÀy%íB¿À…‚U“OƒjIºfÉ–*’S6í¢éZêÜöøÏ-Oà^áÿ$N¤úŒmûjiG–}
+—bÛÒ_²M�žSS…uBaÎÀ\Õ‘À5�K–Bž©Dæ¶­J×®µãÙ�žO05Åá0“£•ñšôœÀ-3�ùÔ™('ë¾K?¹©³\x
+7tŒ`Ô@/úâ$ïuú�@IU„Ò„-º¾)0Ìð§¹Xrªu§&k¾ÀBª-Î¥zMDT.¿¹Ù¤ÆÜó3-{BJaJÕ6-0ÑPqÍªÜsÜ!Íjh˜Q�ÂƒÜRb’¦¸î`@—sÈèlñ[¬�ïDt\n«M“$oá¶*ÎVWî—eÝ·œÚŠô<s›}wO]Îb^àÊiÓÅ RQz§­-¢;
+lm×´¹Z¸™:ËGG,ïbAÇ}¼'�Hu(hQ=„td±( ²1<à{1ëuE`¦“ÅQ„š¡–ñH9zÜbÝ
+.³hzòdÿ=Qò®lúòT&¯B÷¬èøOUR·¼fÃ‡½iàc¬)f×ùRÛÛÇ,I[Ã'äÏ‹Ú¾EF[++2>Åg:ŠxénÈ}ßÀçŠ "¾hV¬å·Õq¾èWúŽcoXõÈìeö5LÎÛRÝ5Ø¡«zÃš¾œcmewV9«ì<_È>Ë“§ÀòÖ¥ÍKÉúˆMNÃ2ßÐcÓ[vÊ§…(³+;=
+&TyI×HÇ&o²™S3�	´#jV�TW=6¾¾Ž�eK�ÀÁöa7§¬,¯ªNI`Ãÿ55ì
+\}Å�Ä(‡FÀo—1áN×nþsŽƒ€¸Ëq\ãéCé.üª^ä·?T½N7C4Æ%žŒH„ú;ßr´Bmu7”¦—äÀÐÆ~Åxtx#<Lžv}ƒæ£0vÂõPÓµPó(r-æ‰[…8HOÏŒ$z½‡˜ÎöÍü‰Ù¬–Ôx³�»Ù˜Ú½��'ãÇûÙgÉØÞ?ÄÒÀÃòÉøV¹6ðQ¤¹ñé_0~Œ‘´ZØüÜMãœ’LR’NÆø2ü–’}?µàg™0Iø)‚�â OcÓÜÍà§Þ*2ìý[09Õžã6ê¸‹]±ï1¦Z‰Òi±x€2¶Âô yÛî¶iÛî,ì„Å<Àîz×…�*iäZƒÃÒŽ Ä8ß²R||.wêwÃ1û¸êŒÐ…=ì#öPKs*œ\~PKËº$-"junit/swingui/FailureRunView.class�VùWW½/,	a„dTÐJ
+ÄµÚ‚ZDic-P*­ÒdƒÃŒ�$ Ý÷ÅîûÞÓ?ÁžSCÕszúsÿ¨žÞ÷fH	´œÃ$óÞ÷îw¿û-/ÿsïOT ¿ìZÌÚf&ž^1íù¬ÖM+ëãY{Ê4V‚‘E}Y�[º=¿8»hÌe‚¨ØY|nÒHgò‡ª´”�4b¦3
+#ä†g¿ ûjS<2äØãmöŒ”…ô÷i^=`rÿ´ÀÞØÖ¦]S•CNÒ¨ˆuMi¨E]•¨×Pƒp
+Ø.°½„Q
+%z#ÑHÖóFÆ.Mb]E±I Qº¶ú54£¥MØ)ÐÛÄÈc×ÆìÒDH²Û#°M‰®¯dâÃtDÃ?gê–3Â>�fÏËÊDÆ%h"á�íc/:šŠr–®;¶!±ÓŒ�ÀQiÍ•bÔ…î0b8ÈäÓpÂ°˜uÓ±G•¤•1å¨}’u\àØV%´]–5nØIÃ5Ü ‡qõõt±~ÇËïµÖ(ŠÇp\ºˆðü”™6g-cÜYr²vFÃI�ÝÃ,«-Ù¢¿LA[ùY:ÆX~-z2)9åu‘/†-™÷37–)x¼¬­Â|ƒ’åYŠ0bÚÆXviÖp'uFÂ°Fœ9ÝšÒ]S¾û‹•™3]Ú*è2¿sk]U?¿–@#)‹™ôeÅªã)W_2V÷š*s‹¬3NPìª�žÀˆ$:*¢‰*]
+Ñ"/	4–-î Æ9hÞ2–(Ä �7²xF6¶Ê$žªÅØ¸må¸ùqY œâ‹Œ†gp!Œi<+Pez„E‚ß—¤¶É&]G�R¢Àî²bøiÒ™·e=CS-c¤óúhHÊ©7ªYÌ§Gqþ/pqÖH^ÒmC
+¥æ¢Í‰9×±,¹„)'I¡óÝšïêka,Âòô²ô4« !¶^JµH%m8rÖ]gêMVA:n¸®ãöÍ›©X¡-eç›-Ò¯–O�i'ëÎ1´±¥£§xJYÆJY0%¡µqÂ‹d0¹`tXÌE‡“êðrÙ!…åîË%*èÄ«£eÆ^©ër2–áLYçñz¯á
+6Öuú`6Më.�ÏW‰a!•4¬QŠK*²‹Kèq¸»º5¼V‚;cåR–Laû-©áCo¶}Ä¿Y#kú¬“ÍL:ÝeZ�oâ ì*sŸµ<çUé¬)¿ÚUk¬ï­Nðjt³ö0/éô‚ì�„ìÍ¾¦
+º�ä+jŸoqKÞŽßQÙ	UlÃ¦q
+ÅÃ¬OêÇ€²FUýÉ[·y“[…7_€ÅOÆü„¼O!ÿxëóâz-4>·ñížo3Ó½ŠH÷Á;ˆvßÇŽéîß½‹V�Uì¾ƒv¾¶ßÇÞéèmæÐ#—*r8äm™^ÅÑNÈ·P�x«ÓD=“ÃÐoôÀ9>ûèè'»ò9…Ý8�C¼NbÃ8‹1Z�ã<'Ú9\åÀ=Oë&�!÷SqÌàqFÂ'µõãxKE�žshüÊ_`·½×'G{ÚîâéþÂôXoWnç	µRÐmˆƒ|.¡žî›9ƒ÷qKçÝ¬ï<„vÒš¡ÓfDðž'Ê>TAÇ,J
+Ì¡Î'tTªºsHâ«X.tZÁkž‘/Ø‹>ÀM®J×�÷±(óÑiŠt¬bi”€/DÓàæØÁèK½=ÑWrx³à ª]!»«ŒmûÉ²Gg^ÄNJö6]EÐˆwð.O·25ïá}Ç¸åÓäŽ¤\ã'üã�±ÌR”¹uyªÉ»¨¡,Ÿ(>Åg>ÜþWÈH0ÕJ‚”‚èð6óŸ+ùí|É_ý7˜ù?Á*åíåƒ
+(p NÖ>5þæ.¾`c´m—Öe®ÎGàõü?©$ø«.€Ÿ©Í€òýPK¥½;ÉnPKœ‡,junit/swingui/icons/error.gifS±k“qýB*¶[ÅÉ‚.:Q%T®œ"f„.âeÌ ®.Bè�©â˜áŠC©ÿ�átÒ©'Eá|÷;H¾�ãîÝ½÷î»·³}ãæ£ÓÝZ÷£«¶ß°=†ímÁøºØ?<Y__ßÜÜÜÚÚê÷û»»»ƒÁ`ooo4�ÇãÙl6ŸÏ�ŽŽ–Ëåññ1TTÅT\%TREL`¢&fâ&a’&âu1w	—t‘„hˆ…xH„dˆ¤ ES,ÅS"%SDá(†M,a¢B Y¥•R…)\ŠTˆU‘Ìà†0¤A¼ÚÔaw„#¤x �,hMXÂ‘È„pRQ'QÒ"	®Ìk¼Ö(†M%sSuÕPÍ&WdÊLÝ4L³‰È¥Yd®î®Ùd%
+¶Y¨‡Fh6¡IŒ@–ê©‘šMz”ž2STJXf Ä u%-’({Pëp8G˜0e*Qáfa–ÍBJÆ™r·pËf*EäÒ,ò°Ëf3e%
+¶yZ¤e3uì¡í4™–Ö) Ì)h/™)jJžæE”´ê\PÖx¯Q®B•ÔBŒpÏvR´�’qE¦"<ÿžL&Óáp˜<ðì²=²½1.þ9Õ«�àjýÕ7±²z§ëý»pÿ`²xÞûuöÁÆ7[èêÊö³ßkßûÝÆ•ëÓ7OßÝ}uîü‹O?ßO?ê™K—o?<xòùõµÇ‡ow>ìyÙëu·þPKƒÀsý(dPKœ‡,junit/swingui/icons/failure.gifS?kTq|%*°PÄÂW+IH±!ÆJ-Ò	ƒ
+)ÅBH#ì+ürÕüS\!b%¤Ø 6ê}�µ³‘#�ˆÂ:û[¸{�ewvgfß�›[kë÷NtgºŸ]ÅÐ~C{íí�ñýðí×£•••¾ïWWW777wvvvww÷ööÆãñd2™N§³Ùl>Ÿ/¨¨Š©¸J¨¤Š˜ÀDMÌÄMÂ$MÄ.êb.î.é"!Ññ�ÉIAŠ¦XŠ§DJ¦ˆÂQ&›XÂD…8@²J+¥
+S¸"©«"5˜Á
+aHƒxµ©ÃîG:$
+Hð@2 YÐš°„'"‘	á¤¢N¢¤E\™Öx­Q&›J æ¦êª¡šM2®È”™ºi˜f‘K³È\Ý5\³ÉJl³P�ÐlB“�,ÕS#5›ô(+(<e¦¨”°Ì@‰Aê$JZ$Qö ÖápŽ"0aÊ0T¢ÂÍÂ,›…”Œ+2åná–ÍTŠÈ¥Yäa–ÍfÊJló´HËf<ê4ØCÛi2-­S@™SÐ^2SÔ:”<5Ì‹(iÕ¹ ¬ñ^£\„*©…áží¤h!%ãŠLExþ=Úß=CòÀ³ËöÈöÆ¸ôçØR}—ë¯¾‰åÑF·ôïÂöûýëOFËýçß·~øÓÓç¯=þx»^œ½r¶öèÕ§g×·~�»Óo??~êáÝ/Þ|{yõÁ»“£nã?PK0ôv%^PKœ‡,!junit/swingui/icons/hierarchy.gifs÷t³°L`àcøÎ
+`Ü¦À¬@pçÀ²SþÿÿÏÀÐÂÐ béÒ¥Çîû?
+FÁ¿?,X°¤¡¡˜”þ3üSÿÁ, PüÉÂÈÀð�A”@y‚�#‚á/§Ì~¦f6n�‹‚ƒL\’B-$¹t²0&¤p<8ØÔûOÂÀC¢èÉÑF6A+ÏI�;þÅÍñ¸˜t¶KÂ´IæÆÇÇnUÏéT(ž^h(¯5e§�ƒ5PK*ÓÆØ¼{PKœ‡,junit/swingui/icons/ok.gifs÷t³°Läf`˜ÈÌ0ëÛ,†ÿ'.ÞúðáƒâOFf É;0©Íé7d< À2KgVÚò}	¦÷$ù·yÞ>¹`B…Í´×ÛxÓºŠ{]~XŠ2XPKD·•ŸWUPKËº$-junit/swingui/ProgressBar.classu’[OAÇÿÓ¥Ûí…*Ð
+E�nW¡Þ5Á˜(�XS�	¦¼-e¨K¶»dvø*ò)€hM|ðø¡Œgv7„¢>ìÙ™sù�Ûüúýã'’XÃ†¹ÃÀµeÛ?±ÝA`·?
+o ¸ï¿±DŒaöÐ:¶N#sûÝ˜5É0q°%„'Ø.]^ÚDzÅ�4Z=†Ô¦·Ïud0©!MGY$ 3\îHKþ¦ç¨ð²ÑêªDmëD¶CÝ†ŽŠù—ªcElzÃ#Ïå®Ì Ì�÷¹Üö/p÷*ÆMR«§c3*¨2»¶Ë?Ã=.>Y{§ä]¯o9=KØê+Sò³í3ÔºÿÏõ1ž)ƒ:5/8UQú»�,fq
+†4!¸«ãN¤¹KbrÉ0I²g9�*Àè¨ÂWÑTã3ÈÇ—– �|Þ[§ö0ê¸™ïëXQsN`�¥'-‡vÒ!Š/ù©ŒÎ®ÚIú8‚k~ÐïSùi;^ ú|ÛV}—®u¸®z@ƒ¨)Œ>Za(™Z+É,ÝÞ’]ÙÊæwäÌä7äM:M�pë‚´	Ì*[H(�ÌQLS(aŽ4z‰yÔB_ZyL}Me+š_‘ÿ‚Ì%–Î/±|~…,Ð­4C»Íaæ®ã˜šIŒëÄEVÆ
+4“#´nV9GýÍ#Oˆ2ê×°•+¬‰fŒÝ¦Èý5³6Âš9BûâF�‹Dk�ïRHªFÞ1I�àaØé#<Ž™ù¨ÈÅl©öÏ0]?CÉLýs¶UÊ,“\¡©®Ò(šô¨Za¾FDºÊ·€'a>uzJ»TCy’žÿPK�‰Â^PKËº$-junit/swingui/StatusLine.class}TkwÓVœ‹;ÊËqœ��Ù
+¸ï–&@ÉÃÔT$ií†BT¶/Ž¨båH2¡ýØD8˜žö~?ª§s%Åvm>(ºÚÝ™ÙÝ¹~ûÏ_oÃ5Ô.<m·,¿èX­fÛ*V|Óo{†Õ’	�ìSó™ù<ŒïUås¿dI»‘@L µmÜ)o>.mmVF
+•Y4übÉiùËÉÕ-c=Š®Ôm‹4·bz~G ¾æ4¤Àð±¢†Î7,ÓvšƒæûJT4¥‡ð¶Iß¥šår9¿£ac)h×0€óIœÃ„†Dø6©T±‘Íö^MºU³f“1m8uÓÞ1]K�£�q=ÂJ¦Ç´@Â“¾RÄ|ýDc*ñ"fUâœÀ|ÿ||Ž'Òš³·ï´¤jiA`ˆh
+Ë?"{¤0q9…K¸"�ëÇXuÜ†tKfÝwÜßxW`¼îJÓ—«ò™´Ã¨Àýeµ U/kÐ‘Oá*
+'7Ø'l‰+¢°äÿ*Á×QLÑ2ïŒ5¥¿íÊ'Òue£býÎ¦²z¾7§ukO¶<ËiQÈ‡øH�êcNòt<�O¬†¿+ Ê>Ç�$>ÃäðNqLégQ(i+¸©¤Ñ(q×ò¦�ÿr5�9²„û bndÎÂ¦q½]ç ÜzâLžáAeå‘nášc;nwÙSÍ6ë¿²ãx�)ã^_ákš?0™+›®ÓnQÂ„~2[õv›ª·­Ð”Ê\¾AIyç[~Û“žg6cŸR§Lù®ëpÁ16¬áAHÿ=u+8Ç±«Ö~ˆúH¡^Ã¼w^0/öQ·¥ÉZâ1/|Åi»uY²”�G{3½®˜©ç
+>sê.ò-§n"ÿ°|I�§»<«¿ù¿¡=L�ÄÆ´×H¿D&<Æ£cöE5Åçªu=‡1‡!\" Ü()BÐ?øEeé…×˜)"ÛÁ|!ÖÁ;…øŸx¯ƒ
+|riæ–KÜî¡/R0FéãÄNóm‚Ìb’±,/ÑTÀ¸âãKÜ	äëXÅ
+²Ï²j
+ëDØ@)ÒSåYiÌPKFi9„ÑÁv�R*=ît0°iŽi†]^$ólÀ•
+k»\â}Gd��.ÃOCî¨ÛC<<bP�{4Ù`â¤¹DšEÒ\&Í•>ª\—*Gà�êçîÆnÍq…ô/
+]C×s•›Ö9Š|€ª…ùª€d×þPK@¨Þ±�xPKËº$-*junit/swingui/TestHierarchyRunView$1.class�Q]KA=cR×¤[£ñ3~¶ÔDìê› H!(‚‚	yŸl.fÂ:�ÝÙ¨?«P-øÐÐUzgÖ§"š�á~žsîÜùó÷ù7rØÇ–@u�je‚äNé›TmJÌwE±ŒÃþÃuª;Šîª‡„ÀÌ@ŽdI}\u9�›½Ïð�H› µ(â5ÔM•Ò{ø 0iú*©°jó}Ùc�BëA›>2öD1â”wÇ×:ùÆ°G¹ÝZÇGŸŠÈcÚ‡‡©&0#Pj*M—ém—â¶ìFÜ[nCud¬lü’ÌÛ±¶ÇÐ­òØþHF)5ú¼*ê	Ôxà·—tfSnä­÷%<,³„áJ†§ž�û¸
+V¹AÇÑ(¶†iÒ¹²¯¬¼&öÕ2±Ü…æ?lD2I(Áo/þ¾e»N¶Ø3Á·ˆ�ûìqì2õ_(Õ÷1ûÃõ”]—­,9ž9ö|¶6;�¶‹\ËX¾±µ½SõŸ˜}ÂÚÿž`Åq,f}/Ö[Ç†Co:Ìg|q¨Œ(ÿPK¬»Ÿº—	PKËº$-(junit/swingui/TestHierarchyRunView.class•VùWWþBDvˆ¸€U	k×‚K•�‚R (u©È`˜Á™	 Ý÷}ßk÷íçöœÛrÚãÏý£zú½™I€d ­ž3dÞ»ïûîýî}÷Î_ÿþ'6 ?JØ1“Ö5;f-hútZ‹�ª–}ZSMÅœLÞNëcšº C’P1£Ì+±”¢OÇÎOÌ¨“¶Œ
+"…§s‡‚ÂS£¦ªž4�K5%l(4Ik¶:¤èjª×±çRŸ¡Ûê¢íoOxoŸöÅG4î“Ð]ß´uLB ÏH¨6D[ÇÂ(Cyl
+£¡R¡RÂ–õ¼“QB�8 £D¨“ O«¶PBm´u@´èžŽ�Ë½a4 "Nm–°óßuÞ¹WÆ	-~±äÛöºAla+¶K¨, —Ñ,¡AI$ÄËˆšbÆ4CÐ,[ÕE.:¢«VçUÝŽùÚ:T÷ag;°KÂ¦MWÏ¥g'TsT™H1øªcRI�)¦&Þ½Å€�Ô,†ý_b¡’“Ùœ—•	f#š§¨21¡&D.œl–Pû¾”b‘£Úß­Ng‘Òw!&2¼‡ûÑ­X2KÛ5­M• ›òøÖC–±Ÿ�’!Î“Ãªe¤ÍIÆt(ZÀ³baÄ6‰Ó»º�9ˆC!Àa	å‚¥)'A	z(àhRm²Åzryýˆ„ú5�Á’ŒrR»6Ê‚ë3fç�Yöó™îÀ!Ç	¦nŽ¼ÛkêOõmVŠ Ù/ uµsIMˆ€©µH’#÷”©Ìª†yÝœâœÂiqIâ„UXyóŠMö°Ð#Æ€¸¯E”°Ñd­*©~EK¥MáfÔ7[$ƒ¼õ)ö’¼*pêÝÙ§cXTøˆ„ÆÂ²ÈÊx$ÛÓ¶–Š�Ñ?ƒõr!„‹Øä¶„aÃ`À5«ªÒí™¤y—BÃeø¹-ã*ÝžÒtO¶kD·Öjžc½­ñ0®A”¼SK»å¶@.' 
+§§È7iÌÝŒë¶!¡.z©ÐkQIhÂzÆ»yI-•p[U¾qÜ7ìf…º~YRì¤Œ9ÑÓÈsìPV¶†ØŒÄ¾H¢Å®ã¥�´Hâ¼„²Yåº:¦Y»Q‹îúM&h*[8uþŠÖåôôjŸŽ.!8ëÖÓVŸÆ¶\N´›Ÿs\®*Ì	7™_uQ‚wn›°«öÑ�›l2vdõÞFkµ8�ëhÃû¤Li{Ô±“ˆþO]±¦Sî�
+[Ic!kobH\Ý·$l^û Œw˜öõåéÓìO¿jä¼‡÷CxP.KŒaÎÓÁãlXÏMr™i½Ÿ_VRe‘–›ê¬1¯f±ÃøÌ¾-JÜwì/9Èø’ò'=ÁÉ¶ª#}�¡2|…o$„FœùÐ¯‰¹ñ›p]"3/.†‹38TÍ¤€Qñ/ÄWÄ?~ŽðYÂõ2„ùÜÈ7‹vÂ¦¥í.*ÚÚï ªm	5ãwQ{õm¿ >ƒÆ%lçvS»¦iZøÜFX šÇk\ËgQÏi^‡Ýürˆr·Î…F+ÚZÐNX›œ�žWä÷"ÐÐ–ÁÞª}¿âþÁöªÞA]u4ƒ“ËŒåŽ]šÉ³ÃahrÏæÐ‡‰¢õCèçIIÌ�«Ûá¦n`g~Êa;ë»Ì°kãaJ8K,÷ü>ï|�¾ž[v,ä„ÙJ)ÚVsç1äHÛ¹ZÊµ´§ì`G£÷0vn	©ùxO ³½3ƒ+÷ðX$�ÁäÁ`mð6ââ÷tàÚôG‘â®GŠÝÅDw�ìýîŒÈµÁŒ‘%Ü�ß…ÕSÒ)É`ÁyÞZvø M'cìBbˆ`�ÝË·nô0ÊØ�A~S\¡e‡ ã0Û_�Üe7€œâi<Ž'^	fñ$ž"CT<�g˜™­ŸÅs¦•Söy¼Àð{øÿE¼DÅéËËx…u”¤d¯â5§4_ÇžÚˆ%²[)ÄjÏàíWµóKâ(#íñ%Q™s°9Š_ã§$>Í‘œõHJ=ðÏóÓz’à}+€KsÀ¥9àR8 ¾%<à#]$nëå‹ßðmòÑûi{jEÑ”{èEøÎy~�[‡³êPKÝh:Ê,`
+PKËº$-"junit/swingui/TestRunContext.classUŽ½A…Ïµþ5B%ÑèlÁ<€R¢Z‘ úa¯5kÌ&»3x6…ðPb‡ÊmnòåÜïž×ûñD€	:„aêŒ²¢¸)“8%¶\Øµ3óÌX¾ÛˆÐMåU
+-M"Vû”%
+½“4±fŸß°.)Ç„Á8úéŽ¹¼ð-ËÏ_á,Ü:	Û…TÚå\ødyïý÷YDª°Ë,f=#´7™Ë¼Pš	ýÿFST¡‚*üTª„ê@¹h–„ÐòíPK¥ÞA·æPKËº$- junit/swingui/TestRunner$1.class•TkOA=C‹ë`±È»à«b»¥øBAP
+•šF
+�~ê—Ýd‘Æo&‰üþ(ã�iC+R¢MfæÞ¹wî=÷ìIþúþ1Ì È0¶¹v˜Žlw7²sÛ27#×•~:o€1ôï‹C‘s„»›{³³/«¡�C²u«²ÅŽ#
+t3˜‡ÂI¡£€�•z·>¸áží*Ã¥pÏÒsÔ³Ü©é"C�*Ò
+ÃP3¯æ‹yäùïu&åtë†ÁrÇöžï) ¿´dÓ»e†R¦s«ÒùÕÏ-™­0ÄÞ;ÉËd+ý0Ç5—{Ñ…!=ÊáàèSÖÇ$”•bH”mW¾Žv¤¿­j‰e¯*œŠðmå7/ãŠ$†TGÜé<
+ó#—a¤SŽ�ÛD¤¨Ve 	_¸€†ì™PÁ‹ÜPúo…+�EŽ;˜2‘ÆÝV½ü¿Õû“ÖMDNHõ²°T½éSå�—g`†´$}ßó5Íz‰#‡9³Èÿ%ÛvÐî3ô2\Wï+Â‰­™’úlñÈÄ<nM3Ï°qÁ4ÿ¥Ž'xª¦£/ÄkÂv"_jdÏÈI’	BVlÄ46Žç
+P/hä-/ò«²h+%$Z0fU?ªYRNÁA Ì‘®â ±ÓžTâ#»ê—T¢lóHŽmIòÔë¢Õ�«ä'ÉÚ ¿›Î1ë­é:†­T£ÖLãÖh¼Ž‰/úÍ$í¦~»¬\'‹ÓI/q7éd¸…�fÕOôW£b5ë+F?ë¶:§ÑDÕ¡Øð	2�ãÞ1æ�± Zã´&N°ôSg³VŽ±z&«…p’8‘›Â*qUÀ
+ÖÈ*¢‚—�xÕ†ºÖDÝEYj_Ãºž�i|ÄÙoPKx{ò±�1PKËº$-!junit/swingui/TestRunner$10.class}�kKA†ß“¤Ý$Ý6&Z›æR/ˆ$Ýø­ ”i¡jiB¾OÖQ'$³°;kðg	^ üþ(é™1 ”¦Ã¹ìyŸsyxü}�,v±I¨�S­L�Ì”>KU0�‰ù•j-ã­ý®",�Å…&BŸÇ£±�‡,¡é²bfy!µ	¾„FEº§#Yëáá¥9WÉV—Pë-êq@(ô/µ9—F…¬8T\÷‰é­Å’ö��;ŠN$!Ûj}ñºˆÞøð�/ ƒ%B©§´ü‘NG2ˆÑ„k+½(“¡ˆ•�çÉœ‘Û-ìÆGàKÂm÷SÆ§Q<•'„5ð_øj}7buÒC•PÅÑ,‘6{4I"5»Ç{Ô	Ä£5þ×€PìGiÊoÊ®Qz¦ïYÁÿnƒ9]>J|_~{%¶Ø/Ã¯ˆWûì}äØe:w(uvnP¾r5WÅhÛq–9öÙÚì
+Þ²%¬âÝœò™­¥ä;×(ß¢ñ7£�ÚŽ±úT7gX¯‰N½æ4ëØpª'PùPKRW�¹PKËº$-!junit/swingui/TestRunner$11.classu�ßnQÆ¿ìÂvD-Ð?þiQ�F·½Ó´61D#ñ¢âí&p*šÝ³­¼�¯`¢5ñÂð¡ŒsNIzav““3ßìÌï|3þþú�<ž¡MØ8Mµ2ar¡ô$Uá€sœjÍqsß§ÑyF&äsÖ&|Ï‹×ãèÌpì!OX1S•4÷ë½,Ò¡Ô_h3e£FÒq¨¤îˆ°ÕÊni	…î|Ì„|«=PÄª�‚7°RB·åžÒü!ý|Âñ :™Imµ7E³a+«—É‚µ(Ïe¾&£ŠÇâ'^g<&lŠ³ÿ¦~cg¬žò°FX5üÅt§‘žð8@Ýú®¡A¨e =lü	IH[ì&îØÂ}›x ÎâT÷Se8À£+Ü6�d²F¦M!öçi<â·Ê® |íñ¹m!ï¬èÎ¢$á{²ÐÙ Ý¯Üì—“SDI´/ÑÑ6ãw~âfg÷Êß\MÅæìz)ÂmÑ�Ü6[ÅÇ½‹{KÊÇ%¥ÞùŽò%Öw/ñ°âªÓ;×ÌªõDðèz…9öÚUÿ’m£&=‡'®÷)ZîmruÂùPKc_,¸ñPKËº$-!junit/swingui/TestRunner$12.classuR]OA=·]\º¬m©ò!ˆŸx"ÁøÒ¨©ÙhbIß§å¦�¦l“î,è¿ñ/˜&>øüQÆ;Ã&˜�Ýdr?æžsÏ½;þþú�2öÐ"¬�³D›(½ÔÉ0ÓÑ)§æs–$<kù B}¬.T4QÉ0úÔóÀø([˜ÍªKñ'&ê>�ujX�>æ÷ÌH§ÍÂZ\Ôá„Pé~MÌˆ�âµ–º7„�V1d»GðÚÓ3&”[Û½îðP
+ác¾‚ê„Z¬þ˜�÷yvªú©mÄÓ�šôÔLÛ8OzV¢´+ì&+�u-³u�2ÜÉøìFáÝùßZÏ)\-ºõ±J¨ÙüÇç&é„XÃz€Gxlá‚|<!,þbr)!žÙùŸâ9aÎõr/ÒFºÓl6àwÚ. vË¼o1„°cƒöD¥)§8�uz�?#§a÷+¶û•äX�8ïXb—Ùù‰ÚÎî¿»š†«’zïxHŠµÙ‡XKXÆJÎç,õÝklxß„í¯ñâ–«*�ÔÁ<}@�bÇ·|ƒÉù¬÷Ma,aÓá¶ðÊõ#W4þPKÀÖs@³ýPKËº$-!junit/swingui/TestRunner$13.class…P]KA=7­UÛ²ì[+K|H£¶è%("�‚@
+*|ŒFrÄVpgµ~VÐôÐèGEwF!–†û±çœ{îýúþøD[(r­ÐWÚúÊ¿•w-}ú¾ìw÷aª%zÂkÿÞ»¨·dC;ˆÖL÷q@ódOúÚ«4#«*Ð’éF	cº©‚â![�s@H^=ùº)µj0ãP1îˆ°²M)ÕñJçNb¥š‹&RˆcÒ…ƒD#˜"¤«Ê—çáC]v¯E½ÍØLµÓíšè*S›qc‘ÇENã;°G7ÐBËÁŠw„»‹8À‰É­ÅÅ(I‹ìOs]S²?u‘5[,!G 6–ÿg!uÕ	»
+yªÌé_ùmCdËg¦¨´EÈ;|•8øÀü2æL“0ß¿Æ¹v9ÛçÚvÊïH—7_1ýl1‹â?tcuf¸v9šî,æ8æ±0T9æhTåL¿aù¯Æ-Vc~€j˜l«–�·œ5¬[Ö@ÈüPKÞ.ëï…½PKËº$-!junit/swingui/TestRunner$14.classuQ]KA=wwë&›Ñ¤iµV�Ú6šZ7‚ TíK  …&ä}²É„Íö#¥?Kˆ´øÐÐUzg#–,ìÌ½3çž{Î�?ï~ÃÆ'| lŽ²H§~ò]GƒLû]•¤ß²(RqýèØ*#9•~(£�Õ© uaªóS—ýP¹xA(MeX«$‘Å¨öÖIcnqJ(v~DéP¥: ,¥C�Ô›„�ö"\±t¦ùîÁß[û¿Õ~�à´&×,ÄÞÛï	”=8¨x(a¡*à¢`¢×„r[Gê2÷UÜ5~ŒüI ÃžŒµÉ#™P[¨„Çší8‹ë‹@.6	<ªú‰@
+Ë¶°Mð:“,ÔWmš•ç‡ÆA\˜¤Ê$Q	š,ÝOÈ˜1^8.Â|Uãñ1³øXæ|…£sÎmÞË�ŸxÙøx‹W�ƒ[¬ÞäÀ5^=S`QNý&/%Ç:ÞòÎ¯Åñ=ÕgFš;Ñ˜1Ë«¿°óœÇFÉržðˆ»ùúïs,å2Yú?PKÀ æì� PKËº$-!junit/swingui/TestRunner$15.classuQ]kA=w7f“Í¤‰©±Ñ¶ÖÖ<´éÇ¦Bñë¥ ¡‚)yŸ¬C;aÝÀÎl¥?«Ð`ñÁà�’ÞYƒ%;sïÌ¹çžsçç¯ï?àã/ë“<Õ62_uz‘ëè\û)OS•u�_ Bs"¯d”Èô"ú8ž¨Øð	­Å©ƒËq¢< „W2é+mn4X †6ã¯	Õáuj/•Õ1¡l/µéö	OËdpEù�æ»w„hw9ìÿV{#BétúYüÝ½‘€@#D	M�µ*<´T\ôˆÐèT�å_Æ*;wvœüi,“‘Ì´Ëç‡%'™°¹T	Ï�5ûYž:Ë@Ö	ÇÊ˜î‰À&ê!6ðŒ8œæY¬Þk×¬±¨8rþâƒKNiŒ2è³ôxBÎŒóÂqîk9�2��:ç+½åÜç½Ñû†‡½ýV{3´o
+àc^CWàÕ
+êµ¢”<á�_‹ãßT¯éîDï–YnÑ¾ÃÖ¿<uÔ¼•¿xÄœÇÃóbÝÆN�¥B&K¿PKRÀµŽŸPKËº$-!junit/swingui/TestRunner$16.class•UmWU~îò’°l!DZ¬P�RHˆôj-¡`Óª$¢­¯Ëî…,lvéÞ]ÚøòüØsì�Ÿ=§Mc{Ž?Àåqî&”X6¨9'›™»3ÏÌ<sgòç_Ïþ@æ &wÇòsâ¾ålV®Â…¿8÷Rù10†ÄŽ¾¯çlÝÙÎUª×Ízúýª%Ró§JÝ–ÊuÇ¯rß2NìëvÊ§·åÀò9ÃxÛqËÓkü¾ëí†®äÔÅ¢ó««éîØÑÎ¥Ã\Ë¾GNK3½+®I_IG½Ö â„Š^ièCÿ$4Ä1 ¥$ÃpÉrøí ¶É½Š¾iN²äº½¡{–ÔÛ‡½’†Ó]3&:©¶Á”î¸N½æb^"Iˆ¡Çz¦eæÝÐbx�!®"u™aáS%+S*NcšA•¶ä™Ífãxƒ×†ÎS–¹c±£Má-‰ûö?.O¹.|^‹!Í0bžÇ¿bÕø-Ë¶%sTpQCgUÌ`ö°¸<Ã¥c˜‰¬n�‹Àö—4d‘“™PcQv1¼Ë0•>CÖs
+ç±€ótÛ»[Æp‘xU7°Í²ïî…%ÝÕp‹*.�:“Ç{ÜŒã½†óÞoñu�†âe>ÁÖ–lw�°×h.D•›‹Óq\W±‚¡ãë…lä
+ºà�—ä†Qnë{‚›’ëeÑ•³Pœ9Ú;
+7QTqÒê”ªc2ÌF�Í‘£Vž„p·ejQ§7\Çq|BšïKGÆ.£"=?¥)¡rŠe8ÝŸ°3ŸásÉÜ�>©£ùã/…~Ðz•+ßwŠþ¾”H_QÛÈ2Žo: ®ÿÛ¼Œ=:6e£üÜž°Öú
+q8¶$‘©l,LÊ±Ù!Xáë^8X¬HwŽzØÒbDjKRËnà|Í’‹kø0VV†bÐnJeÅÖ…àó´{¹å~A~’rG¾Ðúª$]#éFÛ'‘™{ŠáÌÙ'ÉÌ>Áèo¡åXhKŠEˆtIôûjˆ—ÀNÒ_M&[¨l„¬e´G™Ç„÷£Mœ‘bòÍ&Þibîš<“MäÇm¹�+¿PÒòjË¿bžŒg¦øÅ>yø+w’«O±&•ñ¾J
+|œ\§G„|­�»m‘@¿N~Û„)eÖDµ‰ÝÃÒ1Dâ.cŠƒ	ÅEZ¹‡óŠ‡eÅÇª ¨ìÃQ ®Ôñ“ò*ßãgå‡�ŠLHÝ£6ø6jDÁ*5Ø!©EZ°.I}q/Œ{^H*i¤æü
+PKyë,ŠÙâPKËº$-!junit/swingui/TestRunner$17.class}P]OÔ@=Ó.Ö-£«+_" û°T´údÂW$$˜�&îfß§u³©Ý¤�þ£?Ã4ñÁÀ�"ÜÛ%,B“ÎÜ{{Îé9÷üâï?¸x�¦À\¿H�
+óc“&ìêÜ~.ÒTgÍwï=�‰¾:Ra¢ÒƒðSÔ×±õà
+ÔGS†«(ÑÆü#•4£ÂÚA*Ðh3êd(~Ø)ÇëÕÎ·Ôjkbª™�¨H'$Ú©vlF$?Ø0dpK hÝ)w›³Ò¨ì¾h·µÒ“�¨ù¨`BÂÃÃ*Ô%|ŒsõT Ö6©þX|�tÖåìc«¤§2ÃýÕ°bM.0ß¾gad×Í
+J>{Óév”ÛLÅvhØÃœ€—kÛÕ'–vÔº+€Ä<^øxŽZigPd±Þ3ì¢6úßæ	È}nv•ç:Ç[ÊTm�Sr\ª«à§Î‘¯;‡^‰GÔ?¦j“z—îZð“Á«3<	VÏÐøUŸÑé3Áù^JO•TÁpLc†nÊKõPj��üM§¤rŠÆo,þ¯óãÎÏ:òJÇÁRy¾Är‰¥M²~	PK=ÁÃ£±PKËº$-!junit/swingui/TestRunner$18.class•RkOQ=³-,]VŠ…V°¢ UÛò(X•*èš˜4i”HÓï·ëµl]v“»»–‰øúà >þ‘qî–ØÄP7ÙÝ™¹gÎœ;3g¿¾|E
+ëØ!±ïFµðÄõû±[ëÈ0zû¾T¥­†	"ÌÄ±¨yÂï×^ôÒ‰L¤¹QTÃEÏ“&&SÇÂ+ELB(´‡Ô¯•8’'�z“�sÉÌÁ[?:”‘ë&£C7,m®¶Ç	áŒÉ]—Ïžêåñ°‹ËUº„t3x%	©r¥kÃFÖB³6,Lg` gÃÄ”¶æ	Ù¶ëËçñQOªŽ¾ß´8Âë
+åjÿ<˜Ö²	KcÕp÷XwJÅ>aþ"a&Š„'ˆýH»MÊ0‘Ø²±„ëÓ¸†„…qü&V¸ÙÂqd–ê„í4¦ò×Ñ¾
+úŠóö„Ú±q%7q›°8fâ.a"Œ„â¹¦Ë-ÝÇ
+ªÊXÉà)6þCFSß]ª}áK�u¬cCë¨ñ*ŒÇ™Øâz¡Œ:A$<u-âî³ºHGÔ"XA¬ùÌÕ£ÊŽ$lè¥%Ø-í4=rÏ±ÉƒOƒwL¯‚Þ¶3ÐONoÈÏà×Æ%ögØzÂ~ŠÿÙêG\®®žb®ºvŠü»Xà¯¥Œ³„úJ’JŽ,òŸ/Éö�J0R“¯Tß#ÿË„]¶æ>áNñÖ†æ&›Fä9¦…ñ
+–ñyã–�ŸI‘Â�è¼ˆÅ±‡Øæ2Iî#<Nâ”à˜ç7PKwŒI,
+PKËº$-!junit/swingui/TestRunner$19.class}PËJÄ@¬N²�Ñhô&Þ<ø@³âI/‚tÙû$ë„8�$£ßåIðàø	ú/bO\Œ'ÓÝÕSÕ]ôû×ë\`ƒ°Y­Ú¤yRzfT2‘M{c´–õöÑ‰"¬âQ$¥Ð³ä:+dÞúp	qßµt‘•ÒÇ€0<S<îœàîìN	Þ¸º“!|,ð¢Tiye2YO¬ˆ'¥U.Ê©¨•Åó¦×Þ«†°•þãî”—ÔF‚ÛÊÔ¹¼PVõœCë‘^Z0.EÓÈ#8ì„�\ÁZc´ÈÕ1gâ<Ø{ÁÒs÷r,ÍùèDËŒÃVqæûüØï0¿^<´
+çó��æBk]Œ±Þ-¡Î
+PK{âÆ…�PKËº$- junit/swingui/TestRunner$2.class•S]oÒP~0;º"~ms›_¨ÀÜ`è
+ób$&$DY%Þê+v­éi%þ,Eã…—^ø£Œï)¸.QŒ69=çýzžçíyûýÇ—¯Hb�–¡ke9´Ý~h—„ž…®+ü|Uc˜ð·¼ìp·_~Ú+Ð�dÈÅ^•Í{ŽÐ0Ãp&8²e¾B°íi¸u†tç�‰À¶¨¢aS	Y-L/)š©¦÷J0$EÓ€ŽŒŽÎÐ0›FóÙ¶íŠ'áqOøJ©l{wLîÛÊž8SJ"ÃÊT¶|•$&ýÐeXœ–£áÃ,·,!e~‹¡ö7ñ“Ð¡Ï�ÅÐó_�ƒB†NP7°„e‹¸ãUþ
+ïW¨é…n ü}î
+‡ðV±¦ð®œ\íŸx5\#>ê1*Ž¾jËÀ
+äu\ÇÍß¦â4…†ÛsR(9&wBõI-u)E”t°wr—aç?:Ù÷½¾Ou{Ü§F6°©)3d†\vÂò0t"µ][¨*µÄ±4FÃ6É“�xÃ0Shu•ÌÔtÜÇ½ã…¾%Ûj.²±°M5ÝFKM‡K)$*4e)ÐÀÒÊ©±£=
+õ$hé˜#Û S�ìÈSú„liý#ÞG9¹(KEÌç�Ú•÷<.ÐÎp™	Š¤ÿSÅvK°ð+ß°=>]�8F¸5Â�±Q‰}'§{#<Œ‰sD	<'ªXC
+¼<%`w" �zôn�GÉb‘\ªþ	PK·æ@ž)1PKËº$- junit/swingui/TestRunner$3.class}“]OA†ßCíbù, ˆ¨Uúm¥ (*�Ä¤h¤Þ-e¤S·»É~½ô'4&þ¯MDÅãµÂ¢žÙå¢¥IwgæœóœygÞýý÷ÇO„0‹Ç„ËUß’^Î=�Ö¾/s;Âõ¶|ËN¢ �}U£näLÃÚÏ=Û­Š²§!Dh®ªlc×:	]^Eº‰<c‹í¸K„ží×–Wž,zë†™ð8ºíKOâ'…/£&lçePÊE]Ë’×W…d{vëâT‰^³÷J¦J:tÄ"£O‡†ît`@GQ5"ÄŠÒOýÚ®pv”2–[´Ë†Y2©æ'‹a¥•0Ñv7‰o;äøa´]Ž†qB·Q.×MÌ²ˆKƒS÷=iæJ|¶³¤ã
+&#˜ÀÕÓ›:Õp�ÙÂ5ay¼Ó±äyÂºå×„cxÒ¶s‰®ã&a¸eŠ†iBÔ¯¼õ�0tŠ;g&¥�Ž"‰÷k©¤$Å�†Ù¦êÛ„Å‹U·¸Ó-áú¦j—C^égH”Ozƒ=âVÄa!ÙÚÑ”5
+˜�"‹¶AÅp7mG¬Ÿ ›ç¹Ž»XTïˆ]0ÒæH9Z'Œ·Ö¥Î€3"Û¶ï”Å†TvŠ55g’ ?Q“5Óp]á"Ïæƒ¿eWå[÷@ý”wÏfü×ÑËóK<zÀó¿céoèOgŽ0˜ž9Âðç 1ÎÏHPð6@�¥¤Ò1Š1~ó‡Ìãê
+ƒª�þ‚Áï˜úŠ[ÅO˜Ìc†ðÙÍ7‚sÇ¸‡î>þûÓlG'?øŽ[¼g·b‚ÖS
+üIë(¦±„en>Š~Ö±Â„¬¤‡xl�‚Íó	üPK’!R‰ÒPKËº$- junit/swingui/TestRunner$4.classuP]KA=×D7Y·F£Ukµ±’�èú`APJE*B[ªä}²NuBœ…�YÅ$ú*X”>øüQâ�1P(îÀp?æœsÏÜÇ§¿(a
+K„¹^®•�Í¹ÒÇ¹Š¥±¿r­eÖÜ@„ñž8q_èãøG·' DXð]qncy&µ�w«RÝVÆJ¦&ŒØeš<¡]4b›P=¸ÐöDZ•0cG1î3«/SV:„ò^z$	¥å•N„oB”1!@¥Š!Œjm¥å÷ü´+³CÑí3¶ÞNÑïˆL¹zÐ,;‹„ùÂiÍM¶Xþs?eö;ÍNå¡Áþ^ûÿW—{‡³EŠf	‘$Ò˜æ§s
+ñï	$½“b]Bx�æY"÷•3_û'ºîX„è›+öúÂi°Á«(ƒ·Ê·îvÃ±
+w†ø†å:âl‹kßiÝ¡ÖZýƒ‰�©{”{¹ô:“œE]w
+o9¦13PùÂÑa+­[LÜcþ�+vpí5¦_p
+—-àƒg7<g=ëE¨?PK•8ŒÅŽ®PKËº$- junit/swingui/TestRunner$5.classuP]KA=cb7Y×&Fë·FK4¢›—¡"Š´ -*yŸl¦:!ÎÂÎl‚?K°T|ècQTñÎŠ»0Ü�=çÜsïó¿‡?ÈaŸ{©’&ÔC©.S^mÎR¥DRkz`åð°ÏÕexÚé‰ÈxÈ1¬¸.šP„2áadd¬ZRATãÌ•ÔµMhe�øÊP<¿QæJcOnŸÔ7²)›m†üQÜ¹�Ív“>òøÀC¡ˆ1”J-©ÄIzÝÉïô	[iÅï·y"m=jæ­E†åÌiµ&Y,q·Ü‘üŒ“kÑe¨’¿÷öÿfsçp>KÑÃ<C�G‘Ðºö%À"&|,`‰aÜ)97ÙÚþyœ&‘ø.í¥7áËbŽmqÔçZ��#º,½Š½Å"ì7FÏÇÕe»T»Ný7Jõ­_˜ºu˜ŠCÙ?�Î4eEÛ�Á'Š³˜©P´ØBýS÷Xþ_ã‘<9�ÙWÜHÃf+Xuìªã¬aÝ±^õ€ÊPK¤Ìf�²PKËº$- junit/swingui/TestRunner$6.classuPÙJÃ@=ÓVck´µîûBjEã“Š(¢ -}ŸÆ±�ÒN ™(~–à>ø>ŠþŽxg,bÃ]rÎ¹çÞ·¯—W¤±Ž†™v¬¤ö¢[©š±ôj"Ò±R",m9`…6¿á^‡«¦wÖh_;H3ÌÛ.¿Õž¸J{¾–�ªÊH¢:ècè×-•6iB5iÄCöòNé–ÐÒ'Æ®$Ü©—“)«u†Ìap%ÒåÕº‹†rÈ`Ø…ƒ�,R(0ä«R‰Ó¸Ûa�7:„-VŸwê<”¦î53Æ"Ã\â´ÒYÌs»Ü¹¯ƒ°+®Éßû™Ü:œJRt0EKkv¥âZ¸˜1ö§1ËÐg¥¬�dq†Üe‡¾8–fƒü¯ò†a1¸'¦8ìð(6éÐiéÍ�(fa¾½©v)Û¦Úv*ÏÈWÖ1ro1E‹2Þ­Î(e.EÓÃ8E†	LöTö)ì@å#O˜û«ñA>­ÆÄ®§a²y,Xö¢å,aÙ²~ô€â7PK£í&ˆ³PKËº$- junit/swingui/TestRunner$7.classu�ÝJAÇÿ£¦i[–••ivá…µÝQHA ]”Øõ¨CMèlìÎ&=VÐtÑô Q/�… Ú…å|Ì9¿ó?çýûõ
+qla�¡p*©Ý`(ÕU(Ý–ôy¨”ð+õCñ†ßq—µ+î„Òî¥T=oxÔã·Zø)Ä’úZ•B5£X{é‹{¥¯…–]êØ—TwÀPªF·l´
+¯'âÕ�¶ƒILe�€ã`É4b˜aÈ6¥gá #üïô©6×ôº¼ßæ¾4ñ8™0i—Èi•:IœÚÝ}/ w†2©ûoùcã[}ËQ¼ò´2]h ×ÂÁ²¿„&¬�h0CæÂý®8‘F{ö—ºmºœS4ú<D€ºD­nC6óÅèŸDšây»›L¦ö‚éÚæ²¶fÖäìËQæÈsÈšló–»€Å1å�¬åÖ‘}Fá/ã“fYF~<Ä0Þ*Š¶»d{ÖP¶]#�ûPKÓš©x”PKËº$- junit/swingui/TestRunner$8.classuP]KA=×D×ÄÕÕ´µ~§J4R×Ç@K©ˆ‚TTò>YouB2»³Š?«P[èC@Té�1 ˆ»0Ü�=çÜsïß¿ÿ ‚�Ø"¬
+£mœßksSèøŠs{QÃY«€óu§â¡27ñYÀ‰
+P!¬û®º·1ß±±ñAbujº:·,Ô“„){«óÖ¾Lè–�øD¨]>{ËV'Âø¬÷EÔ·Ë);=Bõ0½fBe{§¢ŽÙ:ª˜`º†	Ì¢®6|ZŒúœ]©þP°�nš¨aOeÚÕãfÕY$¬•NkuÄb¤ürçœ}K³_šâïµý�\î.•)X’¥-g#m”å+Îþ2V	ÄÞJ¹0¡~™YÂÇÚ¹�žU÷‹ž¸âp¨òœsìË-ª�³Êk¸ãH¬Á}òê˜‘:”¬#µï´!jï>bá»Ç4<JþPèuÞHJtÝ·x'‘°ˆ÷c•¯�Êtû~bí¥ÆŠ¼Æân¬á²ulxvÓs>`Ó³žô€ÆPKÏ“˜ˆ¯PKËº$- junit/swingui/TestRunner$9.classu�]kA†ßmWí¶F›X“hÓ/¢!Y/+	¥EZ(H[jð~\§fÄÌÂî¬ÒŸÈä¢? ?*äÌD(”îÂp>ö¼Ïygîîþ ‡#ì¶g©V&H–JOSœÉÄüLµ–q«ç�ë3±Á\èið}<“¡ñ�#4]W,M R›àShT¤*1’¥žž›s•´º¼a�µâ„PþÖæ\²âTñÜ¦dKÚ#B¾M$!wÐù(áe	y¼òá¡PÄÖ	å�Òò[z1–ñ™Ïy¶:ˆB1‰XÙzÕÌ[‹„Fæ¶V�-–…»ÜÿŠâ9!ì²¿ÿÝÿ³Í�ÃzÑC�PˆS=L•‘>¶­û-ìH:'Ù\Bi¥q(¿(k¾üzlUÿ«-ús‘$2A—Ÿ"~U>Uû6‹°ßŸ^písöžk×éÜ¢Ü9¼FåÒÍTÝÿ¡-ÇyÍµÏÑv7°É‘PÃ›å#GK)t®P¹Aã_Æ<j8FíinÅ°Yo�z×iÞaÏ©žx@õPK=3�Œ®PKËº$-junit/swingui/TestRunner.class¥||ÅÙ÷33+Ýiµ–dËM®ç.K²Œ»±ÁA–e#�dcÉ62õ,�¬éNÜ�\=@B
+%¡C `:Ùˆz€ !�’@B	%@âïÿÌîíU)¼¿�÷�wovæióôû©ÿÞû)šcœ$hì	½¡`lnt{0´µ78·%�­ï
+…	Aãí¯=2w¥?H� MÈ¹¼6ŠvÄ<”'H­©Y'HÔ†áhÌŠmôwõ‚Š­onY»¾õ¸†º¦5-‡ò(åw¬Žø»‚F6œàßæßa#˜{˜].ÈÓaÓ h„ž0·Ë�Ï-�‘€¿Ÿ;4!�hoW46ØDvðâíáÈ‰s“_õäæÞ`,PîÞ4&¡]Þ�y#:ÖEÂ[#�h´>ÔlóÇÂ@?¾!]‰)+ý,)èXívõb@Ð¤4À«~ oFc�áö@&çu4„·†³XnðoÑŸ‡uÔ†{!ÖÈ:(Ð•ä*�9õ+¦,!A£Ò�­ì�ÅÂ!Íô`Úþ)ÈêXÀ'~B"1¬7ÚaÆe J~[Î+7ÛùÒÆù¶*ÃÏÐ+Xúü£Å¿EPY:�Ûhg&0uxÇ†h !ìoÇ§Ä~gîOg íD{†u8ÚÇ°£®fôÆ‚]s7Ú°]²¥®¹¥vmCC]-´î¸ÃëZÓU¨9\ÞmVîêÒ+k»üÑ¨—æ@ «kê6¬¯[U×‚—�õu›l %)rpf=mã×éxž‚DgõhÞŠubÁ6hüAAnì¥|öFl_-´Â¢E´Ø$ƒ–~&3ZfÒrZjÑlª( I*æ]iêíÞˆ@�]æ-ÜæïÚè�ù·3hÄ:ƒÑì�Mš6ëO·?U]~T¶tfo4�DåÁœ#1‹VÓ*YƒeþÈV€.Í±
+¬EX%G–g‰‚9.É\à¡Fp”1ÕCk!Õ­�X“íÊgg#²èZoÒ:j¶¨Ö¦l3
+ö™üà½
+´š[^ŸÓ7,Ow*áí,7Må¸ÁD6}ž‡6ª/\¨ÿ7\¼ùG›tÃXSt¾™ÿÜEÆ‚ä8l0´-|b ÁÓ&’*`ÆíBôÓ“Ž'V·¨¶blpn¢à±c	ï‘Ið±›yïYŠ£Ês©@gŽ®ìíèà¸q"TŸéÂÐ2Ÿ—º™ÕLê"x¿|OO ¨U¹ f
+Ù ±å'Q„!€#o,l³¨—õ ‹¶a°'�Õ‡:Âí`\’vòL°a+R¿Ö…Ú™Otg¨­sC½E§²ùI:m¨}Ÿï¡3Mbßí½<Ë¤3é;PÀ¨&ÎFë�b:úXTJ#ÙŠ¿yæŒ@:dBóëÚƒ:ôLrt?131Ñþ‘\@št>]”¡?éó<ô}æ8«�º3örí–àj4ý—Òe…t	]¢L¯M¾åooo	Š Žì´©c05¬:åõ³³AYôcº‚‰º;8©×ßçf‹~BW›ÔD?žH ;¼-�€m6hº–®cP×ã{0
+D\Ü£sÔ+n¤›xÅÏàmXðvî�v„óÀ‹vÙàn8‡RµG†.üœnãÏ·ãsüXÀáÚ¢;l%¹“Ý!‹¦Ä6wûwtÚS¼t7¢`®‹ ¬�P[ ƒFG½ëOÅÙå÷c‰³¾!ÚëÄoÛ4œ@#¨ºüÿèPÆÐXV±ûÜ¼.}¡ØC°¾˜ô =ÄÞi‹‡«Ð‚º®@w „Pð(]fÒ#ôv)<zýËízôGÛþ.—þ²AègRŸ¢§Y¨ÏÀD6è(/˜�ÓëB½Ý�ˆ?DBcÑ³ô‡Ï9æ“5ÅC/Ào…�•:¤fWCG/Òoé÷À—Ó¤9Â{è¥Bz™É+îôGÃ‘@�K%ÔÊû
+½ÊP^ƒ6YK6Ýøº-;‰LAÄ	“K¸7Ön¶cípÁ›øWA‹ÝÿÁÓ]–í_èm&þoŽ×k¶•¶J½9H´“}ààþn�‡þ!hÁþnð]]Dï›ô}€¼¤
+©:'Ý©)­öhC%µãÿê¡�Mú„“’á6h;Æ;�GgøÊÃGd�zès$0z¿üÛcs×D‚í
+þ�Øý®²¼ÿÙÌ|eÒ—ô5öÏ±ežnOmô‡ü[]×ÿ_“¾ ýÐŒ\Ü#Pf)HÎ+”)$!@ùhvXägøíš-ˆþ¶Xb�—c	Â�ïíì7�0E¡)
+„5Ô.ôˆ"Ss8ã­iced£è{j
+?0ÙPlnúfK#O©#C=™ë>¤�ˆñb¸hA)ÀzzÂ!LDòôAKŒcM1Z”q
+’º#sïÞ˜äV§•ÌÂìÿ]ŠÌüF)\BŸ˜Ÿ,|\x†#vì›ñ?Û™­%¦ŠiÈEÅtí}¶×ë
+¸-`‰™ô"�Ï‚ÚM¨GÌ¶h±NT
+Z
+­ïj÷…Â1ŸÍ½ÏYáK.ñÍñõFA�¯Ýö×¾mô
+”/cÒä¸¶‡·•¥és¡ÑÎðöFT¯ÐÝUAWx« Ù9·/g’ æ‰ù¦8@,€dÓUÏ	9X[dŠÅl´¥I€u;Úš.�À‡]A9IÚ¶Dq•žšº+°§Å¶PÛü��P/§¶ÏÃ\
+f
+zÄ·ÄõR¯¨1Å!œ�ÂÆCÈ?B\¦åµÌé*QÇÊ¿:3Yc(œ9xÄ¡ˆ\5ì¸«««½â0SÔ3°ÁMr‘G4š¢‰Mò€òlzèò|èq¶›u Wa§dÍ�„û–hFr‚-H·|u;‚1ŸWYÅ,öˆ#MÑÊdÝZ|¥9…§ºƒó²Šq— ý}>dçØ§ÝËÉrÂ‰nÎˆìQ�ØbŠ6Ù°®°¿]�Õ·qsbDyŠï¨ï†ª‚ÿ€è@º  ¯Eî7r1‹Ó[,Ö³ÁQy&ÞÒE—)NÈ�‹�ªéV(Æ¦‘$<ÝÇmXô€JqR"éàï+Ã‘ö@Ä‰ššWîÄÑk¢¨ÚÆ)t fO°ÄDx¼�CmÊ�ø¶)NáM)vñl
+†ÚÃ° ÓlnÿÊ‡§ÏÐ<Ÿ!Î4Åéâ,n>Ù{dµ�K2%„Xcï¥Ý£ÊÚJ»KeÑ|ZÀ~ê¼DŠYm{µêôÖ¡W\ÀnÏ5à¦°¶j¸‰Õéíu‘
+qQš[pSY�@Åbb�Oe‰KQæ‰KÄe¦¸˜5ÆÇ®ÞìðŠBb[íÍGî�pê½$»1˜+OðÇ°ß?W°š]™©²š{�ø‰[Ë¤­³7ÿ§¦¸Z\#H¶Ñ+®Ã&µH;ßÆ@$
+÷ã¼±.-8Ÿ<E‹¶[b3{³¸Å©¯SëDÛ9{ÄÏ*Öwµ{Z�óZâvT½â6ñA¾æ›Â1[êI¿ËµLó”hŽ¥ñãÚ5Û{ÔÎã3Ý÷?YÃ+Xb}ÌVŽ9�:§<Çú\¾Nû¹}¦Ø+î…,º·èæE.Änbà´‘D›0YCäê Žï�Öºì†cK"5¶!Xâ!z•“€_fè�xDÐX{½OG­@ÔÓ‹ìôE8½{,wÑ·ÙV�'Lñ¨@‘t0höù}m½(ýºm0¾.M�/öElè±Î€‹	I*–§ ÿÁÐÆšÃ€ÇÏØ4ÿÚN7£A�%~Ã9âmÅRAoBD(E6Ãooa!•ØâKm�É”›ÛJÜo-õˆ?˜â%LN,7:¯Oöš_} G¼jŠ×xµS-¬„ˆ+3¼r"5:ä¾	ïaWø'ƒµ%æqËß\]¼<â-S¼ÍXó·h|®8R›â²J•´¶øØÁ¾yÄ?¸"€ý¿'ÞOBN9€ÈVÐÄ·–Ú		÷nüz+?ÆVÒùâH’£JpkglS€ÿ\îéíqŠK|jOû²t[H®Ì,ñ…x£�.ÿR4ó<â+S|­7$[ðñ_¸D¢Ã;“ahrVJùÌBÂ;˜b¿”`ŒuÛm&�+D¼È�yp+2Hzç{¤×”:l‚.ÎL’„ù²Ký®‘J2“Ãa(ž[¿6é%e1¼d›½iŽ‚¦@ŒÏÜÉ´Ã�1ƒ|òÈ‘¦ÅÊ‘q¶ædÏ‰„#hÊ U¸sþfGYfÊ±rwGãþj{»>x™P>(qÌüD9‰—MF&‘�âÐ` â�´uît‰™bÊ©À�?&¹'<r†)g&*ÏÚNxÂ@rWf¤eoLú$M]¹œ
+!É
+8–�¢É®múˆm‰Aæ2†YÓsÈ,“!.$bÎ1•�¾Ý¢4¹�D^[²5³{(ÒmLÑ"¸T§aU³äîv.—°Z/*÷à6èˆ%—ÑâBzYò!Ë6]¬–¤h�sf™l…rj9nð¯yˆ)kØUx�0XïÙ!r'·ÄñÂÏÆ…
+g/-µÄÝâþy¨íyAÖ’‡a\´ÉÃAÒ½úB€±Ì+-ñOñ!¯[k‰WÄïùí‹&êÖ†l,ˆp}8ìdØYN/ñi¹%7È�ŒgSfÜMLñÈV»ŸëT™‰ø0¶<gÀbõ9JmÊÍòK¼.Þ`ÒŽ³ÄâA~ó[4‹Ê™È¶¬`Êá®GLÙÁ§o£h4Ïî´èCúˆ!œ`ÑxšÀc]Üø\jÉ²”?„-ú”>ã·“,1QLâ·¨EÓh:OîÍt	Ím‘pW—Íáv»)�ôØr'<¶¨�'»éWFtjyŠ)wÈS-ñŽx—ñ�nÑšÊøÎ´Ä‹ö¾|Ç¢Éö¾œc‰ïŠïñØw-*£q<v^â 'Ñ[éßêT7òS^Èzæ�)ó'Aó2„nwjrX_¿Š‰”Ëï3ÊK23Z·ŒõÈËLy¹Vh[Ã£Ð°fMïé
+:
+ñc>>ª¼q‘Ñ‹Ò‚ºÒ”WÈ«ìÌ9­ú“&ßDñÇ„_-Êšy�öBm'Zò:®¶O—×Û¦ÂG¯),y#—~ûåMœ†é”ÒÎ­­-i	ÍÈÜéLwýŽ�4¢"| Çî•y£,}8¶!·„8×ÍÜS}9#æbQ�¼Ã”wêÞ­øï¶‡¼òNy—3²Ó’÷Ø#}|êƒ‘íÁöX§%ûíÑ½gBm�a¸‰{í¡hÉv�˜ ¿«,y¿|€Çä«
+Á®.KþÒžø°;Xµ'=–ZøÖ‡ [Ðø„)Ÿäîk~P¸GìÉ9pOÉ§À3\:ÌG¡-ŸöD‚6DmÁ¤ Õ0/¹�Àæ'6!™å¶ê|�ë*Aä•/Û'Òœ?Xò>=¸D¾j{¸äõ�L—zóÃ9¾ÚÐÓîçNüô\ApU¸­—£JÝ6[eõ!ìŽX"8É?ëS(‰ä6O/@rð?¡@d¶ê»v=�d'�Üû©É)LÓ¾CÒ—ï0ïæLéí`É–üŸº'ElÇœ¡ ÛÖù�)ß—ÿ„ ƒÑºîV��PÚ`ìcAÇ4…í¿ÖoD(f«M]–¡RòÇìr)ênÅ^´ûf¥!˜åF}ÑÞžž0ŸfûP…óí_O—?†Òª»Ú+ÿ•ª}v_Ô#?ã®ÎðvK~ÉËÏå¿íVƒ›hmø
+Å:ˆüÚ¢sõ©³ü/w4“R�0çúx8sf.©&Ó�\p<ÊÈÕ5N›“Õ0viôª|n¤Bov÷t2pxMUÀ£¨-íÎŒ aÑnW—Û’QVF×ý%î+xT8fCâK•ˆS«á™mFw7¥Üt<šSÈÒíK�öõ.l=jT¢`Á·ÕÁ®@b|LbËb1Žò'd‰²Ò™¼ÜRe
+Ù³Tãa/åéß´rª‰¦«&%‹øj£p¾ûL5ZM±Ã¤Ö5�OIÏWÓÁ0_YãÊÐR3¡,˜8‹ËŠ®p#³¡ZAš+·¸î<›CÁäyµÑ¥KT.í#Õ�áî€W�~¿fg”{Ôj¾í¤�ÖôÀýì´ÔB1ÙT’X+•M�Z‚}¬ÖJã~”W(hVŽœ2×U–ÁrS-U�8&hÈa¡G}Ëvƒ0æÆQcªCÔJÈ¹ÛîB?øÚG³sÕeœ‹<jµ©Öðbç®AÂçEúÖRªm·è›DcIÑ¡0‡«døª› —ó°¥Öê3mµÎm¤¯cïåQë¡dI[uú=^Õ’¶�ö™‹Gm4Õ&}»…=‘¾Ý¢ZµŸQ›íÛ‰ÖŽ/—÷Nén�æ£Õ1&êXÛã--Ïq¤¥ŽW~ V[Ü57P�BB˜o³àFµ´k_9`w¨­…* :MÕLÍnž.)�Ã£Nt›Òö†,ÿ†}ÝÜ{Ö­B¦êRa·›>Ã£N²»CŸ­®¢…*¢@Í°íþhso[T±£·ËRÛ8^Õ(¤žm|ÿumGÆdâ -Ç¤Ú©N6©I}zè\Ä«`¯:bpÇ\›¿¥NçJ´F�|�PÈ§?{ÕYœBSlƒ°ÔÙ¶®œ¯mÏôuØùŠW}W‚n<:ê>.'ë¬´œG¤Îut;o×²0!dc–ºˆS”OÔÅ(œÔÅÚÉPGªKQ‹
+Å×FÔel1½¡Äý<¾—¤Û×êGÜ¾.P?¶¨˜JP–¨+Ùuö†œËF4î±ÔÕŠkßŸ0"»k©k¹*ÕuvÔ¹Rj©¸+f¨ùÛÅœ@²±¹©·ÕÍ–|‰o‘Iu‹�æÙÒ¨È]NçV­Ÿ«ÛÍíýÈ–ø`³=¼>ávÛŽa¨FNÆRwƒhð|ð:>Œ6ƒQ¯ê·ë»rpª‰ŠÜõnNg©ö©{åÀ�^q±GÝÏWfÝ¡9ö
+k¯BÖ^÷¾2˜Ûþ¥©P[r…üÓô(¢e²)4%·Õ¥6„Ôãê	Þù'ùv‹æSiÓ¦Û£žá»ªˆ©¿VÏr�æßpû�YÙÃ¦TNìùŒì!1þ[Sý.#êÛŸ¶~oªÔ`]úþ–¥^æ›PMê�Pýí­¶crh‘.ÜÕ«ê5^þ'ì}(°ÝÎÞ`Ê_Poò:%Øž+%php.÷87Ò†Øä%õ7&÷^Sý]½Ã]o§�Ò¢ÝÎó:é\H;Ç·Ôû¶Ä?°äŸäëüöaFŠ—¼.¦>¶¨:·E¦þEWªOÔ§P~ûÊ‡mŸ«“T_ð6%QÚ}ÛÁï®i]øR}ÅåkÛ^›ùšú/ÝÆXöÃkt¸5Ù˜A+2OGßÄ!Ñ™â=j™D}jiùì©Þ3<Ð¿žH˜½tMdk¯s7lVÎëÔ9<¾Q`˜ðF¡%k%_a6†™b¿xÎR?Ñ…žQ2ä¦.õ#L£”oZ
+1ë@�1Ê4FsÚ>Ì¾A\jßäÆ,c¬¾)l”i5ŠtC:ò´£=œ™t§Ã˜h©çlz&RáÞä�ahä:°‚ä–×
+†¦SÔcJI�ß„fÅ|l€>VS>»ò%®K3R:î)@<RcOt…,c6m”Üì`š«è:d¯ÆœTRöúÜ’CŽþŒlÊçñ&^æt$ÝCâ©ƒöKç†±¹Ö7€§…Æ"“Ö‹Á;B¬e,µyDj\¶É±ï7·¹ÉœNå¦z
+’?ÕÇí^ãàdM‘«½‡ñ-Ô>Æ!:JúO><†ôù¼ê�ÀÕ¥¯À,}G0«a©/ 8«±Æõ7_a½ij–}1ÆrÝÆf•æ¿Ñ°t¨+ÏCßãK@™÷Í ÒO@AsèÿO0J¿${/ß|•FsþûÊÀ7å5ý¯%€,L¹¯›ˆ?ë/«$Ö.²Ôa¶®nN.¶ŒÕöà1ÉÁ%É×¥É×9ê±�6�²$d@Êû<KÕéÔÄèH�o÷s‡¦9û@Ø]Á­ú_eÜ7IWR@.üÆ•¡ó—ÁxµÙ¬�Ú®ï‹“Ó«y6R=ÿpú_4…$¥Q4Ž<äÅ{FMü.LùmaÞ0*ÒïÈJõs8�ÐÏR©Ÿ£h´~Ž¡±úYüOôs"MÒÏÉÎÓç<§ÐTýœFÓõsÍÔÏYT®Ÿ³©ÏqTIU.=Õø=7å÷<Ð:Ÿà÷BâÿÖâm-ÆŸKðk%)¼•TôÓ�´¼µŸê£{ôÚoáÏ"â¿�w¸¬óèü²ì5Tƒõ<µ´Ê�·«ø›5@ ê*âth_æ&ÐQ
+’p,ª§Ã4œÃ©Á�Ó|<w¸q?5µ*€iin¨ÜK3	[Šå‚”eàh{mÃ8Oƒø¿#©Õ}6ÕÀ³x€Žj­_5§ŸŽÝKí™€W€ÊƒñÞ¨WØKŽù- u€ß6Q‡F[L[©SË3H'dð1
+²íjê§žÊ8Åâ´½ŸNÎÌ:¨Ë)|ŒrÑ�¢oë-tŠzPIgëN 3[ñ<;�‘šèü¹²Ø�K�^âB/¡sèçºÐWcÏ*ª¸‡¾§‹+÷Ñ$eR¼ªß–³È…YD?Ô0%W;Ì½ ˜E»^¼‹æV2ä	qº*N×\I�_7ð³RÅéf~ÁóÖ=gK1Á¦â×ï&ë;ØÞ�¤«ÛFØ�<lÆHlÇlÆP0‡NÄ·:ˆBTGalLd}’¦ÝgSåÒ¾|Ú´/£»°Í,‰;\“9Ûá¢zÄ=Þ½´÷ ñÆ
+”gäPh´ƒ·¢3gËýÆí7îÿ(Iá$¸¢þìÅ®lƒ¤¶Ãì€‘o•;S(ªv(òÀà÷iuMHP„åPt"¸åùS€öþz°µ²ªŸ~§Çùwœ~e\GÞŠÊ~úu¦jœ‚­?ÈOÂÓSOqE1Ek·Ðo¬ÝŒø)zÚA|šö’D3�hEœžoÜE#«öÊ�‡èå¦9Ð™?JÂ
+˜«ö¿“Ä>�…­ú:›t6éÜK›éR0Ó¡À/ù:½¡½©‡Þ¤?ƒRƒë<‡–³ôo¬OÒ26•¿µ�þ®\zÞÊ¤ç<Ðs> _)œßzQ
+=.=ôŽCÏ—žB—žw]zêË6@ïµ²ôÿ™ÃÉ\
+§w	´àªæ¢æ 2øPÙ;ßq°Þúö_»]ˆùzü§)ŽÕë@2øÄÙY¹Ö¢Úú¢u€¾lU†Êë§ÿôj¨²µTý"¯Ox*îÃø9 Šá^DI\Œ¬äßq1nSeõT%ºñîHåFÈî&¨òÏàåo‚ƒ¾
+dÜžÂ`­CV) Æ‹	Ì „;^áèTÕˆy{Å”†ÊÇi¢h¬Ü+f4VÅEùC¢bw(¨*Õ{ÅÂ±¸µ_,Ù�µ|T]&L£h7„²®ê.|½a¡sâˆ�ýˆ§÷¦ìn•CQ>ÍË´é[4V,G‘˜mÒëâ Þ]¾ÇèPù&ÖñÊcÄ!ÙÊ~QÛPYrX\¬õ8¼_44V
+ˆ&ÛZˆ­ª¤+ÁÃúM•q±Áž¶	ÓšæˆVž¶Óæ”ìàisô´¤€WêÄâa(Ú#`ãQÌc0‡Ça4�!xžâ×«¿�°ŸƒxŸG8~¡ôyû—à÷_¦£è•v�qØ-¤õâ(q4Xš@5âq,°ÕÒ8qÞ˜Ýã…ßa÷‡Ž‡Y2 ÚlvÛ@qgcÕãäe¦Bà)2 b­Jõ‹íqqrå€8…™:5.¾“ÂÈL�•¼Ôo€¥7á¢ÿŒ=ù4æ-÷6Ôû-hÍ{)¾h‰Kl•8fƒŠšf‰sÄ¹¬'|QÁ!ñ!°Æó�¾KœßúMÜT*.„Ö´Þ-Îß…X/.Þ|\\\Þ/~ð`©øÑ^q“Žá«[«úÅµ
+ðÙü^*®ï74Tr°.7!Zï·Úñ:.î¨Ü­í¾ˆF‰Ý?ã 3ã,§�¡7Ÿ`>…?£ÍôyŠÀ�vxXDJìÁ�9eÎ[9-7winî÷¸y™~ÍÊŠ¸ˆÇÅÀ¦ÌÐû$ùuŠU™®Û0Å}â~mUˆxÛéÌ¸‡�‚½ÇÇ÷‹_5Â’žo{Å³W’·
+ÿ|Ur»lööó?Æ@Ãâ��4I(š&Œ”-šá Î#ŸxAü(‡ÓHñ;°ÆL½(~ïqŒãËl?åÏƒ¨ÅK¬'/³kI"ÖY˜T(
+ÉÀÒ1"…ß2W/ŠÄi’æ÷U‡ƒjRÒ¥5TðfÀ÷ãûS:>Í¨
+|c¨DŒ³ìMÆÒ19ç$g)rUçëâ
+g§ƒÓgãü³ÆY*þÊš3 Þf¬Ë…u°N§b•Š™4ÏI¢*«ÏÅ:JüÝÁúŽx×ÁºÈÉàÄ{­ÃÅ)ýâƒŒ˜ H‰	…‰˜À7³?s”ãà:îô#-©!ÉŸ#Y½xŸøRÐ€øšøO\*3éÙEFcå€,À 4ã²HÛÆL8¢jYâ Ÿ”$’W,¢ab18\
+î„ò,…Ÿ]IÕ¢–æŠÕˆkh)žËÅÚ®võÒ"	ub®ù
+•CòÝŽÿ­�£Zóûåè†9–ißÈñ¿*.'TUÆ¥o@NåÑiM<:£s0:„ÏäáYqY™²:wÍT 6€Ø�ð„›h²h¥r±DE‹Ä1´¾qž5¢=ÅÀkÝRh™¬‚¬yrŽ¬är/çÊx›ä<7‹ÜàxVq�\—‹ãò@ä*
+•ûäA‚2RÑ	’‚0ÀrØÀòÈƒáIYF+ä·²RYÓÚ/WfªEw®T��özù|Š‰y/UÄåêÆ±@Ö4U@ŠõUø£A;LÙ‡¹Ì¨Àœu}ô=~®ï“-Ø€#ÁUK\‹‘ã—åñ‡-}²½b@vÎÖ>ä¡ûd7J£G0ê£ûy¨§O.À#²,ŸÅúä¶¹£À¶í“ß†÷]âë—§-óð×3úäYü<»OžËÏïõÉóub#/Ä‹�Ô,óV”yË¥òòŠK†÷ËKñSW†‘(Ë3C%¿ËŒä•˜î@»ÊËW)dPå§�”ççå3ŒBw [yò’@äå éÊ›²Ê–à� AUâB�W à…F”yúåO–0}ªÄ“g$éÍÏ+ñ0}Idg©’†�¤øÜ¼’‚UeÞ¸¼›rCÕpzÿ—?Kqó7p?Aœ7�¥F¡i1xÛm°ÔíT)vÐ±J2­§Pƒ8•6‰Óè8q� Î¢ˆøíçÐˆÈ?B4¾FœG7‹óéq!= .¦_‹ï#ß¾„Þ—ÒÅå¢XüXøÄbž¸J¬?ÅÕ"$®§‰kÅÅâz¼Ý(v‹›ÄÃâfñ¤Ø%ž·ˆß‹[µ®vØú˜ˆtx³‹Ì<ñ[�HPÿ´Ž~¢úäÍð°¨þ�Ü%oADÙ�”†3Î|PºRÞ*ŽJâ1NÞ†1/xÚ,o—¿ ¾ïx±ü¾mb<æpI�wbw/3ËÌ‰}òî2s”Ñ'ãxäõÉ}xôÉûÊÌ±ž>ù~å÷ÉGFå×RÁ¨üüë¨ Ì,î“�—™òÉÖQÆUä-1áBÕÄÄ›ÇƒÝþUŸüueUüéo2*Z²Ä4ZÜ‰tx7MGòP‰¤a¾¸sXì£­"N!ÑŸªÜDJ–ÏéD›ßž‡(¤~{f¯ôÛoñfè·ßá-O¿ýoùúíEù€®YÃ|�â) ù{ùà0øXÔmu�a<›×ä)•Üí4öÉ×¸kJjœíÓî%�@ô»/Å�wˆ|Žä€žë€Îã‚6Ó�=”²8Ï]ü†|ÓY|°®äyq\þ5#‹�">–âQó\‘åÉ·äÛŒWþÍuÚ7:Qg	@ýçýV.E?Dq"?¹’”&òS”&{0ò%þ÷Ÿ¦9È‘ÙkîO"¯ÐŠü$÷W0¶§�j<
+…}ûú,¢ÍohŽxŽæ‰çm^H‰2KÜ<k¾âv‹£Ì%÷�æ íãÒbåKxYÅTu®bJå9Å”òp1¥
+Zû•9H1%^¤|¤W¦ø²—‘ ý3^AŒ|T¿þ¿Š)U˜QLIþÛšnÁîd-þß©»†Ôý!UÌ¬x+ãjÄn‘�”ëæ†ø,ä¯H0ÞB‚ývÊ/vè«„â�£8¡�ü7IH*nÖØðMÕŸ gÖú¦5ºu@qv¡&ô«Éýjj£Z±‹¬Ê2#®fœ­DU\•·.3žØÿáÄk¨”›S·î¢Âeù·�U–ÿà-”Ï¿ò0«òÖ¼=À7
+ð—¸º`§Iï"ùûxø!þŸH?¤)x¯ƒƒOh‰ø”ÖˆÏèpñ5Š/47+´u6¹
+Ûä¤I¥´\U©9º1q ªÖ6>–
+7…
+8úbçMò�6gwR×ÒR5o¯ZÜ0 –¶V–ªeýêà¤¹Ùól6µî(u›T–Zá´Ív¸-¿dDÂ]U›Ý‘‚
+0Ç’žÜ]µÊË‡Ù`×h°‡æ[°&À¤¹°›žªþ¹
+9ÞnÔ�®Bò�ê$Ìaß:-W~§šéÒ¹¢ª_‘Ñ‡’ci„„ùÉq4QŽ§©rBJ©5ÍÍø†;_™j­î@K¾[æD­+  V�—*©š¯¢	ºý\ª6èþ³:ÒiA«£öÀ<¤š›*âê8|hÛ§‚’–eÆœ¸:a¯êiÜE“�Ý
+¶ÚÉ,—UeÆ>Õ+	J~ä²<6ŒWÒd½®,o¯:+KÕiîÂ]TÃsÎ4®Ëšô�Ä¤sw9d'¿}ÏýÆf4iw­ë¤š ‰$'#öÑd9…|rd7�fÉY´X–S­œMu²‚Ž‘•t¬œC[‘œ‡‘–÷")?UÎ§+åºA.¤äbúƒ\¢e¾^w‘Ü|ov/r*ÅÕyZæ³h�Z«ÎÇÞ,†¢^'gPö„�œA[é$u¡vG½Ô¦Õ81ÿ"WIN†>‹³Å¸ú>§•quI²ó†œW].H÷qÕ’Š¢G¹Ì.§"y�†2L–+h&’ÿd4œ•HêÕ]ËIÔ£ØjÎåLÕq\]Q!úÔUýa¹ª]KÅ¨FÊºÜŽqNá	Š›Õ‡Ú««§aÜy�«kvÑÜ
+¸Ðëãê&hÛÏ*JÕ.h^om¨€Vý‚
+bSu'[Å]	�<ÌÖCë‡e4À2iºl¢Ùr-Í•ëh�<‚–Êõt°Ü�b-+:gÃ1Ú™â\ø†wk¹–^u(^áä#÷Šg¯¢bN÷ãªïJÊ3nW·SZº!�LðHþt¸üDßw«#àÉ™Ü—0×¶˜Ç»2÷ò°w,Ø;žFI?XÜB“d Eä“]‘OvºÂ’oŒ¹gùzÖÒ
+½£jo¿º¯b@=ßXªêW�`sQ©Çúè-&¯¿b¡?ÍDÆÕo2N'd'Ê êÖ3hš<“*åYt€<›–ÈsR(ZêR´Ô¥è9(Af}JÏ®hó€zqôwN}±_½ÔÀA>÷HÙT9GÁó¼W¯ƒº?§�ü¼¢£(ÇÔ¼DL50é/·{tÔƒ3 ´üJ~�Jåù4V^U¹�ªåE4¿k‘Ú7ËKh“<�Zåe)™Ëf·1½FýU½¥#uµsÞ2�ŠÔÛ:¿’|mÎ‘{³Ó9Aú;Ÿº¨wsÄ¡!ýqèêÍL
+oÿÐ=¼	>v‚GPï¹ÛêhÓDö	Pž"öçW’Çàâ�]téŸ™¯¥1ò:š ¯OÙ­‰.Â‰Ž“|eËAsæpÖ¿(–C9>ÒÎ¬ª‰ûÔg™ûƒâêß•7këØÆÞþ?’ö ù™Xµ�Ê¯ßÿ¢ë®2ò\y"çÏ „›á«vÑ8ÔÓä­Ø�ŸÃto¦ƒäpÌwjZÚT¸´®vh- †0X…4Oïˆ‚ÝŒ2PÅëL¦Õõo5ŽÀ
+¸&®Œy™a‹åÝ)‚)p‘¸‰ÆÙƒ‚óf‚‹\np‰ƒÿaLÜ¹ÎÙaŒÏ°+*ªâFQŸ¨â$Å9?Œ¸QOhá“Ü_7†'1ê<\ÞOù¨ÇŠåƒðúÁK<Œ0÷ÂÜ£°ÓÇST¬Ê¥¤Ê9GF®Ý ³´:ÇA•QÊ¹”12‡?…íûtø…Ar)G¥øßJtËA[rÅÆèÖ~cÌ^ct¶a�­êPöDà¶CÍáÿ^¦a(ùŠ�Ž%]lâÈ]ã]ÐÝ)FNªè7|»hXÃ]ÆôRcfÜ¨T{�jFäõEn?Òv´¢w0ú.Dø8‡÷a(ä0”blàë†®<ù¯U¥på¹²…cœÕ5)æ7ægŠî#ìÓÇÐúOr¹_?s@/v‚�îæÄ�™šöÿ<GË®€ÿAÆŽ?šÏúµ¤±ê	šz—±LgoÆAÎÝƒRc…s¢aTŠÝª¸µªß¨Éh½Ë/¡e_‘)¿†fýavŠfÍ7VêûüV«u<ŸªŒUFïßGr…e×uÃŒCu¥ÜoÞP‰²8CD(`-eP‰ÊKÙ‡á{¢ðjƒï…x�F£	ßôŒdG@vgž�NÓ`¤ö'üŸ×Xk¬Ë^Hoe.œ˜µðc½³p–cºž
+øy£eOÆÒog-Ý`lÌAl0§/ká&ãÈÄ®È\X™µ°•ÎÊZØo•Aª“µðèœ�ÍX¨dÖÂãT�³p¦c“ù‘²PîÉZy|î•çf®ìËZé§÷s¬4Ú2W>™µ²='ÎÔ{8vGiÖÊ@Î•ÆÖLœY+;�`-hÉÜÌéYO0NÌ¥yê¾Lœ?ÈZÚetgS›–ÞÛH'd¬”FHÿ6zð¼
+yÐQz|�é<ß³Ÿ¢Øy69ÏVçyŠó|Éy¾æ<ßvž_ÛOYà<gÚOuˆó\ã<pž·ŸF©óm?ÿPKmÛƒ+»^PKËº$-junit/swingui/TestRunView.classu�½NÃ0…�›’–þÐÂD%Æt€LLì¨‰ºß$—àÉ±ž��à¡Nº0þä£sÏ=ò÷Ïç<ÜàB`SZ%MØtRV†	7fgÕ^r7�X—ÔRX‘*Â§´äÌLà	¬
+61WîÉy?!plI/šÞ¹«õÛ�u/0¥ÌÈ–xÁv/°ÔÜ2UÉÊj§n‚ã£½×§<O(¸r&WåãÐ4|pbÊù3)|Jkk’:6¤]�»"�ª;nluX7×VERÉæ•s�Y\[�q$+×rýçknû*þ5F£?þXà>à8Átà)fçX\âlàª'\ž»G8ÿPKòµâŒPKËº$-"junit/swingui/TestSelector$1.class}P]kA=7‰n·¦Iµ~5­JÚ”ºí›`¥*A)yŸl®é„ílÙ™´øPê_´üþ(é�IÛ…á~�sîÙûë÷�Ÿ(cO	Ëã‰Ñ.±'ÚŒ&:Ùgëzœqêò¢½�cu¬’L™Qòq0–I„2¡ºêÄ%|ÌÆ%¯S§sÓÕÖ±á"Â
+ÂMw m{Kvt¯^ò‚Pí}6î€�N…³£ù’°ºvi½O¨ìæC&”×Öû1j˜¯¡‚Û1"ÌUQÂ¡ÞÕ†?L\ì«A&Øf7OUÖW…öõ¬Yñ6	+×ìko‹Íº
+¿¸ÇÅ§¼8äáÔãÿ®ðÖçÁcýÏü�VY>ŠpŸ
+µ=Ê-Çxè]?À#q8ÓÕj„Z/Ÿ)¿ÓÞtão{Ï<�¿7rúÝLYË[r„
+ä¢òšþ*«ð_I^
+·¤Ž%{.uèt.Pïl|GãkÀ4ÊONƒÎ¢d±Dß½ƒ»	K¸7Sy%Ñcç:ßÐ8Çò¿gâàKÐXšâf>ka%°Wç1žÖTh^PK¡eÀì”®PKËº$-"junit/swingui/TestSelector$2.class}QËJ#A=e¢mbkLßï!�h‹+AE„ B$ûJçª•i«¡»¢ø2ó;êÀ,ü?J¼UÉBÄXPÜG�sî£^ßþ¿ ƒuü˜kµµ2Az§ôU[”šEš8)oy£-y+ƒHê«à¬Ñâ�y—•w& [Ò&8�ŠuU¥†4%úÌµJË›\£Ú»ÈŽ@®v¯Í52gW1rO`qå;Òj] {7I ³²Z÷‘ÇpYŒøð0˜CF
+U¥é´}Ó äB6"Æ–ªq(£ºL”�»É¬mS`á›zå-n³ Ýˆç”\ÆÉ
+5;=~µ…#ë»gzkz˜ÈÇ¿:15}ÌØ¦1+ È-­·63kq;	éXÙŠ…7,OÀ?Ñü‡‘LSJ±É+É‚÷Ë·dwÄ6{úøæ1Ä±ÏÞ6Ç.Sù‡Beí	Å¿Sr(ûòàtÆØóÙÚìŒ³˜ÀdWeŸ­ÅVQ|ÆÜg�ßÜÁ§1ÑÁu5¬7�Ç^tœ%,;VG(½PK²®¦zŒ¼PKËº$-"junit/swingui/TestSelector$3.class�Q]KA=7I]³Ý¨‰Vm• &¢+ø"´%¤Pô!’÷Íf0×YØ�Øþ
+±ÿ¤`[èC€?J¼3¦P
+	]îÇœsî™»�¿~#‹l*£TÉÄ�o¤ºL¥{!â¤+á'aT?¶@„¥‘7öÜÀS—îyÄ7²„]ÝýüÌsÅX¨ÄíÈ?\*]%"/sÉPÆõ#žÖ™>î-!ßý¢’¡H¤Ïœw’‘§„ÚÞ,R£GÈµÂ� d÷=6
+6rXp`a>�–‹©ÄYzÝÑ…×[ê„¾ô¼HêzÒÌi›„êŒyõc¶éŒ½ ­!¯D
+68{mÝ2VËÓ¥-¬
+þPøWm¥
+�rPÆš�×xC 6¸óƒv7L#_|�úYÅ¿§j~ÂGÅ?§xq,bñšrà�ó)é½qÌC>6^rípvÂµé4b±¹ÿÅoS2(}skt–9s8êî
+^q$¬bm¢ò~¢’oÞ£¸ÿ•EîØÀW#²úœˆèlU–É f8›Ø2,28 ôPK¶e2NšÛPKËº$-"junit/swingui/TestSelector$4.class}PËJ1=±µcëhµ¾µZ]hE§‹.E”ª 7-u;¡FÆ™¤¿Dô/àÂð£Ä›´ˆˆ6î#çœ{r?>ßÞ‘À&Vò—�PjOueØîH¯!”®‹@´t+˜Aðîñ®öÄ�µw&C?êøüZ‹ØA‚!¥/¤*–	Zû_m‡!]¿
+õ…Ð²Eœ]IÈ=†ÂÚ Òz“!Y�|Á�X[oºÁhI¸.†‘JcãÙšÅiçê\Ä
+~6W‹Z<hòXšºßL›+æ+ds¬kX
+"EˆžÃ¿Vpdrë0ûý~(yµÌ28¾T×‘.æ�ç9,00a—ô¿C¦uâ–8–ÆòäOs[†Çàž„¡ˆ«WJ(”iIôg³ŠÌ¢;‚4ÕÊ¶©6�Léc¥�gd-fÂôìË©Ð<Ê\Š¦›Ã”Õ�ÆL_eŸ¢Õ-=!û‚Åß÷4ûÁjÌöç÷4L¶„¼e/[Î
+
+–ÕÓr_PKÕ½d|“PKËº$-4junit/swingui/TestSelector$DoubleClickListener.class}RËNÛP=“BŒ!¼_áÝ”ò˜Ew­*U)m©\6AÙgŒ]Ù× þ†_@j©ÔE? U1÷©]$ñâÞ™ñœ3gŽýçï¯ß(c¯—E¢´Ÿßªä¼Pþ)çºÅ1G:ÍÒâ,æf¬¢«@åšÎ* Bý2¼	ýðVû|Ã‰ö¿¦EÎï;á7mÊ„a}¡òÆ!a9èOÿ†PmÝ%ú‚µŠóVIç;ÂÚö ÐN›à4ÓÊÛ;m#uáÀó0„á*J'Ô•ðIq}ÆÙi(+¦‚4
+ãv˜)“w‹Ž‘I80¯—"Ü»6+Û*w«"¹‡%G&´Šû¾®`Ž0vÎÚ’5Ó"Ñv³cXt1�%ÂR�,Üôê9çŽ‡UcÈ
+Ö$;Ö(`+-²ˆ?*cÇäÿ¼&‹'²q3óœÅªév`CLwˆËæÈ]�yLuUÉ]É^K^’ÛÝý‰±Ý½¨=Øž	9
+8Â¤œž�]áš¶œ3˜í2]†‰½GÔ‡î…é;j�XÿÇ3.5ðI¦~F
+_,ßÜ3¦Ëg¢
+l
+c	/,®�—vž©¬`ÎPKq3“ÞµPKËº$-2junit/swingui/TestSelector$KeySelectListener.class}Q]OA=[>Öm)jµ Tm©¶núVcÒ¬6iJ«	„÷nd²;HøYMZ›ô¡? ?ªé�£	Á}˜¹_çÌ9wÿþûýI¼EEàÍå(TÚ�Ç*¼)¿I±nPŸÚz•¿Ðd×U¬)¤(
+!P¸”×Ò—cíÓ5…Úç©�9Ô¦�Hé®ŠËï6ë‹©?d“PwI«6cO	lUU[N0è�@²RmyÈ`É…ÏÃ#¤²Hà‰@®®Bú6º:§¨)Ïû<»\´e¿%#eòYÑ12xoÞ?ËÎôhÒœ©ÃYìÜ*NL`•®/h¦±&à^�æBÐ•‘5xxŽ‚‹uŠ‹5¥±É†z·ÂL+èË˜�8•À¬ä¶\”°- Øea¡B–ÐŒ¢6}Rfùû��€÷9dÏ–žø�üÜ:°Ã+w°$óøNÃ|¦šA–s—³÷œ'øvk¿ð¸¶ÿ¹ïvæ)Ÿ|EžOÏÆ.s­XÎU<›1Ï¼Úäöo°qƒ�;×öN±„3Ë³6��ñ˜è%^1Se‹y�]‹2•öàüPK0•@­PKËº$-0junit/swingui/TestSelector$ParallelSwapper.class}RkOA=Ón©Ô•–j‹å%bÅm, ñƒ<C4ihÄ¤¤ß·uh·Ùn›}@üY$¢‰üþ 5>Ð3)�&�{fæÞsÏœ»_O>AKx&Pî†®˜þ¡í¶CÛÜ“~P—Žl}¯øÖò,Ç‘NýÐ¤—„Èt­Ët,·mî6»ÌK".0uÊâ…®+=³Þ÷éÏË#û»AGzÙZD¶c6¢6ë¼
+:¶_\˜®]/‡y£õ÷.i»Åš
+›™[«ÆMEWÛ•Úvÿ�ˆ¥†é4dtŒ"5Š²:’¸¥Ð=�tÍvå›°×”ÞžÕt¤zB¿e9
+Ë³ÕþìPSOX¼AË°Ÿ|P¢êŠæóH`Â¸*·ZU‚3ÃçIÌÐ2÷¤¼rFµTÎºŽ˜Kat_¯.
+òÆÕôªòãŠªâ1=>°œPòYš#÷Y"ª”ìÙíq<è
+ÎÇy™CyÑ¬	¤êýÐkÉ×¶ògü²Ëªˆ‚ªêsÙv,ßWM&¯·.‰UNbÈ?ÌqB(“jd\³jˆ<»
+õSç:îp?F´Ã}œ1]þ„ñråwË‹ÇÈE‰y®cÑõ7R|'þ�	îòI÷Qˆ(Ó˜d£)§0}F|ÄºÆÍÊôGÌ¿Ð*•Fâ…JA#\(@.ºJ(¤þÿ.$TÎ…ŒY¾øÉõÆñ›­ÿ`'XÃ_lD²¶NžËÚÄÊ2PŠDo¢L'ÏsT°H¯æ)z‰(Áûå¨Ÿ‰FåXŒüOûPKãšKPKËº$-1junit/swingui/TestSelector$TestCellRenderer.class•UmSU~.$l––H¥´-ÅdyI-­ÚBÑ6µm(-Ê[-¾õ²ÜÀâ’Äì¦_~ˆ3Žã7¿ôC�Ñ”ÑÇ~òG9>wwy0£Éd÷îÝsžçœçœ{ò÷?¿ý�VŒà[�¡õzÙñóÞ3§¼ZwòóÊóç”«l¿RÐåº³ª¼¢jªf@\X—Oåfè�¿­J²îúÓN³a«@²4­d©hWÊééý^zo\ Uš«;¾
+-Ú&Æ1)ÐšÍ-
+Ä
+•e"�d
+1´tÌ×”u#Ä:zöc.È²\ÕÜ'ŒUå‡¸ƒÙ€:ïJÍ,¯3³ñÜáhLœB:…Nt™ˆ£-‰ôœHm·â©•�ö´	#|ÝË×ÓNY=¬o,«Ú¼\v•Î³bKwQÖýmÆü5Ç™þRSž³Ì¡YØBe£Z)«²/0™=�Å”6?œkqi)L7/Ÿùù]&ü*úµ¶¯	tîyÍù5¢¸@ÅW¯êÊ­p«IÉp3RòÀ–‰‹LQ 77]Wgæ%�c½=_Ö|ï‘ã¯±xG¡-™Âp
+¡–Ó“ËÊ5�gm½�Úöd2·hâM\NáÆBÛyµéÃGÛ«xKÛ¾Í2¹TP ëYâO¥[W;�|@a&¶Áfu‹,Ñ¦€(rÃñÂÊªn,	˜6‹xOzw*v�­ l�î£ªr� 
+S Ý•žàÏ”h¶˜+šxw´Rw2Í.·ê¥’>	%éÕ—½¨‚=t<ª`÷1­‘P¯ MMrü¹iržÁÚùC}X)åæx†ûGúXà©–Õ*[W`ø?5O7Aá#
+õ˜¹e‹Çý±æý„]æWvz´;{¤ígø\Ã=¡6¥ôÊ
+Ö2éoUUTµÔ†ôí5åÝW[šó0H!·tL±6Jºã@›½&k7ý°HÖu”_°¯ö<´‘lVhƒÅõ+T©V�žÙ‚ö« šB_²WØ/-6OŒ(ðç0Ô¹J½f«;Žž-§öO‘QMÁf+–Ë„Ó‰*:Ÿ9~ìøŠ§¿yö Ÿ¹Ä^¡‡!ôÇîq=“yMñé-ï§­—0­ô‰mtÿŠŒ•~%Xœù9€èã5À�ãõ<:8x2¤8Ë3tç›ó¼=’"è¿H—à}Â>×ë‰¿Äë×Û†ÿÄÀ6²×�^#m50úNXÖ/8ÓÀ•ŸÐ®—.­^£�wzÛ^ìòŸgøà\êÀ ¹³dÉqÐaŒÿ�×0Ä2òE±èÕ5\â›À8-Áê&ùÏ©Wïâ½ «	Üä*Nì<n¡À¸3d¹ˆÛäLêYeT¥�Æ¸duŽ6po¢ï{Ä­¿cê±Õ{ÒÀÃmÌ¾Ä|z±�%«µ¯�O¹h@¾hRñ2qÇÐŽ+d¼Dž	q±LN]¨ûq’¬I¬@Eìwµ¶êê³¬m¬5àn£ö#â±ç­Ïw	Ú‚t¯íí‚€ê•�zÆf�@%m´]QJ­7ú~€ÁlnœÝÍ0oP7ƒ1%©ZÕ:EÍ4Iè‘0w#Oá)W-ü>�6±Å{ŠïZð5¾Aâ_PK˜Zþ~™ÄPKËº$- junit/swingui/TestSelector.class�XxÕuþ�´ë•×c[’ŸÂÈ–y®W’Æ�`�Á–d�-ÉFpíŽ¤±V;Êî¬d �˜¤äÑ$}¤
+¥š¤vÒÆ­dÔÒ”@)IIÈ«	iÚ†<É£4é3ô?3ûÒÃúúí§¹3÷žûŸsÏëž£ç~÷Ä”£QÞ+8çh&i»Mé	;9”±›z­´Ûc%¬˜ë¤BÁš£æ¸yÌ_oÚßj›	g(„rAh°ÅLÆ¬„`]Çš½×u’Í‚òÁƒ#‚à`‡�v	4—J'I³r°'–r	+îSÕÌ¥ò™I‹´Æ`«•Ž¥ì1×v’‚µóÍ+á#zò[ñv×T{dM	“D=nŠ´$Zv•ÍSï4EüesÂmÚ—2G­æ_!©L2i¥<}´¨|ª�æm}‚@‹·È}ÁÆÃÛúTbM¬%ßÂr‹3:æ$­¤Âzê-m¹=ö„FÚÛuÏFÔ„±çVöä}.�Í
+ÝVÚ¾ÃHpW â1ÚŒ-aÔ¢®tÓMv2îL„pmÂMNÌTUu[	ŽãV¯#ØP"vA®f¼†q>."Ãç¬”�f ¢eØFÕª6êòîQ�zAùôÚ®
+¶.²PÓ
+Üˆí*iS©¤-™TZìRúÅ�åJYqkÐNZqAÕÛ¾­cy³�Ë°3Œ¸\°œŒ‹ÄH•ñðF=Ñ•‚U±”eº–Šï»Ù%‘%ÍìÃe\;ÑÔçOhÆUª†«•”¸Õ43‰‚k"‹I{
+®Ui÷ªø~-E••rò½¨-ŒVì3P�åËÉõzrU¿ñTO“vz>ˆxþ³”ºCPö`¾À;¢•Ht[É¸•²¨ü.†hÄgw(Œƒ¸�R­–	¶Fæ„™Š^Jà‰Ûƒ^àFº×Y¢7„›”
+éfôc…žê–ùéÅO!ÜÆõ³KÞ¤éAG`b™nŒåÂknð‡@�¬÷\ç[už»Æf:½«Ca*„�•
+qTPvð@B>hR“a	èž�´›2cn^¨1A˜êiKjÆ
+¤4ßŒ´`¢Ûq\=)SXÎ
+Âå—èŒkz˜ é%	aÒ·tÎ¿|Þ‚�‘Es¬*ÿ-¸3Œ;pãÖ�¡sÒÉ¸ÞªV-ÃÛ¸`Æ½ôjÑÕÓîõÞ.ØTØ.§'î´Üa'Þ–JipÞGè `WftÀJõúé§Z³J¢ÏLÙú�›¸Ã6õpnÇÙýO“î˜™bfáç§N¦·4‹P‹Æ§@È´¶c	éIHx¡^½0Ä˜„‡òIx}iä¶Ú£V2Íø¢©þ¤Yù�iu÷:NbÄv5×”ÐçfIý'øS¥þ75„?ãù”!³�•T¶þ\ÑÄC¥÷D�{æí0aÇÝaµÝÀ_à#Ëñ>J[öÐ0­û—þÔ	z_Iª7ðqÿ2ù7Æòwä¼lÏ¬=F_óÏ¿v±Ó«§„¥1–H+—†pJ°%²”éýó™0ÃãÌ…ôÆ=^Ëû¤à¼’n�SÈ¦¹DÓp3K´#„'Â˜UNÛ— ku2tÝ–„É3	á³aœÑ�•±ÓÉ¤­¢„[H8‡Àð)|Nuÿ·‚†%8°&ý÷"ß¿ãiå»Š|¹\äºe×’e�ç3xVy~qi¥\Â—Âx^ylÌ%ƒÂ]RäÖ07Ëø¥õXÿ=^Ð´ÿ•¥YïáÂx1oy¿ªXÊòs)<N_ÇKz“ƒbµ8,O’¹l;'~uÅ´u—�oáÛšj¿C’Âúu);¾×ò3dß
+ã{zëU/áû~�áÓ2U–ÈéÏušIs('àðÏaüþ%ŸRK˜Rï;é¦Cøa¯(Çà�ø±Fñ+øInfÒÀÏü™Ÿ“»ÎxIÀÀ/üÙ_j2âl>	üÚŸþ7&»A;Á«ìßý‰ß0QðúvRþÃŸúO&½	oÛ1¦†Vÿ�ÿÑùÿ-Ì“ùëÞ×KJµö$µ�I	Y°ú%k¥ÂR.Aò±½u·cÞ–fCBR¡xËYhÐô‚m‹VŸ%yüàÀQz�ªTVˆA•ÊJFcBo÷=rÿâjfúZ­¹ÎŽ•ÎÈœïª˜W_Ì¥‰
+[±ÿ‚?x  îñÐ6î—Ï~QXh<XóŠ«vCÖËF‰l\ôÿC£��‘<Ô\à>3‘±Jî R�r®Ô*§Íù;¨¤I��UXÍ:GØ„âvzÌI[†\ µ@­\È9;Ý6:æNzræA¾Zf&V4*´·D¦Û$ªLëçU4’�4ò.•
++d»°¨Ég?ïJ×ÚLëØUáš¢Ô-Ã¦–^ŒC¹ŒÈvz?—ÚãT�=h[©×L¹þ¾Ã†\.W„e§¼�…enKX¼ÆÜ=®–×í‹*êJÙ¥âPÓ+\çÆ±1+Õb¦-¯Å�«e·â]CCŒš.}"Í¤«™faãñß#{Y>KKi�žsCÚ¼â\öÑj¼\3)Ë›oO÷Ùi›nfÈõ>A;]²ØWäJCh]ñ °¶XÖ˜!]j°å Ë×˜VäõÍ´á,F"•Í?*zu©“zÝñ\W*ôÇçœ½ú
+I¿¶ˆþ§®¤‹âWYmÉÌ¨•òê*û¹u…–Ûò^YRˆ…Ä+î„åv1yÂ´–F,[6èD<çQ0C2HÃ%­cyS2,µ+dHOfžÉMÏëHKRËˆ$”�¿R!aNúgˆ.ÖÃ.œ2Ä‘1µù›©Óa3Ýé¤¬×´AEGT
+]â^<D§=¦z`HÆ—.YF�¥W”ca™�I�ŸR£õ8)/~Þ¢"ß}Ñi¬�‹4�íí‹l¾ '›§´»äî°Ü)oåÅ+ÖéËT7ÜpóÓíÆ‹ZîËm
+÷8™TÌÚgkïPUzÆí
+C÷jW)¼ì`QâÊù½+ÏºHýF¬µí3OÑ¨cï°Œ#ûI¾•iè�l·½‘
+ª7²YôF¦NŽa^Œ•¨â³�wEw=­Lc]´JŽTIC›¢åYl�Ögqñ	TtEg�Vsþéª_6ƒ+²Øm˜Æî®X±+xFMðÉ“Xv«vêg°—ëDgÑÚß8�ë¦Ð}í„ìÔqû§Ñ�E)nî×©ižÂ­ü<Ò_}û4¦çÇ`õð4ì)Œø+£ÞŠÃ
+±ÜhÇô=‹»£Ó¸‡ÇOñœëPËß;E3zòwò9ˆ>{yÚyþ>Rõ“ê06ãœ‡ÛÁ›¸ÃÄpWG7nçŽA>‡0Ìß8lÜ‡üx£xI�?ždEÿyöÒÏ �ß#—�´	uŠûñ.À{{7ÞC�ëÛ{ñû”h3õþ>¼åäù>@ÄrZ-‚}»+À Â3~°ƒ�²x¸3Úð8>VÏ¿x0Á×“|=É×,>yªpÎjÏ/Æ)Áí~cÒ“©ÎÇ£ÌŸâd%úWøkr[‰Mø4ßÊøcS�ãÿQTÞ›©ßø,ë§r§²8­êžÅ¬~þ�ÿIkžÑÏ'³ø¼ÿù´~~!‹çüÏçõóËY|•6|Qß¿–Å7‹òîö¼òNò»‹žz'¿Žc
+µ¼‰ãfj­‘»Š:»–úºžã|lU{9ÞÄTÏfø²æô]¦ÿ5ðÏQ`TÐrUø�³øýîå,þu¯ðíGõåSø©>^­LáWúxM¿­¯¬šÂÕ¯žÂïêWM‰ÔÏJyeEeEyeÅ´,›’°ò€#õYY•ƒëlP¸îµ!D8}{M¿m¨®AáøiÈÃéoÞ­
+E¼®Æ ñôñj£Š§�×+WªQÊÙï4÷ï
+Ô–¡& 5Åðž¯Õ<”šÀÙ`â5â­t/ýø0sÈ#XÏV¾¡ç~Mø.g¿'p
+Nâöî·á“°èg=m’^v7½ë8}ì~œ¢ý#Âg¸2Å_–‘3�/b/à4[�'ðs|¿Á)Ã“²
+OÉ:|N"lF/g|"K®ÈYz½ÔÉj©¤­-|UªøVFÔ{¤šoåÄ¹VÖð�ž,k‰ä{ö!®”qÜ¨ÊRÍJMÙÃN  I¥xæ°G÷6¦Ïx¼×ûû
+Q½ï“sˆ*²©7m¤Q_\õ¡·<%[§äühV.*¯òBñ9Ž_â¦çK\xM\äbÛ‡¼ZYx�bÃi¹Dð‚�GË-@.óH^XêRÙ‘ƒúŠw[Ý9¨ÎM3òÆ8U¾ûšjOËUeTúVu.];#­ÂZ%®ÍÊu¹qÿ©ãåRë‹ñÈë_ž‘Î¬*nùƒ­r¾ÆXþ:síKÌµßÀV|“±ü-zË·y¤ï0î_b,³uÅË%9³» Ýn¹Aº)wöK�ô½WÊ�ô»rbÕJÑÕ²7ÉÍ¹Ó5åŒ>.çzžj~P¢š`!Q43µø›œ»>­úÓrDÐ9+·÷WáÙièÒWF•Å÷]ô’Í<úQñÔl¬	f%Y¨	ÎHŠo\ÊÐ8¯¿¬ô¡¦&P®�dâ³2Ñmœ–;fäm�Eá¶{wôÉüŠñ#l¡ çá'ÔÔOqûè«ù½¯¢“Ýs¿ô±Û´ )Kîa\±ùÁ¹WÞîiªGŽ{wÊì“ûø b¥§³ »§w(y§(Ú^jø ¿îçx†£VOs|72Áñ=Ä{ÌãS�ÙÜø|n|ÑÿPKit#Þ
+‹PKËº$-$junit/swingui/TestSuitePanel$1.class…TýSU=âZJ ­±´E
+6…4Vk%E[¢µ©�"‰Q¨J7áA—]fwC©ãïÎ8~·õcúW8#Á±£ãÏþQŽçm"Ô’¦Ì„½ï¾óÎ½÷ÜûÞßÿüþ'z1�ªÀÉõ†múï–i¯5ÌLYz~©aúrÞ°¥Ïj‡×�-#cöZæzu]Ö|
+½Ñ}ïBÃ¶�ª%5„úüºéÅÏ’ºØ�;'0Pºmûué›5�þ-ÃŠûDmŸ[u�
+yËq?	NQ¹½iØ+b‰¡.š¾.p!Ñ=VgÆ¥dE ”wV¤@o"YÑqC„Õ¡¡=ÑÁSÊ:ªCÇÓÊzF`°hÚr®±Q•nYN5ŠNÍ°*†kªuÛRRŒuM.žei½nÃþOè†oZ™
+ev\
+§"CT`´…†ç© Q«I/P~ú	r$;l—])g)…•ÓÇx/àE�ã]€Úšô‡mI�ö‘A!W
+é’8C@§&h˜dê«¦½Rš9Ñ¹W�ó>"X.YÐqYò%6À3?m5—î—ñŠó<ãÕœÍÛÛw8l‰³V£p¯)ô”@Lío·4Èø¬>£$˜7üº†‹jfœ§ppÕtå¥É×I&9¤§ÅÇÎT˜K¸¬r�¡<T²hx¾ÚË;›Ž-m_Ç›J¿i¼Å¬	È×M‹¼§“.t”ÿm\Uü…ýùÈ
+œ{ò|<”õ5•1©ÞAQMÅ¬ÀÐ�m
+×†½šëX–* ìTLÏ.ÁÉn(	ÞÅBó(	„·6éT—é@_¹É‘Û¼ø¬%ÔÂ
+wèõÛìß.¡ÕØ5ZÙ
+èÊ,ï�‹”œ†[“WLUÀðÿÕ™T”<Q°méæ-Ãó¤Ç‘ëá»Á‰ïjT=´ þ¢êyhÅGdoÕÃß!r}˜ÖLÀŒ¤v1œJïàHêÌŽ¥Nì öK€~–ÿ#Á©/‚hÇiéüòFq‚_Ê�¡Ÿ˜D˜™w`lqÏS¿âÈo8ÍÏ±¶ÙÄÄ_È¤›87=z4^ý¡¹ôD¹˜^œØÅS¡68m"ÏEìgÌ(hè&ÁSát,Lx,¬\{Ð&®}­¤XbaEÓ×Ú›‹õ5QÞ¯gŠ
+_R±¯0Ž¯9«ß ‹oqßñr|�YÜAw±Œ{�øŸáG|ŽŸè½ÔµUc»þ~2½‡
+‡ƒ÷ñ£dQÅ"–Ø™K(á>¤vË|
+>¢/L.Ó×Gär�ÕM�Î"Pš=ûPKž-¸.¹0PKËº$-7junit/swingui/TestSuitePanel$TestTreeCellRenderer.class•U[wUþN›6i:Ü
+-¤´P¤”I
+å’"…j°´µ­¢¢ÓvB§�fâLB+^ïx¿!Vß|Ñ'.%°Ô%ðâƒ?Êåwæ„´1Y¬åËÌ9{ï³/ßþÎ>ÿóÛŸ¨Çn|'°w¶�µò	oÁÊ^(X‰qÓË�¬¼9bdM»[nÇ]Óì7m{ÔÌN›®é!ôYã¢±¨Ž%ò´Hœ43FÁ®a]/Îœr]ÇMM9Y�–Á•g¥¬O ˜žSj-3`XvÁ5Õ¶ñˆÅüŽ
+ÔëÑ	�@¿3mjhB8Œ4�&Û1¦¥©§aµ”Öa�ÀšA+kæ'MwÜ˜´MÕ™2ì	Ãµä¾$äg,O`ÿàÿ�)¯•e$lƒEOÎšSù ZBÌ|¿mxt»^�.ÛøÂ>
+±)Œ6D˜¤%ÓN˜šÞV&„Í›ªS-d³ÈN¡wYì¨é9wŠ%Ô«b¬Œå]úé‹VC®a+ºÂØ‚mÐØDÜ¶|•’3§òÙ¡!¨t;Ö)]FuGD5„”Á.â1ZnÄpÍl~Æô$²=+³S(õE«ó#lyG­6è5,4$°Gâ¶·x¥
+b?d±3‹ÃvUOESÁ�0ÆArÄ+Lz%ïmz*UÓÿa$¥9sÎ}’Vä-éb.æ+uåêsë)�öè¿téwæsN–¸Ó+šqZšöUGK§Ó©t)Qc!Ÿ({`ªý8)ÙŠ=©rÄãŠ„gxQl�-zeóý»*
+}=�¥p:Œ'ð¤Àæjê•
+ƒ8ÃÎ(ƒŒkÌ›Ž;ç›1,@<Eœ-¯tw"ú`-ë¾hZÃÆÃÂÓ„²"ÿAcRFz†ÍôÏZõjîF'4œC:Œ³x–Q»vwÉ°ætÏKxþ°Ñð‚
+ó"ñ ‰/a’#eÁðx§4L+SùáÝ‘>$I*Ò*C„UÒ­lþ‰B&#¯çcËÖ“#æ%[Ï‚/vÁÎhÈ¡W2ì¥rQ•wtBŽ5/dI£‘Ë‘;ñZ¦U"•»yÒÃ¢üðª¬&ŽãŽc�[9•×+2Â,^Õ8ý{å°|]�­´oHíY\‘Tgç9ÂjpU Á/‰œ÷$ÃDš›‹9ƒTgÂÛ4x	ë]g�òÃp¦
+òjL‘@µøLóŠ«b*›”'�J´î¬1²WÚ
+bØV›�T2�ð˜?@,ù¬¯œø½2
+Ã”œ»þL5y¢ãA�Dß°¼Z/ºˆràƒ[''-Wurªúÿ�ÿ—Z¾hhæª�!%±[X+bíÏ¾é:~WÓ	°‰"<ÚŽî4eŒõØø6÷�§µÔé1zioé¸�‡n¢[mzüMIó7ñå8-~J�XÅ÷¡�ÅN±K/Ç"‡J±\Æ’gÚw±ïL|­^Ä¡£��ïÑ¿¯ï,âÈ�²÷6Âlç·›wPÖC�;ý1å¥¡�â(c4 �á=Ègþ8Nøµqªøâ&ñXEû;±]ñÎÖ@kCkckð’!&4˜lŠ4ÝÃÐ®Gšîb(ŽßÅH²¹e4©EÂ‘æ"&–‰ýŠø_hŽÉÏµœOj?à˜ÒJß]ÒwKý”Ôw)}f	m”ë%½.õ3tº‡Ù%l‹„îböwØç·sî-"Z/q©ˆ×b1Æ»\Ä›‘Ð2HiÂ$^Gˆ7òñÛŠ=„i/âØÇÕ~$9IŽó�KáFpˆö‡aPj‘?9‚v‰°]!dW	ÚÇ„ëÁú§ð| ßVp•�¾ƒ·(þêž­óWïâ=Ÿrwð>Wu•«õý6ú«)2×Ÿð£…˜ñ�øŸ’–=Ü†ÏIÊ8m¾À—l×ÆúŠyiŒrÍ¯øk\ç_·Kø¡PK„²p7‘£
+PKËº$-"junit/swingui/TestSuitePanel.class�VkWWÝ—‡	c@TmUD‰h­¶ø(Æ”’(í�Ü�Áa†ÎLD­}úhµµï÷ÓöèZ\u-W?õCTWÏ½CôKfî½çì}Î¾çœÉ¿ÿýõµØ‚?º¦³†æ„í9Í˜Êjá8·�XVsø¨jpÝÆ˜V/ª—òá£î~mÁ3m©3|Î´.Hß¨f;Üà–õõé¸Å9Ck´Bl2,OÇ’–©ëy›U¥6ù#AF–ËÒ#fŠëk¢‹£îòXîÖèx/Cm°÷C]„öÚrX�sÂûM+Å­¨zÙÌ:4ûÐ¿‚:ƒÑ‚YÞ`D5Ô)n
+öžvm
+êÐîª!­h3Ü°5Óð ƒr
+ç-W)X‰Õ+JŠ˜3³¦Á
+âíbh¶¹3jñ4·,žŠiW(ÊŽ¢
+Ð’¼k¬Á:†–E:zð¢‚õøà�·5ØÈà%pW°µÁYò/&À7!(z|ä6fÎáÚTÆ!ñ‚2Ÿ6‹ó-«‹‘â¦©ÇµYW#Â~;£R6Ã†í¨F’2êöF«ûú0€m
+¶b;%fñ)Q9VA¦Â�,VPÆ½/ß�MRˆ~]3xÌ¹¬s/^¡J2¦tžò‚ª¢e6ëDt�<G-s–[Îe†M®ÚºJÐ'&§yÒ\¼#ˆö`¯PÝP•
+õ`¨ôúJ#mDDÁ~ð¡Š¸¢C^„N¹åÅ‘âŠŠ˜†£j²{ŽR
+«©CoEÜÊ¡F1¢àŽ“&Q‚9ž�™äV\�Ôé2Q3©ê§TKkw³ÎÉh6]T…¶Z¤ —B9hY¦ÅÐŒVêûâˆâËœ2¨åð‰¤©;—h^NÓ¨‚-`â˜P�ÀÊ-­Y\ìG2ÄÆI£ÕUü&„ã9œWˆÿ
+‘-mR_V6f`tØ^1…8¤jzÖ"ÙöUÕ lwÈ¶©Ü¨�…+ÏK(³áùl¦zžÏ‰ÁÃ�T\& bËbáÃ…<õzõ�åäMš¦¸ã:w�VŠf¬œwKÁ˜HGU'cËÞ=SytêÝ·`‰¹@¦«ªšy�eh#ô¨j;b£¨»ÛÜáPRÄ>Ìá’‚‹ m«­oÓ¨�ÍÇØµT„$ç¿-íeƒèéÈggÌ¹§e(UJù!ÃÀRý°á©G„ëúÝ
+·DÇ^WpC|HšhŒŸÐWÂÅV²*>ÂÇBÓ[Tª–i’HÝKÆ1àÁ§»‚Kwï­ÑˆÏÜÁçe³=&~O:š®9·=ø’¾ÕšqÑ¼À£ª#ê(žT‰F¡Ù¿Æ7
+¾Â·4áø¥YÕ ædb~$“Ü¶7leØóŒp{Ÿñ‰oˆ]6œw´äìÃögÃV(%ff­$?¤‰aØZêÒ/¨F†
+È]¥®¤šk«tùXG¦”4ý«ª_b€ž4îå“& =—Ó9ýÝ ß&Z=@=½é¾ÇhIÌ£u+èue¢…mnNÍ£3‡h½žŽ6<DOßô°úÄ³¹-‡þGxI¼ç°K<¯vçð9ìOˆõ<>Äaa}80œÃ‰û2ŽQúí“1£h¢èÄzpý8��t:„×iwg£§(r%íÆèÉh÷¤›ÁIÊµ–žMÄ2Êál_¨no.Pùåñ8‰qšÞn]ÞÅ…o*&%E’H‘'#êtŠLeŠ³DqŽÞÏ?…&)¦1áR“7¶@1Óª­@‘"
+NïiI±"ï²ˆ‚Á(ï�$ÙÔ2…^Á
+¬abÖ…8O6Âª;ÓN4ôZCOêî¢1T»-‡+ãê=v¯€ ,
+Õ¦w]Èqu»\^Z¿ƒw%×{xßå
+Ë5P/¸î•…|µ¨ê¥ðA!×4Š*ÀD"4�k1.€„¨nÕ>Æ
+ªå›9Ü¾_ð5B¾Žšžq³(àž‚8=øDŠS#>æ.gœ"7ãŒ;‰¾P×<¾x„ïÊïí6•û-j»ßŠJÃ_ÀõJÃ�ïñyzñ#~¢§`ØX$Éx¹$ÍP„ù³„òâüZÁq‘–þ2ÇŠMüþŽ»R‘Ò¡àyøPK=¯ÛP#­
+PKËº$-!junit/swingui/TestTreeModel.class�W‰vÇ½­Ù4£�ÐÂ,Ë‹¤a±e6´€ŒYRd9KKêA�gºåî�w‡�ÍÎbg±6‰í,8‰â€ƒ†`lg!çø3rüù€8·ª[­z‡ƒºººê¾ûÞ»ïUÍçÿûèS„Ð�
+Ö�Èº“¶OêÆñ¼žÕlgÔÒ´Ãæ´–�AQ°ê„:§¦³ªq<}tò„6åÄRP/fO¹ÛÒ7¤‹vED2Ã¦é(¨tñ3–šÓNšÖSÒÂn•¹xP·ÍÐ,[AÕ ´”wôlzŒvL‹Ëâ™~UÏæ-�jŠTíG�Ìj\ËôY–) â™á¼!p}H§á=
+R-ÁZÇ„{HBA¨¥u,‰JT%ÆšEŸ‹˜ÄP“@-Ö$G"Ž2¬U°&€Mõ	¬ë*�ëîIb…;º7‰•îè¾$b(£fÆaP7´#ùÜ¤f�
+sJÍŽ©–.Þ½É°3£Ó©{—IC¶dÔ«Õéiz1Ä
+ZZ‹Ó¦Íi†“¾m�Lù”i8ªnˆ°»»Š%°»õX[Ð!bÒ© As}Y-G¸ËÝ­Ø&–oW dl¼+&
+ê,-gÎiÎ¬p¿xv“xÐ¥³“Ü3º1-"£`_‰Ü—š½U€­’öt^ÍÚI<$,„ñ°‚
+ÝFòºÃÜ¤ƒ<´ 7ìNâìM0ýû(Î’Ëbè¡m‡¯û!â�`H¢õ¡?�^H¢».IW2ušåxÑµ,DbaPî0ÕcëÏºÕ0�ÄQ‰éÇéãšÓ3£g§{Ì|ÉsÇF…õ¯ÚªÅMD4d}…gUg†MÁv¶n™àP:ÿÓ…û#Ì¤vJtÝÒŽ«g†Fµi÷Þ¬e¿
+Ñ’ðK„¶Ô÷&Y#$8¨ÚŽ˜è1s³¦!å[ÝÒz»wILCK`
+ªk1
+6†4hûtš
+—Ñ}Ÿx��åÑ€¼Œ¿ÁEW	#�LÒÖ\)ØBK­EJï3ò9ÍRÝ4HôiX"ë¢ì—Ä�§ü
+í”ãÞIh˜³Ô|5Ã³ì¯‚¾H§íçsã²½IFFzô<^¨Àsx‘š˜QíÃ¦µØl)\ö¥—ñMÁç´ÔYÉ�ñØ ¶ô)q°”MˆŠ™r©ÈÜZšÁTJRRSÐtg¾Ô0Õ^W"Ø,“YÕ’XUA†â¢öeÉ%ñcQŒ½x�4)¿QG3Ë¨0¨@I] ²‘ýL$¹?§Úƒ
+1†7¹vÊE�Ñž{”Gu{PSY
+î&j@3lzbË]½Ú”IÏÄYù¶»ÍmÁk[J6®_âW	œÇ;Tç¤jkîú5sj6¯õ›–,ÌEyl]®Üƒ´ÓÅeäŠ/Ão©3ïøW	ÝLYºáŒOÍ‘Ñ¼Çïð{�~.;u7¦Ó¨çf]íiÓåøãâ�àfÐþÄhÌŠ‰¬qKïä
+:#eýg\Là\b(íä˜°èž«Þõ‡Ägñ�w—ì ´€‚¸›\¡	q^‹+“kÂ»31Ã'U›/Ë\™Ž‘‡lì›‚Ï¼Û­~‚O…Õ¿‰z³=£qÝöÝJòjG…iv>+J81bæ­)­_—7¡›®7��l£a�+"ñðÉ[™|òÖ%Ÿ+¼çJù\Ãõ•XÅ¿«ùvšWß2>»Ú® ºíjÇ¯ n)×q¸~
+KÃÆ¥aS[û6\’¸ù·�Ö�µdS)Ñë‰¾U¼è¤ðß6ñk­k	›ÑÈQ+³/ 
+íŸ!®«ªÛ.#Õ^@ú*¼áŽ%k+Éô¾÷ÑŸ¦"ôj½÷Ó²@ïòÑ÷{è	r×ãK˜	ùe3£×R„—ðñ>/Þé¯ˆùpû–öœE$4ßÆÑþîp¨+rÛSášH»£mí©hG�vÅjbo¡®cK¨€#œ¿ƒhMd¾&6&¢ÔDÄî±w¿ü¼lÞçÕÅü�´“&‡m´»uØAïïgÜàlÿ>ˆ‡±{±=ü>Äë™ðaØeçû0ŒÇeÄÅè	ŽÊähœ¸!âîÃ1LÐ£jî~_¥¦ÑŒ¯q]”–Rø:çø+ß€êùÿ¿£á�ã¡õG�„?Ax<ÔÆÐ__ÀS#ÝákÈ�·µw¤ÂW0Ûq/ÀéŽ^ÀÚTô*žQpÏuÇR±Tä*^*ƒ˜ü–‚s_~±”™MÌ‰È]9}«g«nA?ãp€þ¤Çüw€×­CE�ú�Ò»3ÒãQÉ¿Œßñm|‡×3“ßÅ÷èqïïßÇ+ôx=~? _{iUd\xÌ‹çqFVP%|Ü¤ãâôôàEå¢Ï·J®"ÆcŒì0«aDrkswúÜªðCüHr«ò¸EY¡"!ÎòéÙœà¡÷ÕÒæá-7PN™¼>š¿Åä8ŽÑäKðIi²ÑÝè›\í™Œ²tŽI`?ÁO=C—$`—ïÜÖPW˜2}£›j®ß"r$3ö©öhMxþLX³2eÿ)Rm“ÌÃ$á¦HhšÖXQ9Î8hÔë	Ip�kÐ'¸Ë�É.œåHÚáÅdw
+]òW)6È,E¸òÑ\úiY�€PÙ†¥tDåä¬4—txæ¼Åßýîæ½^kHJßÿ�H¸8¾.Æ\QcHú”“,%—2Éxhy/eÍíŸ¡÷,ÊÛ¯£÷"ÇçÏb5Ççx÷°ìÅº©—±xžŠ{� /ÒË—xX¼Ìwº(™Í¾áfÏð:î{OV³‚_ã7…C…ø‡øCÕ|ÞÚê^á–W‹€ã>pÜ/š8þ"“\ö�ŒïÈ}¹¡�Ñúëm]ô5>_/
+V…]!û‰€¾ØøŸoÞð£@À¦`À·!.[Ë^ÃÇ> +ŽJ	XÀõ�úx¯°Ò¬ô?óõk…Ë7°Jz^÷ý"ÜZ·ÖÇý{ nƒ‹ÛP÷ƒ;àþƒ}ÅÅ}B¶$–uà½ h¶q)ÐnOºÌ€.³@_)ªÁ&¿ÿ)wüëÿPK`uú®ÇˆPKÌº$- junit/textui/ResultPrinter.class�W‰_ç~FY—AeŒŠa�†.‹ºi¢&Q£BAIl“8,³²dÙ!³³"µÍÑš¤ÍÑ´é)½’^önlu5I›¦w›¶¿Þ÷}¦EÚçýfvXa°ê�of¾ï{Ÿ÷zÞ÷ûöåWŸK±	¯hX7QÈeœ¤cžp
+™ä ™/d�ÛíLÎ1íJhVMÇ�dÖÈKŒN˜)§K54¸RiÛ˜4§-ûžä°™wú3yÇÌ‰\…†Êô!;C
+uý
+"c%î�c›ÆäÙÑee“9
+Z¯†e;3DÜ¥áªxàþ¶ƒB]Ö˜©ai¼í Ž*¬ˆ „•:–#²KP££ay[­ae&gî/LŽšö°1š¥T´ßJÙƒ†�‘oo2äŒgòt§ñ(ÐÒeÓž+S2§!ï
+€+·£Ol­R[o5�1ÅûÄælˆÐ¾«KËÝ¶mÙÔßxY<‘Œ¡I$›5T+É#“-Øf^ÇkÜ•kJ˜=–E[u¼Ö��Ó|[áÌ¹¨…	±¹áÌ$Ã¢õ1‚
+í�‘a ¬É)Š/?f:¥¤®‰·¦IG×ŠÞ×iX°¡×S‘‚Îætl•$nÁ6
+µ;»‡îßs¬XÊÊ9™\ÁãFòÇ#„â Q2¹c*$[±]dixýüõÎB:-<¼™Î‹GÛcaìÊPb:hš™5¦òæ˜,vä]!ÑÔ×¶P—Ž.ì—º‰fLM™¹1
+ƒŒZ0åÚA„[p«h&ÏÃŽURWÔvúeï>¿6ƒÒU‰ZczüY[B*8™l²;W˜4mÃÉX9ÂÝ�ÁnÇ�†ˆÚÞe„Â,¢^pP‘Új1Œ
+ºJÏ^3Íj'ø¦ø"Ø½Áyy=Þ Ñº“¾¦}–ÞíZq”èÞ¤²CÇ¨kAJú�»7m36mä™:Æj}¼÷²áÍHÈ&È\nÏò±=6–*E†0¦4,ÉsAzR G•``ªrlÝYsÒ”0]š#·RáqLW¡€4,(G^uVâ�¥ªt£©¡)¸Ò=�½À7áÍÀûXƒãF~Ÿe›ž9y•¶#:Àƒ¢þ-Ú¨euZWÖ,’%¦6å¦<äÌL©F¸ mXFCM™¥nãÒñ¨kËc<ÊV‡m#e.ÚKÎˆ/Oà"ÿ$ÉêZªaÃe….9q\ó*ñn:zÜÈÌ�´Ti˜“÷â}¼ïg–Û˜íÓ$‘0ŠENx9WÚSòƒøP'ñáyeíeû²¼û¨ðîiëÜfô1FÛ‘àèø„”ñI|Ò§»+Çd§‘7U«ÏJœ¡Çl¬=™,+�uCÛzEý…&|Ÿ�àÓøËP!•2óùt!«ãxP*ë‹ŒÇÀma<Ëg,Æ—Y—4Å+¿snù�§Ý1‡V…qAÂxŽ”È‡ñma|�4îéèí?0Ø=ÔÔÔÆ×¥¶¸=#”t×oPÿÆX¬t,ÉÔ·¸‡Sî'ß)uj9f“îáÜcÙ“»Ù÷¸™QèÍå#'XW*¼›éôðrßÇ—íyräé•V‹B�½��ú	~*2?£ûÆØ˜²JÃæ`ï(·­i¹-¨+ˆÖÆ¯¤”§êƒ¥¹Íñï=ó@ÈJª÷â¤a÷¢Ì›íÈçM[
+ºGqZÙïZÔÆŸH˜+“`!ñür+bí"ºu9ó`;î>msÿ ÝCVÁN™$ª4‘KîH›ÅS4±ÐC’
+>!w1•ÞÎ8Öp¾
+:Çj~
+p‡ìY™¸€U‰¥çM´ŸGíYN-AÇ(�€ÕkP‹œ­çL½+†5¸J�¯ÄZªa'b®÷ÀS¼ÚŠt]"VDc¢½ˆZeh›SQ�
+Žë96ÐÂ
+„ºšŠ•š!à«©Cí„—·�¼7‹›i”«°‹ß²V“(âº"n�Gô¦"vÎ)[¡›”¬â•M”è®�§$$—Cðn%û[Ê_À®‘èžèL4ÑSD_ûT$¨¢�Š6–…«Å÷£EYOúÊ}ÒSv¿Ü\0>Ãü;=RÄ]sÀµœ¤‚kÉ�œ�\Eƒ@
+þ�EÓ ×tËÿåuÂ}…_’³™†Y„Î6„žF»™qF¦¡ˆ{¢“Í&þE-?Fg÷÷Ý»`_ÞßÚ:CÖ´?‡
+/ád]¨ˆûO…4N¼UÃìÿ3g~³"÷
+4çFºr®ÃÂNÜ‰›‘åóv+·¶¸ûnÍàRyŸÁÃ^fðÞÆä!ßŽˆ*!^<§¹"‰Õí´ûq‰ç;ç'½“%×ÅòÚ[F^Ý×©ã]xJéÔ=�!9Ö=ü1~)n–BÔp`�¢³Œ•}¤ˆgTx>>?y½Ìv_™Æf_c³¯±Ù×È‹€Ï�RñS#5|ê">¿�Îí_„.|H~ãx ¯z„›%à—N£¿¼ÏÝ'ÀWè÷…]‹dR8úüTD¿*Œx±Œ9Ýå@/qÊúfÐ·] 1yÿ®û~˜ï.ˆ‡0çß6eñ¬ÔAú8D¿†åÎÿ‡q#LÉÒárÿq¾?EZ�Æ]e±˜õc1ë×	¤x±èðÚGõEü¨ñÑZü˜¥ðóg}õËTfÒepÕ>\µ× 4ùçÁ%Õ7P‘8‡Úù0e­¬ÂƒÑðüÒîçn±%¢øë€<O±Áß[F£ˆoL¿Áor¿ÃïU—ýþˆüçäi"Ÿ¸ä¿(ä¿âoòV…C?ÎÎsö¾²˜i>˜æ�iø»1áÑ±U÷O!àÈ9D�„Žò¬[Æ%¿ðJ¿ù‡Ò)þO¶‡iø#¸†]aNo«¯·Õ×û/%ÿïÿPK6°ÖG×PKÌº$-junit/textui/TestRunner.class�W‰TÕþnòÈÃ°8HHtP ÉLBY*±XH&@IJõ1ó’Ìß¼! ­Öª­U\j­-¬m\¨…	‹Ý»ïûö�´ýÎ}o&“aˆM~™¹ïÞs¿ó�ïžsîË{ÿ¹rÕhÆ¿æÌ¥N‹cqr‰–^+ëìÌ¥Ó–íƒRXà.Úz¦e“™µJ
+ªü;ìDÚ±l……]“�vZÙ\ÒñV[‚=»ÚÚÚ{zîißÓÙ« :f¶eÒYÇL;}f2gUƒ?´ëØØÙµkg»¶“9Ò˜Õ¾§­}GoçömÅÙ*…š;ô·A¡º¡±OÁhËÄ-…9ÍÃfKÒL¶ôÍ:VÊ‡M29Ga^—^LdZ4¯Ç¶ÌTk7bÞtÌE­B]CE“Æ¾ f£.€*Ô+ÌîJ¤­m¹ÔËî5$é4Ô•‰™É>ÓNÈ³7i8C‰¬B}×u¦(7]_2n	 ,îni˜JY—Ú­Bí6j2b'8+Ss0°,ˆi¨™ÎÅßpá¬ªy¢
+7zÁj±Ú’f6Û*BÖ»Þl3e�dìCšrOŽ¸>4rSËÑ¢°º@l²ikcÅi—6ÕŽb¥°]¥0Ýá¼v¬pÃ5\Äh™Â´x†z±ÎÝöA–Ûj+{§n¾*8Ø˜Žï64¯¿[†¼æ:k{ß'”u¸K8}˜,³"�Âsâ€à åteÌ¸ŒÃ
+0¯œŠ²º$¾dÒzK#nÚñ2;:Ø,ÊD‡3‘´â
+-
+�•c(ÑµwÈÎŒHrê kX{NŽÒ«‰Ò(3c<âƒLlGœÌ+ÍÖF"=¨¡übµ�n¥®±ðº=Œ91–”cMè¨psÃ”:ë¤Òª»è“DïA¯Æ9„x¼+Áâ×‡°¸òátíÅ>Aùó0–³m+íô&RVw"™”fƒÙÄÇqO€]â^N%<”ÔjÅ@ÄSñˆ�JMÓå(‰1Õž­²iCÒ²ÉÌe¥¹4ì•…CHJÌ)NŒè,W{%ÿ=]N­êô¬œ«Ê}[Ù¬tÜ}ò1ÝÑlMR*h‡�I
+;AŒHg	ãˆBU"]ÚS;ÓÃ¹‰žz?�žú	…¹|x�”9Šku;ƒøà!|º`¯¨ýHÌv™´�Ò>eŠÇÚ†}•³pšŽGaeEƒ©+ùq|N„|‚·Òˆ™íÉÅbV6;�Kjz{ƒ8†§$Až&ëˆm4tÊ<‹ÏKR<G;Ëfß}Þ½J¾8)ŒbAùð%–-›B7ÑÍAKzpãµ\ƒ8Ž|_)Q¯ä>òáÅB7O²3¾Œí¼„S$eÚƒÌ×¹âç³”5¹Ô‹s=P| üx�Š6KVùñÆä{U#úp†©fÝ—3“Ù²Î°ýÀA+Æt§noálßÀÛÌ–æ˜ç	Ä[Ì6cnßw{Æ²Jm¥’,pQnµ¼ öã“¡ÜjSn`@šä’Ûº‹'öã¹µ¨Ñ8®‹×k²}–�ÕùõmÉçxßå¿ƒïq»9<ÌŠPhú¿è¹ŽIòø¡¸ú‘Â¢ð�£á»ÙLÂ›¬Ø¡0Ûy¸ÝNÄ†Â›ÍTÊôã'Ò93îö ~*žÇñ3…Þ]’ëÃWIxŸ>‰ýa}cò=L„k
+�Y¶NsNdÃÎ�7Îèq¯gŽ‰Ô~ü"€ÇD°W_¡‘Ê‘UºF‚ø5~#âÿVai[&—Œ‡Ó'ì6sÕôÂú*\OÝ_¦]!/¦Òî�¢ÁŸ¼+EØ3iÙ÷¦½pÕùR…ê	d-§øèÉäì˜Õ‘�—¯ÙÚ-oXÌê6øâhð›¯DÕÃÇ,'´¼N"Àç%ÏA>Ï,yž…Ç|­âç
+œYË9–	ü‘ó˜?†›Îi«ü”>,!úR,ä(èÚanÖo¸|‘ô0Ú5`fdáþè�aI9P”M¨Ö5ö€d´ó%�·z�´«@dˆD/¢qoäÍy%�®bP·—`Š˜D(Ž¥W³•û$„™ãXÞOÜ—pûîršw�æú’xgb5Öð[€V–‘›5Žªþ1¬íŠFò¸ãí2¤ÍÔjK	¹YÄmÕ
+ÖàNÒrÂ³‹äÄjÎ¦‘ÇÆÝåaïàþ�R¨�%Ès°ÉCö£M#+|„§â"¯*œð86yËÏ=ß_ñt;±ÕÛß©³�sçÊ6î×#îbQy…»uºÉH®Ò£.tkõ·a»»F£U€½·$²RØŒ["Ûùþ±)!yÅºVœ>Š³»\œDEqÖS¡Õ;6_$ZÍã*ßž*!â+ñia”ºËz‡´R�L¥þmÍ‘hÌcÿ%˜ëŒhóeTAÆ5µ5µ†µÎ/ËÍµþ<Fæ‘nžð»L×ù}ì
+6s7ËjwØrô|˜e6‚eFß¯ym!é^ku)=Ê`Xw˜•Ä²dˆ� K,ƒ¶uÄsáR2?Ì‘Ÿ³|ƒó"‰ó[2µnÁ	çÜ@ŽžÇ'óxd÷(Œîsòß15©ew9×Òð ?âÊÃ|~ó¹:¡]]‘c�f&µó|ÖóxŠ6âqEi=>ÙÝ”Ç3'à3.áÕüE¨û<^àìÉ<NOãŒ0ñó0\dâª÷8gŸ`½=É¶tŒê=E‹§ÙyŸax–
+>W’ø+ð
+¾ª“£Á«=é°¯R³*î˜…¯áëºcóÅŒß£º–ý‘·ÚÏˆ%ò³¡×»«7T¯5F‹Î3V…ÞÌãÜqø�
+£Ø®'¾©'B‘è£†âscÝ£X­—.ë¥ÛÙ8ÆûCßÃ»—ðý<~z�yüœÁŽÂ/¶Ýzwôêéÿžl
+½®÷±>Öúå~õn„Êün½©7I&¯7dIcþ�˜õìF&šXêžçoA¶}Çy'ÐI^@/ò_¢L/S–SLóÓçÖå«âºM!ÀkÜÿ&>C¤·ðÎ–$åÙâ�ŸÕKJ�Á_X¿’”oè$¨¦èñW�~Çø)Ék§^‹nð÷oÅV±ÅkÙAê¥"†>þÉ­õ=_$÷|Iâ‹<‚ø»×€þQ¼¥6x¨5e7”{\&Ó+%X5E¬ïvRø§Þó¯ÿPKš¢— 	ÊPK´¼~,stylesheet.css­”ÁŽÓ0†Ÿ€wi/KÕÐ”‡öT¶”…BËJœ'Í$µêØ+Û	”Uß�±ãn’’K%|¨š‰¿æŸ±3›ÀWl0×;°î(	ìžÈÁdöj6�
+d¡V�°Žr�BùgÃoýO†ùk¿s
+Ï;-µYrpuêÀ!æö,ŽAiˆ`qZË
+Ü¶ÑRë¨¹dZx<jß¤‹õâýfu‚Þò¹6TEvÙ)Z9¨rÐ¬o¢+tÎˆ¬v\}ZÐ
+#r
+eäT`-ŒÎ¿cIìow(�®Y+¨ûw™Î�ðÜ{•´åÁÍ6,þ1“ç’<õ&î	s¡Ê» åW_‡Z‡'`�Ï¡/ä�:Â£$Œ¡úW—p$é¹l�þÜsÇc¶ÜG¨-@(�T¸dï›Z?BÉ“m�mýó£p’àåý+þÐ”6ÊU*°òxr£Z8øÕðGUL|
+Ìþ>ýÆê‰‡¤°”d¦|<•M,QÎ;~mìÉeÎAÆyúä.òÝ“lÈ‰NamÊA†Sý†�(Ñ	­À_„îüöŽïùˆæŽ¤œ_Ž0¹¸ƒÐã¨çÒïÒ4p4‡x;;Ø;�÷Ú{ö
+õ,vÞVð"îúbm%×‹µ'µó¶Þ^]Ù¿Ó]üOÝ¿PK¯Ê@óîdPK
+®»$-	ýAMETA-INF/PK®»$-/c„10'META-INF/MANIFEST.MFPK
+rº$-ýAšjunit/PK
+Êº$-ýA¾junit/awtui/PK
+Êº$-ýAèjunit/extensions/PK
+Êº$-ýAjunit/framework/PK
+­»$-
+ýAEjunit/runner/PK
+Ëº$-ýApjunit/swingui/PK
+sº$-ýAœjunit/swingui/icons/PK
+Ìº$-
+ýAÎjunit/textui/PK
+®»$-ýAùjunit3.8.1/PKÊº$-Ø‰ÞäŽ¡"junit/awtui/AboutDialog$1.classPKÊº$-€¸àeu†ýjunit/awtui/AboutDialog$2.classPKÊº$-×uÔ˜Lt	¿junit/awtui/AboutDialog.classPKÊº$-(ä�QØ	Vjunit/awtui/Logo.classPKÊº$-äž;lx-
+ëjunit/awtui/ProgressBar.classPKÊº$-f†¯sƒ¨®junit/awtui/TestRunner$1.classPKÊº$-M
+¼31»}junit/awtui/TestRunner$10.classPKÊº$-§
+qG\7ûjunit/awtui/TestRunner$2.classPKÊº$-_£Zh²¯£junit/awtui/TestRunner$3.classPKÊº$-±NÓâ‰¤¡ junit/awtui/TestRunner$4.classPKÊº$-±þ*»Nv"junit/awtui/TestRunner$5.classPKÊº$-qø·‹¤%junit/awtui/TestRunner$6.classPKÊº$-D´Ü‡¦ç&junit/awtui/TestRunner$7.classPKÊº$-REI‚¡º(junit/awtui/TestRunner$8.classPKÊº$-³Ž±ÊZ3ˆ*junit/awtui/TestRunner$9.classPKÊº$-k1nv{:.,junit/awtui/TestRunner.classPKÊº$-fc”Cî³(îIjunit/extensions/ActiveTestSuite$1.classPKÊº$-�øŒôU9&2Ljunit/extensions/ActiveTestSuite.classPKÊº$-Œ�—Þje(ÛOjunit/extensions/ExceptionTestCase.classPKÊº$-‘›éâÒ#›Rjunit/extensions/RepeatedTest.classPKÊº$-9!éº$¾Ujunit/extensions/TestDecorator.classPKÊº$-^?úVéz"!Xjunit/extensions/TestSetup$1.classPKÊº$-`V‘è
+ ZZjunit/extensions/TestSetup.classPKÊº$-Ú!5#K	 �\junit/framework/Assert.classPKÊº$-G�ƒœÍ*%fjunit/framework/AssertionFailedError.classPKÊº$-Þ×Qd¶­'•gjunit/framework/ComparisonFailure.classPKÊº$-dî?/š¿! kjunit/framework/Protectable.classPKÊº$-(gØõ˜¸‰ljunit/framework/Test.classPKÊº$-Ûæ[ imjunit/framework/TestCase.classPKÊº$-€4Ò»1Ö!Usjunit/framework/TestFailure.classPKÊº$-�©bÔV"Õvjunit/framework/TestListener.classPKÊº$-cÌ#_„Š"ùwjunit/framework/TestResult$1.classPKÊº$-äÊ×O|¤ Íyjunit/framework/TestResult.classPKÊº$-¯�$Šxm!—€junit/framework/TestSuite$1.classPKÊº$-áy»+
+h^‚junit/framework/TestSuite.classPKÊº$-õr—@ÜÉ$!Ö�junit/runner/BaseTestRunner.classPKÊº$-LÑÍLê
+)¢junit/runner/ClassPathTestCollector.classPK‚³E,¿Cûö•	 Y©junit/runner/excluded.propertiesPKÊº$-�ê´ë¿ÿ$<ªjunit/runner/FailureDetailView.classPKËº$-®2HÄ¯]	'M«junit/runner/LoadingTestCollector.classPK1�‡,´XWYóÄQ°junit/runner/logo.gifPKËº$-…È"”í+‡±junit/runner/ReloadingTestSuiteLoader.classPKËº$-¬l‹…&Í³junit/runner/SimpleTestCollector.classPK1�‡,›¾#Gšs¬µjunit/runner/smalllogo.gifPKËº$-'ï\}®Ý!Ž¶junit/runner/Sorter$Swapper.classPKËº$-L+ÓÓh‹·junit/runner/Sorter.classPKËº$-Gd¡Ñ‰*:ºjunit/runner/StandardTestSuiteLoader.classPKËº$-Z‰Ãù?&¼junit/runner/TestCaseClassLoader.classPKËº$-Åsõë�« hÉjunit/runner/TestCollector.classPKËº$-C {íÅ"FÊjunit/runner/TestRunListener.classPKËº$-¼ÔŒðÄ2"¡Ëjunit/runner/TestSuiteLoader.classPK®»$-ëãY›ûhµÌjunit/runner/Version.classPKËº$-ìW�©!øÍjunit/swingui/AboutDialog$1.classPKËº$-ïŸ„yŽ!ÖÏjunit/swingui/AboutDialog$2.classPKËº$-œí¹
+²*žÑjunit/swingui/AboutDialog.classPKËº$-«É×2ù �Ùjunit/swingui/CounterPanel.classPKËº$-XÀ`a`?âjunit/swingui/DefaultFailureDetailView$StackEntryRenderer.classPKËº$-˜±¨p0@ëäjunit/swingui/DefaultFailureDetailView$StackTraceListModel.classPKËº$-­V>x),‰èjunit/swingui/DefaultFailureDetailView.classPKËº$-8§’å$[ìjunit/swingui/FailureRunView$1.classPKËº$-s*œ\~:?îjunit/swingui/FailureRunView$FailureListCellRenderer.classPKËº$-¥½;Én"ójunit/swingui/FailureRunView.classPKœ‡,ƒÀsý(dùjunit/swingui/icons/error.gifPKœ‡,0ôv%^�ûjunit/swingui/icons/failure.gifPKœ‡,*ÓÆØ¼{!þjunit/swingui/icons/hierarchy.gifPKœ‡,D·•ŸWUÿjunit/swingui/icons/ok.gifPKËº$-�‰Â^«ÿjunit/swingui/ProgressBar.classPKËº$-@¨Þ±�xVjunit/swingui/StatusLine.classPKËº$-¬»Ÿº—	*/junit/swingui/TestHierarchyRunView$1.classPKËº$-Ýh:Ê,`
+(junit/swingui/TestHierarchyRunView.classPKËº$-¥ÞA·æ" junit/swingui/TestRunContext.classPKËº$-x{ò±�1 §junit/swingui/TestRunner$1.classPKËº$-RW�¹!‚junit/swingui/TestRunner$10.classPKËº$-c_,¸ñ!ajunit/swingui/TestRunner$11.classPKËº$-ÀÖs@³ý!hjunit/swingui/TestRunner$12.classPKËº$-Þ.ëï…½!jjunit/swingui/TestRunner$13.classPKËº$-À æì� !>junit/swingui/TestRunner$14.classPKËº$-RÀµŽŸ!junit/swingui/TestRunner$15.classPKËº$-yë,ŠÙâ!÷junit/swingui/TestRunner$16.classPKËº$-=ÁÃ£±!"junit/swingui/TestRunner$17.classPKËº$-wŒI,
+!$junit/swingui/TestRunner$18.classPKËº$-{âÆ…�!Œ&junit/swingui/TestRunner$19.classPKËº$-·æ@ž)1 ê'junit/swingui/TestRunner$2.classPKËº$-’!R‰Ò a*junit/swingui/TestRunner$3.classPKËº$-•8ŒÅŽ® 8-junit/swingui/TestRunner$4.classPKËº$-¤Ìf�² /junit/swingui/TestRunner$5.classPKËº$-£í&ˆ³ ï0junit/swingui/TestRunner$6.classPKËº$-Óš©x” Å2junit/swingui/TestRunner$7.classPKËº$-Ï“˜ˆ¯ ‹4junit/swingui/TestRunner$8.classPKËº$-=3�Œ® a6junit/swingui/TestRunner$9.classPKËº$-mÛƒ+»^;8junit/swingui/TestRunner.classPKËº$-òµâŒ
+djunit/swingui/TestRunView.classPKËº$-¡eÀì”®"Xejunit/swingui/TestSelector$1.classPKËº$-²®¦zŒ¼"<gjunit/swingui/TestSelector$2.classPKËº$-¶e2NšÛ"ijunit/swingui/TestSelector$3.classPKËº$-Õ½d|“"kjunit/swingui/TestSelector$4.classPKËº$-q3“Þµ4Îljunit/swingui/TestSelector$DoubleClickListener.classPKËº$-0•@­2ånjunit/swingui/TestSelector$KeySelectListener.classPKËº$-ãšK0òpjunit/swingui/TestSelector$ParallelSwapper.classPKËº$-˜Zþ~™Ä1›sjunit/swingui/TestSelector$TestCellRenderer.classPKËº$-it#Þ
+‹ “xjunit/swingui/TestSelector.classPKËº$-ž-¸.¹0$¿†junit/swingui/TestSuitePanel$1.classPKËº$-„²p7‘£
+7ÊŠjunit/swingui/TestSuitePanel$TestTreeCellRenderer.classPKËº$-=¯ÛP#­
+"À�junit/swingui/TestSuitePanel.classPKËº$-`uú®Çˆ!3—junit/swingui/TestTreeModel.classPKÌº$-6°ÖG× I junit/textui/ResultPrinter.classPKÌº$-š¢— 	ÊÞ¨junit/textui/TestRunner.classPK´¼~,¯Ê@óîdD²stylesheet.cssPKwwj$n´
\ No newline at end of file

Property changes on: tags/BN68/libraries/libArcIMS/lib/junit.jar
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/lib/kxml2.jar
===================================================================
--- tags/BN68/libraries/libArcIMS/lib/kxml2.jar	(revision 0)
+++ tags/BN68/libraries/libArcIMS/lib/kxml2.jar	(revision 8301)
@@ -0,0 +1,358 @@
+PK
+‘j2	META-INF/PK
+�j2‚aq½^jMETA-INF/MANIFEST.MFóMÌËLK-.Ñ
+K-*ÎÌÏ³R0Ô3àårÌCq,HLÎHUŠ%ÍôŒx¹œ‹RKRSt�*AêMôŒâ
+Ìt“Œ4‚Kó|3“‹ò‹+‹KRs‹<ó’õ4y¹x¹PK
+�j2org/PK
+‘j2
+org/kxml2/PK
+�j2
+org/kxml2/io/PK
+�j2��;7org/kxml2/io/KXmlParser.class�:|Såõç»¹InC ··†R’Bx¶$M+”¶PJ•jŒ–÷�†6@$Mb’BQQæpï§{	N[�-ÛÄ�:Ûêpà^°¹—nÓÍ½ç6ÝÜü»M§{8ò?ç»ß½IÛ¸Éï—ïy¾ó�÷9ß-�_þÒy°@@Zç€'Ø;ÛZßgÛ¨ÙNÍjvRóVjvQs½ƒíf=Ô­@ÿTZß£°^H¬�š5{iy�öSVØ
+´rÀ�MDaý
+‹Ò0æ`qv#í$ì,ig)Ìe[6@ýA…¢~�šÃ˜Ãn¢37+ì…¡C·*ì6ê�Ró6…ÝNýÛvŒàî°³wÐÝïTØ»PÃÞM›ïQØ{©5ï§íì©ù�Â>¬°;iøj>JÍÇ¨ù8A‚FwÑè8�NPs7M?IÍ=
+»W�_(lˆfÃ
+¼HýI~©°SvvŸ6±Ó´ô)…}Zai…}†fŸUØçv¿ÂÎ(ìâóó„öÔœUØˆÂ¤á©yHa£
+SØ8‘ý05�(ìK
+;§°Göe‚9O8/Ðè1…}ÅÁ¾Ê¾FÍ×iù8Æ.Òè’Â¾©°o)ìq…}›.ýŽÂ¾«°ïÑÞ÷ì	�­'©ùMH£)ì);{š� ‚~¬°ŸÐð…ýTa?SØÏ†Ì#³¿RØ¯íì7øÛâ`Ï²»ö[…ýNa¿WØsDôóÔüÁ’ÉX.S“¹ŒÍKç.€Âþhg/8à^ö'báÏvö¢ÂþÏÁ^b‡öž¥Õ¿*ìo
+{Ya¯(ð"ìïd¿‡íìU<@¤½¦°(ìŸû¯x’ý[a¯“7)ì?
+»¬°Œ"�"1�$E²(’¬HVE²!]’]‘Ú( Æ¡HÓ¨wR3]‘f(R¡"©ŠT¤Hš"“U‘IJWØ%—]ši—J(‘Xo0ŽEhm7«#Áè¾êÎ=7„zS«ÌØÜÑ²mcKswËúÝ-�WO„êJ%ÂÑ}5½9M¦‚ÑÔ–`d ÄÀÙÚÖÖrMSÛîîí[ØhÒ¼�kµ ðžÇk·µ·í^ßÒÜFóçØ†IN…ƒðô#±(â)Î¹l],	£x›#žˆõ†’ÉŽdQîÀÓ‰P$8êcPŠ¦Â©ÃíAÜqé‡RáHõ†`r*¸'ÂãÖ¾P<µ‰EBýß•
+öÀ»væãL‰&ã ‡Í±�h*É@ÚÙŠl%BÁ¾P‚�ªŸÇª7ñ:ŠöÆú‚%½ëöÒ¡f}¶1†(ptäH˜¸µõÆ"ý([j0ÅOÐ€Ë©Ãq’k8¹u8JÆƒ½!¢(ØoŒmñDhoxAi‘Á´¾Ð¾P4”¦H.3‚)ähÏ@*$®t˜ˆ}z’8l'ûƒ©^”Œ5”HÄ�/9
+ãÔ‰sÖCÁdó&<?M„’±ÈAÂnMÅ„ˆîúp4œjd`©X²�7Çúˆ²prc"†
+©¨˜*áS—– F‚}7$S\ÃˆW-ƒ½¨7´$xF(šH„šƒÈ;ª›Á’Š<Úk]’W¥®<d¹!ãR{h0ÕÚ�Ø¥Y(Ëx0‘µ…ö{ñ.¹bÇÔ¾“/®�õêª¡Õ-hK´¯;ˆªWHrÝ|¹ÀC–}¡QÐº$er| ¹ŸPµªé_"Å‘9h·…Û7aÆI7‰Ò¯håWËdŽtº™Ï	^¨Ðb·ˆ+*ò_š<Ž“9†R­Ñø",®˜lÏ„Ð—]åpˆ ì_�_–äóêP0…Jz�£JÕ}âÊÓWÜ}hÄÑ�Îå¦P<‚¶M>ªsZžQþû§!j2ºP‚„µ8ù¢]ë0|JX¼–»¶Q8YaîâæDÍ!wå_™
+0xn½�fÑ±d˜Lp}(Ù›kœŽm(–Ž�þ=oèöf+Œ;®è2*£æýÁD°7…a=°b'úB³¦C�ÎLQ8ÙÒOnÑã!76BÓ4)f¨¹kºUká¤¹²>´78Ié¦‡êuå‚çˆF�¼®ËØ\2ÉÊ]‰eå›³€|‚&µ$þt�rqP×­‡/;÷˜Pn“íVT´¾Y›ã1CW‚#™cþ3ó…=n¤É\#ýÆ-lT?‡Û5°§;
+9™•ÙP¦“�:á9xÞ	 æ�ð‚^�—œðš^†gœà»Tê”fKn§ä‘ÊœððƒÙûS©x]uõ`$>‰TÅûª.«î‹õV;¥9¬Ò)ÍexÀ+ÍsÂëˆGšÏâš´Ãž‰&�ð{B?�ÍÀ+”„#›oˆÌkæ+'dX¡]Â³‹¤ÅNx~ƒwgyØ„öîµdòÌÉb~ÜK–?Ë¸ÁLhü–:¯S*—*PÏ¸ÁÇKœ’�-&y:Ù•¬­nsT7}^Ýæê¼Žz�ð/xŠ¬[àN÷XáŸð”þÁ·Ìóqqù¢kË¦M8a*+d°ˆ„(JÂÜÖÙˆÃ�Ý&‹NÉÏJ±œq …R¥þÆ:b^!½Éx¨7¼7êsÂ«(`ø7üÆ)¤*'ó°2T'[ˆÓN&Q4ÞP´�“\�ö�ìà5X8Ù,Vêds™ÍÉæ°™NVB#ñ0/Cu¾F£bv…“ÍG8øÝò2<ƒzÙØêíÇdì�Æ�JGÞCáÔ~/²„†'
+7oh)¤kà$ I–ÃT]M©áH	3�ðKøEÑ^a:[üy’Ç“F
+�M¼°/ÔqÂß‰,)@GÝÙ¼¾©»i'ŽÖw6ëÕ¦CÀ×yëIïÕÄÐ's±™TÎF
+B½¼œ�k ï�õSðóö…"á~,±uÞ@ Ðèd‹ÈhÊÉÉŠEÁèåå’nÒè�Â:’·ÝK	—¬o)76ij‘L“Û�)%4h
+mUœI¯¡·½UÈ.Ãeü„¾id€Ís²Ùè„ðkR˜ƒMC/Cw	%úÃQ*ö¼z	ŒtìµK5Ni¹´‚š+�ð[ø•j�ÌBþ6=[ÂÕyãÅ$[
+ÙíÚÕ8�·r’åU¸TîÅ´2@ åx¦ÜÉ<c—V:á/d1%ïŸ/­r2‰ß1‰ëâ<%9ÚI°Ÿ*ùÅN©N¢Š$§šWÚ‡‘”!%V�7Äh8ŸÁü¬Q	’›ûH;¦GÙ%<¢lî¾:°¼f]‹9l3†Ëj×e‡m-ËPHØ4 ÿÒâJ¥y*½$"ö9Y[b0ÅiÉ‰XžÖ(*0Ü‡ÖBÇ¼±„×xÔyíòU÷ÆÁv¯ž<’UûSý‘â½0ÃgÒÉVÀà*S×f¥äMaÒýu�Ÿ‚{É€Œo:•p¦€ùðÒŒ•¬:áðCrd�o°s Õ¹wÖ}É~-<,<:t¨êÐrÎ>õª—­Zµ²:çµR6¬féÒ¥Õ<‡ ÇÖPZYøR´DDc‡¨&¯à·„|äfüÁ_ZGÚàj†ì¬8d>ŽP-–ªª*Y‹Ajk"Fañ —¦§´VjB5óàádE	¯£ð[8��3ºq#¡wd�oõ"	%ö{cÑ>^±Õy»º›6uïînºoléXO£Ów
+à›%�Q,ö
+ý¦™¹ëqQPòè`�x‰æŠ¥†Ìð:Ê<oLHùzm€&÷ß2�a§dÍ�9z+š’võòÝœ¸&¼Ä2=Ã÷býÑê�%óçÍµúã=‘Jn
+S9[�Ø“ä¹+P¬§‚‘ä¤·€QÓÐ>Ì-k/•K­ù_G¹5Îád*ÔOÏÄD"x¸7?œ}ŸäbnÍ³ÄßV¶`<ŽY’Aå›ªÓõbcõ$pƒü7WR±.C‘Pt‰eC¾:ï¿).·
+ìÞŸˆâß18½Xä7‰ŠË{w¾w¥IÌ´T¬-v(”h&Q«öŠ�Íº,ŠrÝ;ÚG¦¢ð·g+UýùÊWþ´Ìû¬k�ôôÉ##óµåÆ—ê“;câÔ¤˜^Ñü™º2Ï=oòæâ<q�?¤9úâ<òÆ]ª.º¸émÕD–G’Ç‡ÌƒïÃXî>	‹A¢ 	³áGð®=�c	zpþãœùœÿž1ç?ÅùÏræ?ÇR|Œuï1áóþYÑc>ç=VÜ¼ÇŠŸ÷=Öý¼ÇR’÷/
+|Xéóþ/âÜ_Eÿ7Ñ¿,úWÜßÅüUÑ¿&îÿ‡À÷OÑÿKôÿû¯øÿz.‹yF‡£7ï™¾Nï-¢—y¿½q°µã¬¬(#€m¾q`>Uý2H£`ñ©
+È>û£ŽQ°úŠàè£ÖQ°vŸeŸ•v|ƒc¦]Î�Þ
+E^HƒM˜1ÂÿP Qz7.CŠeìùµÂ1PO€ÕrÆsføUßÆ@;ãW+Œ¡8Že2€Ç¥r°õnK½¥Áã{Š­ƒ§à›8°{¬=5µn®¨•]²4³—<®:kÀ%Ë=ˆ´#�ˆµ™ˆú8¼?Pge¥V>=Š\Ÿ†ÃˆÈŠ¿’·Ví”{:åÁZ›Ï‡sÙe³öŒÃ,’	Ÿºô^îáWÛzjº¡Ô˜h¥üŠŸ6{Ü|Õ®Cú¶#ÍrßŽQ¢ÜÓ÷0xŽI¯“ätf…û8|MçÈÞ×à¹Æòpuªpµì”Ÿƒ9ÛÏÁÜíãàÕæ�Á|”×|m6(Ç…c°h_àRO•‚¯Ô:åu¶RÛ%¨ÖñUäâCùÏ'�ùÚ’‰9E¥¶.ÞË=¥Ö.Ac ÙHgÚpêãÄ6xN@™Ï@è'4¸…Çäö asH²>‹i…J>ñpúFÁÇ¥^‰DŽBG�KÀ.æà¬ÒqVš8}Z)B»¹Ñ0'62Úv
+š>Ÿ…õ•£½“õ¹ýç='Áê?ëQÕ4é¿%`ñŸGmÎê6G/jÝæ ,h´ Kþ8,Ä®úÞm²)ðëTŒBuÃ?ËF¦�¡šëÁÆ1.=5ÛñèrµïØýiðœ~‹Ú‡b!
+¬Ð1ûØ8\ya
+N¬µtœì½¸†8ÙmH^í%2½«�
+œ¬´
+Ãt2»¹oJ|è¿Å¸¼
+�ŽÜx•Ï6
++Gˆ©‹Pe©'k­F’N�‹D^íƒºqX}Œ±tæ9C}j�8�Òx;vÊ=ˆÑ2õÒ0$É{î…ˆ�ßg¬çè	“Å]CÊä#¹§F¨Üâ¶Ò˜†Š<”#Õ†¬Éh�¦t	ì^�…ØQFˆ¤Jj|Ô þqXC7"ãŸ#q]O"ÃŸ
+µøóó p•Ø[ŒÖŽùM#8\72âSëñtó	°Ëi�qc=1sTìZÈ©U;çŸhn‡«ÅmE–ç†.ŸÎª�£q%³+Døú*©ûwk¥í–Z+ÞwÍVjjm.›ºf˜Å¹ÕÁ!d‘�¶
+³M>™Fý´ÆGíÃ¬cª‡@P7>¾NßVýtÄÄÓ6Ìúiï}XÜ=äa˜†}«ý4ÙÊµä?¸ßDH>	EÚuäÙÖ �hÉ†Új—kí.;�žBMuÐ²j«á!¯ˆ©v„ê<fgT\ÛHëxj?ê›CîâØh¥§¦NÑÞRªðe
+-`Óv$¥kºÓ°BÛ<aÃbl¸MKÙBÑJ1Ã€yëÑ½•36
+-dëÛPGgÔ5�ªR‹ªíA™Ï†F]B�aPÕ‚ZYÛÞ®Ó°N_Þ9E­íhWw5RŠð©œîl—fŽIÃ[ñz—mvé4¨g,$¢JîHÅ¾J—�»ÑõH\:ó‚KV$~÷8ìNÃ-† û8}Z�~ÞM–æ²¡VËÔ5ÈŠËV6Œ	†ˆÂ�ª+³qlip¸lµÖtæ\gÂe¥Yë¦E ¾bŽ‰;Ï6ržm.ùLsu±™"NÝŒ…þÖ“,�œJLA÷ó	[(
+e2ô—\¨ä¡`9�mkñ×ˆ¿kunFÊ_B™•âÄuLbi(ÄÑ´cR3…<â>ž9és!S«Ó™»òUb:¬×¬�žÎ±vl÷P‡^ŸÚˆrÎ†áºZIÃŒ\zè±õèö}ÀÔcH�:bk¾¶wrârSföëKûÒÃ!÷q<Åz\êÁ¸ÄÓá�=Ÿ„B½V7ÿÏ8˜/~Ìb¥‚÷P!Ì®çv kb+ÐŸÑuE, €FÕ•PD…|Fµ�á¶Â�+óð·Õø›�¿54·�)²<ÆzÆ>!ƒ"
+}!t®H]Åç@ÚŽtÛ(_ls£t÷‹ÌIŸPðn¡ª.’K‹c�°ƒ[É!ñ!8?hlßo‹Ø{µ¶Ó¢¥ÒBk˜�}•Txâ7Û$Ümî;7•åÃX%2UJ„¯º±˜›hJyd$µŠ�Œ¶Ð¨Cqƒñ¨ÕÃ0›BÅ*Ã°„-¥™â!O+DÄÓø^^õ ³:„yÓ5X-?AþÆ¥4<Å=N.tµ2Ïv—l×ËH»>;&3­´Ë³ìLƒ`µa³”a¡7ˆZOÔ<^;Ð•ÎÌó©
+dùÆ±Z+F‚ò!(Ánþ¹@„"‹C…!(¸.«¬ç8ÄÄ#Nv¬ªwèò·t–/…×œ£ë`gÈâüX„+�c%THŸ?	^£V”$¬XdñuRk`”WÚVX÷ØªNì£Ç¹œc(ç½¨ãØ©ìâ#^uWêc«~g>¿™kG4CdlžÉw=�<êjA·{ðÅr
+®õ¨KOB�G]u=j��o:
+5µ‰�wœ†Åu÷x=j`f{ÔCp…O‹‹’Vñy0‚�ð6�¢ßßîs�rKo¦ìˆ…‚Š™Bfí«´`VPÃ’J™Fƒ¾+±î.RÕ‡áÆ4L£å¢‡!Ñè+ãx‚$¦”ÔcX±ú°&Ö�ipcà8,ÑË–FÓV¢�P}¬2
+&
+s-Å"3èmÀ<™2S>1zÙ<~îùàÃÜÀQ2}G™{Ž¢e
+ƒV¦zOCªL$¦eêbÌŸàqB–¹6
+åe”ûè¥´ÒŠ{Â½$0Ô:MyÊC.—l=‰^§îâ™|©/Swaj#R1D Sq2Ò™[ò‘=Ÿ-d7 ö)-ÓuŽÔ.1Et%ƒ%îMÚÍ8ðÜI£[LaåGkãzÅ
+dÚGÈõ‰¬fâ¼ÀRUÏ;jd´jô�#”s�Ð¨•œ¨ÕM‚Ðh¾�æ(ö´º§_`Å�O‹xú8ùý‘“p»çåû°’Ç¢nmH9½ÐœÉ¯fþÛ¸×Þ¶·—’ÛÖÒ†…ƒ·�ÂQ‚¿	|oEQs›G�>ŒO.ÞNŒp.8®#ª£3�¹ÙC,ÌÅ­ÛOpë›�¾1qÑÓIÁøötf-m¸«¦r»ˆ-Ü> >œÔý•Çî§¬ÎqÊÜ)Ë<jÆ;ôåÇNñj½Œ—®oç¥«nX“±dþ˜Å’ùEÖý3OÆÌ·ÉÍ3ß ¼™µj(ób?•y�»vwmýÉ8ÉLÊÍze	²AfR¦ÛÏ‚Ån‰;ˆH'™çG&É�ÑßB‚Óâýy—Ï?Šª“ÉTPˆ­Ô¬ÌyùðÇÝá´“švjºý—°¾¢ÝÛ¨9JÍjJÐ	Ž¡Ü1Ê_mIíÚ;Çà][ùøÝäbüí½æø}ÚûÍñ´ÒxòK—h÷‰¤|Z¬û½Ùû+;� içàCxõ‡/.I@žŒh?5ø¾“—.žX(+ƒ.ëQÀMù(·££.ë�›Ó™ïðcÃì¼Q•²uØØéÿâ¿NQí ÿjëqF…ÎÑz½‚í×§pwýšÁ~ìÇ´�tp
+Ó¬_û¨1ÜC«äjýf’=.uÒîÄ¥zícÙ%ìeuÍfŸ•oÍÓ>þF[¶‰ìÍÃ$æàÆáÌOEµÅ�ö(ÖZôíFëƒOÐ+cpK©�?1(Ó»Œ1&ÿþàø=­àk+´Wm-»
+ÆÀÕ‘–ÇoÕNÃ"ƒj¬+P4°­8z§à:tØ»	öãYX›kÍ��ï’‹2p«öÉa(ÑîÉÖ!0�ÙôuÒò9¸w»?0Cc0L)²ßMy�LKŒ°}ŠÞ|˜¹î_GJeú<2‚ö7Kj”šàä$‹ô³JQ“VŠ¨íÕNûù»R¡ŠãŒÏoÑ>5ŸÖçeg,ú·GÆ�ô“Eˆ‹Šo*U:ÏŠí*V-Ü´BdªS’—`:}PÓÒâ«YÒ_™ßU–²e}§ ¬Ùç—µÏ˜¤´Ÿ¥ùgÍy7ŸŽÏ)‹Þ‘‡ìûõÈ�IàÌYfWƒ™CG¾@¡Ê%§Éÿ@A~žh³Š0Œ ËÍ:ß%‚NÈny°ÆÀ¹Â) Ó>f +Y­
+©ìÒ¾ ‹Û¦�=«Í4Æ#g)•ŒÁƒò •õ¼£ƒ‹0zj.ñ·—ì!Ä~}‰sš«Ç¤ËéÌwM~¯ÂÜ<UW%w+
+U²—õï€ìy²'*E„/ž?3°£YM¬ÚCã0ÚæW½XlåÕÊç”>§½âãßÏ~mío«_­7€pÓáW«Å´ò"Tû
+“×Ÿ’ü;íÃÙo—Ú#º	sDâ©IgñÕ€�î2Ï)¸%K„½¹¾ˆ2š„Ô^V“ƒ–CMF-Nðm«¾ý%\<voÉ‚³ÈéÌ~µ‘.NÃ^·Úy”ÚBcûú‘ÔsLKø§±é~íQ}aíµÓçU=
+eâòJ‹ªŠÏš_Öïj'¿ÈR§�×IÚ0†óˆ>nÕ¿ª± ¹ÏôóÏÒ\Z÷�ÁB¼®ŒLâyãYÃ>Våµ�
+†}ÔåÝnÛðšñWX*žá…(fëâÒë{…—«ô¯¯-“?G3úëº¸¦Jà™Ïñœäßeùó`†^ÐcìFŸÇ²¡ßà ž5ˆ³íÂûšÄÙãl©ßbéôËº)-ïÔûÇÎš«ÛhÉ†s	çR'Ëúl¾@0¶ónûŒí5y·+�íµ¦ìæ
+ž‹…OeEµjª¨šòj¤ØPØ:3â&IÃ¢}Å¸²™­›3Ä¦dõóà"!ÆR
+ŒÅ''F»Ûš�{W›GÊÅ÷±fãà5oúPNðÜð¦ÙrµŠC×â!*›}âoI�ewsëà~_É#h™ÿ"/�1nøÍ�ÊãÀÙc–×Ó™'L«¸Ö|îäj`åTU]—ó.’Ä»ˆ>¹ò�¯Eå…õ4kÆz÷«tÞ}Š'³•XÛîËüÙ�Lµðû©Ì¯¨¨æ_Ôí§È.&¾TB
+¯‘ÛÌ;
+«š•ýÖK#ó¾|§ÛÍÓkÅéè)_ãqC]¡ÓsÍ&ü[7Ú¯‹¿®äÃÜÁ:æ”)£›4¸ræaJ˜Q‰(¿¡Ó\„Õœ^äß—šÏÒKº0¹y\þ¦ñŒ8÷ÛÏ²‘<7o4_O×-¬Î’ü­q—MéO®çÚø
+¾§µÒ6Á%‚>Ž þ³y.xÛ$.Ø€ŒQf¯7
+©i>Ï(DÓø1k)¾T–Æi0öíìËòü‘Œ±.Ö-ð¯ø«³õÎ4*	±Ò™“[
+~'ãw/LE¹Ù|Š])P.ñYÃß“ëÝ÷Â@ƒÇFX&�yÉcÎ¼ÀÿÞõ»©"†ÿPK
+�j2¦Ô5”é!org/kxml2/io/KXmlSerializer.class�W|SÕÿNsornK¸0Ð@hµ-y4R&J)E(¨�@­@A·\’Û6šæÆä†‚�©[·é6¦ÎM-N…²-Ût®l6u‚°Í
+77÷žÛÜ{Î=Ýûý‚}ß¹7IÛä7øå|çœ{¾ï|ÏÿwúÜ©§Žƒ
+BÌë„vÀû«á
+ð>HCŽ†Ñða>â„Gá1š}Ô	�ÃÇ$'zD‚�;¡
+>áÄ/O8`B‚¼æÀ¤OÒÖ'%xJ‚£tä
+O;à¸Âa	Ný
+Ÿ¦á34<#Ág%øœ'%xV‚ÏÓ}_�à9	¾HÒ¾DÃó4|Y‚¯ýª¾æ€¯;áðŒÂtï7‰é[ôñ	¾Mô;|W‚é‚ïIð}	~à€:¡�¬þ‘:àÇ4ü„Žþ”˜_"M&ÁËD.Á/$ø¥¿’à×Nø
+¼"Áo%ø�¿—àüQ‚?Ñ¹?“;ž—à/üU‚¿‘xTæï$ôôýŸüK‚Kð	þ+Á)œv0p0ÆÀ>œŽZš�kÓuê5×ÃÛùÎj<�Ò’±xr€ÛÉ@P³†ŽÓ.bLKƒd-¡
+iI£ÇP£×3˜»Ë”‘P“á#�¬(¥:™IuêÙ¤‘aPµ¹%Ü°8ìñdùéÞàÈ&ãQ=¦á-‰~µRI¦½=žŒlÍË¶¡j�œKŒj$UhÞI»Î�{£¨g\OâÍ2·sc&ª¦´ƒùÍåb»ˆÉÓ£1-š`à®p„NÌB§lÐ£Ù!®x5ŽqcßV­/ÐŒË4ÕÈ¦µ3°£‘Õxèª´ÖßË ©Â™�Ë*Ü\édå£³øzJKû4VRcÊV÷îë´¨�lsãI=­îNhÛÑS™”E+œ™)&Ur÷ô¬ÌÔ++YU~#ñUgÎî‹Ê ®î¬‘Ê¢ûç6ÏL[:(íš‘[S‡Î ¯&c¨i£ÒJ¾ž²³^×ššä¬gíU1O7œ›þ›ôô@xïP"•M$Â{–‡w%z´t\MÄoä5W­xrwÖ@o;'‘ÿÇ%b"›Áúµc*såeÌ™-êP!êóš+f–Ã:…vãlƒ‰X�XÓ‚¡íE×µVÌ¶WÑæüæ]�]]¯zÌ�e0qP�¨>dFÊ�JëQ-“Ákº’#��RµË�üèš©‰q¸N†ë!!ÃÍ’ ËM†Ap°*™Ù˜ Ãnˆ:˜(3;C�Q£dp3�™ÄªexF,)ÉïJ$´5� †S«:ÕdR7|˜¯¾˜Ö¯f†/Yð²¯_Oû,üÌøâI_R/}$ð¾ª5õ2ìƒÑË¾0¢ë�™Þ'³YLÆrœiàúl?AyUcƒÌjX-
+³ipÉl©,6ªC)t¥Ð8`p’ bo¼!«›5¥gVË�Œ1£ll_º¡»³·ïª�2Ü÷Êp2ì�a
+Fª-\ˆXE£†ðî7#Ó2h%Lˆé¼e¸ÞŒe[(Ï®î)þZX2h+ö‹øPÉ™¦ FÚ~À8¾Þ‰Izu2“M¥ô´¡Å|)}dxFùS¿• yên¯ÚÈAsÑÃhæ¢eÕððpËð
+nÔŽÍ›ÂËW­º$œ,H}Yì×¥8|”™3ƒL”Âø²yä»dØï’áHËÌM1²e�~™Í‡ÛÐÂöµ¨”o�–Î À5MË[.lò!&šãš&Œ5íÈCÉ˜šÐ“Úš&[ ³ó˜EíÓ¨ç&±kW­Åô©ªqâàC†ÅqSkÆ;NÚòl,B�Ì²EÈß¾	½~¦Z‡/¦keó�jD}øPZ{X†1%Ñ :ž/»:7¬ë]·¹¯½ïÚ—†B¸…H�öµ‘S¯GÃZÉ7WN+óiUk6
+ug†éu¾/chC¢é´º/ª§°ù›Ë{OW…-Þýk§7¬þl 'ÿn×nÈª‰ÌŒî^èhØÝí	-9@°h�ªéu†ÉÙ‰k5E¯)ÁWiÈSK+p²ŸíkçY¾J†nî
+ŽêLëÃÔçgèR°âÌò<gh«ü	`è›ôa-Ý©fø³�Ò#³=N®˜SÖ;1cw›³mj"«ñ&Bï?‚Š½Ýý¦Ó°«8ÌÎ°
+–âK6T ç,4R„nN8´(Â<§ˆôœYkÄ{NSR/ÊÅ†�cWËq�.ðOó»ä§¡jl~Ç1ç~—Ä×"®…	°ú§ "²³>°ã6À6ûŸÇŽøûžIˆL€ä·M€·íÇq�Ã"ŽÈ1�ÎÚmA­Ÿ„j%Ó­Tˆ­èE*˜ó–5u…EËÜ�ÔéòåaM95J-NÅ:q°5³Àb~¢Í:QúT“ƒÍƒ��Â’"›1kŽÂœ>E™„¹'¸ìyÈã/�qÕO‚›Ë®GÙ#U,w:NŠq…Èa¨§‰KŠs’‘‚e¤±ÌŠ&EŠöt“¼E£ )ós *ðFÓÍ{ñ'`lZÐáØ-‡‡ÐÝ"Ò¥¶o ç�1OÀ›ÏJÁ-<Š'ð'á¯]øsZ´Æ¢õø;„¿FüÝ‚¿&kÝŽ¿÷â¯wÖU„Ù¤—[@;s0Nó£°°o)uyðÒþb×ê<,Éƒ�ûu?÷×R>¿�Ïëù<Ëç
+|wua‘)ØUm>Ÿl¾€½÷|‡à|$—>BW¸n=Äƒ×8:M™†ŠÊ(M83•±±Ü©—g:‘ÁMp³éD4º
+ÿƒ©ŠÒLAÆIÀ¢cÀÐ[†ÅÞ† ši¡>Œ¥ƒ”Ú>h�µ–B³jÙöÜé1åüåßXT(h)äóÛ&!À3¬ÑÊÞ‚VäíYå2n…Û¬Jn°d,P‚žÞ³Å´"‡©øgeøy“Å°…HÝþ€­nBã[ŽB¸/”‡'aù	n¡s©…—<>c¬t£õ¤Õ¥dnÅeàƒ�¢jqX,¦;ë€bîµ*µ¼È.·–m8ˆ‘•v·}š¤1^¾¢ÛÞê¹ˆjÖ&æ zÄŽåö‚G<	v�8>"œÊ�¾Ç{D6®Ôšw9•Ú6!;
+É�Þ÷­ØI€´³¤M˜©·è„Å�ß*¶îèNoyÉ#œ<ý8ÜJÑ5�€¾ÆïqáÆË‚2o±|<Ë•‚â$×*qÇšqxk1øs­À9ü(uåöò¿
+î°ÄQõ#ÜÂÒBŒ]…×õæ½ð’‹é’#Ö-wÂÛ-Ö&G¬‹èPÁC— ‡‚yX…~™¢>7-ÕF0ÖvÒ†çeàY°+µ›‚œlöÜm	„¸&ýE¿^Ó²Kˆt{WrŸ§tãu+w¹"ØRÚDZØ<¢Í-6zDj2<-Fè1§Ážr_àëÑ2¨×ríþÀÇ	Á&˜
+'¢M©år‹ŠJ§veu�FVÐÀ[UcÁeûá.Ëún´ž\Ö‰†Ï:
+íè²5'üh~íQèèLÂÚÈ|œ„Kó°Ž0~}ð$ÌCŸv*ò°qÝ/…O5än¸Çºæ¤tÍÍ|.ÃzœYµ>0SYa‚N^n!í ë
+œ ~¾è²vQ›×Rƒ¹’ÀvÓÔ£|²¹"Ü½îµ
+Þo&[\'TFøˆ}²c3¢½1^êN¥ÛBáÓ¯˜@ØA˜xÜkÇ,¨çS—Ì³€ÒÃfó6/O4Ð†®–”ÚZL¯6¡PÝ[‹-“*vJ�ÁÅf#w‹æ`|¥�
+­}DDÕ¨ÁÛ¼¨%Ï6>óæ4ØÃ·W©õœ�·}š×L{[iC d*G�÷`C5#üîQÝk¾’LU®"U¬’*ØX0Ýfš^|èœ“´±7Bô:y¶pÉU�w5­yûépÈ-Zos]®ö}Å>ç±Þ†5Å®”‡­å™r1SÌŽÂXvš�ÁVÚ9§Ô[Ÿ…æ¸;0e‹Û¿ ´!FZƒÜä U^°z°ÐU^¥×D.¯rµÙ÷'aEÔ1ŠÆ	¤mñjó
+b¾*#çœµNe»éÓB/�´nQjC\£yô=tÆt˜å½r_?£š]€@¾öàSaÇp°Çv-ù³bÜ‚§çÈ"”XðïU‹e©Q·é*ÙT1ÇßéRá…ð<l%@ƒ±¦U¾­×¨¢$*·ç!Lu“Õ‹	O�‹9þ£PÕ¨óNBu·
+LÏòRvÎ|œíªˆV‡Î&ãš™2®­(cìl2^?SF%Ô„ÿPK
+‘j2org/kxml2/kdom/PK
+�j2¥Ü«(Ø”org/kxml2/kdom/Document.class}T[WUþN.LH†RBC-¡5�a"ŒÅzi‹UKQ£Ø­Úiæ˜L™ÌÄÉ€©ÆË‹¯º–mº–öÙårïÉIKÚy8·ý�o{Ÿ½çßÿþüI,¢žÅ$®ã®ñ°ÂÃ;\çãwsxïópƒ‡Õnò¼¦à6È›�T2ø8‹Q|Â‡ë|Êó†‚Í¶ðo¶yµ£`WÁçÃ¾ç×’mQÈH·êY¶[È¯?0MÃ1Ýš±øtvM Û
+L×2Ï•ã}ˆžçHÓ%ÈÐŠíÚÁu�¤¶pK µêY„ÍÕd°vÌ}F[Äžkõƒ
+ÚI3Žj§OÆ„6@G¬=
+,<åµ§X!Ü†Ù DÆ´¬ÕºíXgµJ¥½yÿ�¬!mºiú-Okëž_3Ú
+§yà8Æá%ãNÃÙ¢åÛý›]kWe3°=·¥à–‚Û¤/Þ¡ŒÜ¤´
+ãN‘„mzŠ5G6¤L’Vfß'úecßòFd#Áéï};xž‚éÛ¦cÿ*P1�‹*Š˜RqT¼Œ½úŒåU˜L¥²[RpGÅ¾Pñ%îªø
+³+õ h^5bî%öCütÏhú^Sú�-[Kõ áÌÄ’Ug±W*¾Æ7c'’­ÂÀk*îá.EØ³n¸�Ý�Ç¹¢7½	,I×*Év“’/­ig^Åe¼!pþR7[%×+q)—d7I„4qŸxçPAU…ú-®¨¨á"=ø3Ð˜žêüËFXÑã¡~Û3*›}Âg_T}¸©á¨$}ùÝ�í“M«œlƒÁ�1ìÊv°ëíK7l>jçÓTV·yÐ×UÜˆ[Ý|(07¨ÇN–½€Êý{HéØ}ØäF¡mTÁªàA7DØ+MîâÀôƒ^’µJž××aù‡î}Ž5G5Q�œ£¿è‡šâ²TùáLÅOc‚»‚ÆÚM A+ «w ôÄ#$~±¯`6ÂŒÑÌ˜´þ’¿Eæ9ÌGæ<Q$hÒË��Œ¯kXdOÅvåô©˜þÕcï£‘9™OÇFjÚÈø:…™¢y~*ýrz‘ôÿŠ%Š?cDß£EêêÅ©Å†bçÔ†$‰	6é:‹[-'…8‚’Bù�Û:ÍÃ‘^Îg��Kà	T
+@/w0BÆSô÷ú#at/ºƒ±ºä—8R¢\&m‚[5Rz™ž„iEVÇb]±áþ—X¬Ší K}oE:1p".ðbèºg×:=Æ™'(Ä9zW¢ç"Ï“e~?Nò&’ÐË�q–âxI §<E7—�ÿPK
+‘j2äÄÕ¹�’org/kxml2/kdom/Element.class�VÙweÿM3IÚ0miK€B�‚PÒ™b¤"ûjA)T¨”
+nC3”@š”É´w°îâ†àZÅ¨ Bz*GÄ8ÇWŸÔ7þñÞ™/ÉØí9½ßr÷~wŸüú×�WàÃ‡°ûJP†x	íöóîß%BPÑÃ$D*D×½L†HÈä]š‰D‹ô39Ä7L3yœÉÌxržÂÓLžar˜‰Í}–w½LÒL2±˜q„ÉQ>>Çd�-zžÉÅx‘×—ð2“Wðj¯±­û˜âu^ßâÍb¼BoOÀq~í8Þaò.«x�wïñ�„’¤Þc¤{õ.CBeË~½_�&ôdw´Í2ãÉîdHéÝìé³ŒtØgÅÑ£ËJ™ôê¦‘´$„[RfwôÀ@O¢1z –ê‰nIÅ÷šÆÞø+¬Œ'ãÖj	¾H}½ÑDZøR‚¿+aè¦„Ò.ÓÐ-cCÂè±õ®ŽŒµoìMýè×…<PÑmXërn4¥úX)ÐL&»9[
+	Gšë½‚2q4~”ò=ÑGwKoÓb�‚¤n[*EN‰ŒqI”1Îã“"žJÞ”»�íf\B�‡�žš*Ü¢"t•î»V;·TOtÙ*
+ÁO‘¦wgGlÈþÞ¾D"Ú¿0º³'ÑJÛVæ›+¸BºŒ^+žJ¦ƒ8ÄI²>íŠ¨„e·LH{	©ÊY8ÿö’BRÁt.¾a¯8u8&ºl?#œŸñÌKù™qëVqi3Ì¸žˆ?nÇEÁZ¬S°+œb²
+«lÀ}
+>ÄFác	U»Ç§à~æoÆ&ŸàSÍ¼kÁ&	“½ûCÁr,S°”I;Ëv°D›C¶+Xƒ•A|¦`ˆyíø\Á£xLÁÃxDAùN+ø’¹;Ñ© ƒ� à+|­`TÐÊäœ¡ö=>œÅ·¹{—
+¾Ã÷fî·pÙ¤âIË0ó#aZ{Ú¨�3§voÊ¬5zz­Ãµù±Æ!ÜÄ9çqAÁ¸¨àHs(v9¢[û½x*Ú¼ÕõÈ¼ñŠØ…+îÚOÄ¨
+h¢¥)‘T†ãuÖ˜‘²uÏ~Š�Oã`ŸžH�ª5Á®ß%¡f¼çéUj¼õdÂ>z•ž ¡VOoàXˆo×»íq·‹‡¾1`mO`KI®‰
+]]¬Çbö™*%Òìa
+7†IÆÆMò,òÈ¸ÝTn=©þÜ8çP°�Üúôb~È{zßáé}¡SÈê´¥›Ž‹ëÿÃgâ–­G1Ò£§ãÿŽž{¤ÔžMùz	É9�Ùôu_À™;’v2·§½Ò0°WöºÆ>O…Ä³‚è½tª UbyuÒyðŸÄ]*Ø¥öÖú<k
+ŠlÖUº„"&¾ˆÆŽÕÑ(­ÓÔ‹�¯CQµ†aø3´¡³Ö�…ÿœ�¡)$df	“ªStA_!Þf8+À4£xYQDk#¦g¼Šb_cNéæqqr×2.ÎïÂ= pkÉ-™ÖE¾Õ3Ô,J† 5¨3²e1áªµk(×ø¬ØçÞ–žôI™›¿I9m[°Uh[H+¿:OmÑ(0×0ƒ—_PvÅ¼;Çä*ÊZ27oh9qš’c’xå9ö6OöÄ›Fµ`ï®l&?*V‘?5CˆØÆWžFyvOªO~W#O BuìÓ²˜”�œ÷°Ý3©áBRÃ®¤vx&!<&©mãâ
+IÝ‘¯;rŽMßf6U¤]¤g4m“iÚÄF0¥«jÄÙ>
+aºªÕŒ`jx©.¢ÏÂ´Á"
+ÃŸ>BŽ`ºD˜96¦ÆÁÌp–™�eCÿ ×v¶„(¥Í23ƒ™b§jÃ¸ƒ sORWMVÎË¢NÐÅ|ú�Œ ^†@:�¶‹þäÄn<DÑVø{Œ
+ÐzÄé 2õ2ÔÎahÔ§Úu*çµˆ~’c‹å°|
+M|ËN—û«ý¾FÍN÷Üj¿ÜØàÔô‚ë(Ïá2(®öû´�”ofn^áûÀOXÐéÓÚ:å†¶Nbeqgn ÐaZ£ˆu�S.ÓÂ|ãwépÉëØ#ä+EÊ*‰”çø]y~-igþ$r´ô2¢�•w
+cáÏŒžè eÄ`xi“sÚö¢[TÆQ{®ýlÛ5ÔQ¦EÑQ�«5ÔLªFÐèƒ�áZ!]wû(¥4DOÍr‚=%ìy0‚E2vØ­tC¥xßã’]ìs'Y&«vPK
+‘j2q×™.qorg/kxml2/kdom/Node.class�WûYÿN;É$é@»…¥)t×4m�‹.j¡Õ’6nik[(¸ºlH¦m M²É´”]pue}?w}±>
+øˆ®¨ Û ‹.¬P|¿]ßÏUñð×ï™Ì´±-|Ìç3gî¹÷{ÏùÞsÏ=ssý?O>…ZtàŸ>ôâ¸†×ûPƒã^Dñ †7øà’Î7ú U:Òð&
+'<xØ‡:¼ÙÞ¢á­¼M oÜ;|Ä½SÄ»dø¸ïöòýïÔûD<"€GE¼ßƒÈ¼zð!>ìÁIÑñÿ¨ˆ�‰úq±7ëC=NIë´œ©Ã'ðI§EÌJß§D|Z %éûŒˆÏŠÓÇÅÊçDœñyÁ}¡_Ä9Ÿ—Ö—D|YÄ"æD”E\ñ.ÊÌ'5\ÒðUžÞ�èžÝ±þJ\ÁŠh.[4Yso"3eÔ‚?Z¬/&Qk¨#±}V[UàŽöÇ¢–æRà#(>²ÿÀPl§ô¸¬ŽïêêÙÑ;0zg|$6<Ø�É˜¦`ÍàÐ@46<ïßu Þ?<2´':è—Q�Fv;N½TÉ³7íÕGÚÉ‰t&U0²
+û%¦‘)3�‰ì5’f®°M�Ë<š7Š
+ÖU3‰ìxdØ,¤³ã;¦ÆÆ�¸·§³i³[Am¨u/WÍ¥N¤RQ±­`m(¯š>pð­oìšÐ
+V$FÂ4bcÒÈš
+ºCKüo[ÚÓÚ—+ŒGÏLf¶D§r“{>IzÆ
+Ó¦ãÅ[—z¥OÍM‰O.‡écï<�f™zC¡#ÆŒ¹Ä…MÏF0 Œ´®¥³)cf`LAèÿZ¡5É�.VÜˆ‘×p�ò‰B‘67…,n¤–ŸÊd"Ó·GöMfÙ”ñ‚X_l&iäÍ4³SÃ×4<¥ ®`Læ¦
+;:b“8×‘BÚ¼‘Ía£�NdÒ÷Û6WXØ¨�H:^‡{lXàÞ/ré¬iæ½ëØRoXœrÌ‰åMÇÝx-G—�¾‚õÓ†¸}éIcÞ÷Ã†s�™<]©VazYÇ<í©òª ¾Ò˜Çëø:¾¡ã›ø–ŽqLè¸	Ðq×t|[Äw0¦ãºŒÒÊ!¯Àëø~@Çwñ=–‡ã
+V³938ÆDKÓÙ ‚UÁÉ\Áš‰l0—MÒ+øïëø~¨#�C:îÃð#üXÇO¤ï§ø™ŽŸKkY
+¿ÐñKq�DJ¸ÔQ„©ã°~%Ïà¨Ž_Kë7ø­Žß‰zhø½Ž?à÷ƒÿˆ?éø³æ/"þ*âo"žñw\&ûx&cŒ'2A)�Ïp	‹¶¦ßª
+‹O�VW:‰TíÑ­7ËÝê½\æ Hz‹†I°•ëB‹O©�±`õé,í9GºÇ”"´´XgÀ]�*„âÑ¥çy¾z³‰I£˜O$�ù"ú¿Ç^qÆ‚SµÈãC‰|ÞÈòØµ/·ª»l_†óMà3çdõêÐ²•É�œHzìš­Tª~‹µÛ¸o*‘).
+¼ã“gX·¡v7ÛÇ
+:6Í(Tê 7ËJ6’;, úJ!ªÚwÆÈŽ›•Í�Ú]²ö†÷ÙãË8](Rœ2–™*¦šVÝÜ²l°oZç˜µéñl®�8˜1F'XîìÕº“©¢•ÔZ27Y©D^Ê´ytÈ`U÷ç¹¤Q,ÒCœ÷�ÂT²’ÄZ*—LÉŒýI¹ÁÆa¯%½üP×¡	1ìäb—\p'õx•þ*êwUé}ÔwWéýÔªôAê¯®Ò‡¨Wé#Ô÷Té{©�Véû Jý–«‹”e¾8ÆºOy€Ú-|+r•	_€r•ÛË¥=|ŒM•ï|Ç5Ô]BÍþ¨½~ê54…/ÁEÝ=•M�MÏ¼×)lìx¾Ç°âêö7ê°ârÇøÂe¬,a5Çê�±sÍeÜÂ†·9ðH�£LÚLÖ’‡Ü„êÂ´³ª¹½ŒÕˆeÔµrÅB·å|äãïïh»OãšÔ¶9¬íhŸÃºŽsö4~{šŸÓjäÒ%TÈ¤É�ðãaC6ÚqZUY¼V[â‚Ø,cýYÌÂoƒ7Óšp]¦±æÝíŒÆIøÚQÎÍãÚã¼çºø¾;ÜÖ^[F ›ïõ^¶¶ª-5³ðúUÊN	™èÆ–26´ñiÜHÁ`lh©9Åî`	®ÆMT¤Íe<ÏŠ/±ÏwœFÆvºÉ^´_HÞz+-²WP_Í‘Ÿ«ebä%ò6gÙütÚ�A4¾{e‡È|«Ëïò«gpGØï"…Nw“û*6·7¹ËxA¡“XÓvõm¢·ZºÛï:{Â¥”ž»^ãXç‡Ô¶²ƒžá®€6‹•�JOÀs
+šJÚµÎ,~N‰–Y³œ#¡}´¶«í"Úx?my\0=–Åí|ÖË;LH»Êe¼°S
+»š¸Å‘&•±~Q	w©]%ìäøí
+ïÍá–7]ktÝRé$¶Ä½�îu3\a¸Áí˜Œ°±EÁhàäsÅJúNÉ¿’�ÆšÁQ{¹;I[R¹ÓÎÉKÜËx‰šêjîn	œ¡wv´XBRå¶2î8QËØ=+]�2¶:Çƒw;ëì=ÔÃ\ÎKIåe
+X¨ÄNó96�ÿ7ûÜ|ÿ«’ôêy;ã»j-ÏHf…·ªÒËVS'wÛ
+îi«ôð_Ÿ-¶Þ-ùÍçŸÝ|æ“–�irñ\�ÏËKx¨M”ú‹è¬Áh	EGÝVƒGÛ.Ú¨£u‰w´nÑ¶9Ú+Dëp´WŠ¶±úõð ø¹ öI±âZüPK
+‘j2org/kxml2/wap/PK
+‘j2:NdfR½org/kxml2/wap/Wbxml.classMÒÙNÂ@€á3¨€(ŠîûŽUžÀZmBa½jŠ!$ˆ`´.—nOå…q»ò¡ŒçÔ¦9½šo:ý;�ôç÷õ
+È‚¦BV…-‰jÍ’Æ�]Ö÷MÂ�4º�k×é¸ÇNû¦¡^³˜§¡5‹Ò’§¤�€HUVl‹ P–4+z�Fš'Ò¶ìmânÀ¢0GÜ*{C@Ì¯ØMäý•ò¿óÐë<ô:Oþ†$á™¥tšxÁ»´Ø½ûð2>¼È'~c©¬™¤/ñ âíè[@º{ÕÔÎï/Ú9íÎ¹Ôju
+Hµœ[Gk;�¦Vª·gnOBøÈdðØÃ¨DÑ*s:ÆG'˜{ÑIæ>t?s
+=À<ˆN3Óû‡™GÐ£Ìcèó8j‚y=Å<�žažEÏ1Ï£˜ÑKÌËèæUôó:zƒy“þÂ?PK
+‘j2që´Û{Ñ)org/kxml2/wap/WbxmlParser.class�9	x›Å•otþ–ÿ$²'±%åÂ¶ä#1$
+ŽmâØ&ˆ8¶+74–­ßŽY:›#0(P @‰)$¦j�vŠm¶		…’´t{lÙîÁÝ‹Ýv—í^Ðm»÷½ùçÿ%Û
+%ßçy3oÞÌ¼û½_yûÒ·Ï�ªØWmp?3À}ÌBƒ•ÉÊ
+Úh(¤A¦a
+ó­l�
+Õ#v‰ÙÀÌ´XHÃ"++¶�ƒ™%¶XbK$¶Tb%6Ü(µ2'¸
+àæ–Ø6(aËhðz¹ÄVÐb%-VÑoXM‹+%V&±rBUÐÚKƒOb•«¢‹«i]#±5ÄÈZj%v•Ä®¦Íu´¹ž�Ÿ‘ØÂ\CC
+%V/±‰5JìZBl¢¡Ib›%Ö,±:ÚJ¨ëh¶…f×ÓÌOÃ
+ÄÏVšµÑÆ6+k—X‡Ä:­ì³ÛnƒNÎÌºhÉ‰í´±]l·•í‘Ø^‰í£+n´Án¢¼�Ý$±ÏIl¿Äº%”X�ÄzIÏ!úèÒ~‰ sa‰$ä!+<E\Dh !*±Ý§áf‰%ˆƒ$-R´�¦á°•±Á Û*±AÚ’Ø-oµ±ÛØí;*±;l°Meì
+wJì.‚wKl˜à=Vv¯•}ÞÊîc0oWSçþÖÝ�Öö.G;æG\s,šL£©�ÁHZ1À&ów´·îîlm´¶ìoí¸Ž�£í`ðp°&Œö×t¥áhÿF²¿­­uKSÛþÀžÎV†p”A±JŽÕø£ñt
+i•àÒš¶ì4mnCB{S °}W i{`&jgSÛŽV
+5?˜J%ºRÁD*ì‰(îËÇ'ã¼2)ìÓÂ$§+[<ëU’ÉödEßËÀRâ©(‡Q”(2ì=„D“q1-Àis,M%Q¼}~ñZ¸'�R8/ÕHb‰*ƒ)')z2©ë-�
+Gjv*½©XY¶VÉpµåˆ§{"á^_÷…•¶ö&º¼ÜO(}áAâ#8 $ãÁ^ÃDs)|w$oL)Qº°%˜
+Î´UGÏA|uã,ºæXˆß0'}õâª3ØOú
+)ýJTIS
+ò!‡“»„SÚ»–úp4œjd`,¯Ø‰§ÕKlýJê:%˜J'pQ\>×B¨h;qwh�âcˆe°¨¼"Ÿ5�!8ª´¢:RCÛ•xŸ&Ó¸°eyîÏó"rgkìEã¢¬h„B|¾3‹+‰Ôƒ+ó1™OeEx¬]Ó»0·©Ü_�nàÈÝêF*Æ½|2-È%Þ‘£fs1˜#ý&	Ïµ¨>‹F@>“d±d˜mQ’½‰0—£7ÚP‘íé�%¡òÐ‹¤¢/@ËX¯ê¶HÌšÑù‚½)ôP4yù>Å¾f•¬�»]×¥*pQ8Ù:O
+µªáö«×4ÍŠ{..À�ÎNê˜¥/˜Žå"OÅ¹ä9j²ÏÆ«vÐQ:[¹Hžløtž“7Ëáu­‡I>Î¹)ÊÕU@ ;¤ ²­|NÒK|Æ	¬	åæt˜¢¢¼ÜÿiÝVJŠ@ÁlW®gÒíJ0¤$8�·<o~½L$sbsq
+ì%ªÂdntü�ÁAç
+‚¡ƒédŠgSâ[dÙ¥å~žDÍO(ZP^&U¨<Gð5™ËýœE®Vÿ@<‚Æ�IeWN2Sý†¨P!2<%NE9D¹´ ¡$c‘Ã
+ÍËËóð•?deþŠðkÌúø*±9ˆŽ&-Uä¿*o�âlmJ)Ü'‚!?ÝÈ‘HâÏNª)zõZR~9E%UÏ­Ž.[
+e˜„)‡ex‚†'áAŒ¢Ù7Êpž’á$
+£pJ†1š=Ÿ¥Í)^2|2ê¤RñºššÁ�H<‰TÇý5‡×Ö„b½5}ª¿%«¤"+EÅ­ÒËWRf÷³dø
+<#Ã³ôÆÊ,?þhHìH§:ú6câ%[³îbÄ§¬ï9r¤úÈUüÙÝÛÚjÖ^sÍ†šœ
+iFbÊûî¹äµkÖ¬©áÛ52¼ob\ÌÖÇæt_Ÿ‚’¾Œ*c_€§Ðléè¡hìH”ú_2{�=$Ã+ðš®\¡üWá!äÃ2¼�`gq«/ñÉíøW'³/ÂY¾�Èð	lh(C|™?&üÝ#—Ñm…Ì�·eö({Å®®®F3ìJÄ¢ý…’�‡Š¶ÿ‰ŒÀ7ñNö%ö8JÜÜÒh’áÉàÿ‡Çáçð6fý4N-§„<j±_‚Eo,â£Î£õ`[¾ÓÚÞB�vH†‹ÄãOá,¦†¬ó ž[±„çd �Èvxä1ø’_#§»D³¯Óì&áCž&eü7üf9=›uäX{‘?QúƒO˜^ðôÅAšâ4†a<K�<ÂÑˆ›ÕdYá‹ä‡»"�8í¤Nä\»8÷|\¤¼:4Þð&*Þ’áÿá#TRX<Ï­ëÑ=ËÊž”Ù—zDiÖi¶c‰(9Ï,ÕŽë­!¿‚85!Ž;ËqRí÷°€íˆªOÈ£–/•*E°¸%Çæ›1�^ÎêHñíìtõ«iý¦¸~““ÂîÁAž<˜­==Š§7ˆÇC8C½*­â,—ÙùÝÓì+2{†=‹¦b'ÐìÔæy(s¾Ob’òè/á™Q†c„2Æ—i8NñÂVÊ0MŽó|ˆŒuú=½éD¢Ú�¥<d€jÔ8{N†ß‘/œ&¯ø#Ç–›	RØ‰&¨Õ<ýN†ßÀo±Da+‹.*Ò?éŠ­ß®šwHIÉèÔg­lLfÏS0Ã!ÔˆUå¾Z†_S¬¼o¡_åU´ïÃ�èS(Cø)$ÃÀ¯”�ËBŸ«­AnjvõàTõ·V-—\Ÿä¡X®0x‚‘ä¬ª¨ÕZúR¡/¬.$ÆãJk™³¼ynáR3–œÊOÕPêäR*¦bð�ˆí§þ² ™îI
+äb,é—íG©_LR*Ä²ßÌë°5ÌóxßÌZ3”L)Ô5$Á¡ÞX|(ÛÌäJëÏƒâ·VæSÍåe2%Ã·ÐçI0ÒËx^íâÕ2Æ€ jJÍê”4ˆîú|½Ñ'Y6·s
+HÄŽPò'�ù¾tæ”,7³¾*ô¯3ÅŸ›A³ÙÅ§¦–Ã}p?&öpV_€qþ~áàa(…/Â#úú^\?š³¾
+ÿ0‘ó96>!à“bÀsx\À1»sˆ5žÃgý	±R@l68|Nì�	üób�­Ð¿¯ñ5Páð±ÿ¢xç%¿!à7Ä¤ÂáiAÿ²€ßðÁß‡Pvì—p|W]`ÄÀ/b¼Æ	0xM`ôš'ÀäµÛ_œX¼v‰O¬^ëYÛHÚF�×~ilÞ3P¸g
+ä	˜wš3Îà�áÛâ>l@hwÌ÷MÂ‚ãxú°¿d|IPž�³‚r>BbÅÀÆÅÞkpÏÒÞ<ü£Ÿl˜úÀyü3!A'þ½ßÉ¹À0ãl|ÄÞJÁÆ'>_4…gÀ�</<�KÉY­qó]xK(Æ÷è@X�¦ÁZíÎ:ÉAR(HLÝ:Ö<AF"âü&Ç"U~‹£xÜ±X›/÷C“°Ô4h5¸ž†u¾‹PL7ºj/Â
+>¡‹}*Š“uì°áRfú‡º¼ß‡·Å³EB™fº]“îš®ÙS`F{ð”ìA’Ò—ÁyîÌG@«Ú˜®)p·ùìžI¸b!Í'¸¤¥–“ðÂeÇÁæsàîò]>{½F„›6Ÿ½F,W\€=1+«�q«8®Tç+h^†Ã$”ó‹WA„^ó`ƒ±Ñí:·e™(p£ÔPG³.-p×æ\Ë©f_-Nðm³ºíÓÈ-êº2K>l4e¦ïñÙéáô�lvëI°d`'Í­'`�Ï;	UDœ�Íˆ«>ó|Ž±–ö¶á…kìö1p‹Ç+�vû$¬¥·jÕ·¶ù*9w8ÕŒø'ºõˆ0hüá'ìMÀ�D´¬AH{«§¥*÷' ˆ&Ò	tjÇUSp51ýÒœ€ú±‘¹N´Ncï'ð§bÛ�ND®ÝÀŸ…jŸÑØá31ÊÝ!àYó6šÅ²Ò8	ë+Ç}F’:X6bò½ºZÛþiÞí
+mû�¼Û+´í?ÓU³L¨f¡ðè¬&–ÍÕÄÏò†“WSøŸë™`�È<FÇg´'ÿþrvZÒsÞ_éW‹RBaç�‘–
+œælÖyW?R&Ž8/sÄœÍBý©å¤®¿ùÔ‡,¹‡þVºaf�F5„­¡F÷ÓP«E]%Ï_nß°«QëÓ�ÂñaãG™éŸè^ñwhÃ”Î5ÕÏuÂ×DÂ=M…¬º¨lA=yÞ6¬oè¨ó¯@¥õNi£yú='zîÍ• Œñº‹`­ÌÀR-^Õ±N�Õ	X‡·\ó"®Å?™ÿêA-Oõœ#¶8,àw	f¦Ó¬®Î	5&­cÈŒU,²BYðÒNØ†bý½.V©pÜù\,Mš|gþA?³Iœ¹“QOÏ˜Á¨©JÒq‘ÔhØ¨FCÞ›ÿ£L½y‹(§³ë§f¾c§ØÆ1,t
+mâ-$mDRßxžþ	þY<Ð�z$Mx=:	ËÑBó+ñ¶k¹Ã8ª.ÀÆ*\nÂå¬ñjõ 	M…EÌÉóùf*µºP¥Ÿ>�çå÷à_ÄË…hV¯£y±æjïÁ¿
+Ò{Ñèä	¯oZ¼ÈNë\GpË\�Œ_?Âõ¼e—Àù	4¯î)¸¡Îd\o.6»OÁ¢~ŒŠÍ°™e¦ß÷–˜¸ÇmõMSÐæ5qÌ€­Ýëhç\acýp™ŸÉÝ/à—‚»u"*´Î«Ðëš{½MÓVêÄ—G/Úeÿÿ..+C]æ<�{´ãŸÍ=¾ýü¬ãú®T�`	aŸ±ÞØàRSÃ)ø…½ÓB{•½nºÖ›ŠM†°´ÊXŒÒ¯­3W›LÝ“hÏ@Q•c1—â¡ª:3k/1ó%ê×TŸ�!êâ¨Ó¹±zŸ©»Ã4¸Þâ¥p¶[ÌÝS°ƒZW¾ªêR¡©›?�§=©D[8øè¢;Õ0(pYUJïäÙÚ;Aœ»B¯Â®aÃGÃl®vg…Z²£îR©F ììÖ·Gø£c/%˜IØÇ5xãy.þ«sÅ÷–˜'á¦:K‰å"”ç^ô9<O{ËûgÞÄy(±tqhê.1w	®¸8¯ë­ÅV×ø«h§ØÊ{"þª‹ŠP—«tgé¦·,sÃiØŠ){
+Õ‘™¦Ú_Á…np�€G?Tóh…~&+](êd¤
+£¥�À^—..ñTpbƒxÓ¬¦Nà"xÕŽÒ­_Û“í"Õk½Ž¤vÎ.ú-CÔ§V‘X®Áƒ[/À<Ò¦£W¨lÞ$„,Î–nl…iÉ&AÉLÿ’¦UNË²Ö§F‰ƒ~™±±C‘Plø¼l
+úgÇ‚�~ä‹PºK<ˆ>ìÓi|@`Æ`™.ãÎ9	aÇA]J×qp‘.æ©'ÈÕ¡×!2¨ÉÙ0êÑ¬IÇÆf¼ƒ~WU¹DÉM(°DW?�" ÈšàÅ›ÿù^.üd\vÚË¨62²!#Óa•$(ß‡”Ûx#|fú*ÚE…”Ý€ƒ}ÿ!|€×|Àrµ¬¾¥–Ufàµ˜a“€›lFXŠð˜Xß)à]Þ�pÂ×Åú;¾!à›©¦–fàu/Ñ<Ø¨Ê†K‹»–ü�Ï°I^j¡^ÍÀC^;'Å¼þX£n4L#ËÝ˜ÌEÓ ¡ã*:ÌÑx¸S­ýxøf$ËÀ&/FB"¸S&¹SZÅíÔOm5âéÔz±°ÕÍ“?'Ñ¹ôÌ²¶�'ðàCáu?Sí	ß÷Ú7Ñ•Ø‚vŠVæyü³©:†Us¸Y@Ô-Ö®[ïu
+CªN9|C@Ô)Ü&Ä:’�Ý¨€Á=$ÄqÌuh¦uƒë¬Ôn¤‰ŸyLwä)�†MXå­â´Ùju‹…|U\÷×ºûžGa±4³oÑ�Xsœ¦ìëf‹¸3R1åô*3Š×ÞŠéº�Ò5–d¶IâÕ:S\4¯*6óÔ„_Åu&LÑ˜u×¶óKœEpì9¨u‡j'öBNìrV!òîàvÚ7�b³lß<ED7
+ï"¸ë9xGU¾ú� þ»E¸ý½ªÛÃãÂ$£Â$£Â$£Â$£Â$£Â$£ª»Ã‹Â4£Â4£Â4£Â4£º2ÐÂ;�-�©Ÿ¹ëùêfõ¶‚{ámä…}»Šv”pÿ‹‘Êø§:×ã¥�y¾¦zÉëm_˜£¡K›2}V¥Ïx›Ó¥V×n,®™K»çÖ@ÿÕ#üxµèi©fÛì—NbÂYË$¥Lƒ¸™ÉŸÚ£ßÀoÅá"ùû]ö;ŽJøi‚†¦íöqüHYˆ_%Ü¾s§ Àç®½+ÏÀ6½ÐÞ�¢º(
+ÓÒð�ç‘j|Îc¿Ó"ŽU¢RõÐ�i¥\=NûµGQo”#1qzÉ#ŽÇæd«ºÊÑ°¢¿™(©ò|»—”RdlàÇ-šv-|a¡Ö¤‚TI)Y:7ŠçÖî³Ø&"ÂXeäxlV(–$­IÒ )TMéØÖ4ºŸ…‡ØŒ®ób–¹ÛKéånÞ\¡Gà0\7ÇkÅŸBõÃÆéÌô9¼ËN]æÜƒ~R cÎ)Õï.>ã�×
+unVùŸkoý÷”þÊ©§ïœkÌ¾q—ÝÞý˜Û}(ž�d«ñóqŽ“ˆÏjáõN4ô<²§ã^²œs®“\Ò—‰¾Ùi¬'ßnpÚ­ƒä/Çê]d®‘é÷óŸÖ?�:Åp‹PZ›©ApÁÝ-‡÷ýœTì¶{ÆÀllð¹Õ(œ~‡úôêìOB9ïÐÿôäÈhä2büÖóê€!™¢Ç¶:©£š}˜á?ƒþÓ¥ÚƒzéûÊP9Ÿ?Ý2ãeˆŒ¹D¦Ë™²Dð{PK
+‘j2R½	#org/kxml2/wap/WbxmlSerializer.class•VûWÿNv’Ùl&˜Ú&�
+,»V "-�6!TV	‰$&„He²;I6;Ëì,Ô–ÚÔ·"¾‹Ú*­�Ô¢M‚
+RÔ
+ZŸµÖ÷ûõ‹?þâ9wfw‡dBp?Ÿ½ç>ÎùžÇ=çÜyñ¿Ï]†-øg­8­àC”át%îÃ Ü^|„‡�*øX•öÎÇyøŸäá1>8 Ù§|Ú�ÏP‹Çýx‚?ëÇç˜žc¼'™é)ž}>€§1ÁÃøô‹ñ$ëÿ’‚/3Ãyfý
+Ÿ}•Ï¾¦à^\àí¯óÎ7üxVÁ¤‚©"8íÇ4Ó‹<|3€0ðœ3~\b-çýøV«qÙ�çâ
+/¾ÍÃwxø®‚Ø†ï±	WyvMÁ÷ü@Á‹ªr–™Ê÷hƒi]BýžÃÚ1-–·RéØn-7bñöV	>#oIh°OSF¬3oeóV·eêÚ(æ‡$,/·�Yz«ijc³ø¹”µ±ˆ’Õ3IÚ‘Pg§µÌp¬[pyRÏZ#¤¸9£�’…•LrY-Aó€fç`ÞÒsEaz¯ž°“2G·¥™–ã ØèÕÒyÝÙð[ZÁy?ŸuiÃ4Uh×žUlKeRÖò1´®—¬Øi$ÙŠ¢f	½¡¹¦ßÊÎº=†9;1šÎæÓéØ±
+±ý£énÝLiéÔI��¯H$säÝŠ‡6&°ëD‚”229?$«Æè¨ž!	%i$’z"M–Ò:e�íÓ)ÚþaÝj·#JÞPL´q¿®YySŸGË	*1í-}Ih�×U)i¤Y—©¥NHXë�yÀS¾JHYÝ´Æ$¬ñ²ÅµÕ9x˜"Cb‹SÃÃäûëIY«(«Ú�DÞFùP:Ÿ#ŸÕÄˆž8ÒUÈ89t€ƒXŸ5�„žËÑ^<Cù™Op@)69Wl<ý éJâ²“œl	 Ï$cLqI‘�wÕx_)ãÝ,xÞRU9wð�sbÇrÕ9.�R¤B7—l3Œ´®e„¨?gW²ýÖì\(ÝeK?A6ÜØ�/È½Ñ3Cª(º{arÕq¾ =ú°–ãÛ�{ÇÕ/Øâš;æ¹Æ¸¸5ÁG;q×¼Ç¾—žbYŠxë©%¾ÖY�ª°WjV*ú°ŸÒÌ£E«Ø‰v	Í7mÀ*^‡Ý*âØ-¡fv³TÑ…7ªØ‡vÝ<ôðð#üXÅÃx„ü/¾/O-eT/6	Ëvj™Œa…ëA§÷‡3Ø×¶¿c~�òrW¡é¦žIèAÉå³YÃ´ô¤›}:¨Eíí�«Ø…ûUüIïÂ»Uü?Sð’ŠŸãeYìWñz¼AÅ/ðŠ„²�8üRÅ{qPE/:Tü
+¿.8ë
+ºŠ7ñá{pBÅo8¦]ñ ©“°²ÄO§)?Ò­æ°¨—»
+³ñè-#ŸHQ>s$cÏ‡ìÆTñ[üNÅïAígyß ¥fÐÔ�æS¦žj™ ûvVPêSTnN"2cºgt(3
+Z²NÉ%@ÅðGjÃ{»»‚"pGarÜÿ¤âÏ½¿à¯$éò.céÃº`¡€ý
+Wñ$)…¸„Ž�¡cÇµlLØ\ª¡bi7	M7«ºB¾RRÆ;]1hÉä®´n÷�žW’sAedÅ„æ¾½n �Þ!¯r¤f/r�hh �!|ô®ÌzO
+
+¼Þ9d´n›Ö*Œ‹{²Öšú¨qLoM§?è#¤BËò�„è˜;o¶òWˆaïp�:š×Ò¹y‚Bï±b7H²²"­g†ù5¯HŒh&ÛÊæï$§Å{´ÅàÃàOe,Ñx°‚>([!¡
+‹î2àU¥ ÔP�;”ŠQP*`A÷:ëN‡R�tŸƒÓíÐAË¸,ít%é¥–Gc?­ z‰eÃÓ�Â3(ëŸ†o2MËiZ1	¥4õÓ´’¦�IT•xÕÒ´º4]tAØ á]ËÈ™h]øYTE§ð*¦-LŸqxßŒƒÄÃ¼‹‰–UÂ‘)ÔôÙ`Ð_&¶·Ðÿ±Ú°ÕÂ9/hÔŠG
+äfPÛ_W7�ÅÏ;<ƒóð,qñ$�txj‰r”ÊÉâúóÎ±Ž!çxQ†(óÎ†1â‚—Šð
+.øÔ-ðÆ�Ï“'�ÑÙvH…€fæ�’A9`ÇzQV¿‘¼[Jÿn»ˆÛK«;¦Ðè¬”Òj
+Ms¯%[Ì¬j¡Å¥�z§­Pzš<)'z–`š¯A¾À‰0…eÛ‰.â½),¿‚àÞ–kØÄ:›Î¢¦ñ1(ÊêkÚ'Ä¢²ã¨¨ÅSX¶…VNà@‹o=-V=�æ0M'±Š|ÌC”Oœ)a60L‹¼~+h¬¹ïÔn£­jZÔâ­bvå‰ø6ËõrÓ9¼D²*›[/OáÎ’�ËSqL±¯`µ0iƒmÒa’L&­™eÒgJ‡ö¬š1Æei–ÁTQ’+ª¹ˆµÿ·‚Ÿ¸kzœ*™öd>“&ITÜDhîÅææ)˜u®L´�wxÖ’gkãÂý3ˆPOˆÖQ©¯§j&í±i¼º tÇ=�7¸€�á„“«›�2G¯¢šÁë62V82IééÙ³æº2†“Õ[ñ¶›¹²ÉÓ•·ãAÇÌÕDYH÷.7¥4¹k®Uá”#|·cUKä*ê^Cz6ŸegÉÄ×²‰aºÔ-á(ßV?õ#ùÐ$ê�ê|ïp£¨�7hKº²h«û#MÍÓ¸›rÈãc•Ó�—ÎÁˆx‹Žý‰9þp)6_¥„£@l™p%žð"éíÅ£x§«¡øJ
+ÅÏß®Ž†vbg·ø/ù;|;¢Íã>©±æ¡Ïô4Ö('·5ž½þŸfù),	GÇ}×›7quÓL\ÿw8êÛäq~þŠ-Ï¶>èÛÞDWqÏ9,Gš¦°õ	Ž—Qý‹C2üÁì`t9íä²½­#z
+‘lëw:î4¶wˆczwôñ¦¬8lâPÑþ½Ô–çfÎûð~'DmÔVË¹J¨�É|;š£—Ï!mÞxËË/ú}��ýr³ÿPç=2·Z:¸]fm®‰ë¯õŠxÛ¼
+A©ó@}°u¯µÉ�jP+JPµxÔ«¾ìeÿPK
+‘j2org/kxml2/wap/wml/PK
+‘j2žHmY=gorg/kxml2/wap/wml/Wml.class}–x×Çg¤ÓÝètÇˆ&@ô"	¤£7qØcŒ‘
+FŒIBVw+Ý¢½ÛóÞJ'œâôÞ»“8=$ŽS\HìØéÍé½÷Þ{OœÌ¼Ý•ˆãDßw¿÷æõùÏ¼·ºïþ»î…FèÅ=i¸	Î¥à
+ih€sÍðx£ÖnÑÚ›´v«ÖÞ¬µ·¤à­iHÃ9Å-Š[Òü6‚Ûn'¸ƒàN‚·¼ƒà<Á‚w¼‹à.‚»	ÞMpÁ½ï!x/ÁûÞOð‚|ˆàÃ!ø(ÁÇî#ø8Á'>Ið)‚O|†à³Ÿ#ø<Á¾Hð%‚/|…à«_#ø:Á7¾Ið-‚o|‡à»ß#ø>Á~Hð#‚ü„à§?#ø9Á/~Ið+‚_ü†à·¿#ø=ÁþHð'‚?ü…à¯#ø;Á?þIp?Á¿�		„M„IÂ!6¦	[3„­„m„³³„³	™°�pá\Ây„ó	v.$\D¸˜°“p	áRÂe„Ë	W®$\E¸šp
+áZÂ.ÂnÂÂu„ë	{	ûs„7n"ÜL¸…p+á6Âí)Ü‘Â�ÍÃNìÜ�Ð~jðŒ5iå\«2–
+|§2Ö��>zzhxàèp<0l:>0xlÜ”ÜíTœ`BcW÷q„Ä>¯h#d
+¾möË¯Ù>BgW÷ ç�åÆ§Êî¦\ÝªæNŒH5ìÖ­ÂáC¶ïX®sƒNYþàSf†È4Ú]pÍîx¼¡ãî‘�—ÂË2¸û3ðr­íÖÚÍZË£¬Ôù·’>P´‚¢B4Öˆ+ŽcU¤­zµ`Ô±]éLZ•BÉóµR(ØµšŒ­FY¡aDÚË×EŠžÀ.‹SffÍÄ“ÆDÉ¶d:2Í)Ë´&§R��ÞDÙä‰ŠçÉ¦‰ªoO"¤¼Š=iW¤›¼j0æ{Ò—”ªãU¤×·G}»V’¦šíÚÖT+[®«
+�ï©_Øåª+ÑP§œ²z�fB0i‰ÑX/Ëð6u§ôJª¯¬“©Æ*ù/¼ò´Y�£è
+éÐtíÑ™¡e§XTÉZBÓwÆJÒÙZ�úÔh¹Ò’*x²ˆº”,zeË?ZåˆÁYo<?j¹5M·Øü	1“£ž_¶tBÉWM–jU« ]Î¤åêQÑ*kéZ#¶8D®W�Åü‚¡lM¹ve,�Ò"rÉ+æÇÔÇ–ÈÐøª%©ž¯xußÒ +¬·•'ÜÀ©ºv|¾Öé†ð€‰pïlÅ®ç¦‚xä¬‹š"g¼JÕ)ŒK—„VÕ±
+ãu“4mQ‹¸6Hô£�µjÈ%²Ó
+Åvt€ª˜,(”l=Éìš])JrØ¾íÇS²·EÓjr$.F¦Œç¥¯õµÆf4�äF8•¢=eò(ÐH'‚³U
+¸ù0�b«(é¨)×l¬’íŠŒ­¦^µjµº§Þ…#c9æDÖ4i¿¸yZ˜LÔ©™æVÔâMÃ”6u¹$ð°Cƒ×'+Å>½“¢‹,£E¾Õ]¹œœwÚ¬»)Jµäd”|Mu§¨²“¼.»ô1‘&“î&ÉÝ‰²¦©àZúN48ê²x0aÅ’¦C+Ô»E‚0³w&¶Â­ÓZíµ¯ŸpÄ¥ù3F~_x—z‡M$º£«•·ªU×)XªGN]”G°Oîy¡?ºßy¾h•ýSUG$’Ãö¼²ºÚg'LY±Sêƒ½zådü0ˆ{¶>#É8â‰0Ø©iWZ¢Z½^©iÆ©L\
+{’ñ’Œï`j:¢4“5MQ,aÍË’š¨ŒË,>NM„kÎýÏï€H�;¡ÏÝEïÿá‘3æál‘U‡­±áðÝŸßuðA>¢úE”«�?X~�ŽÛŽk‚˜¶ÄrùŸê&ù¬C¿URëÐ/•)o6eP?sÂW‰5[J”²©çàí ÍðjxMÔÝ'i÷Š»¡áäh<ÔÓx$ÎËp)“ç!¥%�‡æžÛ¢¹¯…×ý÷Ü´Ìm‰çf¢¹­ÑÜ¶h.Áëãc%–È1õ¬œí¿f�lÄ¡“	ù5É/)¿”üH~Y5²je�Ù¬H+ZE«¢M1K‘UÌV°¢]1G1W1O1Ÿ³Â<[ØÁ,\ÈíÂE<G¸˜ç
+;yžp	Ï.åÂeÜ!\Î…+x‘p%/®âNáj^"\ÃK…ky™°‹—»y…°‡W
+×ñ*áz^-ìå5Â>^+Ìq—pw7r�p¯næõÂ-Ü+ÜªßÆ}Âíœîà
+Â�¼Q¸‹7
+Ý	‰ì)£%o1y‹¨É[ENÞ&zòv”w¨¢¼S%å]ª)÷O‹Ê»UUÎ«¬¼GuåKTX¾T•å•–÷ª¶¼oZ\¾LÕåý*/_®úò#ðFàƒFà+�À‡ŒÀƒFà«ŒÀW����¯15�‡�ÀÇŒÀÇU`Ýv­¢�º'Œº×uOu¯3êž2ê>Ä¨ûP£îÃŒº§�º7êZFÝU—FÞ¢‘×6òŽyÇŒ¼%a¿n¸[‘WìQ\¢¸”áŸîåqá>v…—qY¸Ÿ+ÂËÙàªð
+¾^x�}á•\â@8¨‹]ÅÂ«yRx˜ëÂ#<%¼†Ï
+�ò
+Â!~„p˜)<Æ�çGOð�Âkù1Â“ºØu(i‘Ìv†iñXM‹ÇiZ<^Óâ	šOÔ´x’I‹'›´xŠI‹§jZðÓL^<ÝäÅ3L^<s(¾oü,“Ï6iqÄ¤…F�MôÚMôæðsL^<×äÅó4/Ð¤ÅóMZ¼À¤ÅMZ¼È¤Å‹å´¾QðoPK
+‘j2org/kxml2/wap/wv/PK
+‘j2
+ï¢Gd/org/kxml2/wap/wv/WV.class•Yw|\Å¾�•t£f�ÞsÅôjŠ-lŒÁ…rº;Ég®¡;Iˆ&NÒ³|öéNÜ�$›Þ{‡ÐkéL	RHBBz…$ô–Ò{Hffß5Ùþýý1»;»ovö›ÙývOÏ½ûÄÓíYªŸkQ/¨w¼êw-Pï4«çÕï¹ö®ý‘ÅŸXü™Å_Xü•ÅßXü�Å?Xü“Å¿Xü›¿}—kÿ¡x¼ A#4 4"4!xQýšZZÚÚæ t ø:,a.Â<„ù",BØ
+a1Âî{ ì‰°ÂÞû ì‹°Âþ ˆpÂ„ƒA8á0„¥ËºGXŽ°á„•G"¬B8
+áh„ÕkÖ"¬C8áX„ãŽGð#t#‚!„„^„õa„
+' D¢1„8BáD„>„$B
+¡aaá$„!„“NA8á4„Ó†Î@H#Œ Œ"Œ!8Æ6!d6#lAÈ"L äò“g"Š%„)„i„„­ÛÎB8á„sÎC8á„.B¸á„K.C¸á
+„+®B¸á„k®C¸á„nB¸á„÷ ÜŠpÂíw Ü‰pÂÝ÷ Ü‹pÂý ¼áA„÷!<„ð~„ |áCFøÂG>†ðq„O <ŒðÂv„G>‰ð)„ÇGø4Âgž@xá³O!<�ð9„Ï#|á‹Ï |	áË_Axá«_Cxáëß@ø&Â·¾�ð„ï"|áû?@ø!Â�žGxáÇ?Aø)Â‹/!¼Œð
+Â«¯!¼ŽðÂ›o!¼�ð3„Ÿ#P–þáW¿Fø
+ÂoÞAøÂïþ€ðG„?!üá/EøÂßþ�ðO„!üá]„ÿ ö V¨µFÝ€ºuj/jDÝŒºu+ê6Ôí¨ç î@íCÝ‰ÚBm£ž‹zêù¨ ^ˆzêÝP/F½;ê=Pï‰z/Ô{£Þõ¾¨÷C½?êPˆú ÔKPŒúÔ‡¢>õRÔËPw¡>õrÔ+P�z%ê#Q¯B}ê£Q¯F½õZÔëPƒúXÔÇ¡>µu7êê êêÔ½¨×££Þ€úÔÔQÔ1ÔqÔ	Ô'¢îC�D�BÝ�zõ ê“P¡>õ)¨OE}êÓQ£>uõêQÔc¨ÔQ�£Þ„:ƒz3ê-¨³¨'PçPçQO¢>uuu	õêiÔ3¨·¢Þ†ú,Ôg£>õ¹¨ÏC}>êP_ˆú"Ô£¾õ¥¨/C}9ê+P_‰ú*ÔW£¾õµ¨¯C}=êPßˆú&Ô7£¾õ{PßŠú6Ô·£¾õ�¨ïB}7ê{Pß‹ú>Ô÷£~õ{Q?ˆú}¨Bý~Ô@ýAÔBýaÔAýQÔCýqÔŸ@ý0êGPoGý(êO¢þêÇP?ŽúÓ¨?ƒú	ÔO¢þ,ê§P?�ús¨?�ú¨¿èÕÏxõ—”§½”O¥G²N"=î®<ö)‘ÍéétW6�ïJ–
+™ÜøÚY£–Ïj¯˜Õ>bV{å¬ö‘³Ú«fµ�šÕ>zV{õ¬¶_yæ¤K¥B²”.”Dë*ÒÙ)ÇU4­Ëä2¥c•G/9x@yù1Ò¶�œt‰¬ŠNAyöXrp$_ïÚ²u"»¢k&=Ù58BUÓM0´„¶Ž:“¥L>Wôê/+®ÍŠÙ6õ3õsåY´Ë�ÛÔ�ÕOÚôWô³mê§TS/²x‰ÅË,^añ*‹×X¼Îâ
+o²x‹¿ý*û6×¾¦ŸUßì0‘{þQv/�¥¥yýcc‘L±¤<­T‹eF·˜Vc2–ž`„–’‰¥Q§X$i1�lÆÉ•ÂAú"�Ï•Ò£%÷{nQO0]J+O‡Û
+åFóc2m¹?™9Ë©¶RÛ&Ù(}ä¤2<akÐ)Ž2MtJéLÖësŠSÙc›+eJÛ\'{ù©IZ„”ìR³ÔÜÞp®¿H"ùñ<Ñ]B ?•£Þf·É_µ¸õþ¾0¥@4Ncô�A« HÕhùl–4‰‚StÉŽr595b†·—5’a28?éJÛhö§ÒÙÌÆ§SsŸ3š™dPÉ“>g"?í˜ïç˜Fuþ¦
+
+IÊH'g\iJ:¹16äMÒ2¶N·VÆ2ÏÓ¸:‰œ[7è7Ñ–(MI�*¤sEŠ¨±jZn´”g^�²Öz{�žgè¨iGeéþ¾ùHÒ,¦¡_6SürÅÅ™ËŒe¨F»66Û3•{ä©]ÛìsÎœrø»¹Nêl87�)9K+ê…µjž¥ÚÕHO¦G2Y™kNµaüè¬*jŒIþW{ªÆí¤«8IJZgÆiP÷¶’Cî·™Vrt“3A›¥%˜)Žæs9g”³f™�½N)™ç6æ«³Xµº²y4‹“d6ÕX¾ÄÛw6EùSw¼Ikg ÙuÊòw�'8Î¤?›™®±Þ^Ñ™ÍÜN[/“«öÏ)·ËFX‘Ÿ*UG4Æò²›0‘.gò…1ÞX´Õè©j+0‹lO:éÂè¦PÖ™��cÚ=™Ÿ<#…›ùR¥³µÒŠd&2ŒlíŠ*š!‰tÆMNWQiEQþ¦ÍhÊ»•¦3£58ùªšò7íî–äó[2‰d)?9{ª†5•��‹•YÊÇúœ@~b2ëpæôdÓ|àÒ¹âdÊ‡‰oÀ)d6nk¼m-ñÑ1VUuÖ¨ÊžÍõ�Óa36{s´W†š¿5^Úäxa¼­”Ï>?1lfdŠÒe”òBËíÎš“¢¬kôƒ½Qæ¤’°o	ÒvGB±•¿¿ß”á˜°´?æ"ÀEŸU5úBþ^ê
+šAAÔEzû(44h,Íi“ÎöÇSOÏ`4Éã{ý‘$f|o(ÅI™0e$ÊÝ¡”«N�¹&*ioÅ`„ËHw¤ŸË¾Àzâ”vá'ÿTi“ñÎð•™ÙôEÇ'\ÏÛ¤M»Î4[ÂÑêwMá¨ûQ8ê†¹2ŠéÀ];ÁNU¶¸«Œv÷ùäz4ÀlŠaF1ä¥Äâ©p%G%€•Ií²*èð&)¸n–µ.~w %å†@Ô”¡—ÑF°ÅÝœòm«»L«!Jùêa0nHfÜLQ…Yª¿»7@6ö'‚vóàÝLÌ¬íaÑË‚Ã2Ð'$dn:”»›øzÅôUÑB‹8¹ñÒ&æ“z½9
+–µ’¢�Bõ6ÓâÏm«�bGÐÙ˜¦­¡kÖ”Ü’æ…é¾—Ig]¤¶E�Ò¦üß4hXFÌQÃ\úÌ…¨Ýì>ë¢™S““ùMÞM€ñ–²*š@¸¯b0HÐÅ�B@½ÔHÐ¦Ù [³ùq«Û|^ÍÍÍ½”d˜—ä¢[Ù³Ü_Ã<¦·^9×]{Ý74ÖU×_Ë8Ik1�ãìz2Ó[¯\HÜ·‹ñ‹vÒU>Á:¨¯~´¯ª)²IUNåšåÕkËƒç“z0]"þ.Ô^°CGù‹ÛÑtŽò£†Zë”å¡‹ûsÅ©¾\�8;q©vgÖÝujs¹Ú½¬#¢¤ÛæhšÙê'óû'Çø]³Ã‹’»ž~ZaŸÃçõ´Le.�Õþ=wÕ_¹«Ð®š*¤G·™×‡I]äM¶‘ÿl&-*Ú*¥)¾;b÷T&k6^c M#ù´—;[‹û¡ëS 4(£Ç¦Fyýn¯ÙÍí¦A<h.É�D˜t°x¥LOV4ekÜÊäœ±é@š/"^y:øú(ä‰ÄrãËkê+ä ˜¦hNm$#S²iÛƒ™]ë*G…¯‡¸4ål-Eò&4k¯“¯¶°zˆPµ@s$Ÿwë�|Ÿ¦·G3så˜Ÿö$Âñ]‘œòE¾!‰òIÉ€LjÐéU0ÇùV¬ÕU'ôÕ�3w©ŠÊ�î^ã”³×Ýv3ee|‹iGór8™/W^´t¾Ýó%æä|Ž'ä4õOÓ¯r	×‰Æ@N.^×a†y²�ÉdŒ7P,/ÔÜŒ9ºo&¶˜*Ý“¸ÚàÆ�æîl¾üžê”zýewÎì#»¢ès&åD�_¯¨ÙN=ùÂ�ä¾&k:hKÈTÎØŽ§E}GíãÚÙñ“úŽÊSí©9`ê”å¡tíHçÜcØçv»«rhÉ­å·±ìÛmÕž!Û˜3SùQ`^Ÿ³™²|ÇÙù.²ƒvn½¶ìÔ¢¤Sª¿æÆ_î0ïŠtZ˜Û’31Bû¹æýà›`ú´
+WÉ ©ÌÒ2¤;·¶pÇž²·óÊ]ÌŸÅúX×é+ï%ÑÒM$g ”ß*#ËÜ´!Ï'm,S©ïÜžå¸U««òŒ“žÞaáuÊòÐ†ˆ³‘ãaVÇ—�bÍJt”Ó¿=>“«uÐ2¡®OJ»NY6¿›ùýbçÐÎKî¿Ý+Ô#½©öÙEwyÎFÞÍüSÆ “ÍO¸/Äæ
+P<qÙB}B·Wô†.8�&b²>]ê;*ï>I¾hÚýªÒœæòVj-„l¥ÑÊV*ß”[¦¢	ó¨0ïªlèç#2Ìo�`~"Í©Žô“C„Ö°žŒäÛôÖãà5…ƒî£5šÞZs-¡tšMÑŽ„v6m;*�¯k�fukåOvs3Œ%åw
+Þ¶Uôï´³ŒàÁ['²¹â1›J¥É5]]333Ëfˆ?³œ—Ó™,=k�eüã)Pž%ÿÛØ„ÿ6›âwÆŠÆRòç&òDPN:KWº
+Éè`*Øe£<ËÿÏ�Ø©ÿw"ñ®ÅìR“¢­~‰Œ›òm”5Y7�»”g¯ÚætnlÙLzrÙÄDqéDùÔî¬±uiqB.]S¥<g7%O·?Zµ’*�l¾Èg’×½¿ËÏYÅÉlz›y®+z|)~{ñ“Úë.ˆlq­(Õ¦ÌMÉ•pn$�#[Žš´¬[ñ9¹âŸ_ã„™‹O•Ü/øÑçM2Ó’­>·fˆÄüÂ*B�¨Ñ™æ+RSbj„VH)FÞJbÍ¯_T¥GÃhÉ«¼MÍ¿=Ž!É/×]Èõ)iÕŽO[—Ò­(Kl–¦mÐVUñE©1•Ÿ”©S|÷�x)Ú¼ÐOvî*9ÀCSh”/N›ò3üœõööùc©×¡X0#È±·/ÞŸ–þL5æ�†øR)�T<ð+FZýÉP
+ÞÇØŒ]¯ŽÆBqÃúTŠàÒÉ(ÿþ‘¤7%ô ¤)d¨?öS—%�PÔŽûƒÁ¾P’”¢ì	÷%S®'^×<…Gj¥ËXˆÆ»Ã‘Ðp¬?ÚÍÓe<!‡“)Škô'Ä®ˆ+z�÷ÝüúÐ1çÅñ= ÖÛ7Ä/ŒØIá8›ðú“ëiVÊßÇ‡þH„¨Á?@ðwGBüS¼�4˜.-?ý` Mô§Ø5†“�¾PˆÏbY7Y
+�KL×û‰!ùf8ÞÓÃî“unÄLÝŽ
+Gâ!Ça™Ô»!ä�ˆ‡:Ê+lsñH¬�óWí±xj¸ÖÇxj=û¢A?Éä‰„B2÷@8*¯¬Í4’©¾�ŸÒÈ®ÿ¯ÓÌ4�)uÿŠ�l– mQeò]áxåY”PE§”rÿ�F¸$¼“ÿò¿Ì:‹æ^ûo¶²®úŸ¶†}Ôóê�ÇÓîYÄÿó¢Ú"þ�—”/ºåKnù²[¾â–¯ºåknùº[¾á–oºå[nù¶”Ú£øßo$A­NmG*yÜ£ñðŸR¿T¿ò€t_LÃ�Ê™'=0ô¸GGÕÛ=
+�ymØîiâ²q»ÇËeÓvréÝîiæ·{Z¸ôQG«T¨§M*ÔÕ.•æíž9RiÙîéà
+÷=æéäÒzÌcú°øók
+äÖo<¨~[ö¼mOÒÑ_›å[ý”gî�¶æ%‡¬ùÉ¡FkAr¨ÉZ˜òZ‹’Chí–ò5Y‹Iz­ÝI¢µÉfkO’-Ö^$[­½I¶Yû�l·ö%9ÇÚ�d‡µ?IŸuÉNë@’–uIÛZBr®u0ÉyÖ!$ç[‡’\`Fr¡µ”ä"kÉÝ¬.’‹­ÃIîn-'¹‡µ‚äžÖ$÷²V’ÜÛ:’ä>Ö*’ûZG‘ÜÏ:šäþÖj’XkHh­%y�µŽäë’[Ç’<Ä:Žä¡Öñ$³ü$—ZÝ$—Y’]V�äáVˆär«‡ä
+«—äÖz’+­0É#­
+$WY'�<ÊŠ�<ÚŠ&õ4øÖ\cŒkœqM0®'2®}ŒkRpM	®ý‚ë€à:(¸ž$¸	®'®§®§
+®§	®§®Ã‚ë‚kZp\G×1ÁÕ\7
+®ã‚ë&Á5#¸n\·®YÁuBpÍ	®yÁuRp=Sp-®EÁµ$¸N	®Ó‚ëŒàºUpÝ&¸ž%¸ž-¸ž#¸žË¸*�õ<�õ|�õ�õB�õ"�õb�õ�õR’«­ËH®±.'ˆ›|ëÄW0ÄW2ÄW1ÄW3Ä×0Ä×
+Ä×	Ä×Ä7Ä7
+Ä7	Ä7Ä·Äïˆoˆoˆoˆïˆïˆïˆïˆïˆïˆïˆïˆˆß+?(¿O ~H ~¿@ü�øƒñ‡âÄˆ?*L þ¸@ü	�øa�ø�x»@ü¨@üI�øSñcñã’ºŸŒ?#?!?)V0~J0~Z0þœ`üyÁø‚ñI®µž!¤½¾ƒô—é/3Ò_a¤Ÿe¤¿ÊHM�~N�þº ý
+Aú›‚ô·éoÒß¤¿+H�l£owcûûlûlû‡lûGlûy¶ý‚Øþ±Øþ‰Øþ©Ø~Ql¿$¶_Û¯ˆíWÅökÅ×%ŠoHß”(¾%Q|[¢ø3‰âÏ%Š¿�(þR¢ø+‰â÷%Š¿–(þ†<mö­2žþ–=}‡=ý{ú{öôìéÅÓ?‰§Oÿ"žþU<ý›xúwñôâé?ÅÓ‰§ÿOßOÿÃžÚÊÃ®ÚŠ÷É\[;k+ÍÞÚª�ÝµU#ûk«&vØV^öØVÈ.Ûª™3ÏV-œz¶jåÜ³U'Ÿ­Ú9ûl5‡ÓÏVœ¶òqÚª“3ÐV§ ­lÎA[Íå$´Õ<ÎB[Íç4´ÕÎC[-äD´Õ"ÎD[1_,µÆ2[1ctÙŠ)ãp[í)éÈl±ÂVLGØŠ[+mÅäq¤­ö% [|óh[‹4ØŠX¤ÑVÄ"M¶"ñÚŠXmÅ,B*¦Ò1��’‰¤ÙVÌ$-¶b*iµsI›­˜LÚmÅl2ÇVL'¶b>ñÙŠ	¥ÓV+
+ôGèWè�2ÐM¾µúr}[-¾­ßÖŠoëÄ·cÄ·c�oÇßŽ7¾ù�oÝÆ·€ñ-h|ßzŒo½Æ·õÆ·°ñmƒñíã[Äø5¾ÅLZÄMZ$LZœhÒ¢Ï¤EÒ¤EÊ¤E¿I‹“ƒ&-N2i1dÒâd“§˜´8Õ¤Åi&-N7i1L�´5¹ˆœ!ˆ¤‘êh÷µº=£Ò3&=Ž`µQ°¬6¬2«Í«-«¬Áj‚ÌÍit­åÄZžT¾òÜ“¢;Sf(ÈE™¡$3LÑXŸo«;vZÆÎÈØ52v«ŒÝ&cÏ2Þœm¼9Çxs®ñæ<ãÍù&r˜È]h"w‘‰ÜÅ&r—˜È]j"w™‰Üå&rW˜È� §Ï2¸+Mà®2�»Úî¸kMà®3�»Þî¸Màn2�»Ùî8¦³ýäæCq»ÕÄí6·ÛÍv¾Ãlç;Ív¾Ëlç»Ív¾Çlç{Ív¾ÏlçûÍv~Àlgf¸å¶zÐìgæ¸#ä
+DÛù!³�™ëVÙŠÉî(>ÇŽf±šÅkY¬cqŒ­˜�µ“áq¶b6<ÞVL‡~[1vÛŠ	1`+fÄ ­˜C¶bNì±“b¯­˜×ÛŠi1l+æÅ
+¶bb<ÁVÌŒ[15FmÅÜ³“cÜVÌŽ	[1=žÈõ±H²H±èg1Àb�ÅI,†XœÌâ[1£žj+¦ÔÓlÅœzº­˜T‡mÅ¬z†­˜VÓ¶b^±Õ3TŒÚŠ(Õ7f+"UŸc+¢UßF[±úÆmEÔêÛdÒ&c+æØÍ¶b’Ýb+fÙ¬­˜f'lÅ<›³mÞVÌ´“¶bª=ÓVÌµ[}�Š¢­˜ÕJ¶"¢õM$§mEŒë›±Õ�h›Xæãù/PK
+ŠM³.org/xmlpull/PK
+Žj2org/xmlpull/v1/PK
+�i³.ßËÓ×"org/xmlpull/v1/XmlPullParser.class•VëVÛFž
+Æ—p·’¦)ì´à&½„BšÔÈ‚(1¶kÉ€¡©+ìÅ‘%E
+m_ª§ÿrNû}¨žÎÊ²Â§¡þ±£ïÛ¹ifvå¿ÿy÷¬Áo¼åaš‡9æyXàá÷yxÀÃ"K<¬ð�‚1p8p9ðŒŠµBvWRJYQ" äOµ3-chf3£xŽn67	Ü-Óõ4ÓÛÓŸòàSÔlY­åŠbeW*¨ˆ<€:”
+¹Ï8B`¨£­fwq‹Ç”B8@ ¡J�n‚@RÌ)’ AÃèDV«µ²´Í˜$�iy§P,g·òRmÿ…¬vg{�ÙR¹(JŠ"vjrAQËQ•‹¶ËcP±¸ÛMj!&™“Ä<ƒÃÕjIRLõ+Á�m)«VÊR-ŒpY3…‡3‹Ýý²T*â«ö¶kYU-Ë[•)þL`.î(Ì‚‡s¬~ws/›—sY–;X—zÛTó|‡âK¦®'x˜Þcµ:¯SÛÓ±Yü‚¸±šéc•>$0‚®KŽeSÇÃ@+}´"Lñø”Ö½Ml¤µ[îçýº!ÃÉ¦íãäM…6º•)S­A�ÀïÃK6ÐCgTkoöq�ÊÍÐ›dÖ­²8©t¿þ-4è‰nRÉôtï¢LmC«Ó65=•ž{ï}íHÄIŒXÐÚÔµÑ�hù&Z'RrZÆæE·JÆ;ge—ûæ3U®8:ž›(óþŠö<ñh—Ã¶·¤X³¬3–«³AÈQ·îèÁLà1Æ�<¡à·�©ÓÉA´¿mv™QÝÝoé^7ô‡Â¡Z§L“á“ØÒ­îQÇÅãš:’ÓGbG�å�§=�ÎûOê®Ô¶½Éè”[kvÜd=ÌÿØ÷º5œ‰r‘2LÄùN�{T7Î=õÂfzºÛcrôDó�°W‡±‚[�ÀúÍ† _Xï¤3ö~Aä„‰EâàW,{R­7ËÏ9ô­¯³³˜JÉ7�7>pTŸYù§uC7uïYÐ"ÔJˆVýŽ_vWÕŽ
+d†Ëwêt[g@8h%ß0JšãRg�ÅÃÂÅÃŽÂ§ð�»–ÓÌœ·
+
+2g�2Wl¯˜uÎ6awÿFËóì�L×n�ù@Û†UÏœt."w­åµ�EÛ±êÔuWÍn§q’²75v¨m9Þ¥íªóñäÿ&€;
+Z7<¾©å™fè
+­s¢–þ«H½Û¯ºÞ•Vì±ø)ƒqüöLÂ<LàŠ
+bG˜B<
+3=<‹x.‚?@<Áw-Dð]Ä÷"øCÄ÷#ø#Ä"øcÄ‹ü	â¥^F¼Á)Äé~ˆGŸça5òkˆ3ü9âGüñü%,ãçÿ+ø™'ì¿Êud¾��à�Á&<�í|Ï‚�çð]lç9dcÌˆ�n¤ØÎ6ìÄ˜ Ç˜—×˜W�üíB!�ÅÐ)Äß‡²JÌR
+5+°ÈW!ÞåA(«×,CŸG˜
+“?„òu(e
+~
+¤b
+ŽYGû«=&‰XŠÜI®	­kœŽyÆ¹Ó¸-ððäÚÈ½Æ¸ì'MŒü	¤: ÜRª	a@©
+	¥š•*'$•*/pJu")ð¸rÂ®¼0Œë�0‚ë°0ªü·þmšA(vù¼ÄÕ
+ÉþPK
+ŠM³.TgHþÂm+org/xmlpull/v1/XmlPullParserException.class�TßsUþn’&ÛtKJhS¨­$›”Pª MIÐb
+ÑÖJý½Ý^ÒÅM6³»AðÅŸ}sÆxî‹âH;êŒÌÀŒÌøG9œ³›¤¿bÇÙ™sÏýîùÎ=ç»wï?ÿþñ€sø*Žã¸Ø‹Wp‰Í;1\Ž#‚IE§¼ËãWûð®)()˜fh†ç³læ˜y�Í÷b7Ø{_A9ŽEÜŒãæc¨Äð�@t]zºi	•ïê÷ô‚¥×«…å
+ÇþF_³dQ L®€X PÃ¶šµ:9SfÝô®'³‹´ä9f½ZÌ®D¦íu)�(›uy³Y[“Î2gH–mC·VtÇäyŒx¦+p¶l;ÕÂýšÕhZVáÞxávÍª�[ÑW:³÷
+ÙðL»N%	—3ØY`¾K=‡f-vmš[×Ü*uÚðÃFO#Ðclè&iÓ[•ÞLKÒáLö?Dí§¨qh·L–N:íkÜÆ
+êÁ[òtãëeG7¤IÕÅ—ì¦cÈ9“õ;Ñ]¨s¼µŠ×�Vq§TŒà”@j¿@¥æ�;Òá¸	¨øK¤0q–ñm”iØ®Éé&cXQñ1ƒ¡lZ ÏÐ›®\O¯=˜L3ë¶ŠÎ«gó*N¨¸€‰VU|‚OU|ÆÄT1]—®G,Ù®2mº”ùs_ Ã—£ÿëÛidÕ
+Y_Èw»š  y:Å³D`0s0Ž"NVµFgWiI5#]Ã1[í)äÖÚ]ix‡2°kåIU£#—ŽÓù?M»P	î„#õâ´ñ¢t]½*Û¢ì�ˆù·ÈÚ+Zç:â4½Çéé	ÓBG^„/Œ?Žøc‚ïÙÓ4« D0 å¶!´Ð„Ø„Â²IbƒèA?â8‚†ð:!©€‡70
+øÞ›8KY9{&È.è=ðÙ�´?YÝFOî”dt©ö|±¤Bf½dó­åtk9gðwô	p Ú	Û—'ÙÏàŽËd÷t“ÿÃåI0DÞ{amì	Žî´z
+ÙQ4©Õo©Õï�Å÷Ððrø	cxH/:·®MuZDqÜ:{Å†|/Oò‡	#V vÁ—èÑ~ÃÑ_:ÛF}ð¼ŸZ
+Z©ÿ†]È¡Ÿ÷‘/t%�w%‡÷“'º’é�o‘¤6Â4–¸ìˆkÛHnââ¯8¶Z~F¶uò)
+µO)Åñ[Î=ß„²˜{žú˜öÄeLQ¶)\õÇ ’ÄÈ^#["ág(j–ŠŸÃ%\'taW…¥N…oùì·_PK
+ŠM³.îI)µL)org/xmlpull/v1/XmlPullParserFactory.class�W{|Så~Þ&éIÒS©-A#XÃLmD\Õj)­Ú‚P@ðFHOÛ`š„äŠnNÓÍÍ]·Áœ·éº*^ ^P'0wqºûÜ˜ó67777ÝÕÉžï$MC›þ‘œï|ß{}ÞË÷žgÞ{ø1õRâÆyØ¢áf7J°Å…&|QÃ—ÜpàËjg«úÛ¦^¿âÄ-nÕ‰[Ùmn×p‡ã°Å‰;Õókjÿ.µºÛ�cðu7æbÀ‰o¨ç75|Ë
+/¾­a»’yOîÅ}v”a"îW/hxPQ<äÄN7&ãn'2NìRâv+Á{œxØ‰½É�>ªÌyL=îF5ö9ñ„z>éÄSJÎwœxÚ�ý8 $T«ï*«žqâ{N|ß‰hø¡²l‹bzVýýH±=§öž×ðc'~¢lQýTÃÏž¤Ñm$�XØhŠÇL£ßlŠ†R)Á±mkCëC�h(Ö°¶fÊ/Y´¸yIçÊË:Û›•4KÍd$Ö£ˆ('e†bæòP4m8ñsn-i^ºhÙ’¦æ_y"”LIK¬‘ÊËI›‘h`¹6ãIÊ©«ãŽPŸ‘j‹‡Cf$£Ud‹„¢‘+
+¸�ÝFÈL'ÕÒS èüPª×­‰”U:'‹˜glþšå{S¼ËŒk‹ÄŒŽtß#Ù©•!Ô]¢¾ç6ífo„²§¶Å“=�þ¾h"�ÖÏ\Ø]ÌåbË—–�2{#u¹S†Ù’µH0Á?¢U–	1:&p)“OYEÆæþ°‘P~R›»§@Š§ˆ”r8Ö+ˆUÇóâñ¨ŠÍ¶°2-ø¡°Ñ¸!¤$Ùý–vWH½ÆèŠHj8Q¢ôrò3†‘.bë¡Ië^ôHªð¬<flCàó×Œ	—ŠI$•J« ?Â¹yéîn‹F"üµ
+´D"—–%‰„ úh²…NW�Í±tŸ‘´rˆ§¶Ë��”dôçÆÒ�‡vÖŸ¥ùTÍŸ!
+%Õr¼˜iG�•Qr«U ayÊQpJ«Er`D‰¾_aî¡Ú"¸álá’ÈP
+Eâ�ÖX"mR•ê#OIj
+ÿÂ½dèÎ
+¢Ï‰89lá4™]áP¬K%ÝrFòöˆEkÖ²º•þ¤Ž÷ÄI‰ç„£¹ò”nž-�§“a£%¢jÏ[Ì�z%QÇ20“«Š¼Ž¥èdþ�(
+ÅÓ£ãø¥Ž_á¿ÆZA°×4ÁÀ lõ
+BB×;K}¯Ù�’HÆÃ,™ºØ`¹¤t¬AXpÚû•0XAqš²‹ÙTÆŠW>!ÙGŠ—ˆ !‡‰O!he™%Þ·!”âV8Þ—ˆ¦á«óõr#7}ä6º|:~ƒC:.ÀB¿Å‹
+˜ßéx	/&wÄ}–�¾l—ö…³�Ö×OÇº(”Ì¯àU¶ÏaÙ§ãj¼&˜4–K:~�×5üAÇmÅp·t\ŒKt¼¡âRU¤4uü	/2
+ƒ>þÍæŸ7OG»,ÏÂLTºšµ:h¹øgKÌ§�‚Ò16y †.�‘`u¸°uœ8ÂÂ!qÊÊ«q­ŽóÑªãM¿6¿¹¥qY[§Ž¿à¯Œo ½¹³±®µ£%@¶õ&]€úêSmýÌúb%¢ã-üMp3Ïª&K½esÐ÷Á$úúB—Ótæ²Ïì
+™ƒÉQðõ1u
+ør|¾ÆÅ­¾HÊÇðE¢ª 5ü]ÇÛxY…äÿÀr•pÿ,ÎÛ÷�²LQý+Ä«¼Ëw
+[
+4Ž5jÆËjt>3î+è½þš"ÌÃçÿÂ¿uüÿÕñ.þ§ã=Ly]V0>›]Ì4B�5„ñ¦…rDâg›bVèÑüUWõÚ3ý#»êÈ�šb­×ÆÁB0­ˆ€¢äúšlë\ž�4JC‰„cÓžQl$ý"wšñìañ�¤›=ÊŒ£¥ÅI8¸Œl²5šŠ¡µ¨ÅGÊÏoÛyéó®òž™<E¬+»ßlÎjfÛcŸh�'�Ü†º@{²ƒÖ0TŠÀ:•Ò¨ë1y£–ëÒ¡hj
+ƒ8‹UQÅ’\­4¦²w² fô Œ¸¾«Šl>Í‰þ¦1Ìt„£ñ½;¿Ø2æ$V@ßÙ›Œo°ÆqU-ë2úñºwø[[­Ð¦ÒkR¹™ öŠ%‰ÖOf‘žz”üüdq‡ººò¡+Š.­qÝÜ|Yå)…_fMü^4¯:5W^,ÀBÚ¸.A;N@GÁû,ØÕõÎµ]]±ÖsIî�£	Ÿ:Wœ_È±‚oó`ã
+¨¨Ý©Ý‹’•»`Û	ûý–´ù)@IvÌç‡_VZ2,¬ÂE|Šº9I­äuòÓVÑWÖ>ûô½p¬œ´¥h+†$ªïU�óXò)i¾,GNšZ]jy¤V—a5©C–ýB[D�=9Û/â‰âôZº2pîƒ£}Æ~¸gdà€Ý¶}˜Ê
+_[ Ò›WéÍ©ÔQŽ.¤t£'§h!�RüUJQ¥[y5q¯6Ðæ~KÅ„,K^Ezé{0ÍX›<ÓRÄèÖVº3(²·ÔÚÞT¶–ûòQìÒÇ²k3íºi»¢9»úŠÙ¥±ëÖ¢vÅÏ&�<Ç`9ùG»Ê`ò^³r/Æ1µ**�ÍX¹QÅGãwÁó¸"Ê`Â¶#éŽA—;i³ÍÀfÅ4)ƒã÷ÁÛQ—Á	û01hW0d0)èÀé^Çœ(Ø‡ê`©Ú÷–f$¨yµýðx5æÈV”{y`ßƒ“lP©¶>èµïªÜµÔQø‡hCåþy)ýdõ25kÿWÀ¶©D&åœ¸ãp¤Ð‰i¤`bž’óÀJªÝØÃªÎÂÙÂ¶c*îc%?Àº|ˆpî$Õ.‚ù®Ä£¸�áf<Ž;éËvîeð%ìÇË8€×Hÿ6ž±Âq1\
+ò\8–áa$°ÎŠçn$‘¢Æn|&{ˆ�² �õS?™³ýL¤ëiÅF¦T)µg�†½˜Ž+h…ýˆ
+ü>šôÅÜsðä Ý÷tM±@ûGºvÌ@/TLGzzÐ>f„fŒ!¿¡…ÚëŠDhñŒPøÅ¦áâs~³´ûex•H¿Fê×‰æ[äx·àÜÆý{8¹©ˆœM,‰M>"©|DÖå#rV>"6\…�O³æ.Fîš\‡­¶ê—¥(²õ;¬ÒË—¦Ø†q]›å²µ0N:Ï·L?íÚ¤½v?G§n…^9“‹Ó¶âŠé•³28½£îÊJ•.ˆGÐN$‰WCƒÃã¸¥˜àqTøî‚îµ{›38cÅÀá—Hp¦ŠÂø…×¡„ˆÔíÂYƒR*ƒ*Þ*D³³!jÀ¤Á³9ÃÏ„æòèì }pá°5Põ@mÅKúœÍ£•Ü—ò¤A«õ”zXÙç�tIÐíuîFcÐåu1s‚î8ƒetÂëÚ�Õ¶†2¯û	LÌ6Ì³gw¦«GáNÓVfÙ¸¼î}hêà¦§lN*L£ù*÷œC)ìÑì«J=¥Êª;/'sÙ^4‘´¹£Îkß‰ò:¯c'üu3v¢ªncTÍÞÛÇ¬{“³þá|öÂŒ™v)‡S*à–JTËxL•	˜%^Ì‘‰8G&¡YND»T£SNÂ%Ü[-“Ñ%Sø){2úd6Š7K-î•zì�öÈ©xRfâi™…ƒr:ž—’3ðºœ…7$ˆ7e.Þ‘sð®œË�ŽF±K“¸d¾èÒ,ã¥E&ÊyR-­2MH�,”S¥]Î”™#‹dž\@ª¥<é”nY!Q™%iY%å"¹F.‘ëåR¹Q.“Í²Úª’íªÊ|ÜšVÔj+‚ã“Ü`M0%¬»f|×±Bæ ž}jó»™óÐ'YC^;eì`Wòt^Á§Xk6öÇ¬)ÈŽ'ñ¼5ÿ8ð4žÅ
+ä(åÎ6|š+�µ»Éºø�üì¿Ÿ¡^#pnÄg©Ÿ£¿%¹LtÖðçxK–T—Ÿ/˜¢²÷eE.È÷–>EùÉUÃ)ª6�:iÅrèf‹ú¦ÿPK
+ŠM³.CÞr;Ra"org/xmlpull/v1/XmlSerializer.class�“[oÓ0Ç�G×ô²�²nƒÁ`0Æ–2hØ¸¼ô	(“*MQÔ¡òä¦n–É‰#Ç™:>|>â$
+m¡¦�ˆ9ùùü��ÏåÇÏoß 
+¯84àˆ@!dê˜QIF`Ã<9§ÔâÔw¬–’®ïÔ:•6Z½Ø,P®ðCžð‘3!\×+EôþAŠ€IuI`_c5AšÝsf«Z|^Ñ™Ôíé¼O	äñ¸f¤‚H8HE®°†…Œz5�«¶/	”Ç‚Sé*&“H–CE¥ª;ò˜�nÍÙwx#gÔ^‚ù½±ðš³|’ÖwsÓ1ŠUÎlU§2ÍäPUÇª�%‡7,!xO=ÔÆ¢­™Z™‘Z¡ƒäîŸ¨C ~µXO„t¬�ÇƒˆsëâÐúìñ“.åîWÌ'^„*´ìF
+½·¯äò?ÉbÞ“ 3Š
+0óGÚö™ãd×üò¶Ñ˜–Ý±÷þ1qé°ø®ºüÈúhHa³0Ä½†*ÙñDaÆmá
+›Äè	»ÇlŽÝè:¾�´ËÙé6cZ²Å>�B¬g¡%"i³c—#\ý#¨j�­Y�(ý==vÆ¨Á9s(-�¤yGÃO`{Ê¨¥¨båßCÔhŽh–�ˆŸÍv#dðÿ²H³` ËA×§ö–`9Ù[�ëé^}”ÒÝ¸¡¡«PÖÐ5X×Ð
+¸©¡·`3¥q´Y$·áNÇÜMÖ{éº
+÷5ú°£¡µ¶»ðHK÷4tL
+­héc-=ÐÒ'ZúTK«£<Æ¹)áká÷<ûPK
+Rª”.META-INF/services/PK
+s—-€Näf,85META-INF/services/org.xmlpull.v1.XmlPullParserFactoryË/J×Ë®ÈÍ1ÒËÌ×óŽÈÍ	H,*N-ÒÉGN-ÊLÌÉ¬J-âåRàåPK
+‘j2	íAMETA-INF/PK
+�j2‚aq½^j¤�'META-INF/MANIFEST.MFPK
+�j2íA·org/PK
+‘j2
+íAÙorg/kxml2/PK
+�j2
+íAorg/kxml2/io/PK
+�j2��;7¤�,org/kxml2/io/KXmlParser.classPK
+�j2¦Ô5”é!¤��org/kxml2/io/KXmlSerializer.classPK
+‘j2íAT*org/kxml2/kdom/PK
+�j2¥Ü«(Ø”¤��*org/kxml2/kdom/Document.classPK
+‘j2äÄÕ¹�’¤�”.org/kxml2/kdom/Element.classPK
+‘j2q×™.q¤�[5org/kxml2/kdom/Node.classPK
+‘j2íAÀ=org/kxml2/wap/PK
+‘j2:NdfR½¤�ì=org/kxml2/wap/Wbxml.classPK
+‘j2që´Û{Ñ)¤�u?org/kxml2/wap/WbxmlParser.classPK
+‘j2R½	#¤�-Torg/kxml2/wap/WbxmlSerializer.classPK
+‘j2íA†]org/kxml2/wap/wml/PK
+‘j2žHmY=g¤�¶]org/kxml2/wap/wml/Wml.classPK
+‘j2íA,forg/kxml2/wap/wv/PK
+‘j2
+ï¢Gd/¤�[forg/kxml2/wap/wv/WV.classPK
+ŠM³.íA–~org/xmlpull/PK
+Žj2íAÀ~org/xmlpull/v1/PK
+�i³.ßËÓ×"¤�í~org/xmlpull/v1/XmlPullParser.classPK
+ŠM³.TgHþÂm+¤�„org/xmlpull/v1/XmlPullParserException.classPK
+ŠM³.îI)µL)¤�ˆorg/xmlpull/v1/XmlPullParserFactory.classPK
+ŠM³.CÞr;Ra"¤�”org/xmlpull/v1/XmlSerializer.classPK
+Rª”.íA�–META-INF/services/PK
+s—-€Näf,85¤�Í–META-INF/services/org.xmlpull.v1.XmlPullParserFactoryPKkL—
\ No newline at end of file

Property changes on: tags/BN68/libraries/libArcIMS/lib/kxml2.jar
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native


Property changes on: tags/BN68/libraries/libArcIMS/lib
___________________________________________________________________
Added: svn:ignore
   + remote-clients.jar


Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/exceptions/ArcImsException.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/exceptions/ArcImsException.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/exceptions/ArcImsException.java	(revision 8301)
@@ -0,0 +1,59 @@
+package org.gvsig.remoteClient.arcims.exceptions;
+
+/**
+ * ArcIms specific exception, @see Exception
+ */
+public class ArcImsException extends Exception 
+{	
+	static final long serialVersionUID = 0;
+	
+	private String arcims_message = null;
+	
+	/**
+	 *
+	 */
+	public ArcImsException() {
+		super();
+	}
+
+	/**
+	 * Creates an ArcimsException
+	 *
+	 * @param message
+	 */
+	public ArcImsException(String message) {
+		super(message);
+	}
+
+	/**
+	 * Creates an ArcimsException
+	 *
+	 * @param message
+	 * @param cause
+	 */
+	public ArcImsException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	/**
+	  * Creates an ArcimsException
+	 *
+	 * @param cause
+	 */
+	public ArcImsException(Throwable cause) {
+		super(cause);
+	}
+	
+	public String getArcImsMessage()
+	{
+		if (arcims_message == null)
+			return "";
+		else
+			return arcims_message;
+	}
+	
+	public void setArcImsMessage(String mes)
+	{
+		arcims_message = mes;
+	}
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/exceptions/ArcImsException.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsVectStatus.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsVectStatus.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsVectStatus.java	(revision 8301)
@@ -0,0 +1,153 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims;
+
+
+/**
+ * Extended class to implement specific vectorial state information
+ * @author jsanz
+ *
+ */
+public class ArcImsVectStatus extends ArcImsStatus {
+    private String where;
+    private String[] subfields;
+
+    /**
+     *
+     */
+    public ArcImsVectStatus() {
+        super();
+        where = "";
+        subfields = new String[1];
+        subfields[0] = "#ALL#";
+    }
+
+    public Object clone() {
+        ArcImsVectStatus avs = new ArcImsVectStatus();
+        avs = (ArcImsVectStatus) super.clone();
+        avs.setWhere(this.getWhere());
+        avs.setSubfields(this.getSubfields());
+
+        return avs;
+    }
+
+    /**
+     * @return Returns the where.
+     */
+    public String getWhere() {
+        return where;
+    }
+
+    /**
+     * @param where The where to set.
+     */
+    public void setWhere(String where) {
+        this.where = where;
+    }
+
+    /**
+     * @return Returns the subfields.
+     */
+    public String[] getSubfields() {
+        return subfields;
+    }
+
+    /**
+     * @param subfields The subfields to set.
+     */
+    public void setSubfields(String[] subfields) {
+        if (subfields == null) {
+            subfields = new String[1];
+            subfields[0] = "#ALL#";
+        }
+
+        this.subfields = subfields;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsVectStatus.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextSymbol.java	(revision 8301)
@@ -0,0 +1,153 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+public class TextSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tTEXTSYMBOL;
+    protected String font;
+    protected String fontColor;
+    protected String fontSize;
+    protected String fontStyle;
+
+    public TextSymbol() {
+        font = "Arial";
+        fontColor = "0,0,0";
+        fontSize = "12";
+        fontStyle = SymbolUtils.TEXT_TYPE_REGULAR;
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /**
+     * @return Returns the font.
+     */
+    public String getFont() {
+        return font;
+    }
+
+    /**
+     * @param font The font to set.
+     */
+    public void setFont(String font) {
+        this.font = font;
+    }
+
+    /**
+     * @return Returns the fontColor.
+     */
+    public String getFontColor() {
+        return fontColor;
+    }
+
+    /**
+     * @param fontColor The fontColor to set.
+     */
+    public void setFontColor(String fontColor) {
+        this.fontColor = fontColor;
+    }
+
+    /**
+     * @return Returns the fontSize.
+     */
+    public String getFontSize() {
+        return fontSize;
+    }
+
+    /**
+     * @param fontSize The fontSize to set.
+     */
+    public void setFontSize(String fontSize) {
+        this.fontSize = fontSize;
+    }
+
+    /**
+     * @return Returns the fontStyle.
+     */
+    public String getFontStyle() {
+        return fontStyle;
+    }
+
+    /**
+     * @param fontStyle The fontStyle to set.
+     */
+    public void setFontStyle(String fontStyle) {
+        this.fontStyle = fontStyle;
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(font)) {
+            param += (" font=\"" + font + "\"");
+        }
+
+        if (SymbolUtils.isVoid(fontColor)) {
+            param += (" fontcolor=\"" + fontColor + "\"");
+        }
+
+        if (SymbolUtils.isVoid(fontSize)) {
+            param += (" fontsize=\"" + fontSize + "\"");
+        }
+
+        if (SymbolUtils.isVoid(fontStyle)) {
+            param += (" fontstyle=\"" + fontStyle + "\"");
+        }
+
+        return param;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextMarkerSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextMarkerSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextMarkerSymbol.java	(revision 8301)
@@ -0,0 +1,75 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This class is not supported at this time by gvSIG.
+ * @author jsanz
+ *
+ */
+public class TextMarkerSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tTEXTMARKERSYMBOL;
+
+    public TextMarkerSymbol() {
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TextMarkerSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/IArcIMSSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/IArcIMSSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/IArcIMSSymbol.java	(revision 8301)
@@ -0,0 +1,61 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+
+public interface IArcIMSSymbol {
+    /**
+     * Returns a valid FSymbol of the ArcIMS symbol representation.
+     * @return
+     */
+    public FSymbol getFSymbol();
+
+    /**
+     * Returns a valid ArcXML representation of the object
+     * @return
+     */
+    public String toString();
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/IArcIMSSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterShieldSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterShieldSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterShieldSymbol.java	(revision 8301)
@@ -0,0 +1,77 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This type of symbol is supported by gvSIG
+ * @author jsanz
+ *
+ */
+public class RasterShieldSymbol extends RasterMarkerSymbol
+    implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tRASTERSHIELDSYMBOL;
+
+    public RasterShieldSymbol(String murl) {
+        super(murl);
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterShieldSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/HashLineSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/HashLineSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/HashLineSymbol.java	(revision 8301)
@@ -0,0 +1,122 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This class is not supported at this time by gvSIG, so it will
+ * be transformed in a SiumpleLine.
+ * @author jsanz
+ *
+ */
+public class HashLineSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tHASHLINESYMBOL;
+    private String color;
+    private String linethickness;
+
+    public HashLineSymbol() {
+        color = "0,0,0";
+        linethickness = "1";
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /**
+     * @return Returns the color.
+     */
+    public String getColor() {
+        return color;
+    }
+
+    /**
+     * @param color The color to set.
+     */
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    /**
+     * @return Returns the linethickness.
+     */
+    public String getLinethickness() {
+        return linethickness;
+    }
+
+    /**
+     * @param linethickness The linethickness to set.
+     */
+    public void setLinethickness(String linethickness) {
+        this.linethickness = linethickness;
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(color)) {
+            param += (" color = \"" + color + "\"");
+        }
+
+        if (SymbolUtils.isVoid(linethickness)) {
+            param += (" linethickness = \"" + linethickness + "\"");
+        }
+
+        return param;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/HashLineSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleMarkerSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleMarkerSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleMarkerSymbol.java	(revision 8301)
@@ -0,0 +1,142 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class SimpleMarkerSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tSIMPLEMARKERSYMBOL;
+    private String color;
+    private String width;
+    private String type;
+
+    /**
+     * @param color
+     * @param width
+     * @param type
+     */
+    public SimpleMarkerSymbol() {
+        color = "0,0,0";
+        width = "3";
+        type = SymbolUtils.POINT_TYPE_CIRCLE;
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /**
+     * @return Returns the color.
+     */
+    public String getColor() {
+        return color;
+    }
+
+    /**
+     * @param color The color to set.
+     */
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    /**
+     * @return Returns the type.
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * @param type The type to set.
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * @return Returns the width.
+     */
+    public String getWidth() {
+        return width;
+    }
+
+    /**
+     * @param width The width to set.
+     */
+    public void setWidth(String width) {
+        this.width = width;
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(color)) {
+            param += (" color=\"" + color + "\"");
+        }
+
+        if (SymbolUtils.isVoid(width)) {
+            param += (" width=\"" + width + "\"");
+        }
+
+        if (SymbolUtils.isVoid(type)) {
+            param += (" type=\"" + type + "\"");
+        }
+
+        return param;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleMarkerSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SymbolUtils.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SymbolUtils.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SymbolUtils.java	(revision 8301)
@@ -0,0 +1,210 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FConstant;
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import java.awt.Color;
+import java.awt.Font;
+
+import java.util.HashMap;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class SymbolUtils {
+    /*
+     * Point types
+     */
+    public static final String POINT_TYPE_CIRCLE = "circle";
+    public static final String POINT_TYPE_TRIANGLE = "triangle";
+    public static final String POINT_TYPE_SQUARE = "square";
+    public static final String POINT_TYPE_CROSS = "cross";
+
+    /*
+     * Line types
+     */
+    public static final String LINE_TYPE_SOLID = "solid";
+    public static final String LINE_TYPE_DASH = "dash";
+    public static final String LINE_TYPE_DOT = "dot";
+    public static final String LINE_TYPE_DASH_DOT = "dash_dot";
+    public static final String LINE_TYPE_DASH_DOT_DOT = "dash_dot_dot";
+    public static final HashMap LINE_TYPES = new HashMap();
+
+    static {
+        LINE_TYPES.put(LINE_TYPE_SOLID, "0");
+        LINE_TYPES.put(LINE_TYPE_DASH, "2");
+        LINE_TYPES.put(LINE_TYPE_DOT, "0.05,2");
+        LINE_TYPES.put(LINE_TYPE_DASH_DOT, "2,2,0.01,2");
+        LINE_TYPES.put(LINE_TYPE_DASH_DOT_DOT, "2,2,0.01,2,0.01,2");
+    }
+
+    /*
+     * End line types
+     */
+    public static final String CAP_TYPE_BUTT = "butt";
+    public static final String CAP_TYPE_ROUND = "round";
+    public static final String CAP_TYPE_SQUARE = "square";
+
+    /*
+     * Joining line types
+     */
+    public static final String JOIN_TYPE_ROUND = "round";
+    public static final String JOIN_TYPE_MITER = "miter";
+    public static final String JOIN_TYPE_BEVEL = "bevel";
+
+    /*
+     * Polygon fill types
+     */
+    public static final String FILL_TYPE_SOLID = "solid";
+    public static final String FILL_TYPE_BDIAG = "bdiagonal";
+    public static final String FILL_TYPE_FDIAG = "fdiagonal";
+    public static final String FILL_TYPE_CROSS = "cross";
+    public static final String FILL_TYPE_DIAGC = "diagcross";
+    public static final String FILL_TYPE_HORIZ = "horizontal";
+    public static final String FILL_TYPE_VERT = "vertical";
+    public static final String FILL_TYPE_GRAYFILL = "gray";
+    public static final String FILL_TYPE_LIGHTGRAYFILL = "lightgray";
+    public static final String FILL_TYPE_DARKGRAYFILL = "darkgray";
+
+    /*
+     * Text types
+     */
+    public static final String TEXT_TYPE_REGULAR = "regular";
+    public static final String TEXT_TYPE_BOLD = "bold";
+    public static final String TEXT_TYPE_ITALIC = "italic";
+    public static final String TEXT_TYPE_UNDERLINE = "underline";
+    public static final String TEXT_TYPE_OUTLINE = "outline";
+    public static final String TEXT_TYPE_BOLDITALIC = "bolditalic";
+
+    /**
+     * Parses a <em>RR,GG,BB</em> string into a correct Color object
+     * @see java.awt.Color#Color(int, int, int)
+     * @param str
+     * @return
+     */
+    public static Color getColor(String str, float alpha) {
+        String[] strA = str.split(",");
+
+        if (strA.length != 3) {
+            return null;
+        }
+
+        int red = Integer.parseInt(strA[0]);
+        int green = Integer.parseInt(strA[1]);
+        int blue = Integer.parseInt(strA[2]);
+        int ialpha = (int) alpha * 255;
+
+        return new Color(red, green, blue, ialpha);
+    }
+
+    /**
+     * Generates a String representations on the form <em>RR,GG,BB</em>
+     * @see java.awt.Color
+     * @param color
+     * @return
+     */
+    public static String getStringColor(Color color) {
+        return color.getRed() + "," + color.getGreen() + "," + color.getBlue();
+    }
+
+    /**
+     * Returns a correct Shape type from an ArcIMS Symbol definition
+     * @see IArcIMSSymbol
+     * @see FConstant
+     * @param isimb
+     * @return
+     */
+    public static int getShapeType(IArcIMSSymbol isimb) {
+        FSymbol simb = isimb.getFSymbol();
+        int fsimbType = simb.getSymbolType();
+        int type = FConstant.SHAPE_TYPE_NULL;
+
+        if (fsimbType == FConstant.SYMBOL_TYPE_FILL) {
+            type = FConstant.SHAPE_TYPE_POLYGON;
+        } else if (fsimbType == FConstant.SYMBOL_TYPE_LINE) {
+            type = FConstant.SHAPE_TYPE_POLYLINE;
+        } else if (fsimbType == FConstant.SYMBOL_TYPE_MULTIPOINT) {
+            type = FConstant.SHAPE_TYPE_MULTIPOINT;
+        }
+
+        return type;
+    }
+
+    public static int getFontStyle(String strStyle) {
+        if (strStyle.equals(TEXT_TYPE_BOLD)) {
+            return Font.BOLD;
+        } else if (strStyle.equals(TEXT_TYPE_ITALIC)) {
+            return Font.ITALIC;
+        }
+        //		else if (strStyle.equals(TEXT_TYPE_UNDERLINE))
+        //			return Font.HANGING_BASELINE; 
+        //		else if (strStyle.equals(TEXT_TYPE_OUTLINE))
+        //			return Font.PLAIN; 
+        else if (strStyle.equals(TEXT_TYPE_BOLDITALIC)) {
+            return Font.BOLD + Font.ITALIC;
+        }
+
+        //If no type has found, return a plain type
+        return Font.PLAIN;
+    }
+
+    public static boolean isVoid(String param) {
+        boolean flag = true;
+
+        if (param == null) {
+            flag = false;
+        } else if (param.equals("")) {
+            flag = false;
+        }
+
+        return flag;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SymbolUtils.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ChartSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ChartSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ChartSymbol.java	(revision 8301)
@@ -0,0 +1,75 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This class is not supported at this time by gvSIG.
+ * @author jsanz
+ *
+ */
+public class ChartSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tCHARTSYMBOL;
+
+    public ChartSymbol() {
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ChartSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleLineSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleLineSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleLineSymbol.java	(revision 8301)
@@ -0,0 +1,203 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class SimpleLineSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tSIMPLELINESYMBOL;
+    private String color;
+    private String width;
+    private String type;
+    private String captype;
+    private String jointype;
+    private String transparency;
+
+    /**
+     * The constructor sets default values
+     */
+    public SimpleLineSymbol() {
+        color = "0,0,0";
+        width = "0";
+        type = SymbolUtils.LINE_TYPE_SOLID;
+        captype = SymbolUtils.CAP_TYPE_ROUND;
+        jointype = SymbolUtils.JOIN_TYPE_BEVEL;
+        transparency = "1";
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(color)) {
+            param += (" color=\"" + color + "\"");
+        }
+
+        if (SymbolUtils.isVoid(width)) {
+            param += (" width=\"" + width + "\"");
+        }
+
+        if (SymbolUtils.isVoid(type)) {
+            param += (" type=\"" + type + "\"");
+        }
+
+        if (SymbolUtils.isVoid(captype)) {
+            param += (" captype=\"" + captype + "\"");
+        }
+
+        if (SymbolUtils.isVoid(jointype)) {
+            param += (" jointype=\"" + jointype + "\"");
+        }
+
+        if (SymbolUtils.isVoid(transparency)) {
+            param += (" transparency=\"" + transparency + "\"");
+        }
+
+        return param;
+    }
+
+    /**
+     * @return Returns the color.
+     */
+    public String getColor() {
+        return color;
+    }
+
+    /**
+     * @param color The color to set.
+     */
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    /**
+     * @return Returns the type.
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * @param type The type to set.
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * @return Returns the width.
+     */
+    public String getWidth() {
+        return width;
+    }
+
+    /**
+     * @param width The width to set.
+     */
+    public void setWidth(String width) {
+        this.width = width;
+    }
+
+    /**
+     * @return Returns the captype.
+     */
+    public String getCaptype() {
+        return captype;
+    }
+
+    /**
+     * @param captype The captype to set.
+     */
+    public void setCaptype(String captype) {
+        this.captype = captype;
+    }
+
+    /**
+     * @return Returns the jointype.
+     */
+    public String getJointype() {
+        return jointype;
+    }
+
+    /**
+     * @param jointype The jointype to set.
+     */
+    public void setJointype(String jointype) {
+        this.jointype = jointype;
+    }
+
+    /**
+     * @return Returns the transparency.
+     */
+    public String getTransparency() {
+        return transparency;
+    }
+
+    /**
+     * @param transparency The transparency to set.
+     */
+    public void setTransparency(String transparency) {
+        this.transparency = transparency;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimpleLineSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimplePolygonSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimplePolygonSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimplePolygonSymbol.java	(revision 8301)
@@ -0,0 +1,214 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class SimplePolygonSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tSIMPLEPOLYGONSYMBOL;
+    private SimpleLineSymbol boundary;
+    private boolean hasBoundary;
+    private String fillcolor;
+    private String filltype;
+    private String filltransparency;
+
+    /**
+     * @param hasBoundary Set true if the symboll will have a boundary
+     * @param fillcolor String presentation of a color
+     */
+    public SimplePolygonSymbol() {
+        setHasBoundary(true);
+        fillcolor = "0,200,0";
+        filltransparency = "1";
+        filltype = SymbolUtils.FILL_TYPE_SOLID;
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /**
+     * @return Returns the boundary.
+     */
+    public SimpleLineSymbol getBoundary() {
+        return boundary;
+    }
+
+    /**
+     * @param boundary The boundary to set.
+     */
+    public void setBoundary(SimpleLineSymbol boundary) {
+        this.boundary = boundary;
+    }
+
+    /**
+     * @return Returns the fillcolor.
+     */
+    public String getFillcolor() {
+        return fillcolor;
+    }
+
+    /**
+     * @param fillcolor The fillcolor to set.
+     */
+    public void setFillcolor(String fillcolor) {
+        this.fillcolor = fillcolor;
+    }
+
+    /**
+     * @return Returns the filltransparency.
+     */
+    public String getFilltransparency() {
+        return filltransparency;
+    }
+
+    /**
+     * @param filltransparency The filltransparency to set.
+     */
+    public void setFilltransparency(String filltransparency) {
+        this.filltransparency = filltransparency;
+    }
+
+    /**
+     * @return Returns the filltype.
+     */
+    public String getFilltype() {
+        return filltype;
+    }
+
+    /**
+     * @param filltype The filltype to set.
+     */
+    public void setFilltype(String filltype) {
+        this.filltype = filltype;
+    }
+
+    /**
+     * @return Returns the hasBoundary.
+     */
+    public boolean isHasBoundary() {
+        return hasBoundary;
+    }
+
+    /**
+     * If hasBoundary is set true, a
+     * @param hasBoundary The hasBoundary to set.
+     */
+    public void setHasBoundary(boolean hasBoundary) {
+        this.hasBoundary = hasBoundary;
+
+        if (!hasBoundary) {
+            boundary = null;
+        } else {
+            boundary = new SimpleLineSymbol();
+            boundary.setColor("0,0,0");
+            boundary.setWidth("1");
+            boundary.setType(SymbolUtils.LINE_TYPE_SOLID);
+            boundary.setCaptype(SymbolUtils.CAP_TYPE_BUTT);
+            boundary.setJointype(SymbolUtils.JOIN_TYPE_ROUND);
+            boundary.setTransparency("1");
+        }
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        //Checks for every parameter
+        if (hasBoundary) {
+            param += " boundary=\"true\"";
+
+            String bColor = boundary.getColor();
+            String bType = boundary.getType();
+            String bCapType = boundary.getCaptype();
+            String bJoinType = boundary.getJointype();
+
+            if (SymbolUtils.isVoid(bColor)) {
+                param += (" boundarycolor=\"" + bColor + "\"");
+            }
+
+            if (SymbolUtils.isVoid(bType)) {
+                param += (" boundarytype=\"" + bType + "\"");
+            }
+
+            if (SymbolUtils.isVoid(bCapType)) {
+                param += (" boundarycaptype=\"" + bCapType + "\"");
+            }
+
+            if (SymbolUtils.isVoid(bJoinType)) {
+                param += (" boundarytype=\"" + bJoinType + "\"");
+            }
+        }
+
+        if (SymbolUtils.isVoid(fillcolor)) {
+            param += (" fillcolor=\"" + fillcolor + "\"");
+        }
+
+        if (SymbolUtils.isVoid(filltype)) {
+            param += (" filltype=\"" + filltype + "\"");
+        }
+
+        if (SymbolUtils.isVoid(filltransparency)) {
+            param += (" filltransparency=\"" + filltransparency + "\"");
+        }
+
+        return param;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/SimplePolygonSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterMarkerSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterMarkerSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterMarkerSymbol.java	(revision 8301)
@@ -0,0 +1,134 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This type of symbol is supported by gvSIG
+ * @author jsanz
+ *
+ */
+public class RasterMarkerSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tRASTERMARKERSYMBOL;
+    private String url;
+    private String size;
+    private String transparency;
+
+    public RasterMarkerSymbol(String murl) {
+        this.url = murl;
+        transparency = "1.0";
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(url)) {
+            param += (" url=\"" + url + "\"");
+        }
+
+        if (SymbolUtils.isVoid(size)) {
+            param += (" size=\"" + size + "\"");
+        }
+
+        if (SymbolUtils.isVoid(transparency)) {
+            param += (" transparency=\"" + transparency + "\"");
+        }
+
+        return param;
+    }
+
+    /**
+     * @return Returns the size.
+     */
+    public String getSize() {
+        return size;
+    }
+
+    /**
+     * @param size The size to set.
+     */
+    public void setSize(String size) {
+        this.size = size;
+    }
+
+    /**
+     * @return Returns the url.
+     */
+    public String getUrl() {
+        return url;
+    }
+
+    /**
+     * @param url The url to set.
+     */
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+
+    public String getTransparency() {
+        return transparency;
+    }
+
+    public void setTransparency(String transparency) {
+        this.transparency = transparency;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterMarkerSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/AbstractSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/AbstractSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/AbstractSymbol.java	(revision 8301)
@@ -0,0 +1,58 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public abstract class AbstractSymbol {
+    protected String getParam() {
+        return "";
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/AbstractSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/GradientFillSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/GradientFillSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/GradientFillSymbol.java	(revision 8301)
@@ -0,0 +1,170 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class GradientFillSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tSIMPLEPOLYGONSYMBOL;
+    private String finishcolor;
+    private String startcolor;
+    private String transparency;
+    private String type;
+
+    /**
+     *
+     */
+    public GradientFillSymbol() {
+        finishcolor = "0,0,0";
+        startcolor = "255,255,255";
+        transparency = "1.0";
+        type = "bdiagonal";
+    }
+
+    /**
+     * Generates an XML representation of the Symbol
+     */
+    public String toString() {
+        String start = "<" + GradientFillSymbol.TAG;
+        String end = "/>\r\n";
+
+        return start + getParam() + end;
+    }
+
+    protected String getParam() {
+        String param = new String();
+
+        //Checks for every parameter
+        if (SymbolUtils.isVoid(finishcolor)) {
+            param += (" finishcolor=\"" + finishcolor + "\"");
+        }
+
+        if (SymbolUtils.isVoid(startcolor)) {
+            param += (" startcolor=\"" + startcolor + "\"");
+        }
+
+        if (SymbolUtils.isVoid(transparency)) {
+            param += (" transparency=\"" + transparency + "\"");
+        }
+
+        if (SymbolUtils.isVoid(type)) {
+            param += (" type=\"" + type + "\"");
+        }
+
+        return param;
+    }
+
+    /**
+     * @return Returns the finishcolor.
+     */
+    public String getFinishcolor() {
+        return finishcolor;
+    }
+
+    /**
+     * @param finishcolor The finishcolor to set.
+     */
+    public void setFinishcolor(String finishcolor) {
+        this.finishcolor = finishcolor;
+    }
+
+    /**
+     * @return Returns the startcolor.
+     */
+    public String getStartcolor() {
+        return startcolor;
+    }
+
+    /**
+     * @param startcolor The startcolor to set.
+     */
+    public void setStartcolor(String startcolor) {
+        this.startcolor = startcolor;
+    }
+
+    /**
+     * @return Returns the transparency.
+     */
+    public String getTransparency() {
+        return transparency;
+    }
+
+    /**
+     * @param transparency The transparency to set.
+     */
+    public void setTransparency(String transparency) {
+        this.transparency = transparency;
+    }
+
+    /**
+     * @return Returns the type.
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * @param type The type to set.
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/GradientFillSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/CallOutMarkerSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/CallOutMarkerSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/CallOutMarkerSymbol.java	(revision 8301)
@@ -0,0 +1,80 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This class is not supported at this time by gvSIG, so it will
+ * be transformed in a TextSymbol.
+ * @author jsanz
+ *
+ */
+public class CallOutMarkerSymbol extends TextSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tCALLOUTMARKERSYMBOL;
+
+    /**
+     *
+     */
+    public CallOutMarkerSymbol() {
+        super();
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/CallOutMarkerSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsSymbolFactory.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsSymbolFactory.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsSymbolFactory.java	(revision 8301)
@@ -0,0 +1,410 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import org.kxml2.io.KXmlParser;
+
+
+public class ArcImsSymbolFactory {
+    private static Logger logger = Logger.getLogger(ArcImsSymbolFactory.class.getName());
+
+    /**
+     * Tests if a TAG is one of the ArcIMS symbols
+     * @param name
+     * @return
+     */
+    public static boolean isSymbol(String name) {
+        for (int i = 0; i < ServiceInfoTags.SYMBOLS.length; i++) {
+            if (name.equals(ServiceInfoTags.SYMBOLS[i])) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Tests if a TAG is one of the ArcIMS symbols
+     * @param name
+     * @return
+     */
+    public static boolean isSupported(String name) {
+        for (int i = 0; i < ServiceInfoTags.NOT_SUPP_SYMBOLS.length; i++) {
+            if (name.equals(ServiceInfoTags.NOT_SUPP_SYMBOLS[i])) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * This method will return valid IArcIMSSymbol from a ArcXML symbol definition
+     * @see com.iver.cit.gvsig.fmap.core.v02.FConstant
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol
+     * @param parser
+     * @param featType Type of feature to get the symbol, useful when a default symbol has to be created
+     * @return
+     */
+    public static IArcIMSSymbol parseSymbol(KXmlParser parser, int featType) {
+        //TODO Parse symbols
+        logger.debug("Start parsing Symbol with " + parser.getName());
+
+        IArcIMSSymbol symb = null;
+
+        //  		int depth = parser.getDepth();
+        //  		logger.debug("XML depth = "+depth);
+
+        //  		logger.debug("START =" + parser.getName());
+
+        //SIMPLELINESYMBOL;
+        if (parser.getName().equals(ServiceInfoTags.tSIMPLELINESYMBOL)) {
+            symb = new SimpleLineSymbol();
+
+            SimpleLineSymbol esymb = (SimpleLineSymbol) symb;
+
+            String color = parser.getAttributeValue("", ServiceInfoTags.aCOLOR);
+
+            if (color != null) {
+                esymb.setColor(color);
+            }
+
+            String width = parser.getAttributeValue("", ServiceInfoTags.aWIDTH);
+
+            if (width != null) {
+                esymb.setWidth(width);
+            }
+
+            String type = parser.getAttributeValue("", ServiceInfoTags.aTYPE);
+
+            if (type != null) {
+                esymb.setType(type);
+            }
+
+            String captype = parser.getAttributeValue("",
+                    ServiceInfoTags.aCAPTYPE);
+
+            if (captype != null) {
+                esymb.setCaptype(captype);
+            }
+
+            String jointype = parser.getAttributeValue("",
+                    ServiceInfoTags.aJOINTYPE);
+
+            if (jointype != null) {
+                esymb.setJointype(jointype);
+            }
+
+            String transparency = parser.getAttributeValue("",
+                    ServiceInfoTags.aTRANSPARENCY);
+
+            if (transparency != null) {
+                esymb.setTransparency(transparency);
+            }
+        }
+        //SIMPLEMARKERSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tSIMPLEMARKERSYMBOL)) {
+            symb = new SimpleMarkerSymbol();
+
+            SimpleMarkerSymbol esymb = (SimpleMarkerSymbol) symb;
+
+            String color = parser.getAttributeValue("", ServiceInfoTags.aCOLOR);
+
+            if (color != null) {
+                esymb.setColor(color);
+            }
+
+            String width = parser.getAttributeValue("", ServiceInfoTags.aWIDTH);
+
+            if (width != null) {
+                esymb.setWidth(width);
+            }
+
+            String type = parser.getAttributeValue("", ServiceInfoTags.aTYPE);
+
+            if (type != null) {
+                esymb.setType(type);
+            }
+        }
+        //SIMPLEPOLYGONSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tSIMPLEPOLYGONSYMBOL)) {
+            symb = new SimplePolygonSymbol();
+
+            SimplePolygonSymbol esymb = (SimplePolygonSymbol) symb;
+
+            String hasBoundary = parser.getAttributeValue("",
+                    ServiceInfoTags.aBOUNDARY);
+
+            if ((hasBoundary != null) && hasBoundary.equals("false")) {
+                esymb.setHasBoundary(false);
+            } else {
+                SimpleLineSymbol lsymb = esymb.getBoundary();
+                String strBound = "boundary";
+                String color = parser.getAttributeValue("",
+                        strBound + ServiceInfoTags.aCOLOR);
+
+                if (color != null) {
+                    lsymb.setColor(color);
+                }
+
+                String width = parser.getAttributeValue("",
+                        strBound + ServiceInfoTags.aWIDTH);
+
+                if (width != null) {
+                    lsymb.setWidth(width);
+                }
+
+                String type = parser.getAttributeValue("",
+                        strBound + ServiceInfoTags.aTYPE);
+
+                if (type != null) {
+                    lsymb.setType(type);
+                }
+
+                String captype = parser.getAttributeValue("",
+                        strBound + ServiceInfoTags.aCAPTYPE);
+
+                if (captype != null) {
+                    lsymb.setCaptype(captype);
+                }
+
+                String jointype = parser.getAttributeValue("",
+                        strBound + ServiceInfoTags.aJOINTYPE);
+
+                if (jointype != null) {
+                    lsymb.setJointype(jointype);
+                }
+
+                String transparency = parser.getAttributeValue("",
+                        strBound + ServiceInfoTags.aTRANSPARENCY);
+
+                if (transparency != null) {
+                    lsymb.setTransparency(transparency);
+                }
+            }
+
+            String strFill = "fill";
+            String color = parser.getAttributeValue("",
+                    strFill + ServiceInfoTags.aCOLOR);
+
+            if (color != null) {
+                esymb.setFillcolor(color);
+            }
+
+            String trans = parser.getAttributeValue("",
+                    strFill + ServiceInfoTags.aTRANSPARENCY);
+
+            if (trans != null) {
+                esymb.setFilltransparency(trans);
+            }
+
+            String type = parser.getAttributeValue("",
+                    strFill + ServiceInfoTags.aTYPE);
+
+            if (type != null) {
+                esymb.setFilltype(type);
+            }
+        }
+        //TEXTSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tTEXTSYMBOL)) {
+            symb = new TextSymbol();
+
+            TextSymbol esymb = (TextSymbol) symb;
+
+            String font = parser.getAttributeValue("", ServiceInfoTags.aFONT);
+
+            if (font != null) {
+                esymb.setFont(font);
+            }
+
+            String fontcolor = parser.getAttributeValue("",
+                    ServiceInfoTags.aFONT + ServiceInfoTags.aCOLOR);
+
+            if (fontcolor != null) {
+                esymb.setFontColor(fontcolor);
+            }
+
+            String fontsize = parser.getAttributeValue("",
+                    ServiceInfoTags.aFONT + ServiceInfoTags.aSIZE);
+
+            if (fontsize != null) {
+                esymb.setFontSize(fontsize);
+            }
+
+            String fontstyle = parser.getAttributeValue("",
+                    ServiceInfoTags.aFONT + ServiceInfoTags.aSTYLE);
+
+            if (fontstyle != null) {
+                esymb.setFontStyle(fontstyle);
+            }
+        }
+        //RASTERMARKERSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tRASTERMARKERSYMBOL)) {
+            String url = parser.getAttributeValue("", ServiceInfoTags.aURL);
+
+            if (url != null) {
+                symb = new RasterMarkerSymbol(url);
+
+                RasterMarkerSymbol esymb = (RasterMarkerSymbol) symb;
+                String size = parser.getAttributeValue("", ServiceInfoTags.aSIZE);
+
+                if (size != null) {
+                    esymb.setSize(size);
+                }
+
+                String trans = parser.getAttributeValue("",
+                        ServiceInfoTags.aTRANSPARENCY);
+
+                if (trans != null) {
+                    esymb.setTransparency(trans);
+                }
+            }
+        }
+        // RASTERFILLSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tRASTERFILLSYMBOL)) {
+            String url = parser.getAttributeValue("", ServiceInfoTags.aURL);
+
+            if (url != null) {
+                symb = new RasterFillSymbol(url);
+
+                RasterFillSymbol esymb = (RasterFillSymbol) symb;
+                String trans = parser.getAttributeValue("",
+                        ServiceInfoTags.aTRANSPARENCY);
+
+                if (trans != null) {
+                    esymb.setTransparency(trans);
+                }
+            }
+        }
+        //Not supported
+        //GRADIENTFILLSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tGRADIENTFILLSYMBOL)) {
+            symb = new GradientFillSymbol();
+
+            GradientFillSymbol esymb = (GradientFillSymbol) symb;
+
+            String finishcolor = parser.getAttributeValue("",
+                    "finish" + ServiceInfoTags.aCOLOR);
+
+            if (finishcolor != null) {
+                esymb.setFinishcolor(finishcolor);
+            }
+
+            String startcolor = parser.getAttributeValue("",
+                    "start" + ServiceInfoTags.aCOLOR);
+
+            if (startcolor != null) {
+                esymb.setStartcolor(startcolor);
+            }
+
+            String transparency = parser.getAttributeValue("",
+                    ServiceInfoTags.aTRANSPARENCY);
+
+            if (transparency != null) {
+                esymb.setTransparency(transparency);
+            }
+
+            String type = parser.getAttributeValue("", ServiceInfoTags.aTYPE);
+
+            if (type != null) {
+                esymb.setType(type);
+            }
+        }
+        //HASHLINESYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tHASHLINESYMBOL)) {
+            symb = new HashLineSymbol();
+
+            HashLineSymbol esymb = (HashLineSymbol) symb;
+
+            String color = parser.getAttributeValue("", ServiceInfoTags.aCOLOR);
+
+            if (color != null) {
+                esymb.setColor(color);
+            }
+
+            String linethickness = parser.getAttributeValue("",
+                    ServiceInfoTags.aLINETHICKNESS);
+
+            if (linethickness != null) {
+                esymb.setLinethickness(linethickness);
+            }
+        }
+        // TRUETYPEMARKERSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tTRUETYPEMARKERSYMBOL)) {
+            symb = new TrueTypeMarkerSymbol();
+        }
+        // CALLOUTMARKERSYMBOL
+        else if (parser.getName().equals(ServiceInfoTags.tCALLOUTMARKERSYMBOL)) {
+            symb = new CallOutMarkerSymbol();
+        }
+        // CHARTSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tCHARTSYMBOL)) {
+            symb = new ChartSymbol();
+        }
+        // RASTERSHIELDSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tRASTERSHIELDSYMBOL)) {
+            String url = parser.getAttributeValue("", ServiceInfoTags.aURL);
+
+            if (url != null) {
+                symb = new RasterShieldSymbol(url);
+            }
+        }
+        // SHIELDSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tSHIELDSYMBOL)) {
+            symb = new ShieldSymbol();
+        }
+        // TEXTMARKERSYMBOL;
+        else if (parser.getName().equals(ServiceInfoTags.tTEXTMARKERSYMBOL)) {
+            symb = new TextMarkerSymbol();
+        }
+
+        //  		//Return allways a simplePolygon to test
+        //		symb = new SimplePolygonSymbol();
+        return symb;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsSymbolFactory.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterFillSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterFillSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterFillSymbol.java	(revision 8301)
@@ -0,0 +1,109 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This class is not supported at this time by gvSIG.
+ * @author jsanz
+ *
+ */
+public class RasterFillSymbol extends AbstractSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tRASTERFILLSYMBOL;
+    private String url;
+    private String transparency;
+
+    public RasterFillSymbol(String murl) {
+        this.url = murl;
+        transparency = "1.0";
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + " />\r\n";
+    }
+
+    protected String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(url)) {
+            param += (" url=\"" + url + "\"");
+        }
+
+        if (SymbolUtils.isVoid(transparency)) {
+            param += (" transparency=\"" + transparency + "\"");
+        }
+
+        return param;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+
+    public String getTransparency() {
+        return transparency;
+    }
+
+    public void setTransparency(String transparency) {
+        this.transparency = transparency;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/RasterFillSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ShieldSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ShieldSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ShieldSymbol.java	(revision 8301)
@@ -0,0 +1,73 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This Symbol is essentially a TextSymbol with a Shield to
+ * symbolize US roads. Thus, gvSIG will represent this symbol as a TextSymbol.
+ * @author jsanz
+ *
+ */
+public class ShieldSymbol extends TextSymbol implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tSHIELDSYMBOL;
+
+    public String toString() {
+        return "<" + TAG + super.getParam() + "/>\r\n";
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ShieldSymbol.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsFSymbolFactory.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsFSymbolFactory.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsFSymbolFactory.java	(revision 8301)
@@ -0,0 +1,730 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FConstant;
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+import com.iver.cit.gvsig.fmap.rendering.styling.FStyle2D;
+
+import com.iver.utiles.ImageFilter;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.utils.ArcImsDownloadUtils;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.TexturePaint;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.net.ConnectException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.UnknownHostException;
+
+import java.util.ArrayList;
+
+import javax.swing.ImageIcon;
+
+
+/**
+ * Factory class to produce FSymbol's from ArcIMS Symbol defintions
+ * @author jsanz
+ *
+ */
+public class ArcImsFSymbolFactory {
+    private static Logger logger = Logger.getLogger(ArcImsFSymbolFactory.class.getName());
+    public static char ds = '.';
+    private static ArrayList initialColors = new ArrayList();
+
+    static {
+        initialColors.add(new Color(179, 226, 205));
+        initialColors.add(new Color(253, 205, 172));
+        initialColors.add(new Color(203, 213, 232));
+        initialColors.add(new Color(230, 245, 201));
+        initialColors.add(new Color(141, 211, 199));
+        initialColors.add(new Color(255, 255, 179));
+        initialColors.add(new Color(190, 186, 218));
+        initialColors.add(new Color(251, 128, 114));
+        initialColors.add(new Color(128, 177, 211));
+    }
+
+    //This code is copy&paste from com.iver.cit.gvsig.fmap.core.v02.FSymbolFactory;
+    static int w;
+
+    //This code is copy&paste from com.iver.cit.gvsig.fmap.core.v02.FSymbolFactory;
+    static int h;
+
+    /**
+     * Returns a point FSymbol
+     * @param simb
+     * @return
+     */
+    protected static FSymbol getFSymbol(SimpleMarkerSymbol simb) {
+        Color mcolor = SymbolUtils.getColor(simb.getColor(), 1);
+        int pointWidth = Integer.parseInt(simb.getWidth());
+        int pointStyle = getPointType(simb.getType());
+
+        FSymbol mSimb = new FSymbol(FConstant.SYMBOL_TYPE_POINT, mcolor);
+        mSimb.setSizeInPixels(true);
+        mSimb.setSize(pointWidth);
+        mSimb.setStyle(pointStyle);
+        logger.info("Getting ArcIMS simple point symbol");
+
+        return mSimb;
+    }
+
+    /**
+     * Returns a point FSymbol with a remote image
+     * @param symb
+     * @return
+     */
+    protected static FSymbol getFSymbol(RasterMarkerSymbol symb) {
+        String surl = symb.getUrl();
+
+        // Get the icon size
+        float size = 0;
+
+        if (symb.getSize() != null) {
+            String[] tams = symb.getSize().split(",");
+            int ntams = tams.length;
+
+            if (ntams != 0) {
+                for (int i = 0; i < ntams; i++)
+                    size += Float.parseFloat(tams[i]); // Sums different sizes
+
+                size = size / ntams; // Get the mean
+            }
+        } else {
+            size = 15; // Default size
+        }
+
+        // Get the icon file
+        File img = getIconFile(surl);
+
+        // If is an image, we build the symbol
+        ImageFilter filter = new ImageFilter();
+
+        if (filter.accept(img)) {
+            FSymbol mSimb = new FSymbol(FConstant.SYMBOL_TYPE_POINT);
+            mSimb.setStyle(FStyle2D.SYMBOL_STYLE_MARKER_IMAGEN);
+
+            URI theUri = img.toURI();
+            mSimb.setIconURI(theUri);
+            mSimb.setSizeInPixels(true);
+            mSimb.setSize((int) size);
+
+            logger.info("Getting ArcIMS raster marker point symbol");
+
+            return mSimb;
+        } else {
+            logger.info("Getting random point symbol");
+
+            return getDefaultFSymbol(FConstant.SYMBOL_TYPE_POINT);
+        }
+    }
+
+    /**
+     * Returns a line FSymbol
+     * @param simb
+     * @return
+     */
+    protected static FSymbol getFSymbol(SimpleLineSymbol simb) {
+        String sTrans = simb.getTransparency();
+
+        if (ds != '.') {
+            sTrans = sTrans.replace(ds, '.');
+        }
+
+        float trans = Float.parseFloat(sTrans);
+
+        Color mcolor = SymbolUtils.getColor(simb.getColor(), trans);
+        int lineWidth = Integer.parseInt(simb.getWidth());
+        int intCapType = getCapType(simb.getCaptype());
+        int intJoin = getJoinType(simb.getJointype());
+        String linePattern = getLinePattern(simb.getType());
+
+        BasicStroke bStroke = new BasicStroke(lineWidth, intCapType, intJoin,
+                1.0f, FSymbol.toArray(linePattern, lineWidth), 0);
+
+        FSymbol theSymbol = new FSymbol(FConstant.SYMBOL_TYPE_LINE, mcolor);
+        theSymbol.setSizeInPixels(true);
+        theSymbol.setSize(Integer.parseInt(simb.getWidth()));
+        theSymbol.setSizeInPixels(true);
+        theSymbol.setStroke(bStroke);
+
+        logger.info("Getting ArcIMS simple line symbol");
+
+        return theSymbol;
+    }
+
+    /**
+     * The hasline symbol seems as a railroad, as gvSIG doesn't supports
+     * railroad symbols, this method will return a simple line with the
+     * same color and width
+     * @param symbol
+     * @return
+     */
+    protected static FSymbol getFSymbol(HashLineSymbol symbol) {
+        SimpleLineSymbol line = new SimpleLineSymbol();
+        line.setColor(symbol.getColor());
+        line.setWidth(symbol.getLinethickness());
+        line.setType(SymbolUtils.LINE_TYPE_SOLID);
+
+        logger.info("Getting ArcIMS hashline as a simple line symbol");
+
+        return line.getFSymbol();
+    }
+
+    /**
+     * Returns a polygon FSymbol with proper fill
+     * @param simb
+     * @return
+     */
+    protected static FSymbol getFSymbol(SimplePolygonSymbol simb) {
+        String sTrans = simb.getFilltransparency();
+
+        if (ds != '.') {
+            sTrans = sTrans.replace(ds, '.');
+        }
+
+        float trans = Float.parseFloat(sTrans);
+
+        Color fColor = SymbolUtils.getColor(simb.getFillcolor(), trans);
+        FSymbol mSimb = new FSymbol(FConstant.SYMBOL_TYPE_FILL, fColor);
+
+        //Set the type of fill
+        int type = getFillStyle(simb.getFilltype());
+
+        switch (type) {
+        case FConstant.SYMBOL_STYLE_FILL_GRAYFILL:
+            mSimb.setColor(getGray(fColor));
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_LIGHTGRAYFILL:
+            mSimb.setColor(getLightGray(fColor));
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_DARKGRAYFILL:
+            mSimb.setColor(getDarkGray(fColor));
+
+            break;
+
+        default:
+
+            Paint fill = createPatternFill(type, fColor);
+            mSimb.setFill(fill);
+        }
+
+        if (simb.isHasBoundary()) {
+            FSymbol bSimb = simb.getBoundary().getFSymbol();
+
+            mSimb.setOutlined(true);
+            mSimb.setOutlineColor(bSimb.getColor());
+            mSimb.setStroke(bSimb.getStroke());
+
+            int mStyle = getFillStyle(simb.getFilltype());
+            mSimb.setStyle(mStyle);
+        }
+
+        logger.info("Getting ArcIMS simple polygon symbol");
+
+        return mSimb;
+    }
+
+    /**
+     * A this time, this symbol will be promoted into a genery polygon symbol
+     * with the intermediate color between start and finish color and an outline
+     * "darker" color
+     * @param simb
+     * @return
+     */
+    protected static FSymbol getFSymbol(GradientFillSymbol simb) {
+        String sTrans = simb.getTransparency();
+
+        if (ds != '.') {
+            sTrans = sTrans.replace(ds, '.');
+        }
+
+        float trans = Float.parseFloat(sTrans);
+
+        Color startColor = SymbolUtils.getColor(simb.getStartcolor(), trans);
+        Color finishColor = SymbolUtils.getColor(simb.getFinishcolor(), trans);
+        Color avgColor = mixColors(startColor, finishColor);
+
+        FSymbol mSimb = new FSymbol(FConstant.SYMBOL_TYPE_FILL, avgColor);
+        mSimb.setOutlineColor(avgColor.darker());
+
+        //Until gvSIG supports gradients, this code is useless
+        /*
+        int type = getFillStyle(simb.getType());
+        
+        Point2D startP2D = null;
+        Point2D finishP2D = null;
+        
+        double ratio = 150;
+        
+        switch (type) {
+        case FConstant.SYMBOL_STYLE_FILL_UPWARD_DIAGONAL:
+                startP2D = new Point2D.Double(0.0*ratio,0.0*ratio);
+                finishP2D = new Point2D.Double(1.0*ratio,1.0*ratio);
+                break;
+        case FConstant.SYMBOL_STYLE_FILL_DOWNWARD_DIAGONAL:
+                startP2D = new Point2D.Double(0.0*ratio,1.0*ratio);
+                finishP2D = new Point2D.Double(1.0*ratio,0.0*ratio);
+                break;
+        case FConstant.SYMBOL_STYLE_FILL_VERTICAL:
+                startP2D = new Point2D.Double(0.5*ratio,0.0*ratio);
+                finishP2D = new Point2D.Double(0.5*ratio,1.0*ratio);
+                break;
+        case FConstant.SYMBOL_STYLE_FILL_HORIZONTAL:
+                startP2D = new Point2D.Double(0.0*ratio,0.5*ratio);
+                finishP2D = new Point2D.Double(1.0*ratio,0.5*ratio);
+                break;
+        }
+        
+        //Set the paint
+        mSimb.setFill((Paint) new GradientPaint(startP2D,startColor,finishP2D,finishColor));
+        //Remove the outline
+        mSimb.setOutlined(false);
+        */
+        logger.info("Getting ArcIMS gradient fill as a simple polygon symbol");
+
+        return mSimb;
+    }
+
+    protected static FSymbol getFSymbol(RasterFillSymbol simb) {
+        //Get the icon file
+        String surl = simb.getUrl();
+        File img = getIconFile(surl);
+
+        //Get the transparency
+        String sTrans = simb.getTransparency();
+
+        if (ds != '.') {
+            sTrans = sTrans.replace(ds, '.');
+        }
+
+        float trans = Float.parseFloat(sTrans);
+        Color fColor = new Color(1.0f, 1.0f, 1.0f, trans);
+
+        FSymbol mSimb = new FSymbol(FConstant.SYMBOL_TYPE_FILL, fColor);
+
+        // If is an image, we build the paint
+        ImageFilter filter = new ImageFilter();
+
+        if (filter.accept(img)) {
+            //Creates the BufferedImage object
+            BufferedImage bi;
+            ImageIcon icon = new ImageIcon(img.getAbsolutePath());
+            int w = icon.getIconWidth();
+            int h = icon.getIconHeight();
+            bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+
+            // Draw the image in the BufferedImage object
+            Graphics2D big = createG2(fColor, bi);
+            big.drawImage(icon.getImage(), 0, 0, null);
+
+            Rectangle2D rProv = new Rectangle();
+            rProv.setFrame(0, 0, w, h);
+
+            mSimb.setFill(new TexturePaint(bi, rProv));
+            mSimb.setOutlined(false);
+        }
+
+        logger.info("Getting ArcIMS raster fill symbol");
+
+        return mSimb;
+    }
+
+    /**
+     * Return a Font Symbol
+     * @param symbol
+     * @return
+     */
+    protected static FSymbol getFSymbol(TextSymbol symb) {
+        FSymbol mSimb = new FSymbol(FConstant.SYMBOL_TYPE_POINT);
+
+        String font = symb.getFont();
+        int fontSize = Integer.parseInt(symb.getFontSize());
+        Color fontColor = SymbolUtils.getColor(symb.getFontColor(), 1);
+        int fontStyle = SymbolUtils.getFontStyle(symb.getFontStyle());
+
+        mSimb.setFont(new Font(font, fontStyle, fontSize));
+        mSimb.setFontColor(fontColor);
+        mSimb.setFontSize(fontSize);
+
+        logger.info(
+            "Getting ArcIMS TextSymbol as  point symbol with Font properties");
+
+        return mSimb;
+    }
+
+    /**
+     * @param symbol
+     * @return
+     */
+    protected static FSymbol getFSymbol(TextMarkerSymbol symbol) {
+        logger.info("Getting ArcIMS TextSymbol as  a random point symbol");
+
+        return getDefaultFSymbol(FConstant.SYMBOL_TYPE_POINT);
+    }
+
+    protected static FSymbol getFSymbol(TrueTypeMarkerSymbol symbol) {
+        logger.info("Getting ArcIMS TextSymbol as  a random point symbol");
+
+        return getDefaultFSymbol(FConstant.SYMBOL_TYPE_POINT);
+    }
+
+    /**
+     * This method will return a null value as
+     * this kind of symbol cannot be promoted to other
+     * supported symbol
+     * @param symbol
+     * @return null
+     */
+    protected static FSymbol getFSymbol(ChartSymbol symbol) {
+        return null;
+    }
+
+    public static FSymbol getDefaultFSymbol(int featType) {
+        FSymbol mSimb = null;
+        int colorind = (int) (System.currentTimeMillis() % ((long) initialColors.size()));
+        Color randomColor = (Color) initialColors.get(colorind);
+        mSimb = new FSymbol(featType, randomColor);
+        mSimb.setFont(new Font("Arial", Font.PLAIN, 10));
+        mSimb.setFontColor(Color.BLACK);
+        mSimb.setSize(10);
+        mSimb.setSizeInPixels(true);
+
+        return mSimb;
+    }
+
+    /*
+     * Supporting private methods
+     */
+
+    /**
+     * Gets the correct constant for a ArcIMS point type
+     * @param type
+     * @return
+     */
+    private static int getPointType(String type) {
+        //Default symbol, as gvsig doesn't paints stars
+        int mtype = FConstant.SYMBOL_STYLE_MARKER_CIRCLE;
+
+        if (type.equals(SymbolUtils.POINT_TYPE_CIRCLE)) {
+            mtype = FConstant.SYMBOL_STYLE_MARKER_CIRCLE;
+        } else if (type.equals(SymbolUtils.POINT_TYPE_CROSS)) {
+            mtype = FConstant.SYMBOL_STYLE_MARKER_CROSS;
+        } else if (type.equals(SymbolUtils.POINT_TYPE_SQUARE)) {
+            mtype = FConstant.SYMBOL_STYLE_MARKER_SQUARE;
+        } else if (type.equals(SymbolUtils.POINT_TYPE_TRIANGLE)) {
+            mtype = FConstant.SYMBOL_STYLE_MARKER_TRIANGLE;
+        }
+
+        return mtype;
+    }
+
+    /**
+     * Method to translate from ArcIMS type to a string of values that will be parsed
+     * @return a correct string for the line type definition as "1,3" for dots
+     */
+    private static String getLinePattern(String type) {
+        return (String) SymbolUtils.LINE_TYPES.get(type);
+    }
+
+    /**
+     * Translates ArcIMS line end style into BasicStroke line end constants
+     * @see java.awt.BasicStroke#getEndCap()
+     * @param captype
+     * @return
+     */
+    private static int getCapType(String captype) {
+        int resp = BasicStroke.CAP_BUTT;
+
+        if (captype.equals(SymbolUtils.CAP_TYPE_BUTT)) {
+            resp = BasicStroke.CAP_BUTT;
+        } else if (captype.equals(SymbolUtils.CAP_TYPE_ROUND)) {
+            resp = BasicStroke.CAP_ROUND;
+        } else if (captype.equals(SymbolUtils.CAP_TYPE_SQUARE)) {
+            resp = BasicStroke.CAP_SQUARE;
+        }
+
+        return resp;
+    }
+
+    /**
+     * Translate ArcIMS joining line types into BasicStroke join line constants
+     * @see java.awt.BasicStroke#getLineJoin()
+     * @param jointype
+     * @return
+     */
+    private static int getJoinType(String jointype) {
+        int resp = BasicStroke.CAP_BUTT;
+
+        if (jointype.equals(SymbolUtils.JOIN_TYPE_ROUND)) {
+            resp = BasicStroke.JOIN_ROUND;
+        } else if (jointype.equals(SymbolUtils.JOIN_TYPE_MITER)) {
+            resp = BasicStroke.JOIN_MITER;
+        } else if (jointype.equals(SymbolUtils.JOIN_TYPE_BEVEL)) {
+            resp = BasicStroke.JOIN_BEVEL;
+        }
+
+        return resp;
+    }
+
+    /**
+     * Gets a valid FConstant integer to translate an ArcIMS fill style
+     * @param filltype
+     * @return
+     */
+    private static int getFillStyle(String filltype) {
+        int style = FConstant.SYMBOL_STYLE_FILL_SOLID;
+
+        if (filltype.equals(SymbolUtils.FILL_TYPE_SOLID)) {
+            style = FConstant.SYMBOL_STYLE_FILL_SOLID;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_BDIAG)) {
+            style = FConstant.SYMBOL_STYLE_FILL_UPWARD_DIAGONAL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_FDIAG)) {
+            style = FConstant.SYMBOL_STYLE_FILL_DOWNWARD_DIAGONAL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_CROSS)) {
+            style = FConstant.SYMBOL_STYLE_FILL_CROSS;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_DIAGC)) {
+            style = FConstant.SYMBOL_STYLE_FILL_CROSS_DIAGONAL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_HORIZ)) {
+            style = FConstant.SYMBOL_STYLE_FILL_HORIZONTAL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_VERT)) {
+            style = FConstant.SYMBOL_STYLE_FILL_VERTICAL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_GRAYFILL)) {
+            style = FConstant.SYMBOL_STYLE_FILL_GRAYFILL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_LIGHTGRAYFILL)) {
+            style = FConstant.SYMBOL_STYLE_FILL_LIGHTGRAYFILL;
+        } else if (filltype.equals(SymbolUtils.FILL_TYPE_DARKGRAYFILL)) {
+            style = FConstant.SYMBOL_STYLE_FILL_DARKGRAYFILL;
+        }
+
+        return style;
+    }
+
+    /**
+     * @see com.iver.cit.gvsig.fmap.core.v02.FSymbolFactory
+     * @param cRef
+     * @param bi
+     * @return
+     */
+    static private Graphics2D createG2(Color cRef, BufferedImage bi) {
+        Graphics2D big = bi.createGraphics();
+        Color color = new Color(0, 0, 0, 0);
+        big.setBackground(color);
+        big.clearRect(0, 0, w, h);
+        big.setColor(new Color(cRef.getRed(), cRef.getGreen(), cRef.getBlue(),
+                cRef.getAlpha()));
+        big.setStroke(new BasicStroke());
+
+        return big;
+    }
+
+    /**
+     * @see com.iver.cit.gvsig.fmap.core.v02.FSymbolFactory
+     * @param style
+     * @param cRef
+     * @return
+     */
+    private static Paint createPatternFill(int style, Color cRef) {
+        w = 7;
+        h = 7;
+
+        BufferedImage bi = null;
+        Graphics2D big = null;
+
+        Rectangle2D rProv = new Rectangle();
+        rProv.setFrame(0, 0, w, h);
+
+        Paint resulPatternFill = null;
+        bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+        big = createG2(cRef, bi);
+
+        switch (style) {
+        case FConstant.SYMBOL_STYLE_FILL_SOLID:
+            return null;
+
+        case FConstant.SYMBOL_STYLE_FILL_TRANSPARENT:
+            return null;
+
+        case FConstant.SYMBOL_STYLE_FILL_UPWARD_DIAGONAL:
+            big.drawLine(0, 0, w, h);
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_CROSS:
+            big.drawLine(w / 2, 0, w / 2, h);
+            big.drawLine(0, h / 2, w, h / 2);
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_CROSS_DIAGONAL:
+            big.drawLine(0, 0, w, h);
+            big.drawLine(0, h, w, 0);
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_VERTICAL:
+            big.drawLine(w / 2, 0, w / 2, h);
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_HORIZONTAL:
+            big.drawLine(0, h / 2, w, h / 2);
+
+            break;
+
+        case FConstant.SYMBOL_STYLE_FILL_DOWNWARD_DIAGONAL:
+            big.drawLine(0, h, w, 0);
+
+            break;
+        }
+
+        resulPatternFill = new TexturePaint(bi, rProv);
+
+        return resulPatternFill;
+    }
+
+    /**
+     * Gets the hue of a color and returns the color
+     * with 75% of saturation and 50% of brightness
+     * @param cRef
+     * @return
+     */
+    private static Color getGray(Color cRef) {
+        float[] hsbvals = new float[3];
+        Color.RGBtoHSB(cRef.getRed(), cRef.getGreen(), cRef.getBlue(), hsbvals);
+
+        return new Color(Color.HSBtoRGB(hsbvals[0], 0.75f, 0.5f));
+    }
+
+    /**
+     * Gets the hue of a color and returns the color
+     * with 75% of saturation and 25% of brightness
+     * @param cRef
+     * @return
+     */
+    private static Color getLightGray(Color cRef) {
+        float[] hsbvals = new float[3];
+        Color.RGBtoHSB(cRef.getRed(), cRef.getGreen(), cRef.getBlue(), hsbvals);
+
+        return new Color(Color.HSBtoRGB(hsbvals[0], 0.25f, 0.75f));
+    }
+
+    /**
+     * Gets the hue of a color and returns the color
+     * with 75% of saturation and 75% of brightness
+     * @param cRef
+     * @return
+     */
+    private static Color getDarkGray(Color cRef) {
+        float[] hsbvals = new float[3];
+        Color.RGBtoHSB(cRef.getRed(), cRef.getGreen(), cRef.getBlue(), hsbvals);
+
+        return new Color(Color.HSBtoRGB(hsbvals[0], 0.25f, 0.25f));
+    }
+
+    /**
+     * Get the average of two colours
+     * @param a Color to mix
+     * @param b Color to mix
+     * @return (a+b)/2
+     */
+    private static Color mixColors(Color a, Color b) {
+        return new Color((a.getRed() + b.getRed()) / 2,
+            (a.getGreen() + b.getGreen()) / 2, (a.getBlue() + b.getBlue()) / 2);
+    }
+
+    /**
+     * Gets from an URL a File with the icon stored in a temporary directory
+     * @param surl
+     * @return
+     */
+    private static File getIconFile(String surl) {
+        File img = null;
+
+        try {
+            URL url;
+            url = new URL(surl);
+
+            String[] partes = surl.split("/");
+            String realFilename = partes[partes.length - 1];
+            String[] realsplit = realFilename.split("\\.");
+
+            String downFileName = realsplit[0] +
+                Long.toString(System.currentTimeMillis()) + "." + realsplit[1];
+
+            img = ArcImsDownloadUtils.downloadFile(url, downFileName);
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+        } catch (ConnectException e) {
+            logger.error(e.getMessage(), e);
+        } catch (UnknownHostException e) {
+            logger.error(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        return img;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/ArcImsFSymbolFactory.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TrueTypeMarkerSymbol.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TrueTypeMarkerSymbol.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TrueTypeMarkerSymbol.java	(revision 8301)
@@ -0,0 +1,73 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.symbols;
+
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * This class is not supported at this time by gvSIG.
+ * @author jsanz
+ *
+ */
+public class TrueTypeMarkerSymbol extends AbstractSymbol
+    implements IArcIMSSymbol {
+    public static final String TAG = ServiceInfoTags.tTRUETYPEMARKERSYMBOL;
+
+    public TrueTypeMarkerSymbol() {
+    }
+
+    public String toString() {
+        return "<" + TAG + getParam() + "/>\r\n";
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol#getFSymbol()
+     */
+    public FSymbol getFSymbol() {
+        return ArcImsFSymbolFactory.getFSymbol(this);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/symbols/TrueTypeMarkerSymbol.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleLabelRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleLabelRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleLabelRenderer.java	(revision 8301)
@@ -0,0 +1,133 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
+import org.gvsig.remoteClient.arcims.styling.symbols.SymbolUtils;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class SimpleLabelRenderer extends SimpleRenderer
+    implements ILabelRenderer {
+    public static final String TAG = ServiceInfoTags.tSIMPLELABELRENDERER;
+    private String rotationalangles;
+    private String field;
+
+    public SimpleLabelRenderer(String mfield, IArcIMSSymbol symbol) {
+        super(symbol);
+        this.field = mfield;
+        rotationalangles = "";
+    }
+
+    /**
+     * Generates an XML representation of the Renderer
+     */
+    public String toString() {
+        return "<" + SimpleLabelRenderer.TAG + getParam() + ">\r\n" +
+        symbol.toString() + "</" + SimpleLabelRenderer.TAG + ">\r\n";
+    }
+
+    private String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(rotationalangles)) {
+            param += (" rotationalangles=\"" + rotationalangles + "\"");
+        }
+
+        if (SymbolUtils.isVoid(field)) {
+            param += (" field=\"" + field + "\"");
+        }
+
+        return param;
+    }
+
+    /**
+     * @return Returns the textSymbol.
+     */
+    public IArcIMSSymbol getTextSymbol() {
+        return symbol;
+    }
+
+    /**
+     * @param textSymbol The textSymbol to set.
+     */
+    public void setTextSymbol(IArcIMSSymbol textSymbol) {
+        this.symbol = textSymbol;
+    }
+
+    /**
+     * @return Returns the labelField.
+     */
+    public String getField() {
+        return field;
+    }
+
+    /**
+     * @param labelField The labelField to set.
+     */
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    /**
+     * @return Returns the rotationalAngles.
+     */
+    public String getRotationalangles() {
+        return rotationalangles;
+    }
+
+    /**
+     * @param rotationalAngles The rotationalAngles to set.
+     */
+    public void setRotationalangles(String rotationalAngles) {
+        this.rotationalangles = rotationalAngles;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleLabelRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleRenderer.java	(revision 8301)
@@ -0,0 +1,89 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
+
+
+/**
+ * Simple Renderer for unique symbols
+ * @author jsanz
+ *
+ */
+public class SimpleRenderer extends BasicRenderer {
+    public static final String TAG = "SIMPLERENDER";
+    protected IArcIMSSymbol symbol;
+
+    /**
+     * @param symbol
+     */
+    public SimpleRenderer(IArcIMSSymbol symbol) {
+        this.symbol = symbol;
+    }
+
+    /**
+     * @return Returns the symbol.
+     */
+    public IArcIMSSymbol getSymbol() {
+        return symbol;
+    }
+
+    /**
+     * @param symbol The symbol to set.
+     */
+    public void setSymbol(IArcIMSSymbol symbol) {
+        this.symbol = symbol;
+    }
+
+    /**
+     * Generates an XML representation of the Renderer
+     */
+    public String toString() {
+        return "<" + SimpleRenderer.TAG + ">\r\n" + symbol.toString() + "</" +
+        SimpleRenderer.TAG + ">\r\n";
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/SimpleRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/GroupRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/GroupRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/GroupRenderer.java	(revision 8301)
@@ -0,0 +1,126 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+
+/**
+ * This renderer is used to group any other type of renderer, so
+ * it's unique variable is an ArrayList of renderers and its behavior is
+ * more or less as a Collection.
+ *
+ * This type of legend is used to group other legends and at this time
+ * is not supported by gvSIG. Thus, it will be necessary to select one
+ * of the inner renderers to create a valid gvSIG legend.
+ * @author jsanz
+ *
+ */
+public class GroupRenderer extends BasicRenderer {
+    public static final String TAG = ServiceInfoTags.tGROUPRENDERER;
+    protected ArrayList renderers;
+
+    public GroupRenderer() {
+        this.renderers = new ArrayList();
+    }
+
+    /**
+     * Generates an XML representation of the Renderer
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        Iterator it = renderers.iterator();
+
+        while (it.hasNext()) {
+            sb.append(((Renderer) it.next()).toString());
+        }
+
+        return "<" + GroupRenderer.TAG + ">\r\n" + sb.toString() + "</" +
+        GroupRenderer.TAG + ">\r\n";
+    }
+
+    /**
+     * @return Returns the renderer.
+     */
+    public Renderer getRenderer(int index) {
+        return (Renderer) renderers.get(index);
+    }
+
+    /**
+     * @param renderer The renderer to set.
+     */
+    public boolean addRender(Renderer renderer) {
+        return this.renderers.add(renderer);
+    }
+
+    public int size() {
+        return renderers.size();
+    }
+
+    public void clear() {
+        this.renderers.clear();
+    }
+
+    public boolean isEmpty() {
+        if (this.renderers != null) {
+            return this.renderers.isEmpty();
+        } else {
+            return false;
+        }
+    }
+
+    public Iterator iterator() {
+        return this.renderers.iterator();
+    }
+
+    public Object[] toArray(Object[] a) {
+        return this.renderers.toArray();
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/GroupRenderer.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/IValueMap.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/IValueMap.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/IValueMap.java	(revision 8301)
@@ -0,0 +1,54 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+public interface IValueMap {
+    public TypeValueMap getValue(int index);
+
+    public boolean addType(TypeValueMap value);
+
+    public int valuesCount();
+
+    public String toString();
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/IValueMap.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/RangeValueMap.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/RangeValueMap.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/RangeValueMap.java	(revision 8301)
@@ -0,0 +1,175 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
+import org.gvsig.remoteClient.arcims.styling.symbols.SymbolUtils;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class RangeValueMap extends TypeValueMap {
+    public static final String TAG = "RANGE";
+    public static final String EQ_ALL = "all";
+    public static final String EQ_UPPER = "upper";
+    public static final String EQ_LOWER = "lower";
+    public static final String EQ_NONE = "none";
+    private String lower;
+    private String upper;
+    private String equality;
+
+    /**
+     * @param lower
+     * @param upper
+     * @param equality
+     * @param label
+     */
+    public RangeValueMap(String lower, String upper) {
+        super("");
+        this.lower = lower;
+        this.upper = upper;
+        this.equality = EQ_LOWER;
+    }
+
+    /**
+     * Generates an XML representation of the ValueMap type
+     */
+    public String toString() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(lower)) {
+            param += (" lower=\"" + lower + "\"");
+        }
+
+        if (SymbolUtils.isVoid(upper)) {
+            param += (" upper=\"" + upper + "\"");
+        }
+
+        if (SymbolUtils.isVoid(equality)) {
+            param += (" equality=\"" + equality + "\"");
+        }
+
+        if (SymbolUtils.isVoid(label)) {
+            param += (" label=\"" + label + "\"");
+        }
+
+        return "<" + RangeValueMap.TAG + param + "\">\r\n" + symbol.toString() +
+        "</" + RangeValueMap.TAG + ">\r\n";
+    }
+
+    /**
+     * @return Returns the equality.
+     */
+    public String getEquality() {
+        return equality;
+    }
+
+    /**
+     * @param equality The equality to set.
+     */
+    public void setEquality(String equality) {
+        this.equality = equality;
+    }
+
+    /**
+     * @return Returns the label.
+     */
+    public String getLabel() {
+        return label;
+    }
+
+    /**
+     * @param label The label to set.
+     */
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    /**
+     * @return Returns the lower.
+     */
+    public String getLower() {
+        return lower;
+    }
+
+    /**
+     * @param lower The lower to set.
+     */
+    public void setLower(String lower) {
+        this.lower = lower;
+    }
+
+    /**
+     * @return Returns the symbol.
+     */
+    public IArcIMSSymbol getSymbol() {
+        return symbol;
+    }
+
+    /**
+     * @param symbol The symbol to set.
+     */
+    public void setSymbol(IArcIMSSymbol symbol) {
+        this.symbol = symbol;
+    }
+
+    /**
+     * @return Returns the upper.
+     */
+    public String getUpper() {
+        return upper;
+    }
+
+    /**
+     * @param upper The upper to set.
+     */
+    public void setUpper(String upper) {
+        this.upper = upper;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/RangeValueMap.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsFLegendFactory.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsFLegendFactory.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsFLegendFactory.java	(revision 8301)
@@ -0,0 +1,671 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import com.hardcode.gdbms.engine.values.Value;
+
+import com.iver.cit.gvsig.fmap.core.ISymbol;
+import com.iver.cit.gvsig.fmap.core.v02.FConstant;
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+import com.iver.cit.gvsig.fmap.rendering.ClassifiedLegend;
+import com.iver.cit.gvsig.fmap.rendering.FInterval;
+import com.iver.cit.gvsig.fmap.rendering.Legend;
+import com.iver.cit.gvsig.fmap.rendering.LegendFactory;
+import com.iver.cit.gvsig.fmap.rendering.NullIntervalValue;
+import com.iver.cit.gvsig.fmap.rendering.NullUniqueValue;
+import com.iver.cit.gvsig.fmap.rendering.SingleSymbolLegend;
+import com.iver.cit.gvsig.fmap.rendering.VectorialIntervalLegend;
+import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
+import com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.ArcXML;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.styling.symbols.ArcImsFSymbolFactory;
+import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
+import org.gvsig.remoteClient.arcims.utils.ArcImsValueFactory;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+
+import java.text.DecimalFormatSymbols;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+
+/**
+ * Factory class to produce FLegend's from ArcIMS Renderers defintions
+ * @author jsanz
+ *
+ */
+public class ArcImsFLegendFactory {
+    private static Logger logger = Logger.getLogger(ArcImsFLegendFactory.class.getName());
+    private char ds;
+    private ServiceInformationLayerFeatures silf;
+    private ServiceInformation si;
+
+    //We use a class variable to overwrite every label definition
+    private VectorialLegend auxLabelsOuter = null;
+
+    //	private String PATRON = ArcXML.PATRON;
+    //	DecimalFormat formatter;
+    private int featType;
+
+    /**
+     * @param ds Decimal separator char
+     * @param msilf An object with all the information to build
+     * the legend of a vectorial layer
+     * @see org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures
+     */
+    public ArcImsFLegendFactory(ServiceInformation msi, String layerId) {
+        si = msi;
+        ds = msi.getSeparators().getDs();
+        ArcImsFSymbolFactory.ds = ds;
+
+        silf = (ServiceInformationLayerFeatures) this.si.getLayerById(layerId);
+        this.featType = getSymbType(silf.getFclasstype());
+
+        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
+        dfs.setDecimalSeparator(ds);
+
+        //		formatter = new DecimalFormat(PATRON,dfs);
+    }
+
+    /**
+     * Main method on this class. It calls proper getLegend method
+     * based on type of render.
+     * @param render
+     * @return
+     * @throws ArcImsException
+     */
+    public Legend getMainLegend() throws ArcImsException {
+        logger.info("======Start creating main layer Legend======");
+
+        Renderer render = silf.getLayerMainRenderer();
+        Legend leg = getLegend(render, true);
+        logger.info("======Getting main Legend (" +
+            getClassName(leg.getClass()) + ")======");
+
+        return leg;
+    }
+
+    /**
+     * Main method that calls proper getLengend methods according to the type
+     * of renderer is passed.
+     * @param render
+     * @param isMainRender
+     * @return
+     * @throws ArcImsException
+     */
+    private VectorialLegend getLegend(Renderer render, boolean isMainRender)
+        throws ArcImsException {
+        VectorialLegend leg = null;
+
+        /*
+        if (render instanceof SimpleRenderer) {
+                SimpleRenderer srender = (SimpleRenderer) render;
+                leg = getLegend(srender);
+        }
+        else if (render instanceof ValueMapRenderer) {
+                ValueMapRenderer srender = (ValueMapRenderer) render;
+                leg = getLegend(srender);
+        }
+        // In the main legend, a ScaleDependent and a GroupRenderer can be
+        // treated in the same way
+        else if (isMainRender &&  (render instanceof GroupRenderer)) {
+                GroupRenderer groupRender = (GroupRenderer) render;
+                leg = getLegend(groupRender);
+        }
+        // Otherwise, we will use their proper method
+        else if (!isMainRender && (render instanceof GroupRenderer)) {
+                if (render instanceof ScaleDependentRenderer) {
+                        ScaleDependentRenderer sdRender = (ScaleDependentRenderer) render;
+                        leg = getLegend(sdRender);
+                }
+        
+                // In the main legend, a ScaleDependent and a GroupRenderer can be
+                // treated in the same way
+                else if (render instanceof GroupRenderer) {
+                        GroupRenderer groupRender = (GroupRenderer) render;
+                        leg = getLegend(groupRender);
+                }
+        }
+        else
+                leg = getDefaultLegend();
+        */
+        if (render instanceof SimpleRenderer) {
+            SimpleRenderer srender = (SimpleRenderer) render;
+            leg = getLegend(srender);
+        } else if (render instanceof ValueMapRenderer) {
+            ValueMapRenderer srender = (ValueMapRenderer) render;
+            leg = getLegend(srender);
+        }
+        // In the main legend, a ScaleDependent and a GroupRenderer can be
+        // treated in the same way (ScaleDependent inherits from GroupRenderer)
+        else if (render instanceof GroupRenderer) {
+            GroupRenderer groupRender = (GroupRenderer) render;
+            leg = getLegend(groupRender);
+        } else {
+            leg = getDefaultLegend();
+        }
+
+        if (leg != null) {
+            logger.info("Getting Render of type: " +
+                getClassName(render.getClass()));
+
+            return leg;
+        } else {
+            throw new ArcImsException("arcims_legend_error");
+        }
+    }
+
+    /**
+     * Method to generate a valid simple legend.
+     * @return
+     */
+    private VectorialLegend getDefaultLegend() {
+        SingleSymbolLegend leg = new SingleSymbolLegend();
+        leg.setDefaultSymbol(ArcImsFSymbolFactory.getDefaultFSymbol(featType));
+        leg.setShapeType(featType);
+        logger.info("Getting default legend");
+
+        return leg;
+    }
+
+    /**
+     * Gets a simple Legend with only one symbol
+     * @see com.iver.cit.gvsig.fmap.rendering.SingleSymbolLegend
+     * @param renderer
+     * @return
+     */
+    private VectorialLegend getLegend(SimpleRenderer renderer) {
+        //Get the ArcIMS Simbol
+        IArcIMSSymbol imsSimb = renderer.getSymbol();
+
+        //Get the FSymbol of the renderer
+        FSymbol simb = imsSimb.getFSymbol();
+
+        //Creates the legend
+        SingleSymbolLegend leg = new SingleSymbolLegend();
+        leg.setDefaultSymbol(simb);
+        leg.setShapeType(this.featType);
+        logger.info("Getting a Simple Renderer");
+
+        return (VectorialLegend) leg;
+    }
+
+    /**
+     * Gets a Legend based on intervals
+     * @see com.iver.cit.gvsig.fmap.rendering.VectorialIntervalLegend
+     * @param renderer
+     * @return
+     * @throws ArcImsException
+     */
+    private VectorialLegend getLegend(ValueMapRenderer renderer)
+        throws ArcImsException {
+        //Get the proper Field Information object
+        FieldInformation fi = silf.getFieldInformation(renderer.getLookupfield());
+
+        //Gets the array of ranges
+        ArrayList values = renderer.getValues();
+        Iterator it = values.iterator();
+
+        //Creates the two types of legends
+        VectorialIntervalLegend viLeg = new VectorialIntervalLegend();
+        VectorialUniqueValueLegend vuLeg = new VectorialUniqueValueLegend();
+
+        //Initialize counters
+        int nIntervals = 0;
+        int nUniques = 0;
+
+        //Create a default simbol
+        FSymbol defSimb = ArcImsFSymbolFactory.getDefaultFSymbol(this.featType);
+        defSimb.setDescription("Default");
+
+        boolean hasDefSymbol = false;
+
+        //Fills with intervals and symbols
+        while (it.hasNext()) {
+            //Only RangeValueMaps are allowed
+            TypeValueMap tvm = (TypeValueMap) it.next();
+
+            //Gets the symbol
+            IArcIMSSymbol simb = tvm.getSymbol();
+            FSymbol fsimb = simb.getFSymbol();
+
+            //Set the description
+            String descr = tvm.getLabel();
+
+            if (descr == null) {
+                descr = "";
+            }
+
+            fsimb.setDescription(descr);
+
+            if (tvm instanceof RangeValueMap) {
+                RangeValueMap rvm = (RangeValueMap) tvm;
+
+                //Get the bounds of the intverval
+                String sFrom = rvm.getLower();
+                String sTo = rvm.getUpper();
+                double from = Double.parseDouble(sFrom.replace(ds, '.'));
+                double to = Double.parseDouble(sTo.replace(ds, '.'));
+
+                if (descr == null) {
+                    fsimb.setDescription(sFrom + "-" + sTo);
+                }
+
+                //Creates the Interval
+                FInterval interv = new FInterval(from, to);
+
+                //Adds the symbol to the legend
+                viLeg.addSymbol(interv, fsimb);
+
+                //				viLeg.setIntervalSymbol(interv,fsimb);
+                nIntervals++;
+            } else if (tvm instanceof ExactValueMap) {
+                ExactValueMap evm = (ExactValueMap) tvm;
+
+                //We have to build a Value object
+                String strVal = evm.getValue();
+
+                try {
+                    Value val = ArcImsValueFactory.createValueByType(strVal,
+                            fi.getType(), this.ds);
+                    vuLeg.addSymbol(val, fsimb);
+                } catch (ParseException e) {
+                    logger.error(e.getMessage(), e);
+                    throw new ArcImsException("arcims_legend_error");
+                }
+
+                nUniques++;
+            } else if (tvm instanceof OtherValueMap) {
+                hasDefSymbol = true;
+                defSimb = fsimb;
+            }
+        }
+
+        /*
+         * Determine what type of legend the method will return (Unique or Interval)
+         * The condition will be the legend with more classes (intervals, values)
+         */
+        VectorialLegend leg = null;
+        ClassifiedLegend cleg = null;
+
+        if (nUniques >= nIntervals) {
+            leg = vuLeg;
+            cleg = vuLeg;
+        } else {
+            leg = viLeg;
+            cleg = viLeg;
+        }
+
+        /*
+         * Finally we can add the field name and default symbol
+         */
+
+        //Set the field name
+        cleg.setFieldName(ArcXML.replaceUnwantedCharacters(fi.getName()));
+
+        // Set the default symbol, if it is used and asign the symbol to a nullvalue
+        leg.setDefaultSymbol(defSimb);
+        leg.useDefaultSymbol(hasDefSymbol);
+
+        if (hasDefSymbol) {
+            if (leg instanceof VectorialUniqueValueLegend) {
+                vuLeg.addSymbol(new NullUniqueValue(), leg.getDefaultSymbol());
+            } else {
+                viLeg.addSymbol(new NullIntervalValue(), leg.getDefaultSymbol());
+            }
+        }
+
+        logger.info("Getting a Value Map Renderer");
+
+        return leg;
+    }
+
+    //	/**
+    //	 * Gets the most detailed legend from the ScaleDependentRender
+    //	 * @param sdrender
+    //	 * @return
+    //	 */
+    //	private VectorialLegend getLegend(ScaleDependentRenderer sdrender) throws ArcImsException {
+    //		VectorialLegend leg = getLegend((GroupRenderer) sdrender);
+    //		logger.info("Getting a ScaleDependent Renderer");
+    //		return leg;
+    //	}
+    private VectorialLegend getLegend(GroupRenderer groupRender)
+        throws ArcImsException {
+        ArrayList renderers = groupRender.renderers;
+        ArrayList legends = new ArrayList();
+        VectorialLegend biggerScale = null;
+        VectorialLegend leg = null;
+        double[] limit = { Double.MAX_VALUE, 0 };
+        Iterator it = renderers.iterator();
+
+        //We use a class variable to overwrite every label definition
+        VectorialLegend auxLabelsInner = null;
+
+        while (it.hasNext()) {
+            leg = null;
+
+            Renderer iRender = (Renderer) it.next();
+
+            //If we don't have a Label renderer use the generic method
+            if (!(iRender instanceof ILabelRenderer)) {
+                leg = getLegend(iRender, false);
+            }
+            //Otherwise, use the specific method for labels
+            else {
+                auxLabelsInner = getLegend((ILabelRenderer) iRender);
+            }
+
+            //If renderer is Scale Dependent, we inspect their scale limits
+            if (iRender instanceof ScaleDependentRenderer) {
+                ScaleDependentRenderer iSDRender = (ScaleDependentRenderer) iRender;
+                String strLow = iSDRender.getLower();
+                String strUpp = iSDRender.getUpper();
+                double low = 0;
+                double upp = Double.MAX_VALUE;
+
+                if (strLow != null) {
+                    low = Double.parseDouble(strLow.replace(ds, '.'));
+                }
+
+                if (strUpp != null) {
+                    upp = Double.parseDouble(strUpp.replace(ds, '.'));
+                }
+
+                //First loop
+                if (biggerScale == null) {
+                    biggerScale = leg;
+                    limit[0] = low;
+                    limit[1] = upp;
+                }
+                /*
+                 * Next loops we allways get the minimum interval
+                 * If lower bounds are equal, we get the lower upper value
+                 */
+                else if ((low <= limit[0]) && (upp <= limit[1])) {
+                    limit[0] = low;
+                    limit[1] = upp;
+                    biggerScale = leg;
+                }
+            }
+
+            if (leg != null) {
+                legends.add(leg);
+            }
+        }
+
+        /*
+         * TODO At this time we will return the first (bottom) legend of the ArrayList
+         * or the most detailed legend if there are any ScaleDependentRenderers
+         * Probably I will add more "logic" into this code
+         */
+        VectorialLegend finalLegend = null;
+        boolean onlyLabels = false;
+
+        /*
+         * Check if auxLabels is equal to the last element of the array Legends and if
+         * it's true, merge it with the first one (its label definition)
+         */
+        if (auxLabelsOuter!=null && legends.size()>0){
+        	
+        	for (int i=0;i<legends.size();i++){
+//        		FSymbol simb1 = auxLabelsOuter.getDefaultSymbol();
+//            	FSymbol simb2 = ((VectorialLegend) legends.get(i)).getDefaultSymbol();
+        		FSymbol simb1 = (FSymbol) auxLabelsOuter.getDefaultSymbol();
+            	FSymbol simb2 = (FSymbol)  ((VectorialLegend) legends.get(i)).getDefaultSymbol();
+            	
+            	if (simb1==simb2){
+            		//Null the biggerScale to force the next if statement
+            		biggerScale = null;
+            		//Merge the auxLabels object into the first legend of the arrayList
+            		VectorialLegend legend = setLabelDefIntoSymbol(auxLabelsOuter,(VectorialLegend) legends.get(0));
+            		legends.set(0,legend);
+            		//Null the auxlabelsinner to avoid the last if
+            		auxLabelsInner = null;
+            		break;
+            	}
+        	}
+        	
+        	
+        }
+        
+        //We don't have any scaledependent
+        if (((biggerScale == null) && (legends.size() > 0))) {
+            //if (!(groupRender instanceof ScaleDependentRenderer)){
+            logger.info("Getting the bottom renderer of the Group Renderer");
+            finalLegend = (VectorialLegend) legends.get(0);
+        }
+        //We have any scaledpendent
+        else if (biggerScale != null) {
+            logger.info(
+                "Getting the most detailed ScaleDependent renderer of the Group Renderer");
+            finalLegend = biggerScale;
+        }
+        //We don't have any legend parsed (maybe the layer only have label definitions
+        else {
+            finalLegend = LegendFactory.createSingleSymbolLegend(this.featType);
+            onlyLabels = true;
+        }
+
+        /*
+         * Finally if some label renderer is found, we have to pass the label
+         * properties to the final legend
+         */
+        if (auxLabelsInner != null) {
+        	finalLegend = setLabelDefIntoSymbol(auxLabelsInner,finalLegend);
+        	
+        	// finalLegend.getDefaultSymbol().setShapeVisible(!onlyLabels);
+        	((FSymbol) finalLegend.getDefaultSymbol()).setShapeVisible(!onlyLabels);
+        	
+        	auxLabelsOuter = finalLegend;
+        }
+        return finalLegend;
+    }
+
+    /**
+     * Method that returns a SingleSymboLegend with Font definition and
+     * field to retrieve labels. These properties will be transferred to the
+     * main layer legend.
+     * @param renderer
+     * @return
+     */
+    private VectorialLegend getLegend(ILabelRenderer renderer) {
+        //Get the proper Field Information object
+        FieldInformation fi = silf.getFieldInformation(renderer.getField());
+
+        //Create a legend
+        SingleSymbolLegend leg = (SingleSymbolLegend) LegendFactory.createSingleSymbolLegend(this.featType);
+        IArcIMSSymbol arcSimb = null;
+
+        //Get the ArcIMS Symbol with Font definition
+        if (renderer instanceof SimpleLabelRenderer) {
+            SimpleLabelRenderer slrender = (SimpleLabelRenderer) renderer;
+            arcSimb = slrender.getSymbol();
+        } else if (renderer instanceof ValueMapLabelRenderer) {
+            ValueMapLabelRenderer vmlrender = (ValueMapLabelRenderer) renderer;
+            arcSimb = vmlrender.getValue(0).getSymbol();
+        }
+
+        //Asign it (or a default) to the legend
+        if (arcSimb != null) {
+            leg.setDefaultSymbol(arcSimb.getFSymbol());
+        } else {
+            leg.setDefaultSymbol(ArcImsFSymbolFactory.getDefaultFSymbol(
+                    this.featType));
+        }
+
+        //Set the label field
+        leg.setLabelField(ArcXML.replaceUnwantedCharacters(fi.getName()));
+
+        //Return the legend
+        return leg;
+    }
+
+    /**
+     * @return Returns the featType.
+     */
+    public int getFeatType() {
+        return featType;
+    }
+
+    /**
+     * @param featType The featType to set.
+     */
+    public void setFeatType(int featType) {
+        this.featType = featType;
+    }
+
+	/**
+	 * Gets the simple class name
+	 * @param mclass
+	 * @return
+	 */
+	private String getClassName(Class mclass) {
+	    String[] classSplitted = mclass.getName().split("\\.");
+	
+	    return classSplitted[classSplitted.length - 1];
+	}
+
+	/**
+	 * Private method to set into a legend the label definition of another legend
+	 * @param withLabels
+	 * @param finalLegend
+	 * @return
+	 */
+	private VectorialLegend setLabelDefIntoSymbol(VectorialLegend withLabels,
+	    VectorialLegend finalLegend) {
+		
+		//Set the label
+	    finalLegend.setLabelField(withLabels.getLabelField());
+	    //Get simbol with font definition
+	    
+	    // FSymbol simbWithFont = withLabels.getDefaultSymbol();
+	    FSymbol simbWithFont = (FSymbol) withLabels.getDefaultSymbol();
+	    
+	    //Get simbol to insert font definition
+	    // FSymbol simb = finalLegend.getDefaultSymbol();
+	    FSymbol simb = (FSymbol) finalLegend.getDefaultSymbol();
+	    
+	    //Insert into simb the font properties
+	    simb.setFont(simbWithFont.getFont());
+	    simb.setFontColor(simbWithFont.getFontColor());
+	    simb.setFontSize(simbWithFont.getFontSize());
+	    simb.setFontSizeInPixels(true);
+	    //Set simbol modified into final legend to return
+	    finalLegend.setDefaultSymbol(simb);
+	    
+	    return finalLegend;
+	}
+
+	/**
+	 * Converts ArcIMS feature type to a FConstant value
+	 * @param fclasstype
+	 * @return
+	 */
+	private int getSymbType(String fclasstype) {
+	    if (fclasstype.equals(ServiceInfoTags.aPOLYGON)) {
+	        return FConstant.SYMBOL_TYPE_FILL;
+	    }
+	
+	    if (fclasstype.equals(ServiceInfoTags.aPOLYLINE)) {
+	        return FConstant.SYMBOL_TYPE_LINE;
+	    }
+	
+	    if (fclasstype.equals(ServiceInfoTags.aMULTIPOINT)) {
+	        return FConstant.SYMBOL_TYPE_POINT;
+	    }
+	
+	    return FConstant.SHAPE_TYPE_NULL;
+	}
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsFLegendFactory.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsRendererFactory.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsRendererFactory.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsRendererFactory.java	(revision 8301)
@@ -0,0 +1,541 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.styling.symbols.ArcImsSymbolFactory;
+import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import org.kxml2.io.KXmlParser;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class ArcImsRendererFactory {
+    private static Logger logger = Logger.getLogger(ArcImsRendererFactory.class.getName());
+    private int featType;
+
+    /**
+     * Constructor to set the type of features the instance has to suppose
+     * @param mfeatType
+     */
+    public ArcImsRendererFactory(int mfeatType) {
+        this.featType = mfeatType;
+    }
+
+    /**
+     * @return Returns the featType.
+     */
+    public int getFeatType() {
+        return featType;
+    }
+
+    /**
+     * @param featType The featType to set.
+     */
+    public void setFeatType(int featType) {
+        this.featType = featType;
+    }
+
+    public Renderer getRenderer(KXmlParser parser) throws ArcImsException {
+        logger.debug("Start GetRenderer with " + parser.getName());
+
+        Renderer render = null;
+
+        //  		int depth = parser.getDepth();
+        //  		logger.debug("XML depth = "+depth);
+
+        //			logger.debug("START =" + parser.getName());
+        if (parser.getName().equals(ServiceInfoTags.tGROUPRENDERER)) {
+            render = (GroupRenderer) parseGroupRenderer(parser);
+        } else if (parser.getName().equals(ServiceInfoTags.tSIMPLERENDERER)) {
+            render = (SimpleRenderer) parseSimpleRenderer(parser);
+        } else if (parser.getName()
+                             .equals(ServiceInfoTags.tSCALEDEPENDENTRENDERER)) {
+            render = (ScaleDependentRenderer) parseScaleDependentRenderer(parser);
+        } else if (parser.getName().equals(ServiceInfoTags.tVALUEMAPRENDERER)) {
+            render = (ValueMapRenderer) parseValueMapRenderer(parser);
+        } else if (parser.getName().equals(ServiceInfoTags.tSIMPLELABELRENDERER)) {
+            render = (SimpleLabelRenderer) parseSimpleLabelRenderer(parser);
+        } else if (parser.getName()
+                             .equals(ServiceInfoTags.tVALUEMAPLABELRENDERER)) {
+            render = (ValueMapLabelRenderer) parseValueMapLabelRenderer(parser);
+        }
+
+        return render;
+    }
+
+    /**
+     * This method returns a SimpleRenderer
+     * @param parser
+     * @return
+     * @throws ArcImsException
+     */
+    private SimpleRenderer parseSimpleRenderer(KXmlParser parser)
+        throws ArcImsException {
+        logger.debug("Start parsing SimpleRenderer");
+
+        IArcIMSSymbol symbol = null;
+        String startTag = parser.getName();
+        int depth = parser.getDepth();
+
+        try {
+            int currentTag;
+            boolean end = false;
+            currentTag = parser.next();
+
+            while (!end) {
+                switch (currentTag) {
+                case KXmlParser.START_TAG:
+
+                    //If parser starts a Renderer, call getRenderer method
+                    if (ArcImsSymbolFactory.isSymbol(parser.getName())) {
+                        symbol = ArcImsSymbolFactory.parseSymbol(parser,
+                                featType);
+                    }
+
+                    break;
+
+                case KXmlParser.END_TAG:
+
+                    if (parser.getName().equals(startTag) &&
+                            (parser.getDepth() == depth)) {
+                        end = true;
+                    }
+
+                    break;
+
+                case KXmlParser.TEXT:
+                    break;
+                }
+
+                if (!end) {
+                    currentTag = parser.next();
+                }
+            }
+        } catch (XmlPullParserException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        }
+
+        if (symbol != null) {
+            return new SimpleRenderer(symbol);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * This parser will return a GroupRenderer
+     * @param parser
+     * @return
+     * @throws ArcImsException
+     */
+    private GroupRenderer parseGroupRenderer(KXmlParser parser)
+        throws ArcImsException {
+        logger.debug("Start parsing GroupRenderer");
+
+        GroupRenderer render = new GroupRenderer();
+        String startTag = parser.getName();
+
+        try {
+            int currentTag;
+            boolean end = false;
+            currentTag = parser.next();
+
+            while (!end) {
+                switch (currentTag) {
+                case KXmlParser.START_TAG:
+
+                    //If parser starts a Renderer, call getRenderer method
+                    if (isRenderer(parser.getName())) {
+                        render.addRender(getRenderer(parser));
+                    }
+
+                    break;
+
+                case KXmlParser.END_TAG:
+
+                    if (parser.getName().equals(startTag)) {
+                        ; //&& parser.getDepth()==depth);
+                    }
+
+                    end = true;
+
+                    break;
+
+                case KXmlParser.TEXT:
+                    break;
+                }
+
+                if (!end) {
+                    currentTag = parser.next();
+                }
+            }
+        } catch (XmlPullParserException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        }
+
+        return render;
+    }
+
+    /**
+     * A ScaleDependentRenderer is a type of GroupRenderer with scale limits
+     * @param parser
+     * @return
+     * @throws ArcImsException
+     */
+    private ScaleDependentRenderer parseScaleDependentRenderer(
+        KXmlParser parser) throws ArcImsException {
+        logger.debug("Start parsing ScaleDependentRenderer");
+
+        ScaleDependentRenderer render = null;
+        String startTag = parser.getName();
+
+        try {
+            //We are at SCALEDEPENDENTRENDERER tag, so we have to get it attributes
+            String lower = parser.getAttributeValue("", ServiceInfoTags.aLOWER);
+            String upper = parser.getAttributeValue("", ServiceInfoTags.UPPER);
+
+            //Now we can create the renderer and start parsing inside this tag
+            render = new ScaleDependentRenderer(lower, upper);
+
+            //Start parsing
+            int currentTag;
+            boolean end = false;
+            currentTag = parser.next();
+
+            while (!end) {
+                switch (currentTag) {
+                case KXmlParser.START_TAG:
+
+                    //If parser starts a Renderer, call getRenderer method
+                    if (isRenderer(parser.getName())) {
+                        Renderer innerRender = getRenderer(parser);
+                        render.addRender(innerRender);
+                    }
+
+                    break;
+
+                case KXmlParser.END_TAG:
+
+                    if (parser.getName().equals(startTag)) {
+                        ; //&& parser.getDepth()==depth);
+                    }
+
+                    end = true;
+
+                    break;
+
+                case KXmlParser.TEXT:
+                    break;
+                }
+
+                if (!end) {
+                    currentTag = parser.next();
+                }
+            }
+        } catch (XmlPullParserException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        }
+
+        return render;
+    }
+
+    private ValueMapRenderer parseValueMapRenderer(KXmlParser parser)
+        throws ArcImsException {
+        logger.debug("Start parsing ValueMapRenderer");
+
+        ValueMapRenderer render = null;
+        String startTag = parser.getName();
+        int depth = parser.getDepth();
+
+        try {
+            //We are at VALUEMAPRENDER tag, so we have to get it attributes
+            String lookupfield = parser.getAttributeValue("",
+                    ServiceInfoTags.aLOOKUPFIELD);
+
+            //Now we can create the renderer and start parsing inside this tag
+            logger.debug("Creating ValueMapRenderer (" + lookupfield + ")");
+            render = new ValueMapRenderer(lookupfield);
+
+            ArrayList values = render.getValues();
+            TypeValueMap tvm = null;
+            IArcIMSSymbol symb = null;
+
+            //Start parsing inner tags (EXACT, RANGE or OTHER)
+            int currentTag;
+            boolean end = false;
+            currentTag = parser.next();
+
+            while (!end) {
+                switch (currentTag) {
+                case KXmlParser.START_TAG:
+
+                    //
+                    if (parser.getName().equals(ServiceInfoTags.tEXACT)) {
+                        // Get the parameters
+                        String label = parser.getAttributeValue("",
+                                ServiceInfoTags.aLABEL);
+                        String value = parser.getAttributeValue("",
+                                ServiceInfoTags.VALUE);
+                        String method = parser.getAttributeValue("",
+                                ServiceInfoTags.aMETHOD);
+
+                        // Create the ExactValueMap object
+                        logger.debug("Creating ExactValueMap");
+                        tvm = new ExactValueMap();
+
+                        if (label != null) {
+                            tvm.setLabel(label);
+                        }
+
+                        if (value != null) {
+                            ((ExactValueMap) tvm).setValue(value);
+                        }
+
+                        if (method != null) {
+                            ((ExactValueMap) tvm).setMethod(method);
+                        }
+                    }
+
+                    if (parser.getName().equals(ServiceInfoTags.tRANGE)) {
+                        // Get the parameters
+                        String lower = parser.getAttributeValue("",
+                                ServiceInfoTags.aLOWER);
+                        String upper = parser.getAttributeValue("",
+                                ServiceInfoTags.UPPER);
+                        String equality = parser.getAttributeValue("",
+                                ServiceInfoTags.aEQUALITY);
+                        String label = parser.getAttributeValue("",
+                                ServiceInfoTags.aLABEL);
+
+                        // Create the RangeValueMap object
+                        if ((lower != null) && (upper != null)) {
+                            logger.debug("Creating RangeValueMap");
+                            tvm = new RangeValueMap(lower, upper);
+
+                            if (equality != null) {
+                                ((RangeValueMap) tvm).setEquality(equality);
+                            }
+
+                            if (label != null) {
+                                tvm.setLabel(label);
+                            }
+                        }
+                    }
+
+                    if (parser.getName().equals(ServiceInfoTags.tOTHER)) {
+                        // Get the parameters
+                        String label = parser.getAttributeValue("",
+                                ServiceInfoTags.aLABEL);
+
+                        // Create the Other object
+                        logger.debug("Creating OtherValueMap");
+                        tvm = new OtherValueMap();
+
+                        if (label != null) {
+                            tvm.setLabel(label);
+                        }
+                    }
+
+                    break;
+
+                case KXmlParser.END_TAG:
+
+                    if (parser.getName().equals(startTag) &&
+                            (parser.getDepth() == depth)) {
+                        end = true;
+                    }
+
+                    break;
+
+                case KXmlParser.TEXT:
+                    break;
+                }
+
+                /*
+                 *  Once the exits the switch statement we can add
+                 *  the TypeValueMap into the arraylist of values
+                 */
+                if (tvm != null) {
+                    /*
+                     * Create and assign the symbol definition passing the parser
+                     */
+                    parser.nextTag();
+
+                    if (ArcImsSymbolFactory.isSymbol(parser.getName())) {
+                        symb = ArcImsSymbolFactory.parseSymbol(parser, featType);
+                    }
+
+                    if (symb != null) {
+                        tvm.setSymbol(symb);
+                    }
+
+                    // Pass the TypeValueMap to the arraylist of values
+                    values.add(tvm);
+                }
+
+                // Erase the references
+                symb = null;
+                tvm = null;
+
+                /*
+                 * If end continue as false, get the next tag of the XML
+                 */
+                if (!end) {
+                    currentTag = parser.next();
+                }
+            }
+        } catch (XmlPullParserException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_symbology_error");
+        }
+
+        return render;
+    }
+
+    private SimpleLabelRenderer parseSimpleLabelRenderer(KXmlParser parser)
+        throws ArcImsException {
+        logger.debug("Start parsing SimpleLabelRenderer");
+
+        SimpleRenderer render = null;
+        SimpleLabelRenderer render2 = null;
+
+        String field = parser.getAttributeValue("", ServiceInfoTags.aSFIELD);
+        String rotational = parser.getAttributeValue("",
+                ServiceInfoTags.aROTATIONALANGLES);
+
+        render = parseSimpleRenderer(parser);
+
+        if ((render != null) && (field != null)) {
+            render2 = new SimpleLabelRenderer(field, render.getSymbol());
+
+            if (rotational != null) {
+                render2.setRotationalangles(rotational);
+            }
+        }
+
+        return render2;
+    }
+
+    private ValueMapLabelRenderer parseValueMapLabelRenderer(KXmlParser parser)
+        throws ArcImsException {
+        logger.debug("Start parsing ValueMapLabelRenderer");
+
+        ValueMapRenderer render = null;
+        ValueMapLabelRenderer render2 = null;
+
+        String labelfield = parser.getAttributeValue("",
+                ServiceInfoTags.aLABELFIELD);
+        String rotational = parser.getAttributeValue("",
+                ServiceInfoTags.aROTATIONALANGLES);
+
+        /*
+         * As this render is a type of a ValueMapRenderer, we can use this method and afterwards
+         * get the parameters and values
+         */
+        render = parseValueMapRenderer(parser);
+
+        if ((render != null) && (labelfield != null)) {
+            render2 = new ValueMapLabelRenderer(labelfield,
+                    render.getLookupfield());
+
+            if (rotational != null) {
+                render2.setRotationalangles(rotational);
+            }
+
+            if (render.getValues() != null) {
+                render2.setValues(render.getValues());
+            }
+        }
+
+        return render2;
+    }
+
+    /**
+     * Tests if a TAG is one of the ArcIMS renderers
+     * @param name
+     * @return
+     */
+    public static boolean isRenderer(String name) {
+        int l = ServiceInfoTags.RENDERERS.length;
+
+        for (int i = 0; i < l; i++) {
+            if (name.equals(ServiceInfoTags.RENDERERS[i])) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ArcImsRendererFactory.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ExactValueMap.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ExactValueMap.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ExactValueMap.java	(revision 8301)
@@ -0,0 +1,121 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.SymbolUtils;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class ExactValueMap extends TypeValueMap {
+    public static final String TAG = ServiceInfoTags.tEXACT;
+    public static final String IS_EXACT = "IsExact";
+    public static final String IS_CONTAINED = "isContained";
+    private String method;
+    private String value;
+
+    /**
+     * @param value
+     */
+    public ExactValueMap() {
+        super("");
+        method = ExactValueMap.IS_EXACT;
+    }
+
+    /**
+     * Generates an XML representation of the ValueMap type
+     */
+    public String toString() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(value)) {
+            param += (" value=\"" + value + "\"");
+        }
+
+        if (SymbolUtils.isVoid(method)) {
+            param += (" method=\"" + method + "\"");
+        }
+
+        if (SymbolUtils.isVoid(label)) {
+            param += (" label=\"" + label + "\"");
+        }
+
+        return "<" + ExactValueMap.TAG + param + "\">\r\n" + symbol.toString() +
+        "</" + ExactValueMap.TAG + ">\r\n";
+    }
+
+    /**
+     * @return Returns the method.
+     */
+    public String getMethod() {
+        return method;
+    }
+
+    /**
+     * @param method The method to set.
+     */
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    /**
+     * @return Returns the value.
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * @param value The value to set.
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ExactValueMap.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapLabelRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapLabelRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapLabelRenderer.java	(revision 8301)
@@ -0,0 +1,123 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.SymbolUtils;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import java.util.Iterator;
+
+
+public class ValueMapLabelRenderer extends ValueMapRenderer
+    implements ILabelRenderer {
+    public static final String TAG = ServiceInfoTags.tVALUEMAPLABELRENDERER;
+    private String rotationalangles;
+    private String labelfield;
+
+    /**
+     * @param labelField
+     */
+    public ValueMapLabelRenderer(String labelField, String alookupField) {
+        super(alookupField);
+        this.labelfield = labelField;
+    }
+
+    /**
+     * Generates an XML representation of the Renderer
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        Iterator it = values.iterator();
+
+        while (it.hasNext()) {
+            sb.append(((TypeValueMap) it.next()).toString());
+        }
+
+        return "<" + ValueMapLabelRenderer.TAG + " lookupField=\"" +
+        lookupField + "\"" + getParam() + "\">\r\n" + sb.toString() + "</" +
+        ValueMapLabelRenderer.TAG + ">\r\n";
+    }
+
+    private String getParam() {
+        String param = "";
+
+        if (SymbolUtils.isVoid(rotationalangles)) {
+            param += (" rotationalangles=\"" + rotationalangles + "\"");
+        }
+
+        if (SymbolUtils.isVoid(labelfield)) {
+            param += (" labelfield=\"" + labelfield + "\"");
+        }
+
+        return param;
+    }
+
+    /**
+     * @return Returns the labelField.
+     */
+    public String getField() {
+        return labelfield;
+    }
+
+    /**
+     * @param labelField The labelField to set.
+     */
+    public void setField(String labelField) {
+        this.labelfield = labelField;
+    }
+
+    /**
+     * @return Returns the rotationalAngles.
+     */
+    public String getRotationalangles() {
+        return rotationalangles;
+    }
+
+    /**
+     * @param rotationalAngles The rotationalAngles to set.
+     */
+    public void setRotationalangles(String rotationalangles) {
+        this.rotationalangles = rotationalangles;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapLabelRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapRenderer.java	(revision 8301)
@@ -0,0 +1,135 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class ValueMapRenderer extends Renderer {
+    public static final String TAG = ServiceInfoTags.tVALUEMAPRENDERER;
+    protected String lookupField;
+    protected ArrayList values;
+
+    /**
+     * @param lookupField
+     */
+    public ValueMapRenderer(String lookupfield) {
+        this.lookupField = lookupfield;
+        this.values = new ArrayList();
+    }
+
+    /**
+     * @return Returns a Value
+     */
+    public TypeValueMap getValue(int index) {
+        return (TypeValueMap) values.get(index);
+    }
+
+    /**
+     * @return Returns a Value
+     */
+    public ArrayList getValues() {
+        return values;
+    }
+
+    /**
+     * @param value Add a value into the Array
+     */
+    public boolean addType(TypeValueMap value) {
+        return values.add(value);
+    }
+
+    /**
+     * @return Number of types
+     */
+    public int valuesCount() {
+        return values.size();
+    }
+
+    /**
+     * Generates an XML representation of the Renderer
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        Iterator it = values.iterator();
+
+        while (it.hasNext()) {
+            sb.append(((TypeValueMap) it.next()).toString());
+        }
+
+        return "<" + ValueMapRenderer.TAG + " lookupfield=\"" + lookupField +
+        "\">\r\n" + sb.toString() + "</" + ValueMapRenderer.TAG + ">\r\n";
+    }
+
+    /**
+     * @return Returns the lookupField.
+     */
+    public String getLookupfield() {
+        return lookupField;
+    }
+
+    /**
+     * @param lookupField The lookupField to set.
+     */
+    public void setLookupfield(String lookupfield) {
+        this.lookupField = lookupfield;
+    }
+
+    /**
+     * @param values The values to set.
+     */
+    public void setValues(ArrayList values) {
+        this.values = values;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ValueMapRenderer.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ScaleDependentRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ScaleDependentRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ScaleDependentRenderer.java	(revision 8301)
@@ -0,0 +1,129 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.SymbolUtils;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import java.util.Iterator;
+
+
+/**
+ * Class representing a scale dependent legend, it isn't supported at this time by gvSIG.
+ * This renderer usually is formed by other GROUPRENDERER or VALUEMAPRENDERER. This way the
+ * ArcIMS service can change its simbology according to the scale. In this case it will be
+ * necessary to select one of the renderers.
+ * @author jsanz
+ *
+ */
+public class ScaleDependentRenderer extends GroupRenderer {
+    public static final String TAG = ServiceInfoTags.tSCALEDEPENDENTRENDERER;
+    private String lower;
+    private String upper;
+
+    /**
+     * @param lower
+     * @param upper
+     */
+    public ScaleDependentRenderer(String lower, String upper) {
+        this.lower = lower;
+        this.upper = upper;
+    }
+
+    /**
+     * @return Returns the lower.
+     */
+    public String getLower() {
+        return lower;
+    }
+
+    /**
+     * @param lower The lower to set.
+     */
+    public void setLower(String lower) {
+        this.lower = lower;
+    }
+
+    /**
+     * @return Returns the upper.
+     */
+    public String getUpper() {
+        return upper;
+    }
+
+    /**
+     * @param upper The upper to set.
+     */
+    public void setUpper(String upper) {
+        this.upper = upper;
+    }
+
+    /**
+     * Generates an XML representation of the Renderer
+     */
+    public String toString() {
+        String param = new String();
+
+        if (SymbolUtils.isVoid(upper)) {
+            param += (" upper =\"" + upper + "\"");
+        }
+
+        if (SymbolUtils.isVoid(lower)) {
+            param += (" lower =\"" + lower + "\"");
+        }
+
+        StringBuffer sb = new StringBuffer();
+        Iterator it = super.iterator();
+
+        while (it.hasNext()) {
+            sb.append(((Renderer) it.next()).toString());
+        }
+
+        return "<" + ScaleDependentRenderer.TAG + param + ">\r\n" +
+        sb.toString() + "</" + ScaleDependentRenderer.TAG + ">\r\n";
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ScaleDependentRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/Renderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/Renderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/Renderer.java	(revision 8301)
@@ -0,0 +1,57 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+
+/**
+ * Abstract class to model ArcIMS Renderer's family
+ * @author jsanz
+ *
+ */
+public abstract class Renderer {
+    public static final String TAG = "";
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/Renderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/BasicRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/BasicRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/BasicRenderer.java	(revision 8301)
@@ -0,0 +1,54 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+
+/**
+ * Abstrac class that models renderers not classifying symbols (legends)
+ * @author jsanz
+ *
+ */
+public abstract class BasicRenderer extends Renderer {
+    public static final String TAG = "";
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/BasicRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/OtherValueMap.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/OtherValueMap.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/OtherValueMap.java	(revision 8301)
@@ -0,0 +1,70 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class OtherValueMap extends TypeValueMap {
+    public static final String TAG = ServiceInfoTags.tOTHER;
+
+    /**
+     * @param label
+     */
+    public OtherValueMap() {
+        super("");
+    }
+
+    /**
+     * Generates an XML representation of the ValueMap type
+     */
+    public String toString() {
+        return "<" + OtherValueMap.TAG + " label=\"" + label + "\">\r\n" +
+        symbol.toString() + "</" + OtherValueMap.TAG + ">\r\n";
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/OtherValueMap.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/TypeValueMap.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/TypeValueMap.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/TypeValueMap.java	(revision 8301)
@@ -0,0 +1,94 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+import org.gvsig.remoteClient.arcims.styling.symbols.IArcIMSSymbol;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public abstract class TypeValueMap {
+    protected String label;
+    protected IArcIMSSymbol symbol;
+
+    /**
+     * @param label
+     */
+    public TypeValueMap(String label) {
+        this.label = label;
+    }
+
+    /**
+     * @return Returns the label.
+     */
+    public String getLabel() {
+        return label;
+    }
+
+    /**
+     * @param label The label to set.
+     */
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    /**
+     * @return Returns the symbol.
+     */
+    public IArcIMSSymbol getSymbol() {
+        return symbol;
+    }
+
+    /**
+     * @param symbol The symbol to set.
+     */
+    public void setSymbol(IArcIMSSymbol symbol) {
+        this.symbol = symbol;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/TypeValueMap.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ILabelRenderer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ILabelRenderer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ILabelRenderer.java	(revision 8301)
@@ -0,0 +1,66 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.styling.renderers;
+
+
+/**
+ * We will take care in this Interface only of attributes that gvSIG can use. Thus
+ * we will get a TextSymbol and a rational angles (only first angle will be used).
+ * @author jsanz
+ *
+ */
+public interface ILabelRenderer {
+    public String getRotationalangles();
+
+    public void setRotationalangles(String rotationalAngles);
+
+    public String getField();
+
+    public void setField(String mfield);
+
+    //	public FLabel getFLabel();
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/styling/renderers/ILabelRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/MyCancellable.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/MyCancellable.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/MyCancellable.java	(revision 8301)
@@ -0,0 +1,61 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+import com.iver.utiles.swing.threads.Cancellable;
+
+import org.gvsig.remoteClient.wms.ICancellable;
+
+
+public class MyCancellable implements ICancellable {
+    private Cancellable original;
+
+    public MyCancellable(Cancellable cancelOriginal) {
+        this.original = cancelOriginal;
+    }
+
+    public boolean isCanceled() {
+        return original.isCanceled();
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/MyCancellable.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInfoTags.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInfoTags.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInfoTags.java	(revision 8301)
@@ -0,0 +1,245 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ * Class containing a description for all the TAGS defined in the SERVICEINFO
+ * Object returned from a ArcIMS Server
+ */
+public class ServiceInfoTags {
+    /*
+     * Elements of a ServiceInfo XML
+     */
+    public final static String tARCXML = "ARCXML";
+    public final static String tBACKGROUND = "BACKGROUND";
+    public final static String tENVELOPE = "ENVELOPE";
+    public final static String tENVIRONMENT = "ENVIRONMENT";
+    public final static String tEXTENSION = "EXTENSION";
+    public static final String tERROR = "ERROR";
+    public final static String tEXTRACTPARAMS = "EXTRACTPARAMS";
+    public final static String tFCLASS = "FCLASS";
+    public final static String tFEATURECOORDSYS = "FEATURECOORDSYS";
+    public final static String tFILTERCOORDSYS = "FILTERCOORDSYS ";
+    public final static String tFIELD = "FIELD";
+    public final static String tGCSTYLE = "GCSTYLE";
+    public final static String tIMAGELIMIT = "IMAGELIMIT";
+    public final static String tIMAGESIZE = "IMAGESIZE";
+    public final static String tLAYERINFO = "LAYERINFO";
+    public final static String tLEGEND = "LEGEND";
+    public final static String tLOCALE = "LOCALE";
+    public final static String tMAPUNITS = "MAPUNITS";
+    public final static String tOUTPUT = "OUTPUT";
+    public final static String tOUTPUTFIELD = "OUTPUTFIELD";
+    public final static String tOUTPUTFILE = "OUTPUTFILE";
+    public final static String tPROPERTIES = "PROPERTIES";
+    public final static String tQUERY = "QUERY";
+    public final static String tRESPONSE = "RESPONSE";
+    public final static String tSCREEN = "SCREEN";
+    public final static String tSEPARATORS = "SEPARATORS";
+    public final static String tSERVICEINFO = "SERVICEINFO";
+    public final static String tSQVAR = "SQVAR";
+    public final static String tSTOREDQUERIES = "STOREDQUERIES";
+    public final static String tSTOREDQUERY = "STOREDQUERY";
+    public final static String tUIFONT = "UIFONT";
+
+    /*
+     * Attributes of a ServiceInfo XML
+     */
+    public final static String aPOLYGON = "polygon";
+    public final static String aPOLYLINE = "line";
+    public final static String aMULTIPOINT = "point";
+    public final static String aAUTOEXTEND = "autoextend";
+    public final static String aBACKGROUNDCOLOR = "backgroundcolor";
+    public final static String aBASEURL = "baseurl";
+    public final static String aCOLOR = "color";
+    public final static String aCOUNTRY = "country";
+    public final static String aCS = "cs";
+    public final static String aDPI = "dpi";
+    public final static String aENVELOPEIE = "Initial_Extent";
+    public final static String aENVELOPEEL = "Extent_Limit";
+    public static final String aFONT = "font";
+    public final static String aHEIGHT = "height";
+    public final static String aID = "id";
+    public final static String aLANGUAGE = "language";
+    public final static String aMAXSCALE = "maxscale";
+    public final static String aMINSCALE = "minscale";
+    public final static String aMAXX = "maxx";
+    public final static String aMAXY = "maxy";
+    public final static String aMINX = "minx";
+    public final static String aMINY = "miny";
+    public final static String aNAME = "name";
+    public final static String aPATH = "path";
+    public final static String aPRECISION = "precision";
+    public final static String aSTYLE = "style";
+    public final static String aSIZE = "size";
+    public final static String aPIXELCOUNT = "pixelcount";
+    public final static String aTRANSPARENCY = "transparency";
+    public final static String aTS = "ts";
+    public final static String aTYPE = "type";
+    public final static String aUNITS = "units";
+    public final static String aURL = "url";
+    public final static String aVISIBLE = "visible";
+    public final static String aWIDTH = "width";
+
+    /*
+     * Values of a ServiceInfo XML
+     */
+    public final static String vLAYERTYPE_F = "featureclass";
+    public final static String vLAYERTYPE_I = "image";
+
+    /*
+     * Types of ArcIMS Services
+     */
+    public final static String vIMAGESERVICE = "ImageServer";
+    public final static String vFEATURESERVICE = "FeatureServer";
+    public final static String vINI_SRS = "EPSG:";
+
+    /*
+     * Map units string IDs
+     */
+    public final static String vMAP_UNITS_DECIMAL_DEGREES = "decimal_degrees";
+    public final static String vMAP_UNITS_FEET = "feet";
+    public final static String vMAP_UNITS_METERS = "meters";
+
+    /*
+     * Image formats
+     */
+    public final static String vPNG24 = "png";
+    public final static String vPNG8 = "png8";
+    public final static String vJPEG = "jpg";
+    public final static String vGIF = "gif";
+
+    /*
+     * Renderers
+     */
+    public final static String tSIMPLERENDERER = "SIMPLERENDERER";
+    public static final String tGROUPRENDERER = "GROUPRENDERER";
+    public static final String tSCALEDEPENDENTRENDERER = "SCALEDEPENDENTRENDERER";
+    public static final String tSIMPLELABELRENDERER = "SIMPLELABELRENDERER";
+    public static final String tVALUEMAPLABELRENDERER = "VALUEMAPLABELRENDERER";
+    public static final String tVALUEMAPRENDERER = "VALUEMAPRENDERER";
+    public static final String[] RENDERERS = new String[6]; //See static at the end
+    public final static String tEXACT = "EXACT";
+    public final static String tRANGE = "RANGE";
+    public final static String tOTHER = "OTHER";
+
+    /*
+     * Symbology attributes
+     */
+    public static final String aBOUNDARY = "boundary";
+    public static final String aCAPTYPE = "captype";
+    public final static String aEQUALITY = "equality";
+    public static final String aJOINTYPE = "jointype";
+    public final static String aLABEL = "label";
+    public final static String aLABELFIELD = "labelfield";
+    public static final String aLINETHICKNESS = "linethickness";
+    public static final String aLOOKUPFIELD = "lookupfield";
+    public static final String aLOWER = "lower";
+    public final static String aMETHOD = "method";
+    public final static String aROTATIONALANGLES = "rotationalangles";
+    public final static String aSFIELD = "field";
+    public static final String UPPER = "upper";
+    public final static String VALUE = "value";
+
+    /*
+     * Types of symbols supported
+     */
+    public static final String tSIMPLELINESYMBOL = "SIMPLELINESYMBOL";
+    public static final String tSIMPLEMARKERSYMBOL = "SIMPLEMARKERSYMBOL";
+    public static final String tSIMPLEPOLYGONSYMBOL = "SIMPLEPOLYGONSYMBOL";
+    public static final String tTEXTSYMBOL = "TEXTSYMBOL";
+
+    /*
+     * Types not supported
+     */
+    public static final String tRASTERMARKERSYMBOL = "RASTERMARKERSYMBOL";
+    public static final String tGRADIENTFILLSYMBOL = "GRADIENTFILLSYMBOL";
+    public static final String tHASHLINESYMBOL = "HASHLINESYMBOL";
+    public static final String tRASTERFILLSYMBOL = "RASTERFILLSYMBOL";
+    public static final String tCALLOUTMARKERSYMBOL = "CALLOUTMARKERSYMBOL";
+    public static final String tCHARTSYMBOL = "CHARTSYMBOL";
+    public static final String tRASTERSHIELDSYMBOL = "RASTERSHIELDSYMBOL";
+    public static final String tSHIELDSYMBOL = "SHIELDSYMBOL";
+    public static final String tTEXTMARKERSYMBOL = "TEXTMARKERSYMBOL";
+    public static final String tTRUETYPEMARKERSYMBOL = "TRUETYPEMAKERSYMBOL";
+    public static final String[] SYMBOLS = new String[14];
+    public static final String[] NOT_SUPP_SYMBOLS = new String[9];
+
+    static {
+        SYMBOLS[0] = tSIMPLELINESYMBOL;
+        SYMBOLS[1] = tSIMPLEMARKERSYMBOL;
+        SYMBOLS[2] = tSIMPLEPOLYGONSYMBOL;
+        SYMBOLS[3] = tTEXTSYMBOL;
+        SYMBOLS[4] = tRASTERMARKERSYMBOL;
+
+        //Not supported
+        SYMBOLS[5] = tGRADIENTFILLSYMBOL;
+        SYMBOLS[6] = tHASHLINESYMBOL;
+        SYMBOLS[7] = tRASTERFILLSYMBOL;
+        SYMBOLS[8] = tTRUETYPEMARKERSYMBOL;
+        SYMBOLS[9] = tCALLOUTMARKERSYMBOL;
+        SYMBOLS[10] = tCHARTSYMBOL;
+        SYMBOLS[11] = tRASTERSHIELDSYMBOL;
+        SYMBOLS[12] = tSHIELDSYMBOL;
+        SYMBOLS[13] = tTEXTMARKERSYMBOL;
+
+        RENDERERS[0] = tSIMPLERENDERER;
+        RENDERERS[1] = tGROUPRENDERER;
+        RENDERERS[2] = tVALUEMAPRENDERER;
+        RENDERERS[3] = tSCALEDEPENDENTRENDERER;
+        RENDERERS[4] = tSIMPLELABELRENDERER;
+        RENDERERS[5] = tVALUEMAPLABELRENDERER;
+
+        NOT_SUPP_SYMBOLS[0] = tGRADIENTFILLSYMBOL;
+        NOT_SUPP_SYMBOLS[1] = tHASHLINESYMBOL;
+        NOT_SUPP_SYMBOLS[2] = tRASTERFILLSYMBOL;
+        NOT_SUPP_SYMBOLS[3] = tTRUETYPEMARKERSYMBOL;
+        NOT_SUPP_SYMBOLS[4] = tCALLOUTMARKERSYMBOL;
+        NOT_SUPP_SYMBOLS[5] = tCHARTSYMBOL;
+        NOT_SUPP_SYMBOLS[6] = tRASTERSHIELDSYMBOL;
+        NOT_SUPP_SYMBOLS[7] = tSHIELDSYMBOL;
+        NOT_SUPP_SYMBOLS[8] = tTEXTMARKERSYMBOL;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInfoTags.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetFeaturesTags.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetFeaturesTags.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetFeaturesTags.java	(revision 8301)
@@ -0,0 +1,75 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ *
+ * Class containing a description for TAGS defined in the GET_FEATURES request
+ * returned from a ArcIMS Server
+ * @author jsanz
+ */
+public class GetFeaturesTags {
+    public final static int MAX_ROWS_PER_REQUEST = 1000;
+    public final static int MIN_ROWS_PER_REQUEST = 700;
+    public final static int ACCURACY_RATIO = 1;
+    public final static String FIELD = "FIELD";
+    public final static String FIELDS = "FIELDS";
+    public final static String FEATURES = "FEATURES";
+    public final static String FEATURE = "FEATURE";
+    public final static String FEATURECOUNT = "FEATURECOUNT";
+    public final static String POLYGON = "POLYGON";
+    public final static String RING = "RING";
+    public final static String COORDS = "COORDS";
+    public final static String POLYLINE = "POLYLINE";
+    public final static String PATH = "PATH";
+    public final static String MULTIPOINT = "MULTIPOINT";
+    public final static String NAME = "name";
+    public final static String VALUE = "value";
+    public final static String COUNT = "count";
+    public final static String HASMORE = "hasmore";
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetFeaturesTags.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsReader.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsReader.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsReader.java	(revision 8301)
@@ -0,0 +1,106 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+
+public class ArcImsReader extends InputStreamReader {
+    private char codigoB;
+    private char codigoM;
+
+    public ArcImsReader(InputStream in, char codigoB, char codigoM) {
+        super(in);
+        this.codigoB = codigoB;
+        this.codigoM = codigoM;
+    }
+
+    /**
+    * Read a single character.
+    *
+    * @return The character read, or -1 if the end of the stream has been
+    *         reached
+    *
+    * @exception  IOException  If an I/O error occurs
+    */
+    public int read() throws IOException {
+        int sup = super.read();
+
+        if (sup == (int) codigoM) {
+            return (int) codigoB;
+        } else {
+            return sup;
+        }
+    }
+
+    /**
+     * Read characters into a portion of an array.
+     *
+     * @param      cbuf     Destination buffer
+     * @param      offset   Offset at which to start storing characters
+     * @param      length   Maximum number of characters to read
+     *
+     * @return     The number of characters read, or -1 if the end of the
+     *             stream has been reached
+     *
+     * @exception  IOException  If an I/O error occurs
+     */
+    public int read(char[] cbuf, int off, int len) throws IOException {
+        synchronized (lock) {
+            int n = super.read(cbuf, off, len);
+
+            for (int i = off; i < (off + n); i++) {
+                char c = cbuf[i];
+
+                if (c == codigoM) {
+                    cbuf[i] = codigoB;
+                }
+            }
+
+            return n;
+        }
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsReader.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetImageTags.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetImageTags.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetImageTags.java	(revision 8301)
@@ -0,0 +1,56 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ *
+ * Class containing a description for TAGS defined in the GET_IMAGE request
+ * returned from a ArcIMS Server
+ * @author jsanz
+ */
+public class GetImageTags {
+    public final static String OUTPUT = "OUTPUT";
+    public final static String URL = "url";
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetImageTags.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerFeatures.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerFeatures.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerFeatures.java	(revision 8301)
@@ -0,0 +1,238 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+import com.iver.cit.gvsig.fmap.core.FShape;
+
+import org.gvsig.remoteClient.arcims.styling.renderers.Renderer;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Vector;
+
+
+/**
+ * Class that stores a layer information of a vector image
+ *
+ * @author jsanz
+ *
+ */
+public class ServiceInformationLayerFeatures extends ServiceInformationLayer {
+    //	public final static int MULTIPOINT = 1;
+    //	public final static int POLYLINE = 2;
+    //	public final static int POLYGON = 3;
+    private String fclasstype;
+    private int intFclassType;
+    private Vector fieldsInfo = null;
+    private Renderer layerMainRenderer = null;
+
+    /**
+     * The constructor of this class receives the type of vectorial
+     * information is stored in the layer (polygon,line or point)
+     *
+     * @param _fclasstype
+     */
+    public ServiceInformationLayerFeatures(String _fclasstype) {
+        this.type = ServiceInfoTags.vLAYERTYPE_F;
+        this.intFclassType = FShape.NULL;
+        this.setFclasstype(_fclasstype);
+    }
+
+    public String toString() {
+        String out;
+        out = "Layer: " + this.name + "\t(" + this.type + "-" +
+            this.fclasstype + ")";
+
+        return out;
+    }
+
+    /**
+     * Return a FieldInformation object from the vector passing
+     * @see FieldInformation
+     * an index
+     * @param index
+     * @return FieldInformation object
+     */
+    public FieldInformation getFieldInformation(int index) {
+        if ((this.fieldsInfo.size() > index) &&
+                (this.fieldsInfo.get(index) != null)) {
+            return (FieldInformation) this.fieldsInfo.get(index);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Return a FieldInformation object from the vector passing
+     * a FieldInformation name
+     * @see FieldInformation
+     * @param name
+     * @return FieldInformation object
+     */
+    public FieldInformation getFieldInformation(String name) {
+        FieldInformation fi = null;
+
+        if (this.fieldsInfo != null) {
+            Iterator it = fieldsInfo.iterator();
+
+            while (it.hasNext()) {
+                fi = (FieldInformation) it.next();
+
+                if (fi.getName().equalsIgnoreCase(name)) {
+                    return fi;
+                }
+            }
+        }
+
+        return fi;
+    }
+
+    /**
+     * Returns an array of FieldInformation objects passing
+     * a type
+     * @see FieldInformation
+     * @param type
+     * @return
+     */
+    public ArrayList getFieldInformationByType(int type) {
+        ArrayList fisA = new ArrayList();
+        FieldInformation fiTemp = null;
+        Iterator it = fieldsInfo.iterator();
+
+        while (it.hasNext()) {
+            fiTemp = (FieldInformation) it.next();
+
+            if (fiTemp.getType() == type) {
+                fisA.add(fiTemp);
+            }
+        }
+
+        if (fisA == null) {
+            return null;
+        } else {
+            return fisA;
+        }
+    }
+
+    /**
+     * Set a FieldInformation object into the vector @see ServiceInformationLayerFeatures#fieldsInfo
+     *
+     * @see FieldInformation
+     */
+    public void addFieldInformation(FieldInformation fi) {
+        if (this.fieldsInfo == null) {
+            this.fieldsInfo = new Vector();
+        }
+
+        this.fieldsInfo.add(fi);
+    }
+
+    /**
+     * @return Returns the fclasstype.
+     */
+    public String getFclasstype() {
+        return fclasstype;
+    }
+
+    /**
+     * @param fclasstype The fclasstype to set.
+     */
+    public void setFclasstype(String fclasstype) {
+        this.fclasstype = fclasstype;
+
+        if (fclasstype.equals(ServiceInfoTags.aMULTIPOINT)) {
+            intFclassType = FShape.MULTIPOINT;
+        } else if (fclasstype.equals(ServiceInfoTags.aPOLYLINE)) {
+            intFclassType = FShape.LINE;
+        } else if (fclasstype.equals(ServiceInfoTags.aPOLYGON)) {
+            intFclassType = FShape.POLYGON;
+        }
+    }
+
+    /**
+     * @return Returns the fieldsInfo.
+     */
+    public Vector getFieldsInfo() {
+        return fieldsInfo;
+    }
+
+    //	public FieldInformation getFieldInfoByName(String name){
+    //		Iterator it = fieldsInfo.iterator()
+    //	}
+
+    /**
+     * @param fieldsInfo The fieldsInfo to set.
+     */
+    public void setFieldsInfo(Vector fieldsInfo) {
+        this.fieldsInfo = fieldsInfo;
+    }
+
+    /**
+     * @return Returns the intFclassType.
+     */
+    public int getIntFclassType() {
+        return intFclassType;
+    }
+
+    /**
+     * @param intFclassType The intFclassType to set.
+     */
+    public void setIntFclassType(int intFclassType) {
+        this.intFclassType = intFclassType;
+    }
+
+    /**
+     * @return Returns the layerMainRenderer.
+     */
+    public Renderer getLayerMainRenderer() {
+        return layerMainRenderer;
+    }
+
+    /**
+     * @param layerMainRenderer The layerMainRenderer to set.
+     */
+    public void setLayerMainRenderer(Renderer layerMainRenderer) {
+        this.layerMainRenderer = layerMainRenderer;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerFeatures.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsValueFactory.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsValueFactory.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsValueFactory.java	(revision 8301)
@@ -0,0 +1,131 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+import com.hardcode.gdbms.engine.values.Value;
+import com.hardcode.gdbms.engine.values.ValueFactory;
+
+import java.text.ParseException;
+
+import java.util.Date;
+
+
+/**
+ * Class that will generate convenient Value objects using ArcIMS
+ * types.
+ * @author jsanz
+ */
+public class ArcImsValueFactory extends ValueFactory {
+    public static Value createValueByType(String text, int type, char delDec)
+        throws ParseException {
+        Value value;
+
+        switch (type) {
+        case FieldInformation.BOOLEAN:
+            value = ValueFactory.createValue(Boolean.valueOf(text).booleanValue());
+
+            break;
+
+        case FieldInformation.SHAPE:
+        case FieldInformation.STRING:
+            value = ValueFactory.createValue(text);
+
+            break;
+
+        case FieldInformation.DATE:
+
+            //This tipe is changed to use miliseconds as source of the value
+            if (text != null) {
+                value = ValueFactory.createValue(new Date(Long.parseLong(text)));
+            } else {
+                value = ValueFactory.createNullValue();
+            }
+
+            break;
+
+        case FieldInformation.FLOAT:
+
+            if (text != null) {
+                value = ValueFactory.createValue(Float.parseFloat(text.replace(
+                                delDec, '.')));
+            } else {
+                value = ValueFactory.createNullValue();
+            }
+
+            break;
+
+        case FieldInformation.DOUBLE:
+
+            if (text != null) {
+                value = ValueFactory.createValue(Double.parseDouble(
+                            text.replace(delDec, '.')));
+            } else {
+                value = ValueFactory.createNullValue();
+            }
+
+            break;
+
+        case FieldInformation.SMALLINT:
+            value = ValueFactory.createValue(Short.parseShort(text));
+
+            break;
+
+        case FieldInformation.BIGINT:
+            value = ValueFactory.createValue(Long.parseLong(text));
+
+            break;
+
+        case FieldInformation.ID:
+        case FieldInformation.INTEGER:
+            value = ValueFactory.createValue(Integer.parseInt(text));
+
+            break;
+
+        default:
+            value = ValueFactory.createValue(text);
+        }
+
+        return value;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsValueFactory.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayer.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayer.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayer.java	(revision 8301)
@@ -0,0 +1,176 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.utils;
+
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+
+/**
+ * Abstract class that stores the information of every layer that is
+ * part of the Service
+ *  @author jsanz
+ */
+public abstract class ServiceInformationLayer {
+    private String id;
+    private double maxscale;
+    private double minscale;
+    protected String name;
+    protected String type;
+    private String visible;
+    private BoundaryBox envelope;
+
+    // public String fclasstype;
+    public ServiceInformationLayer() {
+        id = new String();
+        name = new String();
+        type = new String();
+        visible = new String();
+        envelope = new BoundaryBox();
+        maxscale = -1.0;
+        minscale = -1.0;
+
+        // fclasstype = new String();
+    }
+
+    /**
+     * @return Returns the envelope.
+     */
+    public BoundaryBox getEnvelope() {
+        return envelope;
+    }
+
+    /**
+     * @param envelope The envelope to set.
+     */
+    public void setEnvelope(BoundaryBox envelope) {
+        this.envelope = envelope;
+    }
+
+    /**
+     * @return Returns the id.
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * @param id The id to set.
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * @return Returns the maxscale.
+     */
+    public double getMaxscale() {
+        return maxscale;
+    }
+
+    /**
+     * @param maxscale The maxscale to set.
+     */
+    public void setMaxscale(double maxscale) {
+        this.maxscale = maxscale;
+    }
+
+    /**
+     * @return Returns the minscale.
+     */
+    public double getMinscale() {
+        return minscale;
+    }
+
+    /**
+     * @param minscale The minscale to set.
+     */
+    public void setMinscale(double minscale) {
+        this.minscale = minscale;
+    }
+
+    /**
+     * @return Returns the name.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name The name to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return Returns the type.
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * @param type The type to set.
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * @return Returns the visible.
+     */
+    public String getVisible() {
+        return visible;
+    }
+
+    /**
+     * @param visible The visible to set.
+     */
+    public void setVisible(String visible) {
+        this.visible = visible;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/CatalogInfoTags.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/CatalogInfoTags.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/CatalogInfoTags.java	(revision 8301)
@@ -0,0 +1,62 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ * This class provides a list of TAGS to be used
+ * when parsing a ARCIMS-RESPOND-SERVICES  element,
+ * after a request with the parameter: "ServiceName=catalog"
+ *
+ * */
+public class CatalogInfoTags {
+    public final static String SERVICES = "SERVICES";
+    public final static String SERVICE = "SERVICE";
+    public final static String SERVICE_ATT_NAME = "NAME";
+    public final static String SERVICE_ATT_STATUS = "STATUS";
+    public final static String SERVICE_ATT_TYPE = "TYPE";
+    public final static String METADATA_SERVICE = "METADATASERVER";
+    public final static String ENABLED = "ENABLED";
+    public final static String DISABLED = "DISABLED";
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/CatalogInfoTags.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformation.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformation.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformation.java	(revision 8301)
@@ -0,0 +1,585 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.utils;
+
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+import java.awt.geom.Rectangle2D;
+
+import java.util.Iterator;
+import java.util.Vector;
+
+
+/**
+ * Class that stores the general and layers information of an ArcIMS Server to
+ * be retrieved by different classes (ArcImsStatus, ArcImsProtocolHandler,...)
+ *
+ * @author jsanz
+ *
+ */
+public class ServiceInformation implements Cloneable {
+    private String type;
+    private ServiceInformationLocale locale;
+    private ServiceInformationUIFont uifont;
+    private ServiceInformationSeparators separators;
+    private int screen_dpi;
+    private String imagelimit_pixelcount;
+    private String featurecoordsys;
+    private boolean srsAssumed;
+    private boolean dpiAssumed;
+
+    /**
+     * Envelope with name equal to "Initial_Extent", it will be the default
+     * Envelope.
+     */
+    private BoundaryBox envelope;
+
+    /**
+     * Envelope with name equal to "Extent_Limit", it stores the maximum zoomout
+     * extension defined in the configuration file. However, this information is
+     * ignored by the ArcIMS Spatial Server.
+     */
+    private BoundaryBox envelopeEL;
+
+    /**
+     * Units of the map (metes, decimal_degrees, etc.
+     */
+    private String mapunits;
+
+    /**
+     * Vector of layers,
+     *
+     * @see ServiceInformationLayer
+     */
+    private Vector layers;
+
+    /**
+     * Constructor.
+     *
+     */
+    public ServiceInformation() {
+        type = new String();
+        locale = new ServiceInformationLocale();
+        uifont = new ServiceInformationUIFont();
+        separators = new ServiceInformationSeparators();
+        screen_dpi = 96;
+        imagelimit_pixelcount = new String();
+        envelope = new BoundaryBox();
+        mapunits = new String();
+        featurecoordsys = new String();
+        layers = new Vector();
+    }
+
+    public Object clone() {
+        ServiceInformation si = new ServiceInformation();
+        si.setType(this.type);
+
+        ServiceInformationLocale locale = this.locale;
+
+        if (locale != null) {
+            si.setLocale((ServiceInformationLocale) this.locale.clone());
+        }
+
+        return si;
+    }
+
+    public boolean isQueryable() {
+        // if (operations.keySet().contains( CapabilitiesTags.GETFEATUREINFO ))
+        return true;
+
+        // else
+        // return false;
+        // }
+    }
+
+    public BoundaryBox getEnvelope() {
+        return envelope;
+    }
+
+    public void setEnvelope(BoundaryBox envelope) {
+        this.envelope = envelope;
+    }
+
+    public BoundaryBox getEnvelopeEL() {
+        return envelopeEL;
+    }
+
+    public void setEnvelopeEL(BoundaryBox envelope) {
+        this.envelopeEL = envelope;
+    }
+
+    public Rectangle2D getEnvelopeR2D() {
+        Rectangle2D.Double r = new Rectangle2D.Double();
+        r.setFrameFromDiagonal(envelope.getXmin(), envelope.getYmin(),
+            envelope.getXmax(), envelope.getYmax());
+
+        return r;
+    }
+
+    /**
+     * Add a layer to the ServiceInformation @see ServiceInformationLayer.
+     *
+     * @param sil
+     */
+    public void addLayer(ServiceInformationLayer sil) {
+        if (!layers.contains(sil)) {
+            layers.add(sil);
+        }
+    }
+
+    /**
+     * Get a layer of the ServiceInformation.
+     *
+     * @param i Index of the vector of layers
+     * @return @see ServiceInformationLayer
+     */
+    public ServiceInformationLayer getLayer(int i) {
+        ServiceInformationLayer sil = (ServiceInformationLayer) this.layers.get(i);
+
+        return sil;
+    }
+
+    /**
+     * Get a layer of the ServiceInformation.
+     *
+     * @param i Index of the vector of layers
+     * @return @see ServiceInformationLayer
+     */
+    public ServiceInformationLayer getLayerById(String name) {
+        Iterator it = layers.iterator();
+        ServiceInformationLayer sil = null;
+
+        while (it.hasNext()) {
+            sil = (ServiceInformationLayer) it.next();
+
+            if (sil.getId().equals(name)) {
+                return sil;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Get the type.
+     * @return Returns the type.
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Set the type.
+     * @param type The type to set.
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * @return Returns the imagelimit_pixelcount.
+     */
+    public String getImagelimit_pixelcount() {
+        return imagelimit_pixelcount;
+    }
+
+    /**
+     * @param imagelimit_pixelcount The imagelimit_pixelcount to set.
+     */
+    public void setImagelimit_pixelcount(String imagelimit_pixelcount) {
+        this.imagelimit_pixelcount = imagelimit_pixelcount;
+    }
+
+    /**
+     * @return Returns the layers.
+     */
+    public Vector getLayers() {
+        return layers;
+    }
+
+    /**
+     * @param layers The layers to set.
+     */
+    public void setLayers(Vector layers) {
+        this.layers = layers;
+    }
+
+    /**
+     * @return Returns the locale.
+     */
+    public ServiceInformationLocale getLocale() {
+        return locale;
+    }
+
+    /**
+     * @param locale The locale to set.
+     */
+    public void setLocale(ServiceInformationLocale locale) {
+        this.locale = locale;
+    }
+
+    /**
+     * @return Returns the mapunits.
+     */
+    public String getMapunits() {
+        return mapunits;
+    }
+
+    /**
+     * @param mapunits The mapunits to set.
+     */
+    public void setMapunits(String mapunits) {
+        this.mapunits = mapunits;
+    }
+
+    /**
+     * @return Returns the separators.
+     */
+    public ServiceInformationSeparators getSeparators() {
+        return separators;
+    }
+
+    /**
+     * @param separators The separators to set.
+     */
+    public void setSeparators(ServiceInformationSeparators separators) {
+        this.separators = separators;
+    }
+
+    /**
+     * @return Returns the uifont.
+     */
+    public ServiceInformationUIFont getUifont() {
+        return uifont;
+    }
+
+    /**
+     * @param uifont The uifont to set.
+     */
+    public void setUifont(ServiceInformationUIFont uifont) {
+        this.uifont = uifont;
+    }
+
+    /**
+     * @return Returns the screen_dpi.
+     */
+    public int getScreen_dpi() {
+        return screen_dpi;
+    }
+
+    /**
+     *
+     * @param screen_dpi the screen_dpi to set
+     */
+    public void setScreen_dpi(int screen_dpi) {
+        this.screen_dpi = screen_dpi;
+    }
+
+    /**
+     * @return Returns the featurecoordsys.
+     */
+    public String getFeaturecoordsys() {
+        return featurecoordsys;
+    }
+
+    /**
+     * @param featurecoordsys The featurecoordsys to set.
+     */
+    public void setFeaturecoordsys(String featurecoordsys) {
+        this.featurecoordsys = featurecoordsys;
+    }
+
+    /**
+     * @return Returns the dpiAssumed.
+     */
+    public boolean isDpiAssumed() {
+        return dpiAssumed;
+    }
+
+    /**
+     * @return Returns the srsAssumed.
+     */
+    public boolean isSrsAssumed() {
+        return srsAssumed;
+    }
+
+    /**
+     * @param dpiAssumed The dpiAssumed to set.
+     */
+    public void setDpiAssumed(boolean dpiAssumed) {
+        this.dpiAssumed = dpiAssumed;
+    }
+
+    /**
+     * @param srsAssumed The srsAssumed to set.
+     */
+    public void setSrsAssumed(boolean srsAssumed) {
+        this.srsAssumed = srsAssumed;
+    }
+
+    /**
+     * Inner class that represents the description of the ArcIms metadata. The
+     * first part of the capabilities will return the service information from
+     * the ArcIms, this class will hold this information.
+     *
+     * @author jcarrasco
+     */
+    public class ServiceInformationLocale implements Cloneable {
+        private String language;
+        private String country;
+
+        public ServiceInformationLocale() {
+            language = new String();
+            country = new String();
+        }
+
+        public Object clone() {
+            ServiceInformationLocale loc = new ServiceInformationLocale();
+            loc.setCountry(this.country);
+            loc.setLanguage(this.language);
+
+            return loc;
+        }
+
+        /**
+         * @return Returns the country.
+         */
+        public String getCountry() {
+            return country;
+        }
+
+        /**
+         * @param country The country to set.
+         */
+        public void setCountry(String country) {
+            this.country = country;
+        }
+
+        /**
+         * @return Returns the language.
+         */
+        public String getLanguage() {
+            return language;
+        }
+
+        /**
+         * @param language The language to set.
+         */
+        public void setLanguage(String language) {
+            this.language = language;
+        }
+    }
+
+    /**
+     * Inner class that stores the UIFont information of a ServicInfo request.
+     *
+     * @author jcarrasco
+     *
+     */
+    public class ServiceInformationUIFont implements Cloneable {
+        private String name;
+        private String color;
+        private String size;
+        private String style;
+
+        public ServiceInformationUIFont() {
+            name = new String();
+            color = new String();
+            size = new String();
+            style = new String();
+        }
+
+        public Object clone() {
+            ServiceInformationUIFont siuf = new ServiceInformationUIFont();
+            siuf.setColor(this.color);
+            siuf.setName(this.name);
+            siuf.setSize(this.size);
+            siuf.setStyle(this.style);
+
+            return siuf;
+        }
+
+        /**
+         * @return Returns the color.
+         */
+        public String getColor() {
+            return color;
+        }
+
+        /**
+         * @param color The color to set.
+         */
+        public void setColor(String color) {
+            this.color = color;
+        }
+
+        /**
+         * @return Returns the name.
+         */
+        public String getName() {
+            return name;
+        }
+
+        /**
+         * @param name The name to set.
+         */
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        /**
+         * @return Returns the size.
+         */
+        public String getSize() {
+            return size;
+        }
+
+        /**
+         * @param size The size to set.
+         */
+        public void setSize(String size) {
+            this.size = size;
+        }
+
+        /**
+         * @return Returns the style.
+         */
+        public String getStyle() {
+            return style;
+        }
+
+        /**
+         * @param style The style to set.
+         */
+        public void setStyle(String style) {
+            this.style = style;
+        }
+    }
+
+    /**
+     * Inner class that stores the Separators information of a ServicInfo
+     * request.
+     *
+     * @author jcarrasco
+     *
+     */
+    public class ServiceInformationSeparators implements Cloneable {
+        /**
+         * Coordinate separator is used to separate an x-coordinate from a y-coordinate.
+         */
+        private String cs;
+
+        /**
+         * Tuple separator is used to separate coordinate pairs and string lists.
+         */
+        private String ts;
+
+        /**
+         * Decimal separator is used to separate integer part from the decimal part
+         * of a float/double number. It will be determined from the language/country
+         * information of the service. The default value is '.'.
+         */
+        private char ds;
+
+        public ServiceInformationSeparators() {
+            cs = new String();
+            ts = new String();
+            ds = 'c';
+        }
+
+        public Object clone() {
+            ServiceInformationSeparators sis = new ServiceInformationSeparators();
+            sis.setCs(this.getCs());
+            sis.setDs(this.getDs());
+            sis.setTs(this.getTs());
+
+            return sis;
+        }
+
+        /**
+         * @return Returns the Coordinate Separator.
+         */
+        public String getCs() {
+            return cs;
+        }
+
+        /**
+         * @param cs The cs to set.
+         */
+        public void setCs(String cs) {
+            this.cs = cs;
+        }
+
+        /**
+         * @return Returns the Decimal Separator.
+         */
+        public char getDs() {
+            return ds;
+        }
+
+        /**
+         * @param ds The ds to set.
+         */
+        public void setDs(char ds) {
+            this.ds = ds;
+        }
+
+        /**
+         * @return Returns the Tuple Separator.
+         */
+        public String getTs() {
+            return ts;
+        }
+
+        /**
+         * @param ts The ts to set.
+         */
+        public void setTs(String ts) {
+            this.ts = ts;
+        }
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformation.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerImage.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerImage.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerImage.java	(revision 8301)
@@ -0,0 +1,64 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ * Class that stores a layer information of a raster image
+ *
+ * @author jsanz
+ *
+ */
+public class ServiceInformationLayerImage extends ServiceInformationLayer {
+    public ServiceInformationLayerImage() {
+        this.type = ServiceInfoTags.vLAYERTYPE_I;
+    }
+
+    public String toString() {
+        String out;
+        out = "Layer: " + this.name + "\t(" + this.type + ")";
+
+        return out;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ServiceInformationLayerImage.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsDownloadUtils.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsDownloadUtils.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsDownloadUtils.java	(revision 8301)
@@ -0,0 +1,505 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.utils;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.ArcImsStatus;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+
+import java.net.ConnectException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.net.UnknownHostException;
+
+import java.util.Hashtable;
+
+
+/**
+ * These download methods derive from those in
+ * <tt>org.gvsig.remoteClient.arcims.utils.Utilities<tt>
+ * and have been modified to prevent multiple downloads of the same image when
+ * using an ArcIMS server, because the remote image's URL is not the
+ * same when requesting the same map twice.
+ *
+ * @author jldominguez
+ *
+ */
+
+/**
+ * @author jsanz
+ *
+ */
+public class ArcImsDownloadUtils {
+    private static Logger logger = Logger.getLogger(ArcImsDownloadUtils.class.getName());
+    private static Hashtable downloadedFiles;
+    private static final String tempDirectoryPath = System.getProperty(
+            "java.io.tmpdir") + "/tmp-andami";
+
+    /**
+     * Returns the content of this URL as a file from the file system.<br>
+     * <p>
+     * If the URL has been already downloaded in this session and notified to
+     * the system using the static <b>Utilities.addDownloadedURL(URL)</b>
+     * method, it can be restored faster from the file system avoiding to
+     * download it again.
+     * </p>
+     *
+     * @param virtualUrl
+     * @param override If false, the file won't be downloaded
+     * @return File containing this URL's content or null if no file was found.
+     */
+    private static File getPreviousDownloadedURL(URL virtualUrl,
+        boolean override) {
+        File f = null;
+
+        if ((downloadedFiles != null) &&
+                downloadedFiles.containsKey(virtualUrl) && !override) {
+            String filePath = (String) downloadedFiles.get(virtualUrl);
+            f = new File(filePath);
+        }
+
+        return f;
+    }
+
+    /**
+     * Returns the content of this URL as a file from the file system.<br>
+     * <p>
+     * If the URL has been already downloaded in this session and notified to
+     * the system using the static <b>Utilities.addDownloadedURL(URL)</b>
+     * method, it can be restored faster from the file system avoiding to
+     * download it again.
+     * </p>
+     * This overrided method doesn't require the boolean parameter
+     * @see #getPreviousDownloadedURL(URL, boolean)
+     * @param virtualUrl
+     * @return File containing this URL's content or null if no file was found.
+     */
+    private static File getPreviousDownloadedURL(URL virtualUrl) {
+        return getPreviousDownloadedURL(virtualUrl, false);
+    }
+
+    /**
+     * Downloads an URL into a temporary file that is removed the next time the
+     * tempFileManager class is called, which means the next time gvSIG is
+     * launched.
+     *
+     * @param url
+     * @param  virtualURL The virtual URL that identifies the file in the internal cache
+     * @param filePath Where the file will be downloaded
+     * @return File object of the downloaded file
+     * @throws IOException
+     * @throws ServerErrorResponseException
+     * @throws ConnectException
+     * @throws UnknownHostException
+     */
+    public static File downloadFile(URL url, URL virtualURL, String filePath)
+        throws IOException, ConnectException, UnknownHostException {
+        File f = null;
+        long t1 = System.currentTimeMillis();
+
+        try {
+            if ((f = getPreviousDownloadedURL(virtualURL)) == null) {
+                long t3 = System.currentTimeMillis();
+                File tempDirectory = new File(tempDirectoryPath);
+
+                if (!tempDirectory.exists()) {
+                    tempDirectory.mkdir();
+                }
+
+                //f = new File(tempDirectoryPath + "/" + filePath);
+                String fName = normalizeFileName(filePath);
+                f = new File(tempDirectoryPath + "/" + fName);
+
+                logger.info("downloading '" + url.toString() + "' to: " +
+                    f.getAbsolutePath());
+
+                f.deleteOnExit();
+
+                DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(
+                            new FileOutputStream(f)));
+                byte[] buffer = new byte[1024 * 256];
+                InputStream is = url.openStream();
+                long readed = 0;
+
+                for (int i = is.read(buffer); i > 0; i = is.read(buffer)) {
+                    dos.write(buffer, 0, i);
+                    readed += i;
+                }
+
+                dos.close();
+                addDownloadedURL(virtualURL, f.getAbsolutePath());
+
+                long t4 = System.currentTimeMillis();
+                System.err.println("Download time: " + (t4 - t3));
+            }
+        } catch (IOException io) {
+            io.printStackTrace();
+        }
+
+        // Avoid possible conflits caused by multiple application instances.
+        if (!f.exists()) {
+            downloadedFiles.remove(virtualURL);
+            f = downloadFile(url, virtualURL, filePath);
+        }
+
+        long t2 = System.currentTimeMillis();
+        System.err.println("Total download method time: " + (t2 - t1));
+
+        return f;
+    }
+
+    /**
+     * Downloads an URL into a temporary file that is removed the next time the
+     * tempFileManager class is called, which means the next time gvSIG is
+     * launched.
+     *
+     * @param url
+     * @param filePath Where the file will be downloaded
+     * @return File object of the downloaded file
+     * @throws IOException
+     * @throws ServerErrorResponseException
+     * @throws ConnectException
+     * @throws UnknownHostException
+     */
+    public static File downloadFile(URL url, String filePath)
+        throws IOException, ConnectException, UnknownHostException {
+        File f = null;
+        long t1 = System.currentTimeMillis();
+
+        try {
+            long t3 = System.currentTimeMillis();
+            File tempDirectory = new File(tempDirectoryPath);
+
+            if (!tempDirectory.exists()) {
+                tempDirectory.mkdir();
+            }
+
+            //f = new File(tempDirectoryPath + "/" + filePath);
+            String fName = normalizeFileName(filePath);
+            f = new File(tempDirectoryPath + "/" + fName);
+
+            logger.info("downloading '" + url.toString() + "' to: " +
+                f.getAbsolutePath());
+
+            f.deleteOnExit();
+
+            DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(
+                        new FileOutputStream(f)));
+            byte[] buffer = new byte[1024 * 256];
+            InputStream is = url.openStream();
+            long readed = 0;
+
+            for (int i = is.read(buffer); i > 0; i = is.read(buffer)) {
+                dos.write(buffer, 0, i);
+                readed += i;
+            }
+
+            dos.close();
+
+            long t4 = System.currentTimeMillis();
+            System.err.println("Download time: " + (t4 - t3));
+        } catch (IOException io) {
+            io.printStackTrace();
+        }
+
+        long t2 = System.currentTimeMillis();
+        System.err.println("Total download method time: " + (t2 - t1));
+
+        return f;
+    }
+
+    /**
+     * Adds an URL to the table of downloaded files for further uses. If the URL
+     * already exists in the table its filePath value is updated to the new one
+     * and the old file itself is removed from the file system.
+     *
+     * @param virtualURL
+     * @param filePath
+     */
+    private static void addDownloadedURL(URL virtualURL, String filePath) {
+        if (downloadedFiles == null) {
+            downloadedFiles = new Hashtable();
+        }
+
+        String fileName = (String) downloadedFiles.put(virtualURL, filePath);
+
+        if (fileName != null) {
+            File f = new File(fileName);
+
+            if (f.exists()) {
+                f.delete();
+            }
+        }
+    }
+
+    /**
+     * Sends a XML request to the server as a String and returns the server's
+     * response as a File object
+     *
+     * @param url
+     *            server's URL
+     * @param req
+     *            XML request as a String
+     * @param fName
+     *            the name of the local file which will keep the server's
+     *            response
+     * @param override
+     *                            this boolean sets if the download will be done (true)
+     * @return File object associated to the server's response (and it's
+     *         local name is fName)
+     * @throws ArcImsException
+     */
+    public static File doRequestPost(URL url, String req, String fName,
+        boolean override) throws ArcImsException {
+        File f = null;
+        URL virtualUrl = getVirtualRequestUrlFromUrlAndRequest(url, req);
+
+        if ((f = getPreviousDownloadedURL(virtualUrl, override)) == null) {
+            File tempDirectory = new File(tempDirectoryPath);
+
+            if (!tempDirectory.exists()) {
+                tempDirectory.mkdir();
+            }
+
+            String nfName = normalizeFileName(fName);
+
+            f = new File(tempDirectoryPath + "/" + nfName);
+
+            //			f = new File(tempDirectoryPath + "/" + fName + "."
+            //					+ System.currentTimeMillis());
+            f.deleteOnExit();
+
+            logger.info("downloading '" + url.toString() + "' to: " +
+                f.getAbsolutePath());
+
+            try {
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setDoOutput(true);
+                conn.setRequestMethod("POST");
+                conn.setRequestProperty("Content-type",
+                    "application/x-www-form-urlencoded");
+                conn.setRequestProperty("Content-length", "" + req.length());
+
+                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
+                wr.write(req);
+                wr.flush();
+
+                // Get the response
+                DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(
+                            new FileOutputStream(f)));
+                byte[] buffer = new byte[1024 * 256];
+
+                InputStream is = conn.getInputStream();
+
+                long readed = 0;
+
+                for (int i = is.read(buffer); i > 0; i = is.read(buffer)) {
+                    dos.write(buffer, 0, i);
+                    readed += i;
+                }
+
+                dos.close();
+                is.close();
+                wr.close();
+                addDownloadedURL(virtualUrl, f.getAbsolutePath());
+            } catch (ConnectException ce) {
+                logger.error("Timed out error", ce);
+                throw new ArcImsException("arcims_server_timeout");
+            } catch (FileNotFoundException fe) {
+                logger.error("FileNotFound Error", fe);
+                throw new ArcImsException("arcims_server_error");
+            } catch (IOException e) {
+                logger.error("IO Error", e);
+                throw new ArcImsException("arcims_server_error");
+            }
+        }
+
+        // Avoid possible conflits caused by multiple application instances.
+        if (!f.exists()) {
+            downloadedFiles.remove(virtualUrl);
+            f = doRequestPost(url, req, fName, override);
+        }
+
+        return f;
+    }
+
+    private static String normalizeFileName(String name) {
+        String ret = new String();
+        int indPoint = name.lastIndexOf(".");
+        ret = name.substring(0, indPoint);
+        ret += ("-" + System.currentTimeMillis());
+        ret += ("." + name.substring(indPoint + 1));
+
+        return ret;
+    }
+
+    /**
+     * Sends a XML request to the server as a String and returns the server's
+     * response as a File object
+     *
+     * @param url
+     *            server's URL
+     * @param req
+     *            XML request as a String
+     * @param fName
+     *            the name of the local file which will keep the server's
+     *            response
+     * @return File object associated to the server's response (and it's
+     *         local name is fName)
+     * @throws ArcImsException
+     */
+    public static File doRequestPost(URL url, String req, String fName)
+        throws ArcImsException {
+        return doRequestPost(url, req, fName, false);
+    }
+
+    /**
+     * Sends a POST request to a specified URL and gets a BufferedReader of the contents
+     * @param url
+     * @param post
+     * @return BufferedReaded
+     * @throws ArcImsException
+     */
+    public static InputStream getRemoteIS(URL url, String post)
+        throws ArcImsException {
+        InputStream lector = null;
+
+        try {
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setDoOutput(true);
+            conn.setRequestMethod("POST");
+            conn.setRequestProperty("Content-type",
+                "application/x-www-form-urlencoded");
+            conn.setRequestProperty("Content-length", "" + post.length());
+
+            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
+
+            //Do the POST request
+            wr.write(post);
+            wr.flush();
+
+            //Get the response
+            logger.info("downloading '" + url.toString());
+            lector = conn.getInputStream();
+        } catch (ConnectException e) {
+            logger.error("Timed out error", e);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (ProtocolException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return lector;
+    }
+
+    /**
+     * Returns a virtual URL from status to emulate WMS requests to make unique
+     * requests for every image gvSIG downloads.
+     * @param status @see org.gvsig.remoteClient.arcims.utils.ArcImsStatus
+     * @return URL with the virtual link
+     */
+    public static URL getVirtualUrlFromStatus(ArcImsStatus status) {
+        URL u = null;
+        String r = "http://arcims.image.virtual.url/";
+        r = r + "?Server=";
+        r = r + status.getServer();
+        r = r + "&Service=";
+        r = r + status.getService();
+        r = r + "&LayerIds=";
+        r = r + status.getLayerIds().toString();
+        r = r + "&Extent=";
+        r = r + status.getExtent().toString();
+        r = r + "&Format=";
+        r = r + status.getFormat();
+
+        try {
+            u = new URL(r);
+        } catch (MalformedURLException e) {
+            System.err.println("Error in method getVirtualUrlFromStatus: " +
+                e.getMessage());
+        }
+
+        return u;
+    }
+
+    /**
+     * Returns a virtual URL from status to emulate WMS requests to make unique
+     * requests for every image gvSIG downloads.
+     * @param url
+     * @param request
+     * @return URL with the virtual link
+     */
+    public static URL getVirtualRequestUrlFromUrlAndRequest(URL url,
+        String request) {
+        URL u = null;
+        String r = "http://arcims.request.virtual.url/";
+        r = r + "Url=" + url.toString();
+        r = r + "&Request=";
+        r = r + request;
+
+        try {
+            u = new URL(r);
+        } catch (MalformedURLException e) {
+            System.err.println("Error in methos getVirtualUrlFromStatus: " +
+                e.getMessage());
+        }
+
+        return u;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/ArcImsDownloadUtils.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetVariables.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetVariables.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetVariables.java	(revision 8301)
@@ -0,0 +1,77 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ * Class that stores commands and variables used in GET queries
+ * to an ArcIMS Server
+ * @author jsanz
+ *
+ */
+public class GetVariables {
+    // Commands
+    public static final String COMMAND = "Cmd";
+    public static final String SERVICENAME = "ServiceName";
+    public static final String CUSTOMSERVICE = "CustomService";
+
+    // Values
+    public static final String PING = "Ping";
+    public static final String GETVERSION = "GetVersion";
+    public static final String CATALOG = "catalog";
+    public static final String QUERY = "Query";
+
+    //Candidate Servlets
+    public static final String[] SERVLETS;
+
+    static {
+        SERVLETS = new String[] {
+                new String(""), new String("/servlet/com.esri.esrimap.Esrimap"),
+                new String("/scripts/esrimap.dll"), new String("/.esrimap")
+            };
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/GetVariables.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/FieldInformation.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/FieldInformation.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/FieldInformation.java	(revision 8301)
@@ -0,0 +1,146 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/**
+ *
+ */
+package org.gvsig.remoteClient.arcims.utils;
+
+
+/**
+ * Class that represents the attributes information offered by an ArcIMS Server
+ * @author jsanz
+ */
+public class FieldInformation {
+    //Constants for types
+    public final static int ID = -99;
+    public final static int SHAPE = -98;
+    public final static int BOOLEAN = -7;
+    public final static int BIGINT = -5;
+    public final static int INTEGER = 4;
+    public final static int SMALLINT = 5;
+    public final static int FLOAT = 6;
+    public final static int DOUBLE = 8;
+    public final static int STRING = 12;
+    public final static int DATE = 91;
+
+    /**
+     * Name of the field
+     */
+    private String name;
+
+    /**
+     * Type of field (see static constants)
+     */
+    private int type;
+
+    /**
+     * Field size
+     */
+    private int size;
+
+    /**
+     * Field precision
+     */
+    private int precision;
+
+    /**
+     * @return Returns the name.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name The name to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return Returns the precision.
+     */
+    public int getPrecision() {
+        return precision;
+    }
+
+    /**
+     * @param precision The precision to set.
+     */
+    public void setPrecision(int precision) {
+        this.precision = precision;
+    }
+
+    /**
+     * @return Returns the size.
+     */
+    public int getSize() {
+        return size;
+    }
+
+    /**
+     * @param size The size to set.
+     */
+    public void setSize(int size) {
+        this.size = size;
+    }
+
+    /**
+     * @return Returns the type.
+     */
+    public int getType() {
+        return type;
+    }
+
+    /**
+     * @param type The type to set.
+     */
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String toString() {
+        return "FI: " + name + "(" + type + ")";
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/utils/FieldInformation.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsImageClient.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsImageClient.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsImageClient.java	(revision 8301)
@@ -0,0 +1,82 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.exceptions.ServerErrorException;
+
+import java.io.File;
+
+
+/**
+ * Concrete class to deal with an ArcIMS ImageServer
+ * @author jsanz
+ *
+ */
+public class ArcImsImageClient extends ArcImsClientP {
+    //private ArcImsProtImageHandler handler;
+    public ArcImsImageClient(String host, String service, String serviceType) {
+        super(host, service, serviceType);
+    }
+
+    /**
+    * <p>One of the three interfaces that  ArcIms defines. Request a map.</p>
+    * @throws ServerErrorException
+    */
+    public File getMap(ArcImsStatus status)
+        throws ArcImsException, ServerErrorException {
+        File f = ((ArcImsProtImageHandler) handler).getMap(status);
+
+        if (f != null) {
+            return f;
+        } else {
+            throw new ArcImsException("arcims_remote_not_found");
+        }
+    }
+
+    public boolean testFromat(ArcImsStatus status, String format)
+        throws ArcImsException {
+        return ((ArcImsProtImageHandler) handler).testFormat(status, format);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsImageClient.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/arcims_4_0_1/ArcImsStyle4_0_1.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/arcims_4_0_1/ArcImsStyle4_0_1.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/arcims_4_0_1/ArcImsStyle4_0_1.java	(revision 8301)
@@ -0,0 +1,108 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims.arcims_4_0_1;
+
+import org.gvsig.remoteClient.utils.CapabilitiesTags;
+
+import org.kxml2.io.KXmlParser;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+
+/**
+ * <p>Represents the layer style defined by the Specifications for ArcIms 4.0.1</p>
+ *
+ */
+public class ArcImsStyle4_0_1 extends org.gvsig.remoteClient.arcims.ArcImsStyle {
+    /**
+     * <p>URL pointing to the legend for a layer with this style</p>
+     */
+
+    /**
+     * <p>Parses the STYLE TAG according with the OGC Specifications for the ArcIms 1.1.1</p>
+     */
+    public void parse(KXmlParser parser)
+        throws IOException, XmlPullParserException {
+        int currentTag;
+        boolean end = false;
+
+        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.STYLE);
+        currentTag = parser.nextTag();
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                if (parser.getName().compareTo(CapabilitiesTags.NAME) == 0) {
+                    setName(parser.nextText());
+                } else if (parser.getName().compareTo(CapabilitiesTags.TITLE) == 0) {
+                    setTitle(parser.nextText());
+                } else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT) == 0) {
+                    setAbstract(parser.nextText());
+                } else if (parser.getName().compareTo(CapabilitiesTags.LEGENDURL) == 0) {
+                    break;
+                }
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().compareTo(CapabilitiesTags.STYLE) == 0) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.STYLE);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/arcims_4_0_1/ArcImsStyle4_0_1.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStatus.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStatus.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStatus.java	(revision 8301)
@@ -0,0 +1,395 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.*;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+
+import java.awt.geom.Rectangle2D;
+
+import java.util.Vector;
+
+
+/**
+ * Describes the status of a ArcImsclient, so it adds to the Remote client status
+ * a list of layers, a list of layer styles, the extent of the map.
+ * Provides the functionality to modify these lists.
+ * @see org.gvsig.remoteClient.RemoteClientStatus
+ * @author jcarrasco
+ * @author jsanz
+ *
+ */
+public class ArcImsStatus extends RemoteClientStatus implements Cloneable {
+    /**
+     * List of layer to be retrieved by the ArcIms
+     */
+    private Vector layers;
+
+    /**
+     * List of layer styles
+     */
+    private Vector styles;
+
+    /**
+     * Extent required by the ArcIms client
+     */
+    private Rectangle2D extent;
+
+    /**
+     * The ArcIMS Service delivers images with transparency
+     */
+    private boolean transparency;
+    private String onlineResource;
+    private String service;
+    private Vector dimensions;
+    private ServiceInformation serviceInfo;
+    public boolean verbose;
+
+    // Added by jldominguez to allow image identification with
+    // the arcimsstatus variables
+    private String server;
+
+    /**
+     * Constructor
+     *
+     */
+    public ArcImsStatus() {
+        layers = new Vector();
+        styles = new Vector();
+        verbose = false;
+    }
+
+    /**
+     * Retrieves a vector of Dimensions
+     * @return Vector, the list of dimensions
+     */
+    public Vector getDimensions() {
+        return dimensions;
+    }
+
+    /**
+     * Sets the dimensions of the client
+     * @param dimensions A vector of dimensions
+     */
+    public void setDimensions(Vector dimensions) {
+        this.dimensions = dimensions;
+    }
+
+    /**
+     * <p>Retrieves the layer list required by the ArcIms client</p>
+     * @return Vector, the list of layers
+     */
+    public Vector getLayerIds() {
+        return layers;
+    }
+
+    /**
+     * Sets the list of layers required by the ArcIms client
+     * @param _layers Vector, the list of layers to set
+     */
+    public void setLayerIds(Vector _layers) {
+        layers = _layers;
+    }
+
+    /**
+     * <p> Adds a layer to the list of layers required by the ArcIms client</p>
+     * @param alayerName name of the layer to be added.
+     */
+    public void addLayerName(String alayerName) {
+        layers.add(alayerName);
+    }
+
+    /**
+     * <p>Removes a layer from the layer list</p>
+     * @param alayerName
+     * @return true if the layer name has been deleted from the list
+     */
+    public boolean removeLayerName(String alayerName) {
+        return layers.remove(alayerName);
+    }
+
+    /**
+     * <p>Gets the styles list required by the ArcIms client</p>
+     * @return Vector with the list of layer styles
+     */
+    public Vector getStyles() {
+        return styles;
+    }
+
+    /**
+     * <p>sets the styles list required by the ArcIms client</p>
+     *
+     *
+     * @param astyles list to be set as the required styles.
+     */
+    public void setStyles(Vector astyles) {
+        styles = astyles;
+    }
+
+    /**
+     * <p>Adds a style name to the styles list required by the ArcIms client</p>
+     *
+     *
+     * @param aname style name to be added
+     */
+    public void addStyleName(String aname) {
+        styles.add(aname);
+    }
+
+    /**
+     * <p>Removes a style from the list of styles required by the ArcIms client</p>
+     *
+     *
+     * @param aname style name to be removed
+     */
+    public boolean removeStyleName(String aname) {
+        return styles.remove(aname);
+    }
+
+    /**
+     * <p>Gets the extent defined by the map</p>
+     */
+    public Rectangle2D getExtent() {
+        return extent;
+    }
+
+    /**
+     * <p>Sets the extent defined by the map</p>
+     */
+    public void setExtent(Rectangle2D extent) {
+        this.extent = extent;
+    }
+
+    /**
+     * Gets transparency
+     * @return boolean
+     */
+    public boolean getTransparency() {
+        return transparency;
+    }
+
+    /**
+     * Sets transparency
+     * @param arcimsTransparency
+     */
+    public void setTransparency(boolean arcimsTransparency) {
+        transparency = arcimsTransparency;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(Object obj) {
+        if (!(obj instanceof ArcImsStatus)) {
+            return false;
+        }
+
+        ArcImsStatus s = (ArcImsStatus) obj;
+
+        // Compare layer names
+        if (!(((s.getLayerIds() == null) && (this.getLayerIds() == null)) ||
+                s.getLayerIds().equals(this.getLayerIds()))) {
+            return false;
+        }
+
+        // Compare extent
+        if (!(((s.getExtent() == null) && (this.getExtent() == null)) ||
+                s.getExtent().equals(this.getExtent()))) {
+            return false;
+        }
+
+        // Compare height
+        if (s.getHeight() != this.getHeight()) {
+            return false;
+        }
+
+        // Compare width
+        if (s.getWidth() != this.getWidth()) {
+            return false;
+        }
+
+        // Compare styles
+        if (!(((s.getStyles() == null) && (this.getStyles() == null)) ||
+                s.getStyles().equals(this.getStyles()))) {
+            return false;
+        }
+
+        // Compare transparencies
+        if (s.getTransparency() != this.getTransparency()) {
+            return false;
+        }
+
+        // Compare srs
+        if (!(((s.getSrs() == null) && (this.getSrs() == null)) ||
+                s.getSrs().equals(this.getSrs()))) {
+            return false;
+        }
+
+        // Compare exception formats
+        if (!(((s.getExceptionFormat() == null) &&
+                (this.getExceptionFormat() == null)) ||
+                s.getExceptionFormat().equals(this.getExceptionFormat()))) {
+            return false;
+        }
+
+        // Compare formats
+        if (!(((s.getFormat() == null) && (this.getFormat() == null)) ||
+                s.getFormat().equals(this.getFormat()))) {
+            return false;
+        }
+
+        // Compare online resources
+        if (!(((s.getOnlineResource() == null) &&
+                (this.getOnlineResource() == null)) ||
+                s.getOnlineResource().equals(this.getOnlineResource()))) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#clone()
+     */
+    public Object clone() {
+        ArcImsStatus newObject = new ArcImsStatus();
+        Vector v = this.getLayerIds();
+
+        if (v != null) {
+            newObject.setLayerIds((Vector) v.clone());
+        }
+
+        Rectangle2D r = this.getExtent();
+
+        if (r != null) {
+            newObject.setExtent((Rectangle2D) r.clone());
+        }
+
+        newObject.setHeight(this.getHeight());
+        newObject.setWidth(this.getWidth());
+        v = this.getStyles();
+
+        if (v != null) {
+            newObject.setStyles((Vector) v.clone());
+        }
+
+        newObject.setTransparency(this.getTransparency());
+        newObject.setSrs(this.getSrs());
+        newObject.setFormat(this.getFormat());
+        newObject.setOnlineResource(this.getOnlineResource());
+
+        ServiceInformation si = this.getServiceInfo();
+
+        if (si != null) {
+            newObject.setServiceInformation((ServiceInformation) si.clone());
+        }
+
+        return newObject;
+    }
+
+    /**
+     * Returns the URL that the server specified for a ArcIms request if any was described in
+     * its capabilities document.
+     * @return <b>String</b> containing the URL for this operationName or <B>null</B> if none was
+     *                specified.
+     */
+    public String getOnlineResource() {
+        return onlineResource;
+    }
+
+    /**
+     * Sets the string literal containing the URL of an online resource for a specific
+     * ArcIms request.
+     * @param url String containing the URL for the given ArcIms request
+     */
+    public void setOnlineResource(String url) {
+        onlineResource = url;
+    }
+
+    /**
+     * Gets service
+     * @return service
+     */
+    public String getService() {
+        return service;
+    }
+
+    /**
+     * Sets service
+     * @param service
+     */
+    public void setService(String service) {
+        this.service = service;
+    }
+
+    /**
+     * Sets the Service Information object of the status
+     * @param si
+     */
+    public void setServiceInformation(ServiceInformation si) {
+        this.serviceInfo = si;
+    }
+
+    /**
+     * Gets the Servcie Information
+     */
+    public ServiceInformation getServiceInfo() {
+        return serviceInfo;
+    }
+
+    /**
+     * Gets server
+     */
+    public String getServer() {
+        return server;
+    }
+
+    /**
+     * Sets server
+     * @param server
+     */
+    public void setServer(String server) {
+        this.server = server;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStatus.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtImageHandler.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtImageHandler.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtImageHandler.java	(revision 8301)
@@ -0,0 +1,717 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.apache.log4j.Logger;
+
+import org.cresques.cts.IProjection;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.ArcImsDownloadUtils;
+import org.gvsig.remoteClient.arcims.utils.GetImageTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+import org.gvsig.remoteClient.exceptions.ServerErrorException;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+import org.kxml2.io.KXmlParser;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.awt.Rectangle;
+import java.awt.geom.Area;
+import java.awt.geom.Rectangle2D;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import java.net.ConnectException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import java.util.Vector;
+
+
+/**
+ * <p>
+ * Describes the handler to communicate to a ArcIMS ImageServer
+ * </p>
+ */
+public class ArcImsProtImageHandler extends ArcImsProtocolHandler {
+    private static Logger logger = Logger.getLogger(ArcImsProtImageHandler.class.getName());
+
+    /**
+     * Method to obtain the correct extent of the Service in a specific SRS
+     * @param srsFlyr The SRS of the View
+     * @param status
+     * @return Rectangle2D The boundary box of the Service
+     * @throws ArcImsException
+     */
+    public Rectangle2D getServiceExtent(IProjection srsFlyr, ArcImsStatus status)
+        throws ArcImsException {
+        Rectangle2D rect = new Rectangle();
+
+        try {
+            //System.err.println("Requesting the Extent of the Service");
+            URL url = new URL(this.buildCapabilitiesRequest(status));
+
+            /**
+             * The seriveInfo
+             */
+            ServiceInformation si = status.getServiceInfo();
+
+            /**
+            * Gets de Decimal Separator and SRS from the status.ServiceInfo
+            */
+            char ds = si.getSeparators().getDs();
+            String srsSI = si.getFeaturecoordsys();
+
+            /**
+                 * The EPSG code that image requested will have,
+                 * the ArcIMS server will reproject data into this
+                 * code, see <a href="http://www.epsg.org">EPSG</a>
+                 */
+            String srsView = srsFlyr.getAbrev();
+
+            /**
+                 * We suppose that status.getSrs() allways will give a
+                 * string started by this string
+                 */
+            String ini_srs = ServiceInfoTags.vINI_SRS;
+
+            /**
+                 * Assign the srs from the status
+                 * @see org.gvsig.remoteClient.RemoteClientStatus#getSrs()
+                 */
+            if (srsView.startsWith(ini_srs)) {
+                srsView = srsView.substring(ini_srs.length()).trim();
+            }
+
+            /**
+                 * If both SRS are the same or status we pass empty strings
+                 */
+            if (srsView.equalsIgnoreCase(srsSI)) {
+                srsView = "";
+                srsSI = "";
+            }
+
+            /**
+             * Build the custom request for this extent
+             */
+            String request = ArcXMLImage.getCustomExtentRequest(srsSI, 
+                //ServiceInfo SRS
+                null, //envelope 
+                    srsView, //SRS of the view
+                    ds, //Decimal separator
+                    null, //Image size
+                    "", si.getLayer(0).getId() //A valid Layer Id
+                );
+
+            if (status.verbose) {
+                System.err.println(request);
+            }
+
+            logger.info("Requesting Service Extent XML");
+
+            File response = ArcImsDownloadUtils.doRequestPost(url, request,
+                    "getServiceExtent.xml");
+            rect = parseEnvelopeTag(new FileReader(response), ds);
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (FileNotFoundException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return rect;
+    }
+
+    /**
+    * <p>It will send a GetFeatureInfo request to the ArcIms
+    * Parsing the response and redirecting the info to the ArcIms client</p>
+     * @throws ArcImsException
+    */
+    public String getElementInfo(ArcImsStatus status, int x, int y,
+        int featureCount) throws ArcImsException {
+        double iViewX;
+        double iViewY;
+        double iServiceX;
+        double iServiceY;
+        double xReal;
+        double yReal;
+
+        // double dist;
+        int ratio;
+        double currentScale;
+
+        /**
+         * ServiceInformation of the current Service
+         */
+        ServiceInformation si = status.getServiceInfo();
+        char ds = si.getSeparators().getDs();
+
+        /**
+         * Determine the SRS to do all the requests, if the ServiceInformation
+         * doesn't provide a valid SRS, then we use the status srs
+         */
+        String srs = status.getSrs().substring(ServiceInfoTags.vINI_SRS.length())
+                           .trim();
+
+        /**
+         * The geographic extent of the current window
+         */
+        Rectangle2D geoServiceExtent = new Rectangle();
+        Rectangle2D geoViewExtent = status.getExtent();
+
+        /**
+         * If the SRS's are different we need a reprojection, using a properly
+         * formed ArcIms GETIMAGE request
+         */
+        if (!si.getFeaturecoordsys().equalsIgnoreCase(srs)) {
+            try {
+                logger.info("Requesting the Extent of the Image");
+
+                URL url = new URL(this.buildCapabilitiesRequest(status));
+                String request = ArcXMLImage.getCustomExtentRequest(srs,
+                        status.getExtent(), si.getFeaturecoordsys(), ds, null,
+                        "", si.getLayer(0).getId());
+
+                if (status.verbose) {
+                    System.err.println(request);
+                }
+
+                File response = ArcImsDownloadUtils.doRequestPost(url, request,
+                        "getInfoImageExtent.xml");
+                geoServiceExtent = parseEnvelopeTag(new FileReader(response), ds);
+            } catch (MalformedURLException e) {
+                logger.error(e.getMessage(), e);
+                throw new ArcImsException("arcims_server_error");
+            } catch (FileNotFoundException e) {
+                logger.error(e.getMessage(), e);
+                throw new ArcImsException("arcims_server_error");
+            }
+        } else {
+            geoServiceExtent = status.getExtent();
+        }
+
+        /**
+         * URL for the requests of info
+         */
+        URL requestF;
+        URL requestI;
+        URL request;
+
+        /**
+         * StringBuffer to store the POST info to pass to the server
+         */
+        StringBuffer sb = new StringBuffer();
+
+        /**
+         * Vector of Layers IDs to request
+         */
+        Vector idLayers = status.getLayerIds();
+
+        /**
+         * String with the ArcXML request (GET_FEATURES)
+         */
+        String sArcXML = new String();
+
+        /**
+         * First at all, we build the request for this service
+         */
+        try {
+            requestF = new URL(buildGetFeatureInfoRequest(status,
+                        ServiceInfoTags.vLAYERTYPE_F));
+            requestI = new URL(buildGetFeatureInfoRequest(status,
+                        ServiceInfoTags.vLAYERTYPE_I));
+        } catch (Exception e) {
+            e.printStackTrace();
+
+            return "";
+        }
+
+        sb.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
+        sb.append("<FeatureInfoResponse>");
+
+        /**
+         * We need to obtain the real (geographic) x,y not the pixels of the
+         * image, a BoundaryBox of the area we will query, the envelope and
+         * scale of the current view
+         *
+         */
+        ratio = 3;
+        iViewX = geoViewExtent.getWidth() / status.getWidth();
+        iViewY = geoViewExtent.getHeight() / status.getHeight();
+        iServiceX = geoServiceExtent.getWidth() / status.getWidth();
+        iServiceY = geoServiceExtent.getHeight() / status.getHeight();
+        xReal = geoViewExtent.getMinX() + (x * iViewX);
+        yReal = geoViewExtent.getMaxY() - (y * iViewY);
+
+        if (serviceInfo.getScreen_dpi() == -1) {
+            serviceInfo.setScreen_dpi(96);
+        }
+
+        // currentScale = serviceInfo.screen_dpi/INCHES*((iX+iY)/2);
+        currentScale = 1.0 * ((iServiceX + iServiceY) / 2.0);
+
+        /**
+         * Now we are ready to run over the layers to request the info for every
+         * one
+         */
+        Vector ids = status.getLayerIds();
+        int n = ids.size();
+        String fields;
+
+        ServiceInformationLayer sil;
+        ServiceInformationLayer silTemp;
+
+        /*
+         * If ServiceInfo is Assumed we don't pass a valid SRS to
+         * avoid projection problems.
+         */
+        if (si.isSrsAssumed()) {
+            srs = "";
+        }
+
+        logger.info("Searching candidate layers");
+
+        for (int i = 0; i < n; i++) {
+            /**
+             * Before we do any request to the server, we will ensure that the
+             * layer is viewed in the current envelope and scale
+             */
+
+            /**
+             * Retrieve the proper ServiceInformationLayer
+             */
+            sil = silTemp = (ServiceInformationLayer) si.getLayers().get(0);
+
+            for (int j = 0; j < si.getLayers().size(); j++) {
+                silTemp = (ServiceInformationLayer) si.getLayers().get(j);
+
+                if (silTemp.getId().equals(ids.get(i))) {
+                    sil = silTemp;
+
+                    break;
+                }
+            }
+
+            /**
+             * Querying about the scale
+             */
+            boolean inScale = false;
+
+            if (sil.getMinscale() == -1) {
+                if (sil.getMaxscale() == -1) {
+                    inScale = true;
+                } else {
+                    inScale = (currentScale < sil.getMaxscale());
+                }
+            } else {
+                if (sil.getMaxscale() == -1) {
+                    inScale = (currentScale > sil.getMinscale());
+                } else {
+                    inScale = (currentScale > sil.getMinscale()) &&
+                        (currentScale < sil.getMaxscale());
+                }
+            }
+
+            if (inScale) {
+                /**
+                 * Querying about the envelope, we have to ask if geoExtent has
+                 * the Envelope of the layer inside it.
+                 */
+                boolean inEnvelope = false;
+                BoundaryBox mEnv = sil.getEnvelope();
+
+                Area mVentana = new Area((java.awt.Shape) geoServiceExtent);
+                Rectangle2D rectCapa = new Rectangle2D.Double(mEnv.getXmin(),
+                        mEnv.getYmin(), mEnv.getXmax() - mEnv.getXmin(),
+                        mEnv.getYmax() - mEnv.getYmin());
+
+                inEnvelope = mVentana.intersects(rectCapa);
+
+                /**
+                 * If two conditions are true, we do the request
+                 */
+
+                // if (inScale && inEnvelope){
+                if (inEnvelope) {
+                    // System.out.println("Procesando la capa "+ sil.name);
+                    fields = "";
+
+                    /**
+                     * Get the Info request for a featureclass or raster layer
+                     */
+                    double[] coords = { xReal, yReal };
+                    double[] dists = { ratio * iServiceX, ratio * iServiceY };
+                    sArcXML = ArcXMLImage.getInfoRequest(sil.getType(),
+                            idLayers.get(i).toString(), coords, dists, srs,
+                            si.getSeparators().getDs());
+
+                    if (status.verbose) {
+                        System.err.println(sArcXML);
+                    }
+
+                    /**
+                     * File with a layer info response
+                     */
+                    if (sil.getType().equals(ServiceInfoTags.vLAYERTYPE_F)) {
+                        request = requestF;
+                    } else {
+                        request = requestI;
+                    }
+
+                    logger.info("Requesting layer \"" + sil.getName() +
+                        "\" information");
+
+                    File response = ArcImsDownloadUtils.doRequestPost(request,
+                            sArcXML, "getElementInfo.xml");
+
+                    /**
+                     * Now we can parse the file to get the FIELDS element
+                     */
+                    fields = parseFieldsInfoResponse(response);
+
+                    if (!fields.equals("")) {
+                        // System.out.println("Se han encontrado resultados,
+                        // procesando atributos");
+                        sb.append(ArcXML.getLayerHeaderInfoResponse(
+                                ids.get(i).toString(), status.getServiceInfo()));
+
+                        /**
+                         * FIELDS element
+                         */
+                        sb.append(fields.replaceAll("#", "_"));
+
+                        // sb.append("\t\t"+"<FIELDS #IY_PRE=\"1000\"
+                        // #SHAPE#=\"[Geometry]\" #ID#=\"11\" />\r\n");
+                        sb.append(ArcXML.getLayerFooterInfoResponse());
+                    }
+
+                    // else
+                    // System.out.println("No se han encontrado entidades");
+                } // Fin del if de ventana
+                else {
+                    logger.info("Layer \"" + sil.getName() +
+                        "\" is not shown at this envelope");
+                }
+            }
+            // Fin del if de escala
+            else {
+                logger.info("Layer \"" + sil.getName() +
+                    "\" is not shown at this scale");
+            }
+        }
+
+        // Fin del for
+        sb.append("</FeatureInfoResponse>");
+
+        // System.out.println(sb.toString());
+        return sb.toString();
+    }
+
+    /**
+            * Parse the xml data retrieved from the ArcIms, it will parse the ArcIms
+            * Features
+            * @see #getElementInfo(ArcImsStatus, int, int, int)
+            * @param f
+            *            The XML file to parse to obtain the FIELDS element
+            * @return XML with FIELDS or BAND tags as a response to a getElementInfo
+            */
+    private String parseFieldsInfoResponse(File f) {
+        BufferedReader fi;
+        String buf;
+        StringBuffer fields = new StringBuffer();
+        String token = null;
+        int l = 0;
+
+        try {
+            fi = new BufferedReader(new FileReader(f));
+
+            while ((buf = fi.readLine()) != null) {
+                // System.out.println(buf);
+                l++;
+
+                //System.err.println(l);
+                if ((buf.length() > 2) &&
+                        (buf.substring(0, 1).compareTo("<") == 0)) {
+                    token = buf.substring(1); //,l.indexOf(GT));
+
+                    if (token.startsWith("FIELDS")) {
+                        fields.append(buf + "");
+                    }
+
+                    if (token.startsWith("BAND ")) {
+                        fields.append(buf + "");
+                    }
+                }
+            }
+
+            fi.close();
+            System.out.println("Request parsed. (" + l + " lines)");
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException ie) {
+            logger.error("ERROR. (" + l + "lines reeded)");
+            ie.printStackTrace();
+        }
+
+        return fields.toString();
+    }
+
+    /**
+     * <p>Builds a GetMap request that is sent to the ArcIms
+     * the response (image) will be redirect to the
+     * ArcIms client</p>
+     * @param status An  @see ArcImsStatus object
+     * @return File The image requested (a map)
+    * @throws ArcImsException
+    * @throws ServerErrorException
+     */
+    public File getMap(ArcImsStatus status)
+        throws ArcImsException, ServerErrorException {
+        File img = null;
+        String currentImageUrl = "";
+
+        try {
+            URL url = new URL(buildCapabilitiesRequest(status));
+
+            String request = ArcXMLImage.getMapRequest(status);
+
+            if (status.verbose) {
+                System.err.println(request);
+            }
+
+            logger.info("Requesting ArcIMS GetImage XML");
+
+            File response = ArcImsDownloadUtils.doRequestPost(url, request,
+                    "getImage.xml");
+
+            try {
+                currentImageUrl = parseGetImageRequest(new FileReader(response));
+
+                //Control if not /output/blahblah has been passed
+                if (!currentImageUrl.startsWith("http://")) {
+                    String servlet = status.getServer();
+                    int ind1 = servlet.indexOf("//");
+                    int ind = servlet.indexOf("/", ind1 + 2);
+                    currentImageUrl = servlet.substring(0, ind) +
+                        currentImageUrl;
+                }
+            } catch (FileNotFoundException e) {
+                logger.error(e.getMessage(), e);
+                throw new ArcImsException("Fichero remoto no encontrado");
+            }
+
+            URL virtualURL = ArcImsDownloadUtils.getVirtualUrlFromStatus(status);
+            logger.info("Downloading ArcIMS image");
+
+            String[] urlSplitted = currentImageUrl.split("\\.");
+            String extension = urlSplitted[urlSplitted.length - 1];
+            img = ArcImsDownloadUtils.downloadFile(new URL(currentImageUrl),
+                    virtualURL, "getImage." + extension);
+
+            // img =com.iver.andami.Utilities.downloadFile(new URL(currentImageUrl),"getImage");
+            if (img.length() == 0) {
+                return null;
+            }
+
+            // response.delete();
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (ConnectException ce) {
+            logger.error("Timed out error", ce);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (FileNotFoundException fe) {
+            logger.error("FileNotFound Error", fe);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException e) {
+            logger.error("IO Error", e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return img;
+    }
+
+    /**
+     * Method that parses a GET_IMAGE request, sets the
+     * url to download the rendered image.
+     * @param fr
+    * @return @see  org.gvsig.remoteClient.arcims.ArcImsProtImageHandler#getMap(ArcImsStatus)
+    * @throws ArcImsException
+    * @throws ServerErrorException
+     */
+    private String parseGetImageRequest(Reader fr)
+        throws ArcImsException, ServerErrorException {
+        String imageUrl = "";
+        int tag;
+        KXmlParser kxmlParser = new KXmlParser();
+        String value = null;
+
+        try {
+            kxmlParser.setInput(fr);
+            kxmlParser.nextTag();
+
+            if (kxmlParser.getEventType() != KXmlParser.END_DOCUMENT) {
+                kxmlParser.require(KXmlParser.START_TAG, null,
+                    ServiceInfoTags.tARCXML);
+                tag = kxmlParser.nextTag();
+
+                while (tag != KXmlParser.END_DOCUMENT) {
+                    switch (tag) {
+                    case KXmlParser.START_TAG:
+
+                        if (kxmlParser.getName().compareTo(GetImageTags.OUTPUT) == 0) {
+                            value = kxmlParser.getAttributeValue("",
+                                    GetImageTags.URL);
+
+                            if (value != null) {
+                                imageUrl = value;
+                            }
+                        } else if (kxmlParser.getName()
+                                                 .compareTo(ServiceInfoTags.tERROR) == 0) {
+                            throw new ServerErrorException(
+                                "Error parsing GET_IMAGE:\r\n" +
+                                kxmlParser.nextText());
+                        }
+
+                        break;
+
+                    case KXmlParser.END_TAG:
+                        break;
+
+                    case KXmlParser.TEXT:
+                        break;
+                    }
+
+                    tag = kxmlParser.next();
+                }
+
+                kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
+            }
+        } catch (XmlPullParserException parser_ex) {
+            logger.error(parser_ex.getMessage(), parser_ex);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException ioe) {
+            logger.error(ioe.getMessage(), ioe);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return imageUrl;
+    }
+
+    /**
+     * Simple method to test if an ArcIMS server responses with an image
+     * of an specified format
+     * @param status
+     * @return
+     * @throws ArcImsException
+     */
+    public boolean testFormat(ArcImsStatus status, String format)
+        throws ArcImsException {
+        boolean resp = true;
+        URL url;
+
+        try {
+            ServiceInformation si = status.getServiceInfo();
+            url = new URL(this.buildCapabilitiesRequest(status));
+
+            /**
+             * Build the custom request for this extent
+             */
+            String request = ArcXMLImage.getCustomExtentRequest("", // ServiceInfo
+                                                                    // SRS
+                    null, // envelope
+                    "", // SRS of the view
+                    si.getSeparators().getDs(), // Decimal separator
+                    null, // Image size
+                    format, si.getLayer(0).getId() // A valid Layer Id
+                );
+
+            if (status.verbose) {
+                System.err.println(request);
+            }
+
+            logger.info("Querying for a specific format");
+
+            //			BufferedReader lector = ArcImsDownloadUtils.getRemoteReader(url,request);
+            File f = ArcImsDownloadUtils.doRequestPost(url, request,
+                    "testFormat.xml");
+            BufferedReader lector = new BufferedReader(new FileReader(f));
+
+            /**
+             * Loop over the reader until it ends or an ERROR is found
+             */
+            String lin = lector.readLine();
+
+            //The regular expression to match
+            String regex = ".*<" + ServiceInfoTags.tERROR + ".*</" +
+                ServiceInfoTags.tERROR + ">.*";
+
+            do {
+                if (lin.matches(regex)) {
+                    return false;
+                }
+
+                lin = lector.readLine();
+            } while (lin != null);
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_eror");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_eror");
+        }
+
+        return resp;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtImageHandler.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLFeatures.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLFeatures.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLFeatures.java	(revision 8301)
@@ -0,0 +1,500 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+package org.gvsig.remoteClient.arcims;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.utils.GetFeaturesTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+
+import java.awt.geom.Rectangle2D;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class ArcXMLFeatures extends ArcXML {
+    private static Logger logger = Logger.getLogger(ArcXMLFeatures.class.getName());
+
+    /**
+     * Creates a complete request in ArcXML for a FeatureService
+     * from an ArcImsStatus; including extent, SRS and so on
+     * @see org.gvsig.remoteClient.arcims.ArcImsStatus#ArcImsStatus()
+     * @param status
+     * @return
+     */
+    public static String getFeatureLayerRequest(ArcImsVectStatus status) {
+        return getFeatureLayerRequest(status, 0);
+    }
+
+    /**
+     * Creates a complete request in ArcXML for a FeatureService
+     * from an ArcImsStatus; including extent, SRS and so on
+     * @see org.gvsig.remoteClient.arcims.ArcImsStatus#ArcImsStatus()
+     * @param status
+     * @param featCount
+     * @return string
+     */
+    public static String getFeatureLayerRequest(ArcImsVectStatus status,
+        int featCount) {
+        /**
+             * The layer to retrieve
+             */
+        String layerid = (String) status.getLayerIds().get(0);
+
+        /**
+        * Gets the Decimal Separator from the status.ServiceInfo
+        */
+        ServiceInformation si = status.getServiceInfo();
+        char ds = si.getSeparators().getDs();
+
+        /**
+        * The EPSG code that image requested will have,
+        * the ArcIMS server will reproject data into this
+        * code, see <a href="http://www.epsg.org">EPSG</a>
+        */
+        String srsView = new String();
+
+        /**
+             * Is the ServiceInfo FeatureCoordsys assumed?
+             */
+        boolean srsAssumed = si.isSrsAssumed();
+
+        /**
+             * We suppose that status.getSrs() always will give a
+             * string started by this string
+             */
+        String ini_srs = ServiceInfoTags.vINI_SRS;
+
+        /**
+         * Get the minimum distance between points as the mean distance per pixel
+         */
+        Rectangle2D geoExtent = status.getExtent();
+        double iX = geoExtent.getWidth() / status.getWidth();
+        double iY = geoExtent.getHeight() / status.getHeight();
+        double accuracy = 1.0 * ((iX + iY) / 2.0);
+
+        /**
+             * Assign the srs from the status
+             * @see org.gvsig.remoteClient.RemoteClientStatus#getSrs()
+             */
+        if (!srsAssumed && status.getSrs().startsWith(ini_srs)) {
+            srsView = status.getSrs().substring(ini_srs.length()).trim();
+        } else {
+            srsView = "";
+        }
+
+        /**
+         * Where clause to pass to the server
+         */
+        String where = status.getWhere();
+
+        /**
+        * Finally, we can retrieve the correct ArcXML
+        */
+        return getFeaturesRequest(layerid, //layer to retrieve
+            featCount, //beginrecord
+            status.getSubfields(), //subfields
+            where, //where
+            ArcXML.getFilterCoordsys(srsView), //SRS of the service
+            ArcXML.getFeatureCoordsys(srsView), //SRS of the view
+            ArcXML.getEnvelope(geoExtent, ds), //envelope
+            ArcXML.parseNumber(accuracy * GetFeaturesTags.ACCURACY_RATIO, ds), //accuracy multiplied by an arbitrary ratio
+            false, //globalenvelope
+            false, //skipfeatures
+            true //geometries
+        );
+    }
+
+    /**
+     * Method that buids a proper ArcXML based on basi parameters as fields to retrieve,
+     * where condition, etc.
+     * @param layerId
+     * @param subfields
+     * @param where
+     * @param filterCoordsys
+     * @param featureCoordsys
+     * @param envelope
+     * @param globalEnvelope
+     * @param skipfeatures
+     * @param geometry
+     * @return ArcXML request
+     */
+    private static String getFeaturesRequest(String layerId, int featCount,
+        String[] subfields, String where, String filterCoordsys,
+        String featureCoordsys, String envelope, String accuracy,
+        boolean globalEnvelope, boolean skipfeatures, boolean geometry) {
+        String request = new String();
+
+        /**
+         * Build the SUBFIELDS list
+         */
+        String strSubf = new String();
+
+        if (subfields == null) {
+            subfields = new String[1];
+            subfields[0] = "#ALL#";
+        } else {
+            for (int i = 0; i < subfields.length; i++) {
+                strSubf += (subfields[i] + " ");
+            }
+
+            strSubf = strSubf.substring(0, strSubf.length() - 1);
+        }
+
+        /*
+         * With newxml we get FIELDS tag with inner FIELD tag for every field of the attribute table,
+         * this way, we get attribute="#SHAPE#" instead of getting #SHAPE# as a name for an attribute
+         */
+
+        /*
+        request = "<?xml version = '1.0' encoding = 'UTF-8'?>\r\n"
+                        + ArcXML.startRequest("1.1")
+                        + "\t\t<GET_FEATURES envelope=\"true\" checkesc=\"true\" outputmode=\"newxml\" compact=\"true\"";
+        */
+        request = ArcXML.startRequest("1.1") +
+            "\t\t<GET_FEATURES envelope=\"true\" checkesc=\"true\" outputmode=\"newxml\" compact=\"true\"";
+
+        if (featCount > 0) {
+            request += (" beginrecord=\"" + featCount + "\"");
+        }
+
+        if (globalEnvelope) {
+            request += " globalenvelope=\"true\"";
+        } else {
+            request += " globalenvelope=\"false\"";
+        }
+
+        if (skipfeatures) {
+            request += " skipfeatures=\"true\"";
+        } else {
+            request += " skipfeatures=\"false\"";
+        }
+
+        if (geometry) {
+            request += " geometry=\"true\"";
+        } else {
+            request += " geometry=\"false\"";
+        }
+
+        request += (">\r\n" + "\t\t\t<LAYER id=\"" + layerId + "\" />\r\n");
+
+        //Start SPATIALQUERY
+        request += "\t\t\t\t<SPATIALQUERY  searchorder =\"attributefirst\" ";
+
+        //Put accuracy
+        if (!accuracy.equals("")) {
+            request += ("accuracy=\"" + accuracy + "\" ");
+        }
+
+        //Put subfields
+        if (!subfields.equals("")) {
+            request += ("subfields=\"" + strSubf + "\" ");
+        }
+
+        //Put where
+        if (!where.equals("")) {
+            request += ("where=\"" + where + "\" ");
+        }
+
+        //Close SPATIALQUERY
+        request += ">\r\n";
+
+        //Put featureCoordsys
+        if (!featureCoordsys.equals("")) {
+            request += ("\t\t\t\t" + featureCoordsys + "\r\n");
+        }
+
+        //Put filterCoordsys
+        if (!filterCoordsys.equals("")) {
+            request += ("\t\t\t\t" + filterCoordsys + "\r\n");
+        }
+
+        //If envelope exists, put SPATIALFILTER
+        if (!envelope.equals("")) {
+            request += "\t\t\t\t<SPATIALFILTER relation=\"envelope_intersection\">\r\n";
+            request += ("\t\t\t\t" + envelope + "\r\n");
+            request += "\t\t\t\t</SPATIALFILTER>\r\n";
+        }
+
+        //Close SPATIALQUERY
+        request += "\t\t\t\t</SPATIALQUERY>\r\n";
+
+        //Close GET_FEATURES
+        request += "\t\t\t</GET_FEATURES>\r\n";
+
+        //Close request and ArcXML
+        request += ArcXML.endRequest();
+
+        //Return request
+        logger.info("\n\tSUBFIELDS=\t" + strSubf + "\n\tWHERE=\t" + where); //System.err.println(request);
+
+        return request;
+    }
+
+    /**
+     * @param status
+     * @return
+     */
+    public static String getLayerExtentRequest(ArcImsVectStatus status) {
+        /*
+        <?xml version = '1.0' encoding = 'UTF-8'?>
+        <ARCXML version="1.1">
+        <REQUEST>
+        <GET_FEATURES outputmode="newxml" globalenvelope="true" skipfeatures="true">
+                <LAYER id="1" />
+                        <SPATIALQUERY subfields="#ALL#" >
+                                <FEATURECOORDSYS id="4326"/>
+                        </SPATIALQUERY>
+                </GET_FEATURES>
+        </REQUEST>
+        </ARCXML>
+                         */
+
+        /**
+             * The layer to retrieve
+             */
+        String layerid = (String) status.getLayerIds().get(0);
+
+        /**
+        * Gets the ServiceInfo from the status
+        */
+        ServiceInformation si = status.getServiceInfo();
+
+        /**
+        * The EPSG code that image requested will have,
+        * the ArcIMS server will reproject data into this
+        * code, see <a href="http://www.epsg.org">EPSG</a>
+        */
+        String srsView = new String();
+        String srsServ = si.getFeaturecoordsys();
+
+        /**
+             * Is the ServiceInfo FeatureCoordsys assumed?
+             */
+        boolean srsAssumed = si.isSrsAssumed();
+
+        /**
+             * We suppose that status.getSrs() always will give a
+             * string started by this string
+             */
+        String ini_srs = ServiceInfoTags.vINI_SRS;
+
+        /**
+             * Assign the srs from the status
+             * @see org.gvsig.remoteClient.RemoteClientStatus#getSrs()
+             */
+        if (!srsAssumed && status.getSrs().startsWith(ini_srs)) {
+            srsView = status.getSrs().substring(ini_srs.length()).trim();
+        } else {
+            srsView = "";
+            srsServ = "";
+        }
+
+        /**
+             * Create a void subfields array
+             */
+        String[] strSubf = new String[1];
+        strSubf[0] = "";
+
+        /**
+        * Finally, we can retrieve the correct ArcXML
+        */
+        return getFeaturesRequest(layerid, //layer to retrieve
+            0, //beginrecord
+            strSubf, //subfields
+            "", //where
+            ArcXML.getFilterCoordsys(srsServ), //SRS of the service
+            ArcXML.getFeatureCoordsys(srsView), //SRS of the view
+            "", //envelope
+            "", //accuracy
+            true, //globalenvelope
+            true, //skipfeatures
+            false //geometry
+        );
+    }
+
+    public static String getAttributesRequest(ArcImsVectStatus status,
+        int featCount) {
+        /*
+        <?xml version = '1.0' encoding = 'UTF-8'?>
+        <ARCXML version="1.1">
+        <REQUEST>
+        <GET_FEATURES outputmode="newxml" geometry="false" envelope="true" globalenvelope="true">
+        <LAYER id="1" />
+        <SPATIALQUERY subfields="#ALL#" >
+        <FILTERCOORDSYS id="4326"/>
+        <FEATURECOORDSYS id="23030"/>
+        <SPATIALFILTER relation="area_intersection">
+                <ENVELOPE minx="-10" miny="38" maxx="2" maxy="41"/>
+        </SPATIALFILTER>
+        </SPATIALQUERY>
+        </GET_FEATURES>
+        </REQUEST>
+        </ARCXML>
+         */
+
+        /**
+        * The layer to retrieve
+        */
+        String layerid = (String) status.getLayerIds().get(0);
+
+        /**
+        * Gets the Decimal Separator from the status.ServiceInfo
+        */
+        ServiceInformation si = status.getServiceInfo();
+        char ds = si.getSeparators().getDs();
+
+        /**
+        * The EPSG code that image requested will have,
+        * the ArcIMS server will reproject data into this
+        * code, see <a href="http://www.epsg.org">EPSG</a>
+        */
+        String srsView = new String();
+
+        /**
+             * Is the ServiceInfo FeatureCoordsys assumed?
+             */
+        boolean srsAssumed = si.isSrsAssumed();
+
+        /**
+             * We suppose that status.getSrs() always will give a
+             * string started by this string
+             */
+        String ini_srs = ServiceInfoTags.vINI_SRS;
+
+        /**
+             * Assign the srs from the status
+             * @see org.gvsig.remoteClient.RemoteClientStatus#getSrs()
+             */
+        if (!srsAssumed && status.getSrs().startsWith(ini_srs)) {
+            srsView = status.getSrs().substring(ini_srs.length()).trim();
+        } else {
+            srsView = "";
+        }
+
+        /**
+        * Finally, we can retrieve the correct ArcXML
+        */
+        return getFeaturesRequest(layerid, //layer to retrieve
+            featCount + 1, status.getSubfields(), //subfields
+            status.getWhere(), //where
+            ArcXML.getFilterCoordsys(srsView), //SRS of the service
+            ArcXML.getFeatureCoordsys(srsView), //SRS of the view
+            ArcXML.getEnvelope(status.getExtent(), ds), //envelope
+            "", //accuracy
+            true, //GlobalEnvelope
+            false, //SkipFeatures
+            false //geometry
+        );
+    }
+
+    public static String getAttributesRequest(ArcImsVectStatus statusCloned) {
+        return getAttributesRequest(statusCloned, 0);
+    }
+
+    public static String getIdsRequest(ArcImsVectStatus status, int featCount,
+        String idName) {
+        String[] idNameA = { idName };
+
+        /**
+        * Finally, we can retrieve the correct ArcXML
+        */
+        return getFeaturesRequest((String) status.getLayerIds().get(0), //layer to retrieve
+            featCount, idNameA, //subfields
+            status.getWhere(), //where
+            "", //SRS of the service
+            "", //SRS of the view
+            "", //envelope
+            "", //accuracy
+            true, //GlobalEnvelope
+            false, //SkipFeatures
+            false //geometry
+        );
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLFeatures.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandlerFactory.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandlerFactory.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandlerFactory.java	(revision 8301)
@@ -0,0 +1,99 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import java.io.IOException;
+
+import java.net.ConnectException;
+
+
+/**
+ * Factory to create a proper handler based on the service type (ImageServer of FeatureServer)
+ *
+ */
+public class ArcImsProtocolHandlerFactory {
+    /**
+     * Stablishes the type of Handler according with the service type
+     * that will communicate with the server and
+     * returns a convenient ProtocolHandler
+     *
+     * @param servicetype
+     * @return instance of a client that is able to communicate with the host
+     */
+    public static ArcImsProtocolHandler negotiate(String servicetype)
+        throws ConnectException, IOException {
+        return createVersionDriver(servicetype);
+    }
+
+    /**
+     * It creates an instance of a ArcImsProtocolHandler class.
+     *
+     * @param type of the driver to be created
+     * @return ArcImsDriver
+     */
+    private static ArcImsProtocolHandler createVersionDriver(String type) {
+        try {
+            Class driver;
+
+            //           version = version.replace('.', '_');
+            //           driver = Class.forName("org.gvsig.remoteClient.arcims.arcims_"+version+".ArcImsProtocolHandler" + version);
+            if (type.equals(ServiceInfoTags.vIMAGESERVICE)) {
+                driver = Class.forName(
+                        "org.gvsig.remoteClient.arcims.ArcImsProtImageHandler");
+            } else {
+                driver = Class.forName(
+                        "org.gvsig.remoteClient.arcims.ArcImsProtFeatureHandler");
+            }
+
+            return (ArcImsProtocolHandler) driver.newInstance();
+        } catch (Exception e) {
+            e.printStackTrace();
+
+            //throw new Exception("ArcImsDriverFactory. Unknown driver version " + e);
+            return null;
+        }
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandlerFactory.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXML.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXML.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXML.java	(revision 8301)
@@ -0,0 +1,256 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.geom.Rectangle2D;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+
+import java.util.Vector;
+
+
+/**
+ * Class that provides static methods to generate general ArcXML requests
+ * @author jsanz
+ * @author jcarrasco
+ */
+public class ArcXML {
+    public static final String PATRON = new String("0.0########");
+
+    /**
+     * Starting string for an ArcXML request
+     * @param version
+     * @return String
+     */
+    protected static String startRequest(String version) {
+        return "<ARCXML version=\"" + version + "\">\r\n" + "\t<REQUEST>\r\n";
+    }
+
+    /**
+     * Ending string for an ArcXML request
+     * @return string
+     */
+    protected static String endRequest() {
+        return "\t</REQUEST>\r\n" + "</ARCXML>\r\n";
+    }
+
+    /**
+     * Creates the ArcXML request for a Service_Info
+     * @param version
+     * @return String
+     */
+    public static String getServiceInfoRequest(String version) {
+        /**
+         * We will request all the information the server can expose of
+         * its services
+         */
+        String envelope = "true";
+        String fields = "true";
+        String renderer = "true";
+        String extensions = "true";
+
+        return startRequest(version) + "\t\t<GET_SERVICE_INFO envelope=\"" +
+        envelope + "\" fields=\"" + fields + "\" renderer=\"" + renderer +
+        "\"\r\n" + "\t\t\textensions=\"" + extensions + "\" />\r\n" +
+        endRequest();
+    }
+
+    /**
+     * Builds a start LAYER element for a XML response of a GetElementInfo
+     * @see ArcImsProtocolHandler#getElementInfo(ArcImsStatus, int, int, int)
+     * @param id
+     * @param si
+     * @return String, the start tag for the LAYER element
+     */
+    public static String getLayerHeaderInfoResponse(String id,
+        ServiceInformation si) {
+        String name = null;
+        Vector layers = si.getLayers();
+
+        int i = 0;
+        ServiceInformationLayer sil;
+
+        for (i = 0; i < layers.size(); i++) {
+            sil = (ServiceInformationLayer) layers.get(i);
+
+            if (sil.getId().equals(id)) {
+                name = sil.getName();
+
+                break;
+            }
+        }
+
+        return "<LAYER ID=\"" + id + "\" NAME=\"" + name + "\">";
+    }
+
+    /**
+     * Builds a end LAYER element for a XML response of a GetElementInfo
+     * @see ArcImsProtocolHandler#getElementInfo(ArcImsStatus, int, int, int)
+     * @return String, the end tag for the LAYER element
+     */
+    protected static String getLayerFooterInfoResponse() {
+        return "\t</LAYER>\r\n";
+    }
+
+    /**
+     * Creates a ENVELOPE element from a Rectangle2D
+     * @param r Rectangle2D to parse
+     * @param ds with the Decimal separator
+     * @return String with proper ArcXML tags
+     * @see java.awt.geom.Rectangle2D
+     */
+    protected static String getEnvelope(Rectangle2D r, char ds) {
+        if (r == null) {
+            return "";
+        } else {
+            DecimalFormatSymbols dfs = new DecimalFormatSymbols();
+            dfs.setDecimalSeparator(ds);
+
+            DecimalFormat formatter = new DecimalFormat(PATRON, dfs);
+
+            String envelope = new String();
+            envelope = "<ENVELOPE " + "minx=\"" +
+                formatter.format(r.getMinX()) + "\" miny=\"" +
+                formatter.format(r.getMinY()) + "\" maxx=\"" +
+                formatter.format(r.getMaxX()) + "\" maxy=\"" +
+                formatter.format(r.getMaxY()) + "\"/>";
+
+            return envelope;
+        }
+    }
+
+    /**
+     * Creates a IMAGESIZE element from a Dimension object
+     * @param sz Dimension to parse
+     * @return String with proper ArcXML tags
+     * @see java.awt.Dimension
+     */
+    protected static String getImageSize(Dimension sz) {
+        return "<IMAGESIZE width=\"" + sz.width + "\" height=\"" + sz.height +
+        "\" />";
+    }
+
+    /**
+     * Creates the FILTERCOORDSYS element
+     * @param srs The EPSG code
+     * @return String with proper ArcXML tags
+     */
+    protected static String getFilterCoordsys(String srs) {
+        if (!srs.equals("")) {
+            return "<FILTERCOORDSYS id=\"" + srs + "\" />";
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * Creates the FEATURECOORDSYS element based on a EPSG code
+     * @param srs The EPSG code
+     * @return String with proper ArcXML tags
+     */
+    protected static String getFeatureCoordsys(String srs) {
+        if (!srs.equals("")) {
+            return "<FEATURECOORDSYS id=\"" + srs + "\" />";
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * Creates a BACKGROUND color for the ArcIMS service based
+     * on two colors
+     * @param backColor Color for the background
+     * @param transColor Transparent color in the output image
+     * @return String with proper ArcXML tags
+     */
+    protected static String getBackground(java.awt.Color backColor,
+        Color transColor) {
+        String strBackColor = new String(backColor.getRed() + "," +
+                backColor.getGreen() + "," + backColor.getBlue());
+        String strTransColor = new String(transColor.getRed() + "," +
+                transColor.getGreen() + "," + transColor.getBlue());
+
+        return "<BACKGROUND color=\"" + strBackColor + "\" transcolor=\"" +
+        strTransColor + "\"/>";
+    }
+
+    /**
+     * Method that creates a GETCLIENTSERVICES ArcXML to request a complete
+     * list of Services available in an ArcIMS Server
+     * @return String with proper ArcXML tags
+     */
+    public static String getClientServices() {
+        return "<GETCLIENTSERVICES/>";
+    }
+
+    /**
+     * Simple method to get string representations of double numbers
+     * according to a decimal separator
+     * @param number
+     * @param ds
+     * @return
+     */
+    public static String parseNumber(double number, char ds) {
+        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
+        dfs.setDecimalSeparator(ds);
+
+        DecimalFormat formatter = new DecimalFormat(PATRON, dfs);
+
+        return formatter.format(number);
+    }
+
+    public static String replaceUnwantedCharacters(String str) {
+        String resp = str;
+        resp = resp.replace('.', '_');
+        resp = resp.replace('#', 'z');
+
+        return resp;
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXML.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsFeatureClient.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsFeatureClient.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsFeatureClient.java	(revision 8301)
@@ -0,0 +1,117 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.exceptions.ServerErrorException;
+
+import java.awt.geom.Rectangle2D;
+
+import java.util.ArrayList;
+
+
+/**
+ * Class that connects with ArcIMS and retrieves a Feature Layer
+ * @author jsanz
+ *
+ */
+public class ArcImsFeatureClient extends ArcImsClientP {
+    public ArcImsFeatureClient(String host, String service, String serviceType) {
+        super(host, service, serviceType);
+    }
+
+    /**
+     * Requests a map
+     * @param status
+     * @return
+     * @throws ArcImsException
+     * @throws ServerErrorException
+     */
+    public ArrayList getMap(ArcImsVectStatus status)
+        throws ArcImsException, ServerErrorException {
+        return ((ArcImsProtFeatureHandler) handler).getMap(status);
+    }
+
+    /**
+     * Requests service extent in view coordinates
+     * @param status
+     * @param subfields
+     * @return
+     * @throws ArcImsException
+     * @throws ServerErrorException
+     */
+    public Rectangle2D getLayerExtent(ArcImsVectStatus status)
+        throws ArcImsException, ServerErrorException {
+        return ((ArcImsProtFeatureHandler) handler).getLayerExtent(status);
+    }
+
+    /**
+     * @param status
+     * @param subfields
+     * @param where
+     * @param envelope
+     * @return
+     * @throws ArcImsException
+     */
+    public ArrayList getAttributes(ArcImsVectStatus status, String[] subfields,
+        String where, Rectangle2D envelope) throws ArcImsException {
+        return ((ArcImsProtFeatureHandler) handler).getAttributes(status,
+            subfields, where, envelope);
+    }
+
+    /**
+     * @param status
+     * @param subfields
+     * @param where
+     * @param envelope
+     * @return
+     * @throws ArcImsException
+     */
+    public ArrayList getAttributesWithEnvelope(ArcImsVectStatus status,
+        String[] subfields, String where, Rectangle2D envelope)
+        throws ArcImsException {
+        return ((ArcImsProtFeatureHandler) handler).getAttributesWithEnvelope(status,
+            subfields, where, envelope);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsFeatureClient.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLImage.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLImage.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLImage.java	(revision 8301)
@@ -0,0 +1,298 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.geom.Rectangle2D;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+
+import java.util.Vector;
+
+
+/**
+ * Class that provides static methods to generate ImageServer related ArcXML requests
+ * @author jsanz
+ * @author jcarrasco
+ */
+public class ArcXMLImage extends ArcXML {
+    /**
+     * Creates a complete request in ArcXML for an ImageService
+     * from an ArcImsStatus; including extent, format and so on
+     * @see org.gvsig.remoteClient.arcims.ArcImsStatus
+     * @param status
+     * @return String
+     */
+    public static String getMapRequest(ArcImsStatus status) {
+        /**
+             * Layers that we want to request
+             */
+        Vector layers = status.getLayerIds();
+
+        /**
+             * The EPSG code that image requested will have,
+             * the ArcIMS server will reproject data into this
+             * code, see <a href="http://www.epsg.org">EPSG</a>
+             */
+        String srs = new String();
+
+        /**
+             * We suppose that status.getSrs() allways will give a
+             * string started by this string
+             */
+        String ini_srs = ServiceInfoTags.vINI_SRS;
+
+        /**
+             * Gets de Decimal Separator from the status.ServiceInfo
+             */
+        ServiceInformation si = status.getServiceInfo();
+        char ds = si.getSeparators().getDs();
+
+        /**
+             * Is the ServiceInfo FeatureCoordsys assumed?
+             */
+        boolean srsAssumed = si.isSrsAssumed();
+
+        /**
+             * Assign the srs from the status
+             * @see org.gvsig.remoteClient.RemoteClientStatus#getSrs()
+             */
+        if (!srsAssumed && status.getSrs().startsWith(ini_srs)) {
+            srs = status.getSrs().substring(ini_srs.length()).trim();
+        } else {
+            srs = "";
+
+            //System.err.println("The ArcIMS Service doesn't provide a SRS");
+        }
+
+        return getImageRequest(ArcXML.getEnvelope(status.getExtent(), ds), //envelope
+            ArcXML.getFilterCoordsys(srs), //filter
+            ArcXML.getFeatureCoordsys(srs), //feature
+            status.getFormat(), //image format
+            new Dimension(status.getWidth(), status.getHeight()), //image size
+            layers //layers to draw    			
+        );
+    }
+
+    /**
+         * Creates a custom ArcXML request to obtain a request projected by
+         * the ArcIms server
+         * @param  srsInput The SRS of the coordinates provided
+         * @param  srsOutput The SRS of the coordinates needed
+         * @param  envelope Rectangle2D with the envelope provided
+         * @param  ds Char with the Decimal Separator
+         * @param imageSize Dimension object
+         * @param oneLayerId A dumb layer identificator (but valid) of the service
+         * @return String
+         */
+    public static String getCustomExtentRequest(String srsInput,
+        Rectangle2D envelope, String srsOutput, char ds, Dimension imageSize,
+        String format, String oneLayerId) {
+        /**
+             * The returned request
+             */
+        String request = new String();
+
+        /**
+              * To this request we only need a layer, i.e. the first of the service
+              */
+        Vector layer = new Vector(1);
+        layer.add(oneLayerId);
+
+        request = getImageRequest(ArcXML.getEnvelope(envelope, ds), //envelope
+                ArcXML.getFilterCoordsys(srsInput), //filter
+                ArcXML.getFeatureCoordsys(srsOutput), //feature
+                format, //image format
+                imageSize, //image size
+                layer //layers to draw    			
+            );
+
+        return request;
+    }
+
+    /**
+         * Creates a complete request in ArcXML for an ImageService. This private
+         * method is used for every request that needs a GET_IMAGE.
+         *
+         * @see ArcImsStatus
+         * @see org.gvsig.remoteClient.arcims.ArcImsProtImageHandler#getServiceExtent
+         * @param envelope Envelope of the request
+         * @param filterCoordsys SRS of input data
+         * @param featureCoordsys SRS of output data
+         * @param format Image format (PNG,..)
+         * @param imageSize Dimension object with image size to be requested
+         * @param layerIds Vector with layer Ids to retrieve
+         * @return String
+         */
+    private static String getImageRequest(String envelope,
+        String filterCoordsys, String featureCoordsys, String format,
+        Dimension imageSize, Vector layerIds) {
+        /**
+             * Building the heading of the request
+             */
+        String request = new String();
+        request = "<?xml version = '1.0' encoding = 'UTF-8'?>\r\n" +
+            ArcXML.startRequest("1.1") +
+            "\t\t<GET_IMAGE autoresize=\"false\" show=\"layers\">\r\n" +
+            "\t\t\t<PROPERTIES>\r\n";
+
+        if (!envelope.equals("")) {
+            request += ("\t\t\t\t" + envelope + "\r\n");
+        }
+
+        if (imageSize != null) {
+            request += ("\t\t\t\t" + ArcXML.getImageSize(imageSize) + "\r\n");
+        }
+
+        if (!featureCoordsys.equals("")) {
+            request += ("\t\t\t\t" + featureCoordsys + "\r\n");
+        }
+
+        if (!filterCoordsys.equals("")) {
+            request += ("\t\t\t\t" + filterCoordsys + "\r\n");
+        }
+
+        request += ("\t\t\t\t" +
+        ArcXML.getBackground(Color.WHITE, Color.WHITE) + "\r\n");
+
+        if (!format.equals("")) {
+            request += ("\t\t\t\t" + "<OUTPUT type=\"" + format + "\"/>\r\n");
+        }
+
+        //Build the layerlist
+        request += ("\t\t\t\t" + "<LAYERLIST order=\"true\">\r\n");
+
+        //"\t\t\t\t\t"+"<LAYERDEF id=\""+status.getLayerNames()+"\" visible=\"true\"/>\r\n"+
+
+        /**
+                 * Building the string that specifies what layers
+                 * will be requested
+                 */
+        for (int i = 0; i < layerIds.size(); i++) {
+            request += ("\t\t\t\t\t<LAYERDEF id=\"" +
+            layerIds.elementAt(i).toString() + "\" visible=\"true\" />\r\n");
+        }
+
+        /**
+         * Building the end of the request
+         */
+        request += ("\t\t\t\t" + "</LAYERLIST>\r\n" +
+        "\t\t\t</PROPERTIES>\r\n" + "\t\t</GET_IMAGE>\r\n" +
+        ArcXML.endRequest());
+
+        //System.err.println(request);
+        return request;
+    }
+
+    /**
+         * Creates the ArcXML retrieve INFO of a specific location
+         * dependig if the layer is a FEATURECLASS or a IMAGE
+         * @see org.gvsig.remoteClient.arcims.ArcImsProtImageHandler#getElementInfo(ArcImsStatus, int, int, int)
+         * @param layerType A String with the layer type @see org.gvsig.remoteClient.arcims.utils.ServiceInfoTags
+         * @param id The layer id to request
+         * @param coords A pair of coordinates with the center of the request
+         * @param dists A pair of distances to extend the point to a BoundaryBox
+         * @param coordsys A valid EPSG code
+         * @return String with the ArcXML
+         */
+    public static String getInfoRequest(String layerType, String id,
+        double[] coords, double[] dists, String coordsys, char ds) {
+        StringBuffer sb = new StringBuffer();
+        Rectangle2D rect = new Rectangle2D.Double();
+
+        rect.setFrameFromDiagonal(coords[0] - dists[0], coords[1] - dists[1],
+            coords[0] + dists[0], coords[1] + dists[1]);
+
+        if (layerType.equals(ServiceInfoTags.vLAYERTYPE_F)) {
+            sb.append(ArcXML.startRequest("1.1"));
+            sb.append(
+                "\t\t<GET_FEATURES outputmode=\"xml\" checkesc=\"true\" geometry=\"false\" envelope=\"false\">\r\n");
+            sb.append("\t\t\t<LAYER id=\"" + id + "\" />\r\n");
+            sb.append("\t\t\t<SPATIALQUERY subfields=\"#ALL#\" >\r\n");
+
+            if (!coordsys.equals("")) {
+                sb.append("\t\t\t\t" + ArcXML.getFeatureCoordsys(coordsys) +
+                    "\r\n");
+                sb.append("\t\t\t\t" + ArcXML.getFilterCoordsys(coordsys) +
+                    "\r\n");
+            }
+
+            sb.append(
+                "\t\t\t\t<SPATIALFILTER relation=\"area_intersection\">\r\n");
+            sb.append(getEnvelope(rect, ds));
+            sb.append("\t\t\t\t</SPATIALFILTER>\r\n");
+            sb.append("\t\t\t</SPATIALQUERY>\r\n");
+            sb.append("\t\t</GET_FEATURES>\r\n");
+            sb.append(ArcXML.endRequest());
+        } else if (layerType.equals(ServiceInfoTags.vLAYERTYPE_I)) {
+            double xCenter = rect.getCenterX();
+            double yCenter = rect.getCenterY();
+
+            //We need to format these values into the correct encoding
+            DecimalFormatSymbols dfs = new DecimalFormatSymbols();
+            dfs.setDecimalSeparator(ds);
+
+            DecimalFormat formatter = new DecimalFormat(PATRON, dfs);
+
+            String xF = formatter.format(xCenter);
+            String yF = formatter.format(yCenter);
+
+            sb.append(ArcXML.startRequest("1.1"));
+            sb.append("\t\t<GET_RASTER_INFO x=\"" + xF + "\" y=\"" + yF +
+                "\" layerid=\"" + id + "\">\r\n");
+            sb.append("\t\t\t<COORDSYS id=\"" + coordsys + "\"/>\r\n");
+            sb.append("\t\t</GET_RASTER_INFO>\r\n");
+            sb.append(ArcXML.endRequest());
+
+            //			System.err.println(sb.toString());
+        }
+
+        return sb.toString();
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcXMLImage.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsClientP.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsClientP.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsClientP.java	(revision 8301)
@@ -0,0 +1,243 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import com.iver.cit.gvsig.fmap.rendering.Legend;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.RasterClient;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.wms.ICancellable;
+
+import java.net.URL;
+
+import java.util.TreeMap;
+
+
+/**
+ * Abstract class the with the necessary logic
+ * to connect to a ArcIms and interpretate the data.
+ *
+ * The P at the end of the name is to avoid conflict with existing empty
+ * class at libRemoteServices package @seeorg.gvsig.remoteClient.arcims.ArcImsClient
+ *
+ */
+public abstract class ArcImsClientP extends RasterClient {
+    private static Logger logger = Logger.getLogger(ArcImsProtocolHandler.class.getName());
+
+    /**
+     * Handler of the service used by the client to contact with ArcIMS
+     * @see ArcImsProtocolHandler#ArcImsProtocolHandler()
+     */
+    protected ArcImsProtocolHandler handler;
+
+    /**
+     * Layers of the service
+     */
+    private TreeMap layers = new TreeMap();
+
+    //    /**
+    //     * Version and build number of the ArcIMS Server. This data is only 
+    //     * for information purposes as the ArcXML is (at this time) fully compatible with 
+    //     * 4 and 9 versions of ArcIMS.
+    //     */
+    //    private String[] version = new String[2]; 
+
+    /**
+    * Constructor.
+    * the parameter host, indicates the ArcIms host to connect.
+    * */
+    public ArcImsClientP(String host, String service, String serviceType) {
+        //m_log = LogManager.getLogManager().getLogger(getClass().getName());
+        setHost(host);
+        setServiceName(service);
+
+        try {
+            handler = ArcImsProtocolHandlerFactory.negotiate(serviceType);
+
+            //handler = new org.gvsig.remoteClient.arcims.
+            handler.setHost(host);
+            handler.setService(service);
+            handler.serviceInfo.setType(serviceType);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * <p>One of the three interfaces that  ArcIms defines. Request a map.</p>
+     * @throws ServerErrorException
+     * @throws ArcImsException
+     * @throws ServerErrorException
+     */
+
+    //public abstract File getMap(ArcImsStatus status) throws ArcImsException, ServerErrorException;
+
+    /**
+     * <p>One of the three interfaces defined by  ArcIms, it gets the service capabilities</p>
+     *
+     */
+    public void getCapabilities(ArcImsStatus status) throws ArcImsException {
+        handler.getCapabilities(status);
+
+        layers = handler.layers;
+
+        // rootLayer = handler.rootLayer;
+    }
+
+    /**
+     * <p>One of the three interfaces defined by  ArcIms, it gets the service capabilities</p>
+     *
+     */
+
+    /*
+    public void getCapabilities(URL url) {
+        handler.getCapabilities(url);
+        layers = handler.layers;
+        rootLayer = handler.rootLayer;
+    }
+    */
+
+    /**
+     * <p>One of the three interfaces defined by the  ArcIms,
+     * it gets the information about a feature requested</p>
+     * @return  Proper XML to build the Element Info GUI
+     */
+    public String getFeatureInfo(ArcImsStatus status, int x, int y,
+        int featureCount) throws ArcImsException {
+        return handler.getElementInfo(status, x, y, featureCount);
+    }
+
+    /**
+     * <p> Reads from the ArcIms Capabilities, the layers available in the service</p>
+     * @return a TreeMap with the available layers in the ArcIms
+     */
+    public TreeMap getLayers() {
+        return layers;
+    }
+
+    /**
+     * <p>Reads from the ArcIms Capabilities the number if layers available in the service</p>
+     * @return number of layers available
+     */
+    public int getNumberOfLayers() {
+        if (layers != null) {
+            return layers.size();
+        }
+
+        return 0;
+    }
+
+    /**
+     * <p>Gets the image formats available in the Service to retrieve the maps</p>
+     * @return a vector with all the available formats
+     */
+    public boolean isQueryable() {
+        return handler.getServiceInformation().isQueryable();
+    }
+
+    public void close() {
+        // your code here
+    }
+
+    /**
+     * Gets the Service information included in the Capabilities
+     * */
+    public ServiceInformation getServiceInformation() {
+        return handler.getServiceInformation();
+    }
+
+    /**
+     * <p>Checks the connection to de remote ArcIms and requests its capabilities.</p>
+     *
+     */
+    public boolean connect(ICancellable cancel) {
+        try {
+            if (handler == null) {
+                if (getHost().trim().length() > 0) {
+                    handler.setHost(getHost());
+                } else {
+                    //must to specify host first!!!!
+                    return false;
+                }
+            }
+
+            getCapabilities(null);
+
+            return true;
+        } catch (Exception e) {
+            logger.error("While connecting", e);
+
+            return false;
+        }
+    }
+
+    public boolean connect(URL server, ICancellable cancel) {
+        setHost(server.toString());
+
+        return connect(cancel);
+    }
+
+    /**
+     * Returns the handler.
+     * @return The handler
+     */
+    public ArcImsProtocolHandler getHandler() {
+        return handler;
+    }
+
+    /**
+     * Method called to obtain the Legend for an ArcIMS layer ID
+     * @see es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS#setInitialLegend()
+     * @param layerId
+     * @return
+     * @throws ArcImsException
+     */
+    public Legend getLegend(String layerId) throws ArcImsException {
+        return handler.getLegend(layerId);
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsClientP.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtFeatureHandler.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtFeatureHandler.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtFeatureHandler.java	(revision 8301)
@@ -0,0 +1,1137 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import com.hardcode.gdbms.engine.values.Value;
+
+import com.iver.cit.gvsig.fmap.core.DefaultFeature;
+import com.iver.cit.gvsig.fmap.core.FMultiPoint2D;
+import com.iver.cit.gvsig.fmap.core.FPoint2D;
+import com.iver.cit.gvsig.fmap.core.GeneralPathX;
+import com.iver.cit.gvsig.fmap.core.IGeometry;
+import com.iver.cit.gvsig.fmap.core.ShapeFactory;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.ArcImsDownloadUtils;
+import org.gvsig.remoteClient.arcims.utils.ArcImsValueFactory;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+import org.gvsig.remoteClient.arcims.utils.GetFeaturesTags;
+import org.gvsig.remoteClient.arcims.utils.GetImageTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+import org.kxml2.io.KXmlParser;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+
+/**
+ * @author jsanz
+ *
+ */
+public class ArcImsProtFeatureHandler extends ArcImsProtocolHandler {
+    private static boolean hasMore;
+    private static int featCount;
+    private static Logger logger = Logger.getLogger(ArcImsProtFeatureHandler.class.getName());
+
+    /*
+    private ArcImsCache aic;
+    
+    public ArrayList getCacheMap(ArcImsVectStatus status) throws ArcImsException{
+            if (aic==null)
+                    aic = new ArcImsCache(this.getLayerExtent(status),1);
+    
+            aic.addStatus(status);
+    
+            return aic.getGeometries(status);
+    }
+    */
+
+    /**
+     * Method to retrieve an ArrayList of features from an ArcIMS FeatureService
+     *
+     * @param status
+     * @return ArrayList of IFeatures with geometries and Id's to attribute
+     *         table
+     * @throws ArcImsException
+     */
+    public ArrayList getMap(ArcImsVectStatus status) throws ArcImsException {
+        logger.info("Start getMap");
+
+        ArrayList array = new ArrayList();
+
+        try {
+            /*
+             * Build the request
+             */
+            URL url = new URL(buildCapabilitiesRequest(status));
+
+            hasMore = true;
+            featCount = 1;
+
+            while (hasMore) {
+                /*
+                 * Build the proper ArcXML
+                 */
+                String request = ArcXMLFeatures.getFeatureLayerRequest(status,
+                        featCount);
+
+                if (status.verbose) {
+                    System.err.println(request);
+                }
+
+                /*
+                 * Request the reader
+                 */
+                logger.info("Start features downloading");
+
+                File f = ArcImsDownloadUtils.doRequestPost(url, request,
+                        "getFeatures.xml");
+                logger.info("End features downloading");
+
+                /*
+                 * Parse response and add geometries to the general Array
+                 */
+                String layerId = (String) status.getLayerIds().get(0);
+
+                //Deal with UTF-8
+                Reader reader = null;
+                FileInputStream fis = new FileInputStream(f);
+                InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
+                BufferedReader br = new BufferedReader(isr);
+                reader = br;
+
+                logger.debug("Start features with attributes parsing");
+                array.addAll(getFeatures(reader, status.getServiceInfo(),
+                        layerId, status.getSubfields(), 1));
+                logger.debug("End features with attributes parsing");
+            }
+
+            hasMore = true;
+            featCount = 1;
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (FileNotFoundException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (UnsupportedEncodingException e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        logger.debug("End getMap");
+
+        return array;
+    }
+
+    /**
+     * Parse the XML data retrieved from ArcIMS GET_FEATURES request
+     * to get a set of Features if withGeometries is true or an ArrayList of
+     * Value[] if this boolean is false
+     * @param Reader Stream to parse
+     * @param si ServiceInformation with metadata
+     * @param layerId Layer retrieved
+     * @param subfields Subfields retrieved
+     * @param withGeometries Will geometries be parsed?: 0=no 1=yes 2=evelopes
+     * @return ArrayList of IFeatures or Value[]
+     * @throws ArcImsException
+     */
+    private ArrayList getFeatures(Reader lector, ServiceInformation si,
+        String layerId, String[] subfields, int withGeometries)
+        throws ArcImsException {
+        FieldInformation fi = null;
+        ServiceInformationLayerFeatures sil = (ServiceInformationLayerFeatures) si.getLayerById(layerId);
+
+        /*
+         * Prepare a Value array to store every FEATURE tag information
+         */
+        Vector fieldsInfo = null;
+        fieldsInfo = sil.getFieldsInfo();
+
+        //If flag == true, throw an Exception (no layerId found)
+        if (fieldsInfo == null) {
+            throw new ArcImsException("arcims_no_features");
+        }
+
+        //We will store names and types in a hashmap
+        ArrayList fieldsInfoA = new ArrayList();
+
+        /*
+         * If subfields[0] is equal to #ALL we add the entire vector
+         * into the Hasmap
+         */
+        if (subfields[0].equals("#ALL#")) {
+            for (int i = 0; i < fieldsInfo.size(); i++) {
+                fi = ((FieldInformation) fieldsInfo.get(i));
+                fieldsInfoA.add(fi);
+            }
+        } else {
+            for (int i = 0; i < subfields.length; i++) {
+                fi = null;
+                fi = sil.getFieldInformation(subfields[i]);
+
+                if (fi != null) {
+                    fieldsInfoA.add(fi);
+                }
+            }
+        }
+
+        /*
+             * Get the separators
+             */
+        String delCoords = si.getSeparators().getCs();
+        String delTuple = si.getSeparators().getTs();
+        char delDec = si.getSeparators().getDs();
+
+        /*
+         * ArrayList with features
+         */
+        ArrayList features = new ArrayList();
+
+        /*
+         * Start parsing
+         */
+        int tag;
+        KXmlParser kxmlParser = null;
+        kxmlParser = new KXmlParser();
+
+        //FileReader fr = null;
+        IGeometry geom = null;
+        Value[] values = new Value[fieldsInfoA.size()];
+        int[] position = new int[fieldsInfoA.size()];
+
+        //Initialize position array
+        for (int i = 0; i < position.length; i++)
+            position[i] = -1;
+
+        //		long timeFeat = 0;
+        //		long timeGeom = 0;
+        //		long timeTemp = 0;
+        try {
+            kxmlParser.setInput(lector);
+            kxmlParser.nextTag();
+
+            if (kxmlParser.getEventType() != KXmlParser.END_DOCUMENT) {
+                kxmlParser.require(KXmlParser.START_TAG, null,
+                    ServiceInfoTags.tARCXML);
+                tag = kxmlParser.nextTag();
+
+                while (tag != KXmlParser.END_DOCUMENT) {
+                    switch (tag) {
+                    case KXmlParser.START_TAG:
+
+                        if (kxmlParser.getName()
+                                          .compareTo(GetFeaturesTags.FEATURE) == 0) {
+                            /*
+                             * parse FEATURES' tag
+                             */
+
+                            //FIRST ENVELOPE TAG (We hope that ENVELOPE will ALLWAYS be returned at first...)
+                            if (withGeometries == 2) {
+                                //timeTemp = System.currentTimeMillis();
+                                geom = parseEnvelopeFromFeatureTag(kxmlParser,
+                                        delDec);
+                            }
+
+                            //SECOND FIELDS TAG
+                            //timeTemp = System.currentTimeMillis();
+                            values = parseValuesFromFeatureTag(kxmlParser, //the kxml parser
+                                    fieldsInfoA, //Hashmap with names and FieldInformation objects)
+                                    delDec, //the separators
+                                    position //the relative positions of returned values
+                                );
+
+                            //timeFeat += System.currentTimeMillis() - timeTemp;
+
+                            //If geometries are neede we add to the ArrayList the Ifeature
+                            if (withGeometries == 1) {
+                                //THIRD GEOMETRIES
+                                //								timeTemp = System.currentTimeMillis();
+                                geom = parseGeomFromFeatureTag(kxmlParser, //the kxml parser
+                                        delTuple, delCoords,
+                                        delDec //the separators
+                                    );
+
+                                //timeGeom += System.currentTimeMillis() - timeTemp;
+                            }
+
+                            //If some geometry is created, we add a IFeature into features ArrayList
+                            if (withGeometries > 0) {
+                                features.add(new DefaultFeature(geom, values));
+                            }
+                            //Else we only need the Value[] array
+                            else {
+                                features.add(values);
+                            }
+                        } else if (kxmlParser.getName()
+                                                 .compareTo(GetFeaturesTags.FEATURECOUNT) == 0) {
+                            String value = new String();
+
+                            //Get the feature count
+                            value = kxmlParser.getAttributeValue("",
+                                    GetFeaturesTags.COUNT);
+
+                            Integer intFeatCount = new Integer(value);
+                            featCount += intFeatCount.intValue();
+
+                            //Get the hasmore boolean
+                            value = kxmlParser.getAttributeValue("",
+                                    GetFeaturesTags.HASMORE);
+
+                            Boolean boHasMore = new Boolean(value);
+                            hasMore = boHasMore.booleanValue();
+                        } else if (kxmlParser.getName()
+                                                 .compareTo(ServiceInfoTags.tERROR) == 0) {
+                            logger.error("Error parsing GET_FEATURES:\r\n" +
+                                kxmlParser.nextText());
+                            throw new ArcImsException("arcims_server_error");
+                        }
+
+                        break;
+
+                    case KXmlParser.END_TAG:
+                        break;
+
+                    case KXmlParser.TEXT:
+                        break;
+                    }
+
+                    tag = kxmlParser.next();
+                }
+
+                kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
+            }
+        } catch (ParseException pe) {
+            logger.error(pe.getMessage(), pe);
+            throw new ArcImsException("arcims_no_features");
+        } catch (XmlPullParserException parser_ex) {
+            logger.error(parser_ex.getMessage(), parser_ex);
+            throw new ArcImsException("arcims_no_features");
+        } catch (IOException ioe) {
+            logger.error(ioe.getMessage(), ioe);
+            throw new ArcImsException("arcims_no_features");
+        }
+
+        //logger.debug("Time for parsing features " + timeFeat + " msecs");
+        //logger.debug("Time for parsing geometries " + timeGeom + " msecs");
+        return features;
+    }
+
+    /**
+     * Returns an IGeometry with a line between corners of an ENVELOPE
+     * @param parser
+     * @param delDec
+     * @return
+     * @throws XmlPullParserException
+     * @throws IOException
+     */
+    private IGeometry parseEnvelopeFromFeatureTag(KXmlParser parser, char delDec)
+        throws XmlPullParserException, IOException {
+        int currentTag;
+        boolean end = false;
+        int f = 0;
+        String att;
+        String val;
+        int type;
+
+        BoundaryBox bb = null;
+
+        //		parser.require(KXmlParser.START_TAG,null,GetFeaturesTags.FIELDS);
+        currentTag = parser.next();
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                if (parser.getName().equals(ServiceInfoTags.tENVELOPE)) {
+                    bb = super.parseEnvelope(parser, delDec);
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().equals(GetFeaturesTags.FIELDS)) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        //If BoundaryBox object has been created, we can convert it into a IGeometry (polyline).
+        if (bb != null) {
+            GeneralPathX polyline = new GeneralPathX(GeneralPathX.WIND_EVEN_ODD);
+
+            polyline.moveTo(bb.getXmin(), bb.getYmin());
+            polyline.lineTo(bb.getXmax(), bb.getYmax());
+
+            return ShapeFactory.createPolyline2D(polyline);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * @param kxmlParser
+     * @param fieldsInfoH
+     * @param delDec
+     * @param position
+     * @return
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @throws ArcImsException
+     * @throws ParseException
+     */
+    private Value[] parseValuesFromFeatureTag(KXmlParser parser,
+        ArrayList fieldsInfoA, char delDec, int[] position)
+        throws XmlPullParserException, IOException, ArcImsException, 
+            ParseException {
+        int currentTag;
+        boolean end = false;
+        int f = 0;
+        String att;
+        String val;
+        int type;
+
+        Value[] values = new Value[fieldsInfoA.size()];
+
+        //		parser.require(KXmlParser.START_TAG,null,GetFeaturesTags.FIELDS);
+        currentTag = parser.next();
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                if (parser.getName().equals(GetFeaturesTags.FIELD)) {
+                    att = parser.getAttributeValue("", GetFeaturesTags.NAME);
+                    val = parser.getAttributeValue("", GetFeaturesTags.VALUE);
+
+                    /*
+                     * As NAME is known, we need to get the position of that
+                     * attribute into the ArrayList of fieldInformation objects
+                     */
+                    if (position[f] == -1) {
+                        position[f] = getPosition(fieldsInfoA.iterator(), att);
+                    }
+
+                    if (position[f] == -1) {
+                        logger.error("Attribute not found at Metadata");
+                        throw new ArcImsException(
+                            "Attribute not found at Metadata");
+                    }
+
+                    // This way we can create a NullValue
+                    if (val.equals("")) {
+                        val = null;
+                    }
+
+                    /*
+                     * At this point we know wat FieldInfo of the ArrayList we
+                     * have to retrieve
+                     */
+                    type = ((FieldInformation) fieldsInfoA.get(position[f])).getType();
+
+                    // Add the Value into the correct position
+                    values[position[f]] = ArcImsValueFactory.createValueByType(val,
+                            type, delDec);
+
+                    // logger.info(att + " ("+type+")\t" +
+                    // values[f].toString());
+                    f++;
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().equals(GetFeaturesTags.FIELDS)) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        return values;
+    }
+
+    /**
+     * Method to get the position of an attribute into the subfields array
+     *
+     * @param fieldsInfoA
+     * @param att
+     * @return
+     */
+    private int getPosition(Iterator it, String att) {
+        int res = 0;
+        FieldInformation fi;
+
+        while (it.hasNext()) {
+            fi = (FieldInformation) it.next();
+
+            if (fi.getName().equals(att)) {
+                return res;
+            }
+
+            res++;
+        }
+
+        //If no integer has returned at this point we return a -1
+        return -1;
+    }
+
+    /**
+     * Parses the Feature Tag to get a IFeature
+     * @param KxmlParser with the FEATURE tag
+     * @param Value array with the correct subtypes to store FIELDS data
+     * @param String array with the correct fields names to retrieve
+     * @param String with the tuple separator
+     * @param String with the coordinates separator
+     * @param Char with the decimal separator
+     * @return @see com.hardcode.gdbms.engine.values.Value.IFeature
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @throws ArcImsException
+     */
+    private IGeometry parseGeomFromFeatureTag(KXmlParser parser,
+        String delTuple, String delCoords, char delDec)
+        throws IOException, XmlPullParserException, ArcImsException {
+        int currentTag;
+        boolean end = false;
+
+        IGeometry geom = null;
+
+        currentTag = parser.next();
+
+        while (!end) {
+            String featType = parser.getName();
+
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                if (featType.equals(GetFeaturesTags.MULTIPOINT)) {
+                    // Go to COORDS tag
+                    parser.nextTag();
+
+                    if (parser.getName().equals(GetFeaturesTags.COORDS)) {
+                        // Create a tokenizer with the tuples
+                        String strPoints = parser.nextText();
+
+                        // Get the points from COORDS string
+                        ArrayList points = parseCoords(strPoints, delTuple,
+                                delCoords, delDec);
+
+                        //Convert these collections to array of doubles (primitive type)
+                        double[] xD = new double[points.size()];
+                        double[] yD = new double[points.size()];
+
+                        int size = xD.length;
+
+                        for (int i = 0; i < size; i++) {
+                            xD[0] = ((Point2D) points.get(i)).getX();
+                            yD[0] = ((Point2D) points.get(i)).getY();
+                        }
+
+                        //Get the geometry
+
+                        //BUG in 1.0 FMultiPoint2D(double[] x, double[] y)
+                        //						geom = ShapeFactory.createMultipoint2D(xD,yD);
+
+                        //We will use another way to construct the geom object
+                        FPoint2D[] fpoints = new FPoint2D[size];
+
+                        for (int i = 0; i < size; i++) {
+                            fpoints[i] = new FPoint2D(xD[i], yD[i]);
+                        }
+
+                        geom = new FMultiPoint2D(fpoints);
+                    } else {
+                        logger.error("Error parsing MULTIPOINT tag");
+                        throw new ArcImsException("arcims_features_error");
+                    }
+                } else if (featType.equals(GetFeaturesTags.POLYLINE) ||
+                        featType.equals(GetFeaturesTags.POLYGON)) {
+                    //Parse while parser doesn't found </FEATURES> tag
+                    //The GeneralPath to store the different paths
+                    GeneralPathX polyline = new GeneralPathX(GeneralPathX.WIND_EVEN_ODD);
+                    boolean endpol = false;
+
+                    while (!endpol) {
+                        switch (currentTag) {
+                        case KXmlParser.START_TAG:
+
+                            if (parser.getName().equals(GetFeaturesTags.COORDS)) {
+                                // Create a tokenizer with the tuples
+                                String strPoints = parser.nextText();
+
+                                // Get the points (Point2D) from COORDS string
+                                ArrayList points = parseCoords(strPoints,
+                                        delTuple, delCoords, delDec);
+
+                                Iterator it = points.iterator();
+                                Point2D point;
+
+                                //First we MOVE to the first point of the path
+                                point = (Point2D) it.next();
+                                polyline.moveTo(point.getX(), point.getY());
+
+                                //And now we can LINE to the rest of the points of the path
+                                while (it.hasNext()) {
+                                    point = (Point2D) it.next();
+                                    polyline.lineTo(point.getX(), point.getY());
+                                }
+                            }
+
+                            break;
+
+                        case KXmlParser.END_TAG:
+
+                            if (parser.getName().equals(featType)) {
+                                endpol = true;
+                            }
+
+                            break;
+
+                        case KXmlParser.TEXT:
+                            break;
+                        }
+
+                        if (!endpol) {
+                            currentTag = parser.next();
+                        }
+                    }
+
+                    if (featType.equals(GetFeaturesTags.POLYLINE)) {
+                        geom = ShapeFactory.createPolyline2D(polyline);
+                    } else if (featType.equals(GetFeaturesTags.POLYGON)) {
+                        geom = ShapeFactory.createPolygon2D(polyline);
+                    }
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().compareTo(GetFeaturesTags.FEATURE) == 0) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        return geom;
+    }
+
+    /**
+     * Private method that parses a COORDS tag to return an ArrayList of Point2D.Double objects
+     * @param strCoords
+     * @param delTuple
+     * @param delCoords
+     * @param delDec
+     * @return
+     */
+    private ArrayList parseCoords(String strCoords, String delTuple,
+        String delCoords, char delDec) {
+        String tupla = new String();
+        ArrayList points = new ArrayList();
+        String[] tuplaPart;
+        Double x;
+        Double y;
+
+        /*
+         * Replaces Decimal Separator to convert coords to suitable doubles.
+         *
+         * Maybe it will have a better performance if we insert this replace into
+         * the while
+         */
+        if (delDec != '.') {
+            strCoords = strCoords.replace(delDec, '.');
+        }
+
+        //Creates a tokenizer to run over the string
+        StringTokenizer tuplas = new StringTokenizer(strCoords, delTuple, false);
+
+        //Get ArrayLists collections with X's and Y's
+        while (tuplas.hasMoreTokens()) {
+            //			tupla = tuplas.nextToken().replace(delDec,'.');
+            tupla = tuplas.nextToken();
+            tuplaPart = tupla.split(delCoords);
+            x = new Double(tuplaPart[0]);
+            y = new Double(tuplaPart[1]);
+
+            //Version with in-loop replacing
+            /*
+            if (delDec!='.'){
+            x = new Double(tuplaPart[0].replace(delDec,'.'));
+            y = new Double(tuplaPart[1].replace(delDec,'.'));
+            } else{
+            x = new Double(tuplaPart[0]);
+            y = new Double(tuplaPart[1]);
+            }
+             */
+            points.add(new Point2D.Double(x.doubleValue(), y.doubleValue()));
+        }
+
+        //Return an array op Point2D objects
+        return points;
+    }
+
+    /**
+     * @param status
+     * @return
+     * @throws ArcImsException
+     */
+    public Rectangle2D getLayerExtent(ArcImsVectStatus status)
+        throws ArcImsException {
+        Rectangle2D envelope = null;
+        String layerId = (String) status.getLayerIds().get(0);
+
+        //		logger.info("Getting Vectorial Layer Extent (" + status.getl)
+        ServiceInformation si = status.getServiceInfo();
+        String ini_srs = ServiceInfoTags.vINI_SRS;
+
+        String srsView = status.getSrs().substring(ini_srs.length()).trim();
+        String srsServ = si.getFeaturecoordsys();
+        boolean srsAssumed = si.isSrsAssumed();
+
+        if (srsAssumed || (srsView.equals(srsServ))) {
+            BoundaryBox bb = si.getLayerById(layerId).getEnvelope();
+
+            /*
+             * At the end, we convert the BoundaryBox to a Rectangle2D
+             */
+            envelope = new Rectangle2D.Double();
+
+            envelope.setFrameFromDiagonal(bb.getXmin(), bb.getYmin(),
+                bb.getXmax(), bb.getYmax());
+
+            return envelope;
+        }
+
+        /*
+         * If SRS of View and Service are different, we do a custom request to retrieve the
+         * global envelope of the layer
+         */
+        try {
+            /*
+             * Build the request
+             */
+            URL url;
+            url = new URL(buildCapabilitiesRequest(status));
+
+            /*
+             * Build the proper ArcXML
+             */
+            String request = ArcXMLFeatures.getLayerExtentRequest(status);
+
+            if (status.verbose) {
+                System.err.println(request);
+            }
+
+            /*
+             * Request the envelope
+             */
+            File response;
+            response = ArcImsDownloadUtils.doRequestPost(url, request,
+                    "getLayerExtent.xml");
+
+            /*
+             * Parse response and return a Rectangle2D
+             */
+            char ds = si.getSeparators().getDs();
+            envelope = parseEnvelopeTag(new FileReader(response), ds);
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (FileNotFoundException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return envelope;
+    }
+
+    /**
+     * Retrieves an ArrayList of Value arrays. The query can be filtered by a WHERE clause or an
+     * envelope. Only subfields passed will be retrieved
+     * @param status
+     * @param subfields
+     * @param where
+     * @param envelope
+     * @return
+     * @throws ArcImsException
+     */
+    public ArrayList getAttributes(ArcImsVectStatus status, String[] subfields,
+        String where, Rectangle2D envelope) throws ArcImsException {
+        //		//TEST
+        //		try {
+        //			boolean flag = true;
+        //			IntValue iv;
+        //			IdsReader ids = new IdsReader(status, "#ID#");
+        //			while (flag) {
+        //				iv = ids.readId();
+        //				if (iv!=null)
+        //					logger.info("ID = " + iv.intValue());
+        //				else
+        //					flag = false;
+        //			}
+        //		} catch (IOException e) {
+        //			e.printStackTrace();
+        //		} catch (ArcImsException e) {
+        //			e.printStackTrace();
+        //		}
+        logger.info("Start getAttributes");
+
+        ArrayList valuesArray = new ArrayList();
+
+        //Clone the status and set temporal subfields and where clause
+        ArcImsVectStatus statusCloned = status;
+
+        String[] subTemp = status.getSubfields();
+        String whereTemp = status.getWhere();
+        Rectangle2D rectTemp = status.getExtent();
+
+        statusCloned.setSubfields(subfields);
+        statusCloned.setWhere(where);
+        statusCloned.setExtent(envelope);
+
+        try {
+            /*
+             * Build the request
+             */
+            URL url;
+            url = new URL(buildCapabilitiesRequest(statusCloned));
+
+            hasMore = true;
+            featCount = 0;
+
+            while (hasMore) {
+                /*
+                 * Build the proper ArcXML
+                 */
+                String request = ArcXMLFeatures.getAttributesRequest(statusCloned,
+                        featCount);
+
+                if (status.verbose) {
+                    System.err.println(request);
+                }
+
+                //The attributes come from ArcIMS in ASCII/cp1252 encoding
+                boolean withUTF = false;
+
+                //Don't download the file, pass the data directly from the connection
+                boolean withFile = false;
+
+                /*
+                 * Get an InputStream from File or directly from the connection
+                 */
+                InputStream is = null;
+
+                if (withFile) {
+                    File f = ArcImsDownloadUtils.doRequestPost(url, request,
+                            "getAttributes.xml");
+
+                    try {
+                        is = new FileInputStream(f);
+                    } catch (FileNotFoundException e) {
+                        logger.error(e.getMessage(), e);
+                    }
+                } else {
+                    is = ArcImsDownloadUtils.getRemoteIS(url, request);
+                }
+
+                InputStreamReader isr = null;
+
+                if (withUTF) {
+                    //Deal with UTF-8
+                    try {
+                        isr = new InputStreamReader(is, "UTF-8");
+                    } catch (UnsupportedEncodingException e) {
+                        logger.error(e.getMessage(), e);
+                    }
+                } else {
+                    //No deal with UTF-8
+                    isr = new InputStreamReader(is);
+                }
+
+                /*
+                     * Finally, we can create a BufferedReader from the InputStreamReader
+                     */
+                BufferedReader br = new BufferedReader(isr);
+
+                /*
+                 * Parse response and return a Rectangle2D
+                 */
+                String layerId = (String) statusCloned.getLayerIds().get(0);
+                logger.debug("Start attributes downloading and parsing (" +
+                    featCount + ") ids retrieved");
+                valuesArray.addAll(getFeatures(br,
+                        statusCloned.getServiceInfo(), layerId,
+                        statusCloned.getSubfields(), 0));
+                logger.debug("End attributes downloading and parsing");
+            }
+
+            hasMore = true;
+            featCount = 0;
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (ArcImsException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+        finally {
+            status.setSubfields(subTemp);
+            status.setWhere(whereTemp);
+            status.setExtent(rectTemp);
+        }
+
+        logger.debug("End attributes retrieving");
+
+        return valuesArray;
+    }
+
+    /**
+     * Retrieves an ArrayList of I by some IDs. The geometry returned is the envelope
+     * of the feature requested. The query can be filtered by a WHERE clause or an
+     * envelope. Only subfields passed will be retrieved
+     * @param status
+     * @param subfields
+     * @param where
+     * @param envelope
+     * @return
+     * @throws ArcImsException
+     */
+    public ArrayList getAttributesWithEnvelope(ArcImsVectStatus status,
+        String[] subfields, String where, Rectangle2D envelope)
+        throws ArcImsException {
+        //		//TEST
+        //		try {
+        //			boolean flag = true;
+        //			IntValue iv;
+        //			IdsReader ids = new IdsReader(status, "#ID#");
+        //			while (flag) {
+        //				iv = ids.readId();
+        //				if (iv!=null)
+        //					logger.info("ID = " + iv.intValue());
+        //				else
+        //					flag = false;
+        //			}
+        //		} catch (IOException e) {
+        //			e.printStackTrace();
+        //		} catch (ArcImsException e) {
+        //			e.printStackTrace();
+        //		}
+        logger.info("Start getAttributesWihtEnvelope");
+
+        ArrayList valuesArray = new ArrayList();
+
+        //Clone the status and set temporal subfields and where clause
+        ArcImsVectStatus statusCloned = status;
+
+        String[] subTemp = status.getSubfields();
+        String whereTemp = status.getWhere();
+        Rectangle2D rectTemp = status.getExtent();
+
+        statusCloned.setSubfields(subfields);
+        statusCloned.setWhere(where);
+        statusCloned.setExtent(envelope);
+
+        try {
+            /*
+             * Build the request
+             */
+            URL url;
+            url = new URL(buildCapabilitiesRequest(statusCloned));
+
+            hasMore = true;
+            featCount = 0;
+
+            while (hasMore) {
+                /*
+                 * Build the proper ArcXML
+                 */
+                String request = ArcXMLFeatures.getAttributesRequest(statusCloned,
+                        featCount);
+
+                if (status.verbose) {
+                    System.err.println(request);
+                }
+
+                //The attributes come from ArcIMS in ASCII/cp1252 encoding
+                boolean withUTF = false;
+
+                //Don't download the file, pass the data directly from the connection
+                boolean withFile = false;
+
+                /*
+                 * Get an InputStream from File or directly from the connection
+                 */
+                InputStream is = null;
+
+                if (withFile) {
+                    File f = ArcImsDownloadUtils.doRequestPost(url, request,
+                            "getAttributes.xml");
+
+                    try {
+                        is = new FileInputStream(f);
+                    } catch (FileNotFoundException e) {
+                        logger.error(e.getMessage(), e);
+                    }
+                } else {
+                    is = ArcImsDownloadUtils.getRemoteIS(url, request);
+                }
+
+                InputStreamReader isr = null;
+
+                if (withUTF) {
+                    //Deal with UTF-8
+                    try {
+                        isr = new InputStreamReader(is, "UTF-8");
+                    } catch (UnsupportedEncodingException e) {
+                        logger.error(e.getMessage(), e);
+                    }
+                } else {
+                    //No deal with UTF-8
+                    isr = new InputStreamReader(is);
+                }
+
+                /*
+                     * Finally, we can create a BufferedReader from the InputStreamReader
+                     */
+                BufferedReader br = new BufferedReader(isr);
+
+                /*
+                 * Parse response and return a Rectangle2D
+                 */
+                String layerId = (String) statusCloned.getLayerIds().get(0);
+                logger.debug("Start attributes downloading and parsing (" +
+                    featCount + ") ids retrieved");
+                valuesArray.addAll(getFeatures(br,
+                        statusCloned.getServiceInfo(), layerId,
+                        statusCloned.getSubfields(), 2)); //Here we request envelopes instead of geometries
+                logger.debug("End attributes downloading and parsing");
+            }
+
+            hasMore = true;
+            featCount = 0;
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (ArcImsException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+        finally {
+            status.setSubfields(subTemp);
+            status.setWhere(whereTemp);
+            status.setExtent(rectTemp);
+        }
+
+        logger.debug("End attributes retrieving");
+
+        return valuesArray;
+    }
+
+    /* (non-Javadoc)
+     * @see org.gvsig.remoteClient.arcims.ArcImsProtocolHandler#getElementInfo(org.gvsig.remoteClient.arcims.ArcImsStatus, int, int, int)
+     */
+    public String getElementInfo(ArcImsStatus status, int x, int y,
+        int featureCount) throws ArcImsException {
+        throw new ClassCastException(
+            "Invalid request, this method is only valid for Image Services");
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtFeatureHandler.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandler.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandler.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandler.java	(revision 8301)
@@ -0,0 +1,1390 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+package org.gvsig.remoteClient.arcims;
+
+import com.iver.cit.gvsig.fmap.core.v02.FConstant;
+import com.iver.cit.gvsig.fmap.rendering.Legend;
+
+import org.apache.log4j.Logger;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.styling.renderers.ArcImsFLegendFactory;
+import org.gvsig.remoteClient.arcims.styling.renderers.ArcImsRendererFactory;
+import org.gvsig.remoteClient.arcims.styling.renderers.Renderer;
+import org.gvsig.remoteClient.arcims.utils.ArcImsDownloadUtils;
+import org.gvsig.remoteClient.arcims.utils.CatalogInfoTags;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+import org.gvsig.remoteClient.arcims.utils.GetVariables;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerImage;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+import org.kxml2.io.KXmlParser;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.awt.geom.Rectangle2D;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+
+import java.net.ConnectException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import java.text.DecimalFormatSymbols;
+
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.TreeMap;
+import java.util.Vector;
+
+
+/**
+ * Abstract class that represents handlers to comunicate via ArcIms protocol
+ *
+ * @author jsanz
+ * @author jcarrasco
+ *
+ */
+public abstract class ArcImsProtocolHandler {
+    public static final double INCHES = .02540005;
+    private static Logger logger = Logger.getLogger(ArcImsProtocolHandler.class.getName());
+
+    /**
+     * Protocol handler name
+     */
+    protected String name;
+
+    /**
+     * protocol handler version
+     */
+    protected String version;
+
+    /**
+     * host of the ArcIms to connect
+     */
+    protected String host;
+
+    /**
+     * port number of the comunication channel of the ArcIms to connect
+     */
+    protected String port;
+    protected String service;
+
+    /**
+     * ArcIms metadata
+     */
+    protected ServiceInformation serviceInfo;
+    public TreeMap layers;
+
+    //public ArcImsLayer rootLayer;
+    public Vector srs;
+
+    public ArcImsProtocolHandler() {
+        this.version = "4.0.1";
+        this.name = "ArcIms4.0.1";
+        this.serviceInfo = new ServiceInformation();
+        this.layers = new TreeMap();
+    }
+
+    /**
+     * Parse the xml data retrieved from the ArcIms, it will parse the ArcIms Capabilities
+     * @param f the XML file to parse to obtain the ServiceInfo
+     * @throws ArcImsException
+     *
+     */
+    public ServiceInformation parseServiceInfo(ServiceInformation si,File f) throws ArcImsException {
+        Reader reader = null;
+        
+        ServiceInformation my_si = si;
+        
+        try {
+            FileInputStream fis = new FileInputStream(f);
+            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
+            BufferedReader br = new BufferedReader(isr);
+            reader = br;
+        } catch (FileNotFoundException e) {
+            logger.error(e.getMessage(), e);
+        } catch (UnsupportedEncodingException e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        int tag;
+        KXmlParser kxmlParser = null;
+        kxmlParser = new KXmlParser();
+
+        try {
+            kxmlParser.setInput(reader);
+            kxmlParser.nextTag();
+
+            if (kxmlParser.getEventType() != KXmlParser.END_DOCUMENT) {
+                kxmlParser.require(KXmlParser.START_TAG, null,
+                    ServiceInfoTags.tARCXML);
+                tag = kxmlParser.nextTag();
+
+                while (tag != KXmlParser.END_DOCUMENT) {
+                    switch (tag) {
+                    case KXmlParser.START_TAG:
+
+                        String name = kxmlParser.getName();
+
+                        if (name.compareTo(ServiceInfoTags.tENVIRONMENT) == 0) {
+                            parseEnvironmentTag(my_si,kxmlParser);
+                        } else if (name.compareTo(ServiceInfoTags.tPROPERTIES) == 0) {
+                            parsePropertiesTag(my_si,kxmlParser);
+                        } else if (name.compareTo(ServiceInfoTags.tLAYERINFO) == 0) {
+                            parseLayerInfoTag(my_si,kxmlParser);
+                        } else if (name.compareTo(ServiceInfoTags.tERROR) == 0) {
+                            logger.error("Error parsing GET_SERVICE_INFO:\r\n" +
+                                kxmlParser.nextText());
+                            throw new ArcImsException("arcims_catalog_error");
+                        }
+
+                        break;
+
+                    case KXmlParser.END_TAG:
+                        break;
+
+                    case KXmlParser.TEXT:
+                        break;
+                    }
+
+                    tag = kxmlParser.next();
+                }
+
+                kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
+
+                //System.out.println(serviceInfo.layers);
+            }
+        } catch (XmlPullParserException parser_ex) {
+            logger.error("Parser error", parser_ex);
+            throw new ArcImsException("parse_error");
+        } catch (FileNotFoundException fe) {
+            logger.error("FileNotFound Error", fe);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException e) {
+            logger.error("IO Error", e);
+            throw new ArcImsException("arcims_server_error");
+        } catch (NumberFormatException nfe) {
+            logger.warn("NumberFormat Error");
+
+            char dsTemp = my_si.getSeparators().getDs();
+
+            if (dsTemp == '.') {
+                logger.warn("NumberFormat Error, changing . by ,");
+                my_si.getSeparators().setDs(',');
+                my_si = this.parseServiceInfo(my_si,f);
+            } else {
+                if (dsTemp == ',') {
+                    logger.warn("NumberFormat Error, changing , by .");
+                    my_si.getSeparators().setDs('.');
+                    my_si = this.parseServiceInfo(my_si,f);
+                } else {
+                    logger.warn(
+                        "NumberFormat Error: No Decimal Separator found");
+                    throw new ArcImsException("arcims_decimal_error");
+                }
+            }
+
+            //   			throw new ArcImsException("arcims_server_error");
+        } finally {
+        }
+        
+        return my_si;
+    }
+
+    /**
+    * <p>Parses the Environment Information </p>
+     * @param my_si 
+    * @param parser A KXmlParser object to parse
+    * @throws IOException
+    * @throws XmlPullParserException
+    */
+    private void parseEnvironmentTag(ServiceInformation my_si, KXmlParser parser)
+        throws IOException, XmlPullParserException {
+        int currentTag;
+        boolean end = false;
+        ServiceInformation serviceInfo = my_si;
+        
+        parser.require(KXmlParser.START_TAG, null, ServiceInfoTags.tENVIRONMENT);
+        currentTag = parser.next();
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                /*
+                 * Parse the LOCALE tag
+                 */
+                if (parser.getName().compareTo(ServiceInfoTags.tLOCALE) == 0) {
+                    String language = null;
+                    language = parser.getAttributeValue("",
+                            ServiceInfoTags.aLANGUAGE);
+
+                    if (language != null) {
+                        serviceInfo.getLocale().setLanguage(language);
+                    }
+
+                    String country = null;
+                    country = parser.getAttributeValue("",
+                            ServiceInfoTags.aCOUNTRY);
+
+                    if (country != null) {
+                        serviceInfo.getLocale().setCountry(country);
+                    }
+                }
+                /*
+                 * Parse the UIFONT tag
+                 */
+                else if (parser.getName().compareTo(ServiceInfoTags.tUIFONT) == 0) {
+                    String name = null;
+                    name = parser.getAttributeValue("", ServiceInfoTags.aNAME);
+
+                    if (name != null) {
+                        serviceInfo.getUifont().setName(name);
+                    }
+
+                    String color = null;
+                    color = parser.getAttributeValue("", ServiceInfoTags.aCOLOR);
+
+                    if (color != null) {
+                        serviceInfo.getUifont().setColor(color);
+                    }
+
+                    String size = null;
+                    size = parser.getAttributeValue("", ServiceInfoTags.aSIZE);
+
+                    if (name != null) {
+                        serviceInfo.getUifont().setSize(size);
+                    }
+
+                    String style = null;
+                    style = parser.getAttributeValue("", ServiceInfoTags.aSTYLE);
+
+                    if (style != null) {
+                        serviceInfo.getUifont().setStyle(style);
+                    }
+                }
+                /*
+                 * Parse the SEPARATORS tag
+                 */
+                else if (parser.getName().compareTo(ServiceInfoTags.tSEPARATORS) == 0) {
+                    String ts = null;
+                    ts = parser.getAttributeValue("", ServiceInfoTags.aTS);
+
+                    if (ts != null) {
+                        serviceInfo.getSeparators().setTs(ts);
+                    }
+
+                    String cs = null;
+                    cs = parser.getAttributeValue("", ServiceInfoTags.aCS);
+
+                    if (cs != null) {
+                        serviceInfo.getSeparators().setCs(cs);
+                    }
+                }
+                /*
+                 * Parse the SCREEN tag
+                 */
+                else if (parser.getName().compareTo(ServiceInfoTags.tSCREEN) == 0) {
+                    String dpi = null;
+                    dpi = parser.getAttributeValue("", ServiceInfoTags.aDPI);
+
+                    if (dpi != null) {
+                        serviceInfo.setScreen_dpi(Integer.parseInt(dpi));
+                        serviceInfo.setDpiAssumed(false);
+                    }
+                }
+                /*
+                 * Parse the IMAGELIMIT tag
+                 */
+                else if (parser.getName().compareTo(ServiceInfoTags.tIMAGELIMIT) == 0) {
+                    String pixelcount = null;
+                    pixelcount = parser.getAttributeValue("",
+                            ServiceInfoTags.aPIXELCOUNT);
+
+                    if (pixelcount != null) {
+                        serviceInfo.setImagelimit_pixelcount(pixelcount);
+                    }
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().compareTo(ServiceInfoTags.tENVIRONMENT) == 0) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        /*
+             * Sets de decimal separator
+             */
+        if (serviceInfo.getSeparators().getDs() == 'c') {
+            String lang = this.serviceInfo.getLocale().getLanguage();
+            String coun = this.serviceInfo.getLocale().getCountry();
+            Locale local = new Locale(lang, coun);
+            DecimalFormatSymbols dfs = new DecimalFormatSymbols(local);
+            serviceInfo.getSeparators().setDs(dfs.getDecimalSeparator());
+        }
+
+        parser.require(KXmlParser.END_TAG, null, ServiceInfoTags.tENVIRONMENT);
+    }
+
+    /**
+     * <p>Parses the Properties Information </p>
+     * @param my_si 
+     * @param parser A KXmlParser object to parse
+     * @throws IOException
+     * @throws XmlPullParserException
+     */
+    private void parsePropertiesTag(ServiceInformation my_si, KXmlParser parser)
+        throws IOException, XmlPullParserException, NumberFormatException {
+        int currentTag;
+        boolean end = false;
+        
+        ServiceInformation serviceInfo = my_si;
+        
+        parser.require(KXmlParser.START_TAG, null, ServiceInfoTags.tPROPERTIES);
+        currentTag = parser.next();
+
+        char ds = my_si.getSeparators().getDs();
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                /*
+                 * Parse the ENVELOPE tag
+                 */
+                if (parser.getName().compareTo(ServiceInfoTags.tENVELOPE) == 0) {
+                    BoundaryBox parseEnvelope = new BoundaryBox();
+
+                    String value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMINX);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        parseEnvelope.setXmin(Double.parseDouble(value));
+                    }
+
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMINY);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        parseEnvelope.setYmin(Double.parseDouble(value));
+                    }
+
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMAXY);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        parseEnvelope.setYmax(Double.parseDouble(value));
+                    }
+
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMAXX);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        parseEnvelope.setXmax(Double.parseDouble(value));
+                    }
+
+                    /**
+                     * The envelope could be a Initial_Extent or Extent_limit,
+                     * @see ServiceInformation#envelope and @see ServiceInformation#envelopeEL
+                     */
+                    if ((parser.getAttributeValue("", ServiceInfoTags.aNAME) != null) &&
+                            (parser.getAttributeValue("", ServiceInfoTags.aNAME)
+                                       .compareTo(ServiceInfoTags.aENVELOPEEL) == 0)) {
+                        serviceInfo.setEnvelopeEL(parseEnvelope);
+                    } else {
+                        serviceInfo.setEnvelope(parseEnvelope);
+                    }
+                }
+                /*
+                 * Parse the MAPUNITS tag
+                 */
+                else if (parser.getName().compareTo(ServiceInfoTags.tMAPUNITS) == 0) {
+                    String value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aUNITS);
+
+                    if (value != null) {
+                        serviceInfo.setMapunits(value);
+                    }
+                }
+                /*
+                 * Parse the FEATURECOORDSYS tag
+                 */
+                else if (parser.getName()
+                                   .compareTo(ServiceInfoTags.tFEATURECOORDSYS) == 0) {
+                    String value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aID);
+
+                    if (value != null) {
+                        serviceInfo.setFeaturecoordsys(value);
+                        serviceInfo.setSrsAssumed(false);
+                    }
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().compareTo(ServiceInfoTags.tPROPERTIES) == 0) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        parser.require(KXmlParser.END_TAG, null, ServiceInfoTags.tPROPERTIES);
+
+        if (serviceInfo.getFeaturecoordsys().compareTo("") == 0) {
+            serviceInfo.setSrsAssumed(true);
+        }
+
+        //else
+        //System.out.println("JS\t"+serviceInfo.featurecoordsys);
+    }
+
+    /**
+     * <p>Parses the LayerInfo Information </p>
+     * @param my_si 
+     * @param parser A KXmlParser object to parse
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @throws ArcImsException
+     */
+    private void parseLayerInfoTag(ServiceInformation my_si, KXmlParser parser)
+        throws IOException, XmlPullParserException, NumberFormatException, 
+            ArcImsException {
+        String value = null;
+        String type = null;
+        
+        ServiceInformation serviceInfo = my_si;
+        
+        char ds = serviceInfo.getSeparators().getDs();
+
+        // double ratio =
+        // serviceInfo.screen_dpi/ArcImsProtocolHandler.INCHES;
+        ServiceInformationLayer sil;
+
+        type = parser.getAttributeValue("", ServiceInfoTags.aTYPE);
+
+        /**
+         * This way, we can instantiate the proper class
+         */
+        if (type.compareToIgnoreCase(ServiceInfoTags.vLAYERTYPE_F) == 0) {
+            sil = new ServiceInformationLayerFeatures("");
+        } else {
+            sil = new ServiceInformationLayerImage();
+        }
+
+        /**
+         * A this time we can continue parsing
+         */
+        value = parser.getAttributeValue("", ServiceInfoTags.aID);
+
+        if (value != null) {
+            sil.setId(value);
+        }
+
+        value = parser.getAttributeValue("", ServiceInfoTags.aVISIBLE);
+
+        if (value != null) {
+            sil.setVisible(value);
+        }
+
+        value = parser.getAttributeValue("", ServiceInfoTags.aMAXSCALE);
+
+        if (value != null) {
+            if (ds != '.') {
+                value = value.replace(ds, '.');
+            }
+
+            sil.setMaxscale(Double.parseDouble(value));
+        }
+
+        value = parser.getAttributeValue("", ServiceInfoTags.aMINSCALE);
+
+        if (value != null) {
+            if (ds != '.') {
+                value = value.replace(ds, '.');
+            }
+
+            sil.setMinscale(Double.parseDouble(value));
+        }
+
+        value = parser.getAttributeValue("", ServiceInfoTags.aNAME);
+
+        if (value != null) {
+            sil.setName(value);
+        }
+
+        /**
+         * At this time, we can go inside the element to retrieve other child
+         * elements as ENVELOPE
+         */
+        int currentTag;
+        boolean end = false;
+
+        currentTag = parser.next();
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                /**
+                 * Parse the ENVELOPE child element
+                 */
+                if (parser.getName().compareTo(ServiceInfoTags.tENVELOPE) == 0) {
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMINX);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        sil.getEnvelope().setXmin(Double.parseDouble(value));
+                    }
+
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMINY);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        sil.getEnvelope().setYmin(Double.parseDouble(value));
+                    }
+
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMAXX);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        sil.getEnvelope().setXmax(Double.parseDouble(value));
+                    }
+
+                    value = null;
+                    value = parser.getAttributeValue("", ServiceInfoTags.aMAXY);
+
+                    if (value != null) {
+                        if (ds != '.') {
+                            value = value.replace(ds, '.');
+                        }
+
+                        sil.getEnvelope().setYmax(Double.parseDouble(value));
+                    }
+                }
+
+                /**
+                 * Parse FCLASS and FIELD child element if Layer is of type
+                 * LAYERTYPE_F
+                 *
+                 * @see org.gvsig.remoteClient.arcims.utils.ServiceInfoTags#LAYERTYPE_F
+                 */
+                if (type.compareToIgnoreCase(ServiceInfoTags.vLAYERTYPE_F) == 0) {
+                    ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) sil;
+
+                    if (parser.getName().compareTo(ServiceInfoTags.tFCLASS) == 0) {
+                        // FCLASS element
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                ServiceInfoTags.aTYPE);
+
+                        if (value != null) {
+                            silf.setFclasstype(value);
+                        }
+                    } else if (parser.getName().compareTo(ServiceInfoTags.tFIELD) == 0) {
+                        // FIELD element
+                        FieldInformation fieldInfo = new FieldInformation();
+
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                ServiceInfoTags.aNAME);
+
+                        if (value != null) {
+                            fieldInfo.setName(value);
+                        }
+
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                ServiceInfoTags.aTYPE);
+
+                        if (value != null) {
+                            fieldInfo.setType(Integer.parseInt(value));
+                        }
+
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                ServiceInfoTags.aPRECISION);
+
+                        if (value != null) {
+                            fieldInfo.setPrecision(Integer.parseInt(value));
+                        }
+
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                ServiceInfoTags.aSIZE);
+
+                        if (value != null) {
+                            fieldInfo.setSize(Integer.parseInt(value));
+                        }
+
+                        /*
+                         * Now we can add the Field Information into the vector
+                         */
+                        silf.addFieldInformation(fieldInfo);
+                    }
+                    /**
+                     * Parse ArcIMS Symbology definition in a separate private method
+                     */
+                    else if (ArcImsRendererFactory.isRenderer(parser.getName())) {
+                        //Get FConstant type
+                        String fclasstype = silf.getFclasstype();
+                        int ftype = getFType(fclasstype);
+
+                        //Get a factory instance
+                        ArcImsRendererFactory airf = new ArcImsRendererFactory(ftype);
+
+                        //Get the main render
+                        Renderer render = airf.getRenderer(parser);
+
+                        //Assign it to the layer
+                        silf.setLayerMainRenderer(render);
+                    }
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().compareTo(ServiceInfoTags.tLAYERINFO) == 0) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        /**
+         * At the end, we can add the layer to the vector of ServicInformation
+         * layers
+         */
+        serviceInfo.addLayer(sil);
+    }
+
+    /**
+     * Converts ArcIMS feature type to a FConstant value
+     * @param fclasstype
+     * @return
+     */
+    public static int getFType(String fclasstype) {
+        if (fclasstype.equals(ServiceInfoTags.aPOLYGON)) {
+            return FConstant.SHAPE_TYPE_POLYGON;
+        }
+
+        if (fclasstype.equals(ServiceInfoTags.aPOLYLINE)) {
+            return FConstant.SHAPE_TYPE_POLYLINE;
+        }
+
+        if (fclasstype.equals(ServiceInfoTags.aMULTIPOINT)) {
+            return FConstant.SHAPE_TYPE_MULTIPOINT;
+        }
+
+        return FConstant.SHAPE_TYPE_NULL;
+    }
+
+    /**
+     * Method to parse a request to obtain the Extent of a Service
+     * @param reader
+     * @param ds the Decimal Separator
+     * @return Rectangle with the boundary box of the Service
+       * @throws ArcImsException
+     */
+    protected Rectangle2D parseEnvelopeTag(FileReader reader, char ds)
+        throws ArcImsException {
+        BoundaryBox parseEnvelope = new BoundaryBox();
+
+        //char ds = this.serviceInfo.separators.ds;
+        try {
+            KXmlParser parser = new KXmlParser();
+            parser.setInput(reader);
+
+            int currentTag;
+            boolean end = false;
+
+            // parser.require(KXmlParser.START_TAG, null,
+            // ServiceInfoTags.ARCXML);
+            currentTag = parser.next();
+
+            while (!end) {
+                switch (currentTag) {
+                case KXmlParser.START_TAG:
+
+                    /*
+                     * Parse the ENVELOPE tag
+                     */
+                    if (parser.getName().compareTo(ServiceInfoTags.tENVELOPE) == 0) {
+                        parseEnvelope = parseEnvelope(parser, ds);
+                    } else if (parser.getName().compareTo(ServiceInfoTags.tERROR) == 0) {
+                        logger.error("Error requesting Service Extent:\r\n" +
+                            parser.nextText());
+                        throw new ArcImsException("arcims_extent_error");
+                    }
+
+                    break;
+
+                case KXmlParser.END_TAG:
+
+                    if (parser.getName().compareTo(ServiceInfoTags.tARCXML) == 0) {
+                        end = true;
+                    }
+
+                    break;
+
+                case KXmlParser.TEXT:
+                    break;
+                }
+
+                if (!end) {
+                    currentTag = parser.next();
+                }
+            }
+        } catch (XmlPullParserException parser_ex) {
+            parser_ex.printStackTrace();
+        } catch (ConnectException ce) {
+            logger.error("Timed out error", ce);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (FileNotFoundException fe) {
+            logger.error("FileNotFound Error", fe);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException e) {
+            logger.error("IO Error", e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        /*
+         * At the end, we convert the BoundaryBox to a Rectangle2D
+         */
+        Rectangle2D rect = new Rectangle2D.Double();
+
+        rect.setFrameFromDiagonal(parseEnvelope.getXmin(),
+            parseEnvelope.getYmin(), parseEnvelope.getXmax(),
+            parseEnvelope.getYmax());
+
+        return rect;
+    }
+
+    /**
+     * Static method to create a BoundaryBox from a ENVELOPE tag.
+     * @param parser
+     * @param ds
+     * @return
+     */
+    protected static BoundaryBox parseEnvelope(KXmlParser parser, char ds) {
+        BoundaryBox parseEnvelope = new BoundaryBox();
+
+        String value = null;
+        value = parser.getAttributeValue("", ServiceInfoTags.aMINX);
+
+        if (value != null) {
+            if (ds != '.') {
+                value = value.replace(ds, '.');
+            }
+
+            parseEnvelope.setXmin(Double.parseDouble(value));
+        }
+
+        value = null;
+        value = parser.getAttributeValue("", ServiceInfoTags.aMINY);
+
+        if (value != null) {
+            if (ds != '.') {
+                value = value.replace(ds, '.');
+            }
+
+            parseEnvelope.setYmin(Double.parseDouble(value));
+        }
+
+        value = null;
+        value = parser.getAttributeValue("", ServiceInfoTags.aMAXY);
+
+        if (value != null) {
+            if (ds != '.') {
+                value = value.replace(ds, '.');
+            }
+
+            parseEnvelope.setYmax(Double.parseDouble(value));
+        }
+
+        value = null;
+        value = parser.getAttributeValue("", ServiceInfoTags.aMAXX);
+
+        if (value != null) {
+            if (ds != '.') {
+                value = value.replace(ds, '.');
+            }
+
+            parseEnvelope.setXmax(Double.parseDouble(value));
+        }
+
+        return parseEnvelope;
+    }
+
+    /**
+    * Abstract method to retrieve a valid XML of a Query By Point request
+    * @param status
+    * @return Vallid XML to build the Element Info GUI
+    * @throws ArcImsException
+    */
+
+    //public abstract void getMap(ArcImsStatus status);
+    public abstract String getElementInfo(ArcImsStatus status, int x, int y,
+        int featureCount) throws ArcImsException;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public ServiceInformation getServiceInformation() {
+        return this.serviceInfo;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String _host) {
+        host = _host;
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    public void setPort(String _port) {
+        port = _port;
+    }
+
+    /**
+     * Method to request a GET_SERVICE_INFO to an ArcIMS Server
+     * @param status
+     * @throws ArcImsException
+     */
+    public void getCapabilities(ArcImsStatus status) throws ArcImsException {
+        try {
+            String request = ArcXML.getServiceInfoRequest(getVersion());
+
+            URL url = new URL(buildCapabilitiesRequest(status));
+            logger.info("Requesting ArcIMS Service Information");
+
+            File f = ArcImsDownloadUtils.doRequestPost(url, request,
+                    "serviceInfo.xml");
+
+            this.serviceInfo = parseServiceInfo(this.serviceInfo,f);
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+    }
+
+    /**
+     * Builds the GetCapabilitiesRequest according to the ArcIms Specifications stored in
+     * a @see ArcImsStatus object
+     * @param status
+     * @return string A convenient request
+     */
+    protected String buildCapabilitiesRequest(ArcImsStatus status) {
+        StringBuffer req = new StringBuffer();
+
+        String onlineResource;
+        String service;
+
+        if ((status == null) || (status.getOnlineResource() == null)) {
+            onlineResource = getHost();
+            service = getService();
+        } else {
+            onlineResource = status.getOnlineResource();
+            service = status.getService();
+        }
+
+        //String symbol = getSymbol(onlineResource);
+        req.append(onlineResource);
+        req.append("?" + GetVariables.SERVICENAME + "=");
+
+        req.append(service);
+
+        return req.toString();
+    }
+
+    /**
+     * Builds the GetFeatureInfo according to the ArcIms Specifications stored in
+     * a @see ArcImsStatus object
+     * @param status
+     * @param _type of ArcIMS service
+     * @return string A convenient request
+     */
+    protected String buildGetFeatureInfoRequest(ArcImsStatus status,
+        String _type) {
+        StringBuffer req = new StringBuffer();
+
+        String onlineResource;
+        String service;
+        onlineResource = getHost();
+
+        if ((status == null) || (status.getOnlineResource() == null)) {
+            onlineResource = getHost();
+            service = getService();
+        } else {
+            onlineResource = status.getOnlineResource();
+            service = status.getService();
+        }
+
+        //String symbol = getSymbol(onlineResource);
+        req.append(onlineResource);
+        req.append("?" + GetVariables.SERVICENAME + "=");
+
+        req.append(service);
+
+        /**
+         * This GET variable is needed when an ImageService
+         * is requested
+         */
+        if ((this.serviceInfo.getType().equals(ServiceInfoTags.vIMAGESERVICE)) &&
+                _type.equals(ServiceInfoTags.vLAYERTYPE_F)) {
+            req.append("&" + GetVariables.CUSTOMSERVICE + "=" +
+                GetVariables.QUERY);
+        }
+
+        return req.toString();
+    }
+
+    public void close() {
+        // your code here
+    }
+
+    public String getService() {
+        return service;
+    }
+
+    public void setService(String service) {
+        this.service = service;
+    }
+
+    /**
+     * Method that retrieves a catalog from the ArcIMS Server and returns an ArrayList
+     * of name, type and status of every service offered by the server
+     * @param url
+     * @return ArrayList
+     * @throws ArcImsException
+     */
+    public static ArrayList getCatalog(URL url, boolean override)
+        throws ArcImsException {
+        //		if (!ArcImsProtocolHandler.getPing(url)){
+        //			throw new ArcImsException("arcims_no_server");
+        //		}
+        ArrayList services = new ArrayList();
+
+        try {
+            URL urlComplete = new URL(url.toString() + "?" +
+                    GetVariables.SERVICENAME + "=" + GetVariables.CATALOG);
+
+            String request = ArcXML.getClientServices();
+
+            logger.info("Requesting ArcIMS Catalog");
+
+            File f = ArcImsDownloadUtils.doRequestPost(urlComplete, request,
+                    "getClientServices.xml", override);
+
+            services = parseClientServices(f);
+        } catch (MalformedURLException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return services;
+    }
+
+    /**
+     * Gets the catalog without setting the override boolean
+     * @see #getCatalog(URL, boolean)
+     * @param url
+     * @return ArrayList with the Catalgo of the Service
+     * @throws ArcImsException
+     */
+    public static ArrayList getCatalog(URL url) throws ArcImsException {
+        return getCatalog(url, false);
+    }
+
+    /**
+     * Method that parses a ArcXML response for the GETCLIENTSERVICES request
+     * @param f
+     * @return ArrayList of ArrayLists with name, type and status
+     * @throws ArcImsException
+     */
+    private static ArrayList parseClientServices(File f)
+        throws ArcImsException {
+        ArrayList services = new ArrayList();
+        ArrayList service;
+
+        try {
+            KXmlParser parser = new KXmlParser();
+            parser.setInput(new FileReader(f));
+
+            int currentTag;
+            boolean end = false;
+
+            //parser.require(KXmlParser.START_TAG, null, ServiceInfoTags.ARCXML);
+            currentTag = parser.next();
+
+            while (!end) {
+                switch (currentTag) {
+                case KXmlParser.START_TAG:
+
+                    /*
+                     * Parse the SERVICE tag
+                     */
+                    if (parser.getName().compareTo(CatalogInfoTags.SERVICE) == 0) {
+                        //Initialize metadata
+                        String servName = new String();
+                        String servType = new String();
+                        String servStatus = new String();
+
+                        String value = null;
+                        value = parser.getAttributeValue("",
+                                CatalogInfoTags.SERVICE_ATT_NAME);
+
+                        if (value != null) {
+                            servName = value;
+                        }
+
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                CatalogInfoTags.SERVICE_ATT_TYPE);
+
+                        if (value != null) {
+                            servType = value;
+                        }
+
+                        value = null;
+                        value = parser.getAttributeValue("",
+                                CatalogInfoTags.SERVICE_ATT_STATUS);
+
+                        if (value != null) {
+                            servStatus = value;
+                        }
+
+                        //First add an ArrayList with these data
+                        service = new ArrayList();
+                        service.add(servName);
+                        service.add(servType);
+                        service.add(servStatus);
+
+                        //Now add this object to the services ArrayList
+                        services.add(service);
+                        service = null;
+                    }
+
+                    break;
+
+                case KXmlParser.END_TAG:
+
+                    if (parser.getName().compareTo(ServiceInfoTags.tARCXML) == 0) {
+                        end = true;
+                    }
+
+                    break;
+
+                case KXmlParser.TEXT:
+                    break;
+                }
+
+                if (!end) {
+                    currentTag = parser.next();
+                }
+            }
+        } catch (XmlPullParserException parser_ex) {
+            parser_ex.printStackTrace();
+        } catch (ConnectException ce) {
+            logger.error("Timed out error", ce);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (FileNotFoundException fe) {
+            logger.error("FileNotFound Error", fe);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException e) {
+            logger.error("IO Error", e);
+            throw new ArcImsException("arcims_server_error");
+        }
+
+        return services;
+    }
+
+    /**
+     * Method that does a Ping to an ArcIMS Server
+     * @param url
+     * @return true when server exits, false otherwise
+     * @throws ArcImsException
+     */
+    public static boolean getPing(URL url) throws ArcImsException {
+        try {
+            URL urlWithPing = new URL(url.toString() + "?" +
+                    GetVariables.COMMAND + "=" + GetVariables.PING);
+            HttpURLConnection conn = (HttpURLConnection) urlWithPing.openConnection();
+            conn.setDoOutput(true);
+            conn.setRequestMethod("GET");
+
+            logger.info("Trying connect to: " + conn.getURL().toString());
+            conn.connect();
+
+            Reader isr = new InputStreamReader(conn.getInputStream());
+            BufferedReader reader = new BufferedReader(isr);
+
+            String line = reader.readLine();
+
+            //If the connection was succesful and this line starts with IMS, the server is OK
+            if ((conn.getResponseCode() == HttpURLConnection.HTTP_OK) &&
+                    line.startsWith("IMS")) {
+                logger.info("Connection succeeded");
+
+                return true;
+            } else {
+                return false;
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+            logger.warn("Malformed url", e);
+
+            return false;
+        } catch (ConnectException ce) {
+            logger.error("Timed out error", ce);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (NullPointerException npe) {
+            logger.error("NullPointerException", npe);
+            throw new ArcImsException("arcims_server_error");
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Method that pings with several SERVLETS trying to find a correct one.
+     * @param url to start searching
+     * @return Correct URL
+     * @throws ArcImsException
+     */
+    public static URL getUrlWithServlet(URL url) throws ArcImsException {
+        /*
+         * Url with the servlet
+         */
+        URL urlTemp;
+        URL urlWithServlet = null;
+
+        /*
+         * If url ends with a slash, we remove it
+         */
+        if (url.toString().endsWith("/")) {
+            String strUrl = url.toString();
+            int size = strUrl.length();
+            strUrl = strUrl.substring(0, size - 1);
+
+            try {
+                url = new URL(strUrl);
+            } catch (MalformedURLException e) {
+                e.printStackTrace();
+                logger.error(e.getMessage(), e);
+                throw new ArcImsException("wrong_url");
+            }
+        }
+
+        int n = GetVariables.SERVLETS.length;
+
+        //Loop over the SERVLETS to find a valid one.
+        logger.info("Start searching correct servlet");
+
+        for (int i = 0; i < n; i++) {
+            try {
+                urlTemp = new URL(url.toString() + GetVariables.SERVLETS[i]);
+            } catch (MalformedURLException e) {
+                //The url is "Malformed" so, we continue with the next block
+                continue;
+            }
+
+            if (ArcImsProtocolHandler.getPing(urlTemp)) {
+                urlWithServlet = urlTemp;
+
+                break;
+            }
+        }
+
+        if (urlWithServlet == null) {
+            throw new ArcImsException("arcims_no_server");
+        }
+
+        logger.info("Complete ArcIMS URL: " + urlWithServlet.toString());
+
+        return urlWithServlet;
+    }
+
+    public static String[] getVersion(URL url) throws ArcImsException {
+        String[] getV = new String[2];
+        Reader isr;
+        URL urlCmd;
+        HttpURLConnection conn;
+
+        try {
+            //Build the url with the proper command
+            urlCmd = new URL(url.toString() + "?" + GetVariables.COMMAND + "=" +
+                    GetVariables.GETVERSION);
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_no_server");
+        }
+
+        try {
+            //Stablish the connection
+            conn = (HttpURLConnection) urlCmd.openConnection();
+            conn.setDoOutput(true);
+            conn.setRequestMethod("GET");
+            conn.connect();
+
+            //Get the reader and asign the first two lines of the response
+            isr = new InputStreamReader(conn.getInputStream());
+
+            BufferedReader reader = new BufferedReader(isr);
+            String strTemp = new String();
+            strTemp = reader.readLine();
+            getV[0] = strTemp.substring(strTemp.indexOf("=") + 1);
+            strTemp = reader.readLine();
+            getV[1] = strTemp.substring(strTemp.indexOf("=") + 1);
+
+            conn.disconnect();
+        } catch (ConnectException ce) {
+            logger.error("Timed out error", ce);
+            throw new ArcImsException("arcims_server_timeout");
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+            throw new ArcImsException("arcims_no_server");
+        }
+
+        return getV;
+    }
+
+    /**
+     * This method returns a Legend to the client requested by
+     * layerId string
+     * @param layerId
+     * @return Legend with layer simbology
+     * @throws ArcImsException
+     */
+    public Legend getLegend(String layerId) throws ArcImsException {
+        ArcImsFLegendFactory aiff = new ArcImsFLegendFactory(this.serviceInfo,
+                layerId);
+
+        return aiff.getMainLegend();
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsProtocolHandler.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStyle.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStyle.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStyle.java	(revision 8301)
@@ -0,0 +1,331 @@
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+
+/* gvSIG. Sistema de Información Geográfica de la Generalitat Valenciana
+ *
+ * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
+ *
+ * For more information, contact:
+ *
+ *  Generalitat Valenciana
+ *   Conselleria d'Infraestructures i Transport
+ *   Av. Blasco Ibáñez, 50
+ *   46010 VALENCIA
+ *   SPAIN
+ *
+ *   +34 963862235
+ *   gvsig@gva.es
+ *   www.gvsig.gva.es
+ *
+ *    or
+ *
+ *   Prodevelop Integración de Tecnologías SL
+ *   Conde Salvatierra de Álava , 34-10
+ *   46004 Valencia
+ *   Spain
+ *
+ *   +34 963 510 612
+ *   +34 963 510 968
+ *   gis@prodevelop.es
+ *   http://www.prodevelop.es
+ */
+package org.gvsig.remoteClient.arcims;
+
+import org.gvsig.remoteClient.utils.CapabilitiesTags;
+
+import org.kxml2.io.KXmlParser;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+
+/**
+ * <p>Defines a  style. Theme that describes the appeareance of certain layer.</p>
+ *
+ */
+public abstract class ArcImsStyle {
+    /**
+     * style name, defined in the ArcIms capabilities
+     */
+    private String name;
+
+    /**
+     * style title, defined in the ArcIms capabilities
+     */
+    private String title;
+
+    /**
+     * style abstract, defined in the ArcIms capabilities
+     */
+    private String styleAbstract;
+    private LegendURL legendURL;
+
+    /**
+     * <p>Parses the STYLE tag in the ArcIms capabilities, filling the ArcImsStyle object
+     * loading the data in memory to be easily accesed</p>
+     *
+     */
+    public abstract void parse(KXmlParser parser)
+        throws IOException, XmlPullParserException;
+
+    /**
+     * Parses the legendURL tag.
+     * @param parser
+     * @throws IOException
+     * @throws XmlPullParserException
+     */
+    protected void parseLegendURL(KXmlParser parser)
+        throws IOException, XmlPullParserException {
+        int currentTag;
+        boolean end = false;
+
+        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.LEGENDURL);
+        currentTag = parser.nextTag();
+
+        String value = new String();
+        LegendURL legend = new LegendURL();
+
+        //First of all set whether the layer is Queryable reading the attribute.
+        value = parser.getAttributeValue("", CapabilitiesTags.WIDTH);
+
+        if (value != null) {
+            legend.width = Integer.parseInt(value);
+        }
+
+        value = parser.getAttributeValue("", CapabilitiesTags.HEIGHT);
+
+        if (value != null) {
+            legend.height = Integer.parseInt(value);
+        }
+
+        while (!end) {
+            switch (currentTag) {
+            case KXmlParser.START_TAG:
+
+                if (parser.getName().compareTo(CapabilitiesTags.FORMAT) == 0) {
+                    legend.format = parser.nextText();
+                } else if (parser.getName()
+                                     .compareTo(CapabilitiesTags.ONLINERESOURCE) == 0) {
+                    value = parser.getAttributeValue("",
+                            CapabilitiesTags.XLINK_TYPE);
+
+                    if (value != null) {
+                        legend.onlineResource_type = value;
+                    }
+
+                    value = parser.getAttributeValue("",
+                            CapabilitiesTags.XLINK_HREF);
+
+                    if (value != null) {
+                        legend.onlineResource_href = value;
+                    }
+                }
+
+                break;
+
+            case KXmlParser.END_TAG:
+
+                if (parser.getName().compareTo(CapabilitiesTags.LEGENDURL) == 0) {
+                    end = true;
+                }
+
+                break;
+
+            case KXmlParser.TEXT:
+                break;
+            }
+
+            if (!end) {
+                currentTag = parser.next();
+            }
+        }
+
+        parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.LEGENDURL);
+    }
+
+    /**
+     * gets the LegendURL OnlineResource type
+     */
+    public String getLegendURLOnlineResourceType() {
+        if (legendURL != null) {
+            return legendURL.onlineResource_type;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * gets the LegendURL OnlineResource href
+     */
+    public String getLegendURLOnlineResourceHRef() {
+        if (legendURL != null) {
+            return legendURL.onlineResource_href;
+        } else {
+            return null;
+        }
+    }
+
+    public String getLegendURLFormat() {
+        if (legendURL != null) {
+            return legendURL.format;
+        } else {
+            return null;
+        }
+    }
+
+    public int getLegendURLWidth() {
+        if (legendURL != null) {
+            return legendURL.width;
+        }
+
+        return 0;
+    }
+
+    public int getLegendURLHeight() {
+        if (legendURL != null) {
+            return legendURL.height;
+        }
+
+        return 0;
+    }
+
+    /**
+     * sets LegendURL
+     */
+    protected void setLegendURL(LegendURL legendURL) {
+        this.legendURL = legendURL;
+    }
+
+    /**
+     * <p>gets the style name</p>
+     *
+     * @return style name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <p>sets the style name.</p>
+     *
+     * @param _name
+     */
+    public void setName(String _name) {
+        name = _name;
+    }
+
+    /**
+     * <p>gets the style title</p>
+     *
+     *
+     * @return style title
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * <p>Sets style title</p>
+     *
+     *
+     * @param _title
+     */
+    public void setTitle(String _title) {
+        title = _title.trim();
+    }
+
+    /**
+     * <p>gets style abstract</p>
+     *
+     *
+     * @return style abstract
+     */
+    public String getAbstract() {
+        return styleAbstract;
+    }
+
+    /**
+     * <p>sets style abstract</p>
+     *
+     *
+     * @param aabstract style abstract
+     */
+    public void setAbstract(String aabstract) {
+        styleAbstract = aabstract;
+    }
+
+    /**
+     * <p>Inner class describing the Legend URL defined for styles in the  specifications in ArcIms</p>
+     *
+     */
+    protected class LegendURL {
+        public int width;
+        public int height;
+        public String format;
+        public String onlineResource_type;
+        public String onlineResource_href;
+
+        public LegendURL() {
+            width = 0;
+            height = 0;
+            format = new String();
+            onlineResource_type = new String();
+            onlineResource_href = new String();
+        }
+    }
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/gvsig/remoteClient/arcims/ArcImsStyle.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/src/org/cresques/remoteMap/RemoteMapClient.java
===================================================================
--- tags/BN68/libraries/libArcIMS/src/org/cresques/remoteMap/RemoteMapClient.java	(revision 0)
+++ tags/BN68/libraries/libArcIMS/src/org/cresques/remoteMap/RemoteMapClient.java	(revision 8301)
@@ -0,0 +1,227 @@
+/*
+ * Created on 06-sep-2005
+ */
+package org.cresques.remoteMap;
+import java.awt.Dimension;
+import java.awt.Image;
+import java.awt.geom.Rectangle2D;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.TreeMap;
+import java.util.Vector;
+
+/**
+ * @author Luis W. Sevilla (sevilla_lui@gva.es)
+ */
+public abstract class RemoteMapClient {
+	private String cacheDir = "/data/cache/";
+	private String host;
+	private String version = "1.1.1";
+	private TreeMap layers = new TreeMap();
+	private Vector layerVector = new Vector();
+	//private TreeMap srsTable = new TreeMap();
+	
+	int rightMargin = 0, bottomMargin = 0;
+	int leftMargin = 0, topMargin = 0;
+	
+	/**
+	 * Ancho mínimo de la petición al servidor.
+	 */
+	int minWidth = 0, maxWidth = 1024,
+		minHeight = 0, maxHeight = 1024;
+	/**
+	 * Numero de tiles que se deben pedir en una sola
+	 * llamada al servidor.
+	 */
+	Dimension requestSize = new Dimension(1,1);
+	
+	public static class Layer {
+		private TreeMap props = new TreeMap();
+		private Rectangle2D boundingBox;
+		private Layer parent = null;
+		private TreeMap layers = new TreeMap();
+		private Vector layerVector = new Vector();
+
+		/**
+		 * Crea una capa sin parámetros
+		 */
+		public Layer() {		
+			setProperty("name", "");
+		}
+		/**
+		 * Crea una capa con los parámetros básicos.
+		 * @param name
+		 * @param title
+		 * @param boundingBox
+		 */
+		public Layer(String name, String title, Rectangle2D boundingBox) {
+			super();
+			setProperty("name", name);
+			setProperty("title", title);
+			setLatLonBoundingBox(boundingBox);
+		}
+		
+		/**
+		 * @return Returns the name.
+		 */
+		public String getName() {
+			return (String) getProperty("name");
+		}
+		/**
+		 * @param name The name to set.
+		 */
+		public void setName(String name) {
+			setProperty("name", name);
+		}
+		/**
+		 * @return Returns the title.
+		 */
+		public String getTitle() {
+			return (String) getProperty("title");
+		}
+		/**
+		 * @param title The title to set.
+		 */
+		public void setTitle(String title) {
+			setProperty("title", title);
+		}
+		/**
+		 * @return Returns the boundingBox.
+		 */
+		public Rectangle2D getLatLonBoundingBox() {
+			return boundingBox;
+		}
+		/**
+		 * @param boundingBox The boundingBox to set.
+		 */
+		public void setLatLonBoundingBox(Rectangle2D boundingBox) {
+			this.boundingBox = boundingBox;
+		}
+		
+		public void setProperty(String propName, Object value) {
+			props.put(propName, value);
+		}
+		
+		public Object getProperty(String propName) {
+			return props.get(propName);
+		}
+		/**
+		 * @return Returns the layerTable.
+		 */
+		public TreeMap getLayerMap() {
+			return layers;
+		}
+		
+		public Vector getLayerVector() {
+			return layerVector;
+		}
+		
+		public boolean hasLayers() {
+			return layers.size() > 0;
+		}
+		
+		public void addLayer(Layer layer) {
+			layerVector.add(layer);
+			if (layer.getName().length()>0)
+				layers.put(layer.getName(), layer);
+		}
+		
+		public Layer getLayer(String layerName) {
+			return (Layer) layers.get(layerName);
+		}
+		/**
+		 * @return Returns the parent.
+		 */
+		public Layer getParent() {
+			return parent;
+		}
+		/**
+		 * @param parent The parent to set.
+		 */
+		public void setParent(Layer parent) {
+			this.parent = parent;
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public RemoteMapClient(String host) {
+		super();
+		this.host = host;
+	}
+
+	public abstract File getCapabilities();
+	
+	public abstract Image getImage(Dimension sz, Rectangle2D box)
+		throws MalformedURLException, IOException;
+	
+	/**
+	 * @return Returns the cacheDir.
+	 */
+	public String getCacheDir() {
+		return cacheDir;
+	}
+	/**
+	 * @param cacheDir The cacheDir to set.
+	 */
+	public void setCacheDir(String cacheDir) {
+		String separator = "/";
+		this.cacheDir = cacheDir;
+		if (cacheDir.substring(cacheDir.length()-1).compareTo(separator) != 0)
+			this.cacheDir += separator;
+		this.cacheDir = this.cacheDir.replace(':','_');
+		File f = new File(cacheDir);
+		if (!f.exists())
+			f.mkdirs();
+	}
+	/**
+	 * @return Returns the host.
+	 */
+	public String getHost() {
+		return host;
+	}
+	/**
+	 * @param host The host to set.
+	 */
+	public void setHost(String host) {
+		this.host = host;
+	}
+	/**
+	 * @return Returns the version.
+	 */
+	public String getVersion() {
+		return version;
+	}
+	/**
+	 * @param version The version to set.
+	 */
+	public void setVersion(String version) {
+		this.version = version;
+	}
+	/**
+	 * @return Returns the layerTable.
+	 */
+	public TreeMap getLayerMap() {
+		return layers;
+	}
+	
+	public Vector getLayerVector() {
+		return layerVector;
+	}
+	
+	public boolean hasLayers() {
+		return layers.size() > 0;
+	}
+	
+	public void addLayer(Layer layer) {
+		layerVector.add(layer);
+		if (layer.getName().length()>0)
+			layers.put(layer.getName(), layer);
+	}
+	
+	public Layer getLayer(String layerName) {
+		return (Layer) layers.get(layerName);
+	}
+}

Property changes on: tags/BN68/libraries/libArcIMS/src/org/cresques/remoteMap/RemoteMapClient.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/libraries/libArcIMS/scrapbook.jpage
===================================================================

Property changes on: tags/BN68/libraries/libArcIMS/scrapbook.jpage
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/.cvsignore
===================================================================
--- tags/BN68/libraries/libArcIMS/.cvsignore	(revision 0)
+++ tags/BN68/libraries/libArcIMS/.cvsignore	(revision 8301)
@@ -0,0 +1,4 @@
+bin
+doc
+javadoc.xml
+test

Property changes on: tags/BN68/libraries/libArcIMS/.cvsignore
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/libraries/libArcIMS/build.xml
===================================================================
--- tags/BN68/libraries/libArcIMS/build.xml	(revision 0)
+++ tags/BN68/libraries/libArcIMS/build.xml	(revision 8301)
@@ -0,0 +1,69 @@
+<project name="RemoteClient" default="dist" basedir=".">
+	<description> Genera el jar con RemoteClient y sus dependencias </description>
+	<!-- set global properties for this build -->
+	<property name="src" location="src"/>
+	<property name="build" location="bin"/>
+	<property name="dist" location="dist"/>
+	<property name="lib" location="lib"/>
+	<property name="jar" value="remote-clients-arcims"/>
+	<property name="targetDir" location="."/>
+	<property name="targetDir2" location="../extArcims/lib"/>
+	<property name="fmap" location="../libFMap"/>
+	<property name="andami" location="../_fwAndami"/>
+	
+	<!-- to move the lib directly to andami without having to run extArcims build.xml-->
+	<property name="extensionDir" location="${andami}/gvSIG/extensiones"/>
+	<property name="mainplugin" value="com.iver.cit.gvsig"/>
+	<property name="targetDir3" location="${extensionDir}/${mainplugin}/lib"/>
+	
+	<target name="init">
+		<!-- Create the time stamp -->
+		<tstamp/>
+		<!-- Create the build directory structure used by compile -->
+		<mkdir dir="${build}"/>
+	</target>
+	
+	<target name="compile" description="compile the source">
+		<!-- Compile the Java code from ${src} to ${bin} -->
+		<javac srcdir="${src}" destdir="${build}"
+			classpath="${andami}/andami.jar:${fmap}/lib/driver-manager-1.0.jar:${andami}/lib/tempFileManager.jar:lib/kxml2.jar:lib/junit.jar"/>
+	</target>
+	
+	<target name="dist" description="generate the distribution">
+		<!-- Create the distribution directory -->
+		<mkdir dir="${dist}"/>
+		
+		<!-- Put everything in ${build} into the cms-${DSTAMP}.jar file -->
+		<jar jarfile="${dist}/${jar}.jar" basedir="${build}"/>
+		<jar jarfile="${dist}/${jar}.jar" basedir="." includes="images/*.gif"
+			update="true"/>
+		
+		<copy todir="${targetDir3}">
+			<fileset dir="${dist}" includes="${jar}.jar"/>
+		</copy>
+		
+		<move todir="${targetDir2}/">
+			<fileset dir="${dist}" includes="**/**"/>
+		</move>
+		<copy todir="${targetDir2}/">
+			<fileset dir="${lib}" includes="*.jar"/>
+		</copy>
+		
+
+		<!--   <move todir="${targetDir}/">
+		<fileset dir="${dist}" includes="**/**"/>
+		</move>-->
+	</target>
+	
+	<target name="clean" description="clean up">
+		<!-- Delete the ${build} and ${dist} directory trees -->
+		<delete includeemptydirs="true" failonerror="no">
+			<fileset dir="${build}" includes="**/*"/>
+		</delete>
+		<delete includeemptydirs="true" failonerror="no">
+			<fileset dir="${dist}" includes="**/*"/>
+		</delete>
+	</target>
+</project>
+
+

Property changes on: tags/BN68/libraries/libArcIMS/build.xml
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision


Property changes on: tags/BN68/libraries/libArcIMS
___________________________________________________________________
Added: svn:ignore
   + bin
doc
javadoc.xml
test


Index: tags/BN68/extensions/extArcims/.cvsignore
===================================================================
--- tags/BN68/extensions/extArcims/.cvsignore	(revision 0)
+++ tags/BN68/extensions/extArcims/.cvsignore	(revision 8301)
@@ -0,0 +1,2 @@
+bin
+Thumbs.db

Property changes on: tags/BN68/extensions/extArcims/.cvsignore
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/build.xml
===================================================================
--- tags/BN68/extensions/extArcims/build.xml	(revision 0)
+++ tags/BN68/extensions/extArcims/build.xml	(revision 8301)
@@ -0,0 +1,99 @@
+<project name="Generar extension en Andami" default="generate-without-source" basedir=".">
+	<description>
+			Instala el plugin en Andami
+		</description>
+	<!-- set global properties for this build -->
+	<property name="src" location="src"/>
+	<property name="build" location="bin"/>
+	<property name="dist" location="dist"/>
+	<property name="mainplugin" value="com.iver.cit.gvsig"/>
+	<property name="plugin" value="es.prodevelop.cit.gvsig.arcims"/>
+	<property name="andami" location="../_fwAndami"/>
+	<property name="fmapjar" value="fmap-arcims"/>
+	<property name="driverjar" value="arcims"/>
+	<property name="extensionDir" location="${andami}/gvSIG/extensiones"/>
+	<property name="drivers-dir" location="${extensionDir}/${mainplugin}/drivers"/>
+	<property name="lib-dir" location="${extensionDir}/${mainplugin}/lib"/>
+	<property name="fmap" location="../libFMap"/>
+	<property name="entrega" location="../dist"/>
+	<property name="zip-src" location="../gvSIG-ArcIMS-Client-src"/>
+	<property name="zip-bin" location="../gvSIG-ArcIMS-Client-bin"/>
+	<target name="init">
+		<!-- Create the time stamp -->
+		<tstamp/>
+		<!-- Create the build directory structure used by compile -->
+		<mkdir dir="${build}"/>
+		<mkdir dir="${dist}"/>
+	</target>
+	<target name="compile" description="compile the source">
+		<!-- Compile the Java code from ${src} to ${bin} -->
+		<javac srcdir="${src}" destdir="${build}" classpath="${andami}/lib/log4j-1.2.8.jar:${andami}/andami.jar:${andami}/gvSIG/extensiones/es.prodevelop.cit.gvsig/lib/es.prodevelop.cit.gvsig.jar:${andami}/gvSIG/extensiones/es.prodevelop.cit.gvsig/lib/fmap.jar:lib/remote-clients.jar:${fmap}/lib/cms.jar:${fmap}/lib/driver-manager-1.0.jar:${andami}/lib/tempFileManager.jar:${andami}/lib/iver-utiles.jar"/>
+	</target>
+	<target name="generate-without-source" description="generate the distribution without the source file">
+		<!-- Create the distribution directory -->
+		<mkdir dir="${dist}"/>
+		<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
+		<jar jarfile="${dist}/${plugin}.jar" basedir="${build}" includes="es/prodevelop/cit/gvsig/arcims/**" excludes="es/prodevelop/cit/gvsig/arcims/fmap/**"/>
+		<jar jarfile="${dist}/${fmapjar}.jar" basedir="${build}" includes="es/prodevelop/cit/gvsig/arcims/fmap/**"/>
+		<copy todir="${dist}">
+			<fileset dir="config" includes="*"/>
+		</copy>
+		<copy todir="${dist}/images">
+			<fileset dir="images" includes="*"/>
+		</copy>
+		<copy todir="${dist}/about">
+			<fileset dir="about" includes="*"/>
+		</copy>
+		<copy todir="${lib-dir}">
+			<fileset dir="./lib" includes="*.jar,*.zip"/>
+			<fileset dir="." includes=".keystore"/>
+		</copy>
+		<move todir="${extensionDir}/${mainplugin}/lib">
+			<fileset dir="${dist}" includes="${fmapjar}.jar"/>
+		</move>
+		<move todir="${extensionDir}/${plugin}/">
+			<fileset dir="${dist}" includes="**/**"/>
+		</move>
+	</target>
+	<target name="entrega-bin" depends="generate-without-source" description="Generates an almost
+		  distributable extension directory">
+		<buildnumber file="Cliente-ArcIMS.number"/>
+		<!--<delete file="${zip-bin}"/>	-->
+		<mkdir dir="${entrega}"/>
+		<copy todir="${entrega}/${mainplugin}/lib">
+			<fileset dir="./lib" includes="*.jar,*.zip"/>
+			<fileset dir="." includes=".keystore"/>
+			<fileset dir="${extensionDir}/${mainplugin}/lib" includes="${gvsiglibjar}.jar"/>
+			<fileset dir="${extensionDir}/${mainplugin}/lib" includes="${fmapjar}.jar"/>
+			<fileset dir="${extensionDir}/${mainplugin}/lib" includes="${remoteclientjar}.jar"/>
+		</copy>
+		<copy todir="${entrega}/${plugin}/">
+			<fileset dir="${extensionDir}/${plugin}/" includes="**/**"/>
+		</copy>
+		<zip destfile="${zip-bin}-BN${build.number}.zip" basedir="${entrega}" includes="**/**"/>
+		<delete dir="${entrega}"/>
+	</target>
+	<target name="entrega-src" depends="entrega-bin" description="Zips clean source">
+		<!--<delete file="${zip-src}"/>-->
+		<mkdir dir="${entrega}"/>
+		<copy todir="${entrega}/extArcims">
+			<fileset dir=".">
+				<include name="**"/>
+			</fileset>
+		</copy>
+		<copy todir="${entrega}/libArcIMS">
+			<fileset dir="../libArcIMS">
+				<include name="**"/>
+			</fileset>
+		</copy>
+		<zip destfile="${zip-src}-BN${build.number}.zip" basedir="${entrega}" includes="**/**"/>
+		<delete dir="${entrega}"/>
+	</target>
+	<target name="clean" description="clean up">
+		<!-- Delete the ${build} and ${dist} directory trees -->
+		<delete dir="${dist}"/>
+		<delete includeemptydirs="true" failonerror="no">
+			<fileset dir="${build}" includes="**/*"/>
+		</delete>
+	</target>
+</project>

Property changes on: tags/BN68/extensions/extArcims/build.xml
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/.classpath
===================================================================
--- tags/BN68/extensions/extArcims/.classpath	(revision 0)
+++ tags/BN68/extensions/extArcims/.classpath	(revision 8301)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="/libFMap/lib/cms.jar"/>
+	<classpathentry kind="src" path="/libArcIMS"/>
+	<classpathentry kind="src" path="/appgvSIG"/>
+	<classpathentry kind="lib" path="lib/kxml2.jar"/>
+	<classpathentry kind="lib" path="/libFMap/lib/remote-clients.jar"/>
+	<classpathentry kind="lib" path="/_fwAndami/lib/log4j-1.2.8.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/_fwAndami"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/libFMap"/>
+	<classpathentry kind="lib" path="/libFMap/lib/driver-manager-1.1.jar"/>
+	<classpathentry kind="lib" path="/libFMap/lib/jts-1.7.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/libIverUtiles"/>
+	<classpathentry sourcepath="/libGDBMS" kind="lib" path="/libFMap/lib/gdbms-0.8-SNAPSHOT.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Property changes on: tags/BN68/extensions/extArcims/.classpath
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/META-INF/MANIFEST.MF
===================================================================
--- tags/BN68/extensions/extArcims/META-INF/MANIFEST.MF	(revision 0)
+++ tags/BN68/extensions/extArcims/META-INF/MANIFEST.MF	(revision 8301)
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: ExtArcims Plug-in
+Bundle-SymbolicName: extArcims
+Bundle-Version: 1.0.0
+Bundle-Activator: extArcims.ExtArcimsPlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime
+Eclipse-AutoStart: true

Property changes on: tags/BN68/extensions/extArcims/META-INF/MANIFEST.MF
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/.project
===================================================================
--- tags/BN68/extensions/extArcims/.project	(revision 0)
+++ tags/BN68/extensions/extArcims/.project	(revision 8301)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>extArcims</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Property changes on: tags/BN68/extensions/extArcims/.project
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/config/text.properties
===================================================================
--- tags/BN68/extensions/extArcims/config/text.properties	(revision 0)
+++ tags/BN68/extensions/extArcims/config/text.properties	(revision 8301)
@@ -0,0 +1,199 @@
+abstract=Resumen
+accept=Aceptar
+add_again_question=¿Añadir de nuevo?
+add_all=Añadir todas
+add=Añadir
+ancho_alto=Ancho X Alto
+anterior=Anterior
+apply=Aplicar
+arcims_properties=Propiedades ArcIMS
+arcims_legend_error=Error al procesar la leyenda
+arcims_server_status_col_name=Estado
+arcims_server_type_col_name=Tipo
+arcims_remote_not_found=Fichero remoto no encontrado
+arcims_server_error=Error en el servidor ArcIMS
+arcims_catalog_error=Error al recibir el catálogo del servidor ArcIMS
+arcims_extent_error=Error al obtener la extensión del servicio ArcIMS
+arcims_no_server=No se ha hallado un servidor ArcIMS válido
+arcims_no_features=No se han encontrado geometrías
+arcims_server_timeout=Alcanzado máximo tiempo de espera de respuesta del servidor ArcIMS
+array_error=Error en el tamaño de los arrays
+available_layers=Capas disponibles
+available_services=Servicios disponibles
+bands=Bandas
+cancel=Cancelar
+cannotReproject=No se puede reproyectar este sistema de coordenadas
+cant_connect=No ha sido posible realizar la conexión
+capas=Capas
+change_server=Cambiar Servidor
+change_service=Cambiar Servicio
+choose_image_format=Elija formato de imagen
+clear=Limpiar
+close=Cerrar
+column_not_found=No se encontró la columna
+conectar=Conectar
+connect_error=Error conectando
+coor_geograficas=Coor. Geograficas
+coord_system=Sistema de coordenadas
+country=País
+covered_extension=Extensión
+current_scale=Escala actual
+current=actual
+data_origin=Origen de datos
+decimal_degrees=Grados decimales
+default=Por defecto
+defined_by_user=Definido por el usuario
+description=Descripción
+desde=Desde
+dimension=Dimensión
+dimensiones=Dimensiones
+eliminar_extremos=Eliminar Extremos
+enter_new_layer_name=Introduzca el nombre de la nueva capa
+error=Error
+en_language=Inglés
+envelope=Extensión
+es_country=España
+es_language=Español
+Escala=Escala
+estilos=Estilos
+extents_no_coincidentes=El extent de la imagen seleccionada no coincide con la imagen de origen.
+featureclass=Vectorial
+featureserver=Servicio vectorial
+feet=Pies
+fichero_existe=El fichero seleccionado ya existe como banda de la capa
+Fichero=File
+fit_ArcIms_layer=Ajustar capa ArcIMS
+format=Formato
+formatos=Formatos
+from=Desde
+group_layers_option=Agrupación de capas
+group_layers=Agrupar capas
+image=Imagen
+imageserver=Servicio de imágenes
+in=in
+info=Información
+interval=Intervalo
+intervalo=Intervalo
+introduzca_intervalo_deseado=Introduzca el intervalo deseado
+language=Idioma
+layer_abstract=Resumen
+layer_name=Nombre de la capa
+layer_not_queriable=El layer no es interrogable
+layer_scale_status=Estado de los límites de escala
+layer_title=Título de la capa
+layer_was_already_added=La capa ya se había añadido
+layer=Capa
+layers=Capas
+legend=Leyenda
+line=Línea
+lineal_directo=Lineal Directo
+location=Ubicación
+max_no_of_pixels=Número máximo de píxels
+max_scale=Escala máx
+meters=Metros
+min_scale=Escala mín
+move_layer_down=Mover abajo
+move_layer_up=Mover arriba
+muestra=Muestra
+multiple_value=Valor múltiple
+multiples_intervalos=Múltiples Intervalos
+name=Nombre
+new_layer_name=Nombre de la nueva capa
+next=Siguiente
+no_layers_found=No hay capas disponibles
+NO=NO
+none_selected=Ninguno seleccionado
+not_available=No disponible
+not_visible=No visible
+num_bandas=N\u00FAmero de bandas
+ok=Aceptar
+opacidad=Opacidad
+period=Periodo
+point=Punto
+polygon=Polígono
+previous=Anterior
+properties=Propiedades
+property=Propiedad
+propiedades_raster=Propiedades del r\u00E1ster
+raster_layer=Capa raster
+raster=Raster
+realce=Realce
+recorte_colas=Recorte de Colas
+recorte=recorte
+remove_all=Quitar todas
+remove=Quitar
+repeated_layer_was_not_added=No se añadió la capa repetida
+retry=Reintentar
+scale_limits_status=Estado de los límites de escala
+scale_limits=Límites de escala
+the_scale=Escala
+seleccionar_srs=Seleccionar SRS
+select_formats=Seleccionar formatos
+select_layers=Seleccionar capas
+selected_dimensions=Dimensiones Seleccionadas
+selected_from_list=Seleccionado de la lista
+selected_layers=Capas seleccionadas
+selected_themes=Temas seleccionados
+server_abstract=Sumario
+server_cant_render_layers=Este servidor no puede renderizar estas capas juntas.\nPruebe a hacer peticiones separadas para cada capa.
+server_has_no_services=El servidor no ofrece ningún servicio
+server_provides_no_srs__scale_data_may_be_wrong=El servidor no proporciona sistema de coordenadas. La información sobre escalas puede ser errónea.
+server_doesnt_support_selected_image_format=El servidor no proporciona imágenes en el formato seleccionado
+server_timeout=Alcanzado máximo tiempo de espera de respuesta
+server_title=Título
+server_type=Tipo de servidor
+server_version=Versión del servidor
+server=Servidor
+service_does_not_exist=Servicio no disponible
+service_info=Información del servicio
+service_name=Nombre del servicio
+servicename_selection_mode=Selección del nombre del servicio
+service_type=Tipo de servicio
+service_type_not_supported=Tipo de servicio no soportado por el cliente
+service=Servicio
+set=Establecer
+settings_editor=Editor de ajustes
+settings=Ajustes
+show_layer_names=Mostrar nombres
+show_layer_ids=Mostrar ID de las capas
+siguiente=Siguiente
+sin_realce=Sin Realce
+single_value=Valor simple
+status=Estado
+style=Estilo
+the_scale=Escala
+this_layer_was_already_added=Esta capa ya se había añadido
+tipo_dato=Tipo de Dato
+to=Hasta
+tooltips_enabled=Tool tips activas
+transparencia=Transparencia
+type=Tipo
+unable_to_findout_service_type=No se pudo determinar el tipo de servicio
+unable_to_findout_server_version=No se pudo determinar la versión del servidor
+units=Unidades
+unknown_response_format=Formato de respuesta desconocido
+update_catalog=Refrescar lista de servicios
+us_country=Estados Unidos
+usar_rango=Usa un rango
+Valor_azul=Valor Azul
+valor_pixel=Valor de pixel
+Valor_rojo=Valor Rojo
+Valor_verde=Valor Verde
+value_not_found=No se encontró el valor
+value=Valor
+vector_layer=Capa vectorial
+vector_type=Tipo vectorial
+vectorial=Vectorial
+version_conflict=Conflicto de versiones
+version=Versión
+view=Vista
+visible=Visible
+warning=Aviso
+wrong_url=Dirección URL no válida
+xmax=X m\u00E1xima
+xmin=X m\u00EDnima
+xrange=Rango en X
+YES=SÍ
+ymax=Y m\u00E1xima
+ymin=Y m\u00EDnima
+yrange=Rango en Y
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/config/text.properties
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/config/text_en.properties
===================================================================
--- tags/BN68/extensions/extArcims/config/text_en.properties	(revision 0)
+++ tags/BN68/extensions/extArcims/config/text_en.properties	(revision 8301)
@@ -0,0 +1,196 @@
+abstract=Abstract
+accept=Accept
+add_again_question=Add again?
+add_all=Add all
+add=Add
+ancho_alto=Width x Height
+anterior=Previous
+apply=Apply
+arcims_properties=ArcIMS properties
+arcims_server_status_col_name=Status
+arcims_server_type_col_name=Type
+arcims_remote_not_found=Remote file not found
+arcims_server_error=ArcIMS server error
+arcims_catalog_error=Error while retrieving ArcIMS catalog 
+arcims_extent_error=Error while retrieving ArcIMS service extent
+arcims_no_server=Not a valid ArcIMS server
+arcims_no_features=No geometries found
+arcims_server_timeout=ArcIMS server's timeout
+array_error=Array length error
+available_layers=Available layers
+available_services=Available services
+bands=Bands
+cancel=Cancel
+cannotReproject=Unable to reproject this coordinate system
+cant_connect=Unable to perform the connection
+capas=Layers
+change_server=Change server
+change_service=Change service
+choose_image_format=Choose image format
+clear=Clear
+close=Close
+column_not_found=Column not found
+conectar=Connect
+connect_error=Connect error
+coor_geograficas=Geographic coordinates
+coord_system=Coordinate system
+country=Country
+covered_extension=Covered envelope
+current_scale=Current scale
+current=Current
+data_origin=Data source
+decimal_degrees=Decimal degrees
+default=Default
+defined_by_user=User defined
+description=Description
+desde=From
+dimension=Dimension
+dimensiones=Dimensions
+eliminar_extremos=Remove ends
+en_language=English
+enter_new_layer_name=Enter new layer name
+error=Error
+envelope=Envelope
+es_country=Spain
+es_language=Spanish
+Escala=Scale
+estilos=Styles
+extents_no_coincidentes=Selected image's extent does not match original image's extent
+featureclass=Feature class
+featureserver=Features service
+feet=Feet
+fichero_existe=Selected file already exists
+Fichero=File
+fit_ArcIms_layer=ArcIMS layer settings
+format=Format
+formatos=Formats
+from=From
+group_layers_option=Layer grouping option
+group_layers=Group layers
+image=Image
+imageserver=Raster service
+in=in
+info=Information
+interval=Interval
+intervalo=Interval
+introduzca_intervalo_deseado=Enter interval
+language=Language
+layer_abstract=Abstract
+layer_name=Layer name
+layer_not_queriable=Layer is not queriable
+layer_scale_status=Layer scale status
+layer_title=Layer title
+layer_was_already_added=Layer was already added
+layer=Layer
+layers=Layers
+legend=Legend
+line=Line
+location=Location
+max_no_of_pixels=Max. number of pixels
+max_scale=Max. scale
+meters=Meters
+min_scale=Min. scale
+move_layer_down=Move down
+move_layer_up=Move up
+muestra=Sample
+multiple_value=Multiple value
+multiples_intervalos=Multiple intervals
+name=Name
+new_layer_name=New layer's name
+next=Next
+no_layers_found=No available layers found
+NO=NO
+none_selected=None selected
+not_available=Not available
+not_visible=Not visible
+num_bandas=Band count
+ok=OK
+opacidad=Opacity
+period=Perios
+point=Ponit
+polygon=Polygon
+previous=Previous
+properties=Properties
+property=Property
+propiedades_raster=Raster properties
+raster_layer=Raster layer
+raster=Raster
+realce=Enhancement
+recorte_colas=Tail trimming
+recorte=Trimming
+remove_all=Remove all
+remove=Remove
+retry=Retry
+scale_limits_status=Scale limits status
+scale_limits=Scale limits
+scale=Scale
+seleccionar_srs=SRS selection
+select_formats=Format selection
+select_layers=Layer selection
+selected_dimensions=Selected dimensions
+selected_from_list=Selected from list
+selected_layers=Selected layers
+selected_themes=Selected themes
+server_abstract=Abstract
+server_cant_render_layers=Server cannot renderize layers together.\nTry one request per layer
+server_has_no_services=Server provides no services
+server_provides_no_srs__scale_data_may_be_wrong=Server provides no SRS. Scale information might be inaccurate
+server_doesnt_support_selected_image_format=Server does not support selected image format
+server_timeout=ArcIMS server timeout
+server_title=Title
+server_type=Server type
+server_version=Server version
+service_type_not_supported=Service type not supported by the client
+server=Server
+service_does_not_exist=Service not available
+service_info=Service information
+service_name=Service name
+servicename_selection_mode=Service name selection mode
+service_type=Service type
+service=Service
+set=Set
+settings_editor=Settings editor
+settings=Setings
+show_layer_names=Show layer names
+show_layer_ids=Show layer IDs
+siguiente=Next
+sin_realce=Without enhancement
+single_value=Single value
+status=Status
+style=Style
+the_scale=Scale
+this_layer_was_already_added=This layer was already added
+tipo_dato=Data type
+to=To
+tooltips_enabled=Tool tips enabled
+transparencia=Transparency
+type=Type
+unable_to_findout_service_type=Unable to find out service type
+unable_to_findout_server_version=unable to find out server version
+units=Units
+unknown_response_format=Unknown response format
+update_catalog=Override services list
+us_country=United States
+usar_rango=Use a range
+Valor_azul=Blue value
+valor_pixel=Pixel value
+Valor_rojo=Red value
+Valor_verde=Green value
+value_not_found=Value not found
+value=Value
+vectorial=Vector
+vector_layer=Vector layer
+vector_type=Vector type
+version_conflict=Version conflict
+version=Version
+view=View
+visible=Visible
+warning=Warning
+wrong_url=Wrong Url
+xmax=Max X
+xmin=Min X
+xrange=X range
+YES=YES
+ymax=Y Max
+ymin=Y Min
+yrange=Y range
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/config/text_en.properties
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/config/text_ca.properties
===================================================================
--- tags/BN68/extensions/extArcims/config/text_ca.properties	(revision 0)
+++ tags/BN68/extensions/extArcims/config/text_ca.properties	(revision 8301)
@@ -0,0 +1,171 @@
+abstract=Resum
+accept=Acceptar
+add_again_question=¿Afegir de nou?
+add_all=Afegir totes
+add=Afegir
+anterior=Anterior
+apply=Aplicar
+arcims_properties=Propietats ArcIMS
+arcims_server_status_col_name=Estat
+arcims_server_type_col_name=Tipus
+arcims_remote_not_found=Fitxer remot no trobat
+arcims_server_error=Error al servidor ArcIMS
+arcims_catalog_error=Error al rebre el catàleg del servidor ArcIMS
+arcims_extent_error=Error al obtindre l'extensió del servei ArcIMS
+arcims_no_server=No s'ha trobat un servidor ArcIMS vàlid
+arcims_no_features=No s'han trobat geometries
+arcims_server_timeout=Arribat màxim temps d'espera de resposta del servidor ArcIMS
+available_layers=Capes disponibles
+available_services=Serveis disponibles
+bands=Bandes
+cancel=Cancel·lar
+cannotReproject=No es pot reprojectar aquest sistema de coordenades
+cant_connect=No ha sigut possible realitzar la connexió
+capas=Capes
+change_server=Canviar Servidor
+change_service=Canviar Servei
+clear=Netejar
+close=Tancar
+column_not_found=No s'ha trobat la columna
+conectar=Connectar
+connect_error=Error connectant
+coor_geograficas=Coor. Geogràfiques
+coord_system=Sistema de coordenades
+country=País
+current_scale=Escala actual
+data_origin=Origen de dades
+default=Per defecte
+defined_by_user=Definit per l'usuari
+description=Descripció
+desde=Des de
+dimension=Dimensió
+dimensiones=Dimensions
+enter_new_layer_name=Introduïsca el nom de la nova capa
+error=Error
+envelope=Extensió
+Escala=Escala
+estilos=Estils
+extents_no_coincidentes=La extensió de la imatge seleccionada no coincideix amb la imatge d'origen.
+featureclass=Vectorial
+fichero_existe=El fitxer seleccionat ja existeix com a banda de la capa
+Fichero=Fitxer
+fit_ArcIms_layer=Ajustar capa ArcIMS
+format=Format
+formatos=Formats
+from=Des de
+image=Imatge
+in=in
+info=Informació
+interval=Interval
+intervalo=Interval
+introduzca_intervalo_deseado=Introduïsca l'interval desitjat
+language=Idioma
+layer_abstract=Resum
+layer_name=Nom de la capa
+layer_not_queriable=La capa no és interrogable
+layer_scale_status=Estat dels límits d'escala
+layer_title=Títol de la capa
+layer_was_already_added=La capa ja s'havia afegit
+layer=Capa
+layers=Capes
+legend=Llegenda
+line=Línia
+lineal_directo=Lineal Directe
+location=Ubicació
+max_no_of_pixels=Nombre màxim de píxels
+max_scale=Escala màx
+min_scale=Escala mín
+move_layer_down=Moure baix
+move_layer_up=Moure dalt
+muestra=Mostra
+multiple_value=Valor múltiple
+multiples_intervalos=Múltiples Intervals
+name=Nom
+new_layer_name=Nom de la nova capa
+next=Següent
+no_layers_found=No hi ha capes disponibles
+none_selected=Cap seleccionat
+not_available=No disponible
+not_visible=No visible
+num_bandas=Nombre de bandes
+ok=Acceptar
+opacidad=Opacitat
+period=Període
+point=Punt
+polygon=Polígon
+previous=Anterior
+properties=Propietats
+property=Propietat
+propiedades_raster=Propietats del ràster
+raster_layer=Capa ràster
+realce=Realçament
+recorte_colas=Retall de Cues
+recorte=retall
+remove_all=Llevar totes
+remove=Llevar
+retry=Reintentar
+scale_limits_status=Estat dels límits d'escala
+scale=Escala
+seleccionar_srs=Seleccionar SRS
+select_formats=Seleccionar formats
+select_layers=Seleccionar capes
+selected_dimensions=Dimensions Seleccionades
+selected_from_list=Seleccionat de la llista
+selected_layers=Capes seleccionades
+selected_themes=Temes seleccionats
+server_abstract=Sumari
+server_cant_render_layers=Aquest servidor no pot renderitzar aquestes capes juntes.\nProve de fer peticions separades per a cada capa.
+server_has_no_services=El servidor no ofereix cap servei
+server_provides_no_srs__scale_data_may_be_wrong=El servidor no proporciona sistema de coordenades. La informació sobre escales pot ser errònia.
+server_timeout=Arribat màxim temps d'espera de resposta
+server_title=Títol
+server_type=Tipus de servidor
+server=Servidor
+service_does_not_exist=Servei no disponible
+service_info=Informació del servei
+servicename_selection_mode=Selecció del nom del servei
+service_type=Tipus de servei
+service_type_not_supported=Tipus de servei no suportat pel client.
+service=Servei
+set=Establir
+settings_editor=Editor d'ajustos
+settings=Ajustos
+show_layer_names=Mostrar noms
+show_layer_ids=Mostrar ID de les capes
+siguiente=Següent
+sin_realce=Sense Realçament
+single_value=Valor simple
+status=Estat
+style=Estil
+the_scale=Escala
+this_layer_was_already_added=Aquesta capa ja s'havia afegit
+tipo_dato=Tipus de Dada
+to=Fins a
+tooltips_enabled=Tool tips actives
+transparencia=Transparència
+type=Tipus
+unable_to_findout_service_type=No s'ha pogut determinar el tipus de servei
+unable_to_findout_server_version=No s'ha pogut determinar la versió del servidor
+units=Unitats
+unknown_response_format=Format de resposta desconegut
+update_catalog=Refrescar llista de serveis
+usar_rango=Usa un rang
+Valor_azul=Valor Blau
+valor_pixel=Valor de píxel
+Valor_rojo=Valor Roig
+Valor_verde=Valor Verd
+value_not_found=No s'ha trobat el valor
+value=Valor
+vector_layer=Capa vectorial
+vector_type=Tipus vectorial
+version=Versió
+view=Vista
+visible=Visible
+warning=Avís
+wrong_url=Adreça URL no vàlida
+xmax=X màxima
+xmin=X mínima
+xrange=Rang en X
+ymax=Y màxima
+ymin=Y mínima
+yrange=Rang en Y
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/config/text_ca.properties
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/config/config.xml
===================================================================
--- tags/BN68/extensions/extArcims/config/config.xml	(revision 0)
+++ tags/BN68/extensions/extArcims/config/config.xml	(revision 8301)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<plugin-config>
+	<depends plugin-name="com.iver.cit.gvsig" />
+	<libraries library-dir="."/>
+	<resourceBundle name="text"/>
+	<extensions>
+		<extension class-name="es.prodevelop.cit.gvsig.arcims.extension.ArcimsClientModule"
+			description="Support to access ArcIMS"
+			active="true"
+			priority="1">
+		</extension>		
+	</extensions>
+</plugin-config>
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/config/config.xml
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/images/up-arrow.png
===================================================================
--- tags/BN68/extensions/extArcims/images/up-arrow.png	(revision 0)
+++ tags/BN68/extensions/extArcims/images/up-arrow.png	(revision 8301)
@@ -0,0 +1,6 @@
+‰PNG
+
+
+IHDRv¥æñ	pHYsÃÃÇo¨dZIDATxœíÒ»ÀPFg47#•MNü´¹žú* 	.¡nŸi’"9BˆXA-�™ Ø@+`‚Ö@�á
+TrxÇ=•·®'r.Û�|©Jå�©|
+“–ã9´IEND®B`‚
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/images/up-arrow.png
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/images/down-arrow.png
===================================================================
--- tags/BN68/extensions/extArcims/images/down-arrow.png	(revision 0)
+++ tags/BN68/extensions/extArcims/images/down-arrow.png	(revision 8301)
@@ -0,0 +1,5 @@
+‰PNG
+
+
+IHDRv¥æñ	pHYsÃÃÇo¨dnIDATxœíÔ;À P=GóÍÜ‰ª€¡k;xAè!å$aIEÄwWì!Ièò#ßFÜPE„EÒ»îÕJžS’:…Æ5¸kP…ÜuÅÜAÙ"N]É Õ&ÛöŽÐë¯ A; ET–Hƒv€$\9N
+“BxûIEND®B`‚
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/images/down-arrow.png
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/images/Thumbs.db
===================================================================
--- tags/BN68/extensions/extArcims/images/Thumbs.db	(revision 0)
+++ tags/BN68/extensions/extArcims/images/Thumbs.db	(revision 8301)
@@ -0,0 +1,66 @@
+ÐÏà¡±á>þÿ	þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿþÿÿÿþÿÿÿ	
+
+þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÑËõÃŽÆ@1ÿÿÿÿÿÿÿÿÿÿÿÿRCatalogÿÿÿÿÿÿÿÿÿÿÿÿþ2ÿÿÿÿ*	
+
+þÿÿÿ9þÿÿÿ !"#$%&'()þÿÿÿ+,-./012345678þÿÿÿ:;þÿÿÿ=>?@ABCDEFGHþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿFÿØÿàJFIF``ÿÛC
+
+
+
+
+ÿÛC		
+
+ÿÀ"ÿÄ	
+ÿÄµ}!1AQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ýøéñ‚ßà—…´í~ò=Œºœ6W˜ãur\ÏG¯�€eáŸi¾0Ñ-u]*é.ì®:IêìHèAã‚# ƒ_;ÁD?ä€Áÿa›oýZòïø'Í§ÄCspðÊ±xùßmFo˜‚BCÈä–
+ŽB‚[�ø�îú(¢€<ÿãWÁû/�ž°ÐµÇ³±ƒQ†úo. í* pPd€¤ïûÄ0åH®Ã@Ð4ïhÖšN“iŽ�jž\0D8QÔòy$’I'$’I$“E¡EPÿÙ``*ñbI0LÆforward.png,ÿØÿàJFIF``ÿÛC
+
+
+
+
+ÿÛC		
+
+ÿÀ"ÿÄ	
+ÿÄµ}!1AQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ýS¯$ø…ûChÞø‰á_Ú´wúÞ³¨Ck$Jr!�Ÿk1ÁãóýáŒ1NÓâT>&¸ðN¨ž’Ú?yy·`íU2íb2ÈÇ+÷‡æÂxµè¿j¯	ÂMç�lëð}¤Ü©WÜ$Œ6��»p6ãn0?Y¨¢Š+Ëþ |Ð|qãÿxÍÓuýú§¸Ž-Âíƒ±ÆF(~xà†Âí( P¢Š(ÿÙtÿØÿàJFIF``ÿÛC
+
+
+
+
+ÿÛC		
+
+ÿÀ"ÿÄ	
+ÿÄµ}!1A3ÿÿÿÿÿÿÿÿÿÿÿÿ€4ÿÿÿÿ*š5ÿÿÿÿÿÿÿÿ<0ÿÿÿÿÿÿÿÿÿÿÿÿQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ýñ¯Å}OÃŸ~øÖÖÑôïC5åÄÁŒÉäÀÏ�üÊs�ÙŒc&¿Ä/ÚFðwÄO
+ø.Õ£¿Öõ�BY"S‘lûYŽçŸï`áŠyoí5ˆ§ý¤~'„šñ	Ó5o²}¤�„ý�÷.A%wr¼‘Êõ#|'‹^‹öªð—ü$ÞyÖÎ¿ÚMÊ•}Â@¸ÁhÛ·n6àcõšŠ( ;ñWÂ/øI¾2ø'Ç¿Úßfÿ„j¸³þÍ¿í>|M|ÍãfÝÙû§8íTþ |Ð|qãÿxÍÓuýú§¸Ž-Âíƒ±ÆF(~xà†Âí( P¢Š(ÿÙŽÿØÿàJFIF``ÿÛC
+
+
+
+
+ÿÛC		
+
+ÿÀ"ÿÄ	
+ÿÄµ}!1AQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ýøéñ‚ßà—…´í~ò=Œºœ6W˜ãur\ÏG¯�€OÆO�çÂ_uˆ^{RKt¶{qt�·›<Q�ÁIùd$a°x<ƒÏŸÁD?ä€Áÿa›oýZø÷ÂV¿ìÕãÙ¶x	>Éæ‹ Ö¸J¬'Ô³+‘Œ“•ßûÀÕ]&ûûSJ³¼Ùå}¢›fs·rƒŒ÷ëEUðŸüŠÚ7ýyCÿ 
+(”øÕð~Ëãg†l4-Fñìì`Ôa¾›Ëˆ;J¨ );þñ9R+ã_Ávñ§À-Wáï„c°ÒÉo¢Ü³¤ˆîc•·2«1$#à’Ç$òMP¥è–O¦è¶’•i-íã‰Š‚U@8öâŠ( ÿÙñbI0LÆbackward.png4ñbI0LÆfastbackward.png2ñbI0LÆfastforward.png2uYÁŽÆarrowbutton.png$ÿØÿàJFIF``ÿÛC
+
+
+
+
+ÿÛC		
+
+ÿÀ"ÿÄ	
+ÿÄµ}!1AQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ú—ÅÞø/à9,¡Öü#à
++íFñ>©m
+1òÑœ®æPp\gŒŠó¿ŒšGÃÿ�~1Ö<!á_¼¶ö­jz5¤34|»‚¸,ö¸÷�85èÿl¼ñ+HºðçˆuM2[s*H¼‰fµ�"UÞ„Ÿ’E;‡#ûÊÀ‚AóÏŒsxKBýž<Eáï
+ÝépÚ[iæ;k;”s€Á‰ÆIbybÇ$’I$’k�^æ½Îú(¢º�ÿÙ
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/images/Thumbs.db
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/images/arrowbutton.png
===================================================================
--- tags/BN68/extensions/extArcims/images/arrowbutton.png	(revision 0)
+++ tags/BN68/extensions/extArcims/images/arrowbutton.png	(revision 8301)
@@ -0,0 +1,4 @@
+‰PNG
+
+
+IHDR[Í»“bIDATxÚctpp` 0^¹p‚xÕ9,@J[ßœÕ���@’Â¹zñ$‘–0‘äºh`ALS&tà´M«˜ª±û¢«jœžÆ¥šœP¢O<@R‘€‘Ôüq‡"°¶Á­IEND®B`‚
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/images/arrowbutton.png
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native


Property changes on: tags/BN68/extensions/extArcims/images
___________________________________________________________________
Added: svn:ignore
   + Thumbs.db


Index: tags/BN68/extensions/extArcims/Cliente-ArcIMS.number
===================================================================
--- tags/BN68/extensions/extArcims/Cliente-ArcIMS.number	(revision 0)
+++ tags/BN68/extensions/extArcims/Cliente-ArcIMS.number	(revision 8301)
@@ -0,0 +1,3 @@
+#Build Number for ANT. Do not edit!
+#Tue Oct 24 16:20:21 CEST 2006
+build.number=68

Property changes on: tags/BN68/extensions/extArcims/Cliente-ArcIMS.number
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/javadoc.xml
===================================================================
--- tags/BN68/extensions/extArcims/javadoc.xml	(revision 0)
+++ tags/BN68/extensions/extArcims/javadoc.xml	(revision 8301)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project default="javadoc">
+    <target name="javadoc">
+        <javadoc destdir="doc" access="private" source="1.4" use="true" notree="false" nonavbar="false" noindex="false" splitindex="true" author="true" version="true" nodeprecatedlist="false" nodeprecated="false" packagenames="es.prodevelop.cit.gvsig.arcims.fmap.datasource,es.prodevelop.cit.gvsig.arcims.gui.toc,es.prodevelop.cit.gvsig.arcims.gui.panels,es.prodevelop.cit.gvsig.arcims.gui.panels.utils,es.prodevelop.cit.gvsig.arcims.gui.dialogs,es.prodevelop.cit.gvsig.arcims.gui.wizards,es.prodevelop.cit.gvsig.arcims.extension,es.prodevelop.cit.gvsig.arcims.fmap.drivers,es.prodevelop.cit.gvsig.arcims.fmap.layers" sourcepath="src" classpath="../libFMap/lib/jmrsid-0.0.2.jar;../libFMap/lib/mysql-connector-java-3.1.7-bin.jar;../libFMap/lib/geojava.jar;../appgvSIG/lib/batik-xml.jar;../libFMap/lib/gt2-legacy.jar;../libFMap/lib/gt2-postgis.jar;../libFMap/lib/tar.jar;../extWMS/lib/remote-clients.jar;../libFMap/lib/driver-manager-1.0.jar;../fwAndami/lib/javaws.jar;../libFMap/lib/tempFileManager.jar;../appgvSIG/lib/batik-css.jar;../appgvSIG/lib/batik-util.jar;../libFMap/lib/jts-1.6.jar;../libFMap/lib/jmgeoraster.jar;../appgvSIG/lib/JimiProClasses.zip;../libFMap/lib/hsqldb.jar;../libRemoteServices/lib/kxml2.jar;../fwAndami/lib/iver-utiles.jar;../libFMap/lib/postgresql-74.213.jar;../fwAndami/lib/castor-0.9.5.3-xml.jar;../libFMap/lib/jogr.jar;../appgvSIG/lib/batik-bridge.jar;../appgvSIG/lib/batik-script.jar;../libFMap/lib/geoapi-2.0.jar;../libFMap/lib/units-0.01.jar;../appgvSIG/lib/itext-1.3.jar;../appgvSIG/lib/batik-svg-dom.jar;../appgvSIG/lib/batik-ext.jar;../libRemoteServices/bin;../fwAndami/lib/log4j-1.2.8.jar;../fwAndami/lib/xerces_2_5_0.jar;../appgvSIG/lib/batik-parser.jar;../appgvSIG/lib/batik-gvt.jar;../fwAndami/lib/xml-apis.jar;../appgvSIG/lib/batik-svggen.jar;../libFMap/lib/jgdal-0.1.0.jar;../libFMap/lib/gt2-main.jar;../fwAndami/bin;../libFMap/lib/batik-awt-util.jar;../appgvSIG/bin;../libFMap/lib/gdbms-0.8-SNAPSHOT.jar;../libFMap/bin;../appgvSIG/lib/pdf-transcoder.jar;../libFMap/lib/geotiff-jai.jar;../libFMap/lib/cms.jar;../libFMap/lib/jecwcompress-0.0.0.jar;../fwAndami/lib/crimson.jar;../appgvSIG/lib/jep-2.24.jar;../appgvSIG/lib/batik-awt-util.jar;../appgvSIG/lib/js.jar;../appgvSIG/lib/batik-swing.jar;../libFMap/lib/wkb4j-1.0-RC1.jar;../libArcIMS/bin;../appgvSIG/lib/batik-transcoder.jar;../fwAndami/lib/JUF-1.0.jar;../appgvSIG/lib/batik-gui-util.jar;../appgvSIG/lib/batik-dom.jar;../libFMap/lib/jecw-0.0.1.jar;../libFMap/lib/vecmath-1.3.jar;../libFMap/lib/postgis-jdbc-driver.jar;../appgvSIG/lib/batik-extension.jar;../fwAndami/lib/tempFileManager.jar"/>
+    </target>
+</project>

Property changes on: tags/BN68/extensions/extArcims/javadoc.xml
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/datasource/ArcImsWizardData.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/datasource/ArcImsWizardData.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/datasource/ArcImsWizardData.java	(revision 8301)
@@ -0,0 +1,366 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.datasource;
+
+import java.awt.geom.Rectangle2D;
+import java.net.URL;
+import java.util.TreeMap;
+import java.util.Vector;
+
+import com.iver.cit.gvsig.fmap.DriverException;
+import com.iver.cit.gvsig.fmap.MapControl;
+import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMSCollection;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.LayerScaleData;
+
+import org.gvsig.remoteClient.arcims.*;
+import org.gvsig.remoteClient.arcims.utils.MyCancellable;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.apache.log4j.Logger;
+import org.cresques.cts.IProjection;
+
+/**
+ * This class implements a data source object, owned by the ArcImsWizard
+ * object. It will create the ArcIMS layer and load some basic data.
+ * 
+ * @author jldominguez
+ * 
+ */
+public class ArcImsWizardData {
+	
+	private static Logger logger = Logger.getLogger(ArcImsWizardData.class.getName());
+
+	/**
+	* The graphic context in which a request is performed
+	* (ccord. system, view's dimension etc.)
+	*/
+	private ArcImsStatus status;
+	private String testInfo;
+	private String serviceType;
+	private FMapRasterArcImsDriver arcImsImageDriver = null;
+	private FMapFeatureArcImsDriver arcImsFeatureDriver = null;
+	private boolean missingSrs = false;
+	private MapControl mapControl;
+	
+	private MyCancellable myCanc;
+
+	
+	public ArcImsWizardData() {
+		myCanc = new MyCancellable(new DefaultCancellableMonitorable());
+	}
+	
+	public void setHostService(URL host, String service, String svcType) throws DriverException {
+		
+		serviceType = svcType;
+		boolean nogood = true;
+		
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			nogood = false;
+			arcImsImageDriver = new FMapRasterArcImsDriver(host.toString(), service, svcType);
+			// Send a getCapabilities request;
+			if (! arcImsImageDriver.connect(myCanc)) {
+				DriverException de = new DriverException("cant_connect");
+				logger.error("While trying to connect ", de);
+				throw de;
+			}
+			testInfo = "Connected successfully.";
+		}
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			nogood = false;
+			arcImsFeatureDriver = new FMapFeatureArcImsDriver(host.toString(), service, svcType);
+			// Send a getCapabilities request;
+			if (! arcImsFeatureDriver.connect(myCanc)) {
+				DriverException de = new DriverException("cant_connect");
+				logger.error("While trying to connect ", de);
+				throw de;
+			}
+			testInfo = "Connected successfully.";
+		}
+		if (nogood) {
+			logger.error("Nothing done. Unable to find out serviceType ");
+		}
+	}
+	
+	public void setHostService(URL host, String service, String svcType, FLayer lyr) throws DriverException {
+		
+		serviceType = svcType;
+		boolean nogood = true;
+		
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			nogood = false;
+			
+			arcImsImageDriver =
+				(FMapRasterArcImsDriver) ((FRasterLyrArcIMS) lyr).getDriver();
+
+			// arcImsImageDriver = new FMapRasterArcImsDriver(host.toString(), service, svcType);
+			// Send a getCapabilities request;
+			if (! arcImsImageDriver.connect(myCanc)) {
+				DriverException de = new DriverException("cant_connect");
+				logger.error("While trying to connect ", de);
+				throw de;
+			}
+			testInfo = "Connected successfully.";
+		}
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			nogood = false;
+			
+			// arcImsFeatureDriver = new FMapFeatureArcImsDriver(host.toString(), service, svcType);
+			arcImsFeatureDriver =
+				(FMapFeatureArcImsDriver) ((FFeatureLyrArcIMS) lyr).getSource().getDriver();
+
+			// Send a getCapabilities request;
+			if (! arcImsFeatureDriver.connect(myCanc)) {
+				DriverException de = new DriverException("cant_connect");
+				logger.error("While trying to connect ", de);
+				throw de;
+			}
+			testInfo = "Connected successfully.";
+		}
+		if (nogood) {
+			logger.error("Nothing done. Unable to find out serviceType ");
+		}
+	}
+
+	
+
+	public String getServiceType() { return serviceType; }
+	public void setServiceType(String t) { serviceType = t; }
+	
+	public ArcImsDriver getDriver() {
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			return arcImsFeatureDriver;
+		}
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			return arcImsImageDriver;
+		}
+		logger.error("Null value returned. Unable to find out serviceType ");
+		return null;
+	}
+	
+	public void setDriver(ArcImsDriver d) {
+		boolean nogood = true;
+		if (d instanceof FMapRasterArcImsDriver) {
+			arcImsImageDriver = (FMapRasterArcImsDriver) d;
+			nogood = false;
+		}
+		if (d instanceof FMapFeatureArcImsDriver) {
+			arcImsFeatureDriver = (FMapFeatureArcImsDriver) d;
+			nogood = false;
+		}
+		if (nogood) {
+			logger.error("Nothing done. Unable to find out serviceType ");
+		}
+	}
+	
+	public ArcImsStatus getStatus() { return status; }
+	public void setStatus (ArcImsStatus s) { status = s; }
+	
+	/**
+     * Gets available layers from the current server and service
+     * 
+     * @return a TreeMap with available layers
+	 */
+	public TreeMap getLayers() {
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			return arcImsFeatureDriver.getLayers();
+		}
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			return arcImsImageDriver.getLayers();
+		}
+		logger.error("Null value returned. Unable to find out serviceType in method " +
+				"TreeMap getLayers()" + ", class: "+ this.getClass().toString());
+		return null;
+		}
+
+	/**
+	 * This method is invoqued by the wizard's <tt>getLayer()</tt> method
+	 * to create an ArcIMS raster layer.
+	 * 
+	 * @param host server's URL
+	 * @param service service name
+	 * @param sLayer comma-separated list of selected layers
+	 * @param name new gvSIG layer's name
+	 * @param srs project's coordinate system
+	 * @return the new layer (of class FRasterLyrArcIMS, which is a
+	 * subclass of _FLyrArcIMS which is a subclass of FLayer)
+	 */
+	public FRasterLyrArcIMS createArcImsRasterLayer(String host, String service, String sLayer,
+			String name, IProjection srs, String imgFormat)
+	throws  Exception {
+		
+		FMapRasterArcImsDriver drv = new FMapRasterArcImsDriver(host, service, this.serviceType);
+		
+		if (!drv.connect(myCanc))
+			throw new Exception();
+	
+		FRasterLyrArcIMS flyr = new FRasterLyrArcIMS();
+		flyr.setDriver(drv);
+		flyr.setHost(new URL(host));
+		flyr.setService(service);
+		flyr.setServiceType(this.serviceType);
+		flyr.setServiceInformationInStatus(drv.getClient().getServiceInformation());
+
+		ServiceInformation si = flyr.getArcimsStatus().getServiceInfo();
+		if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
+			missingSrs = true;
+			si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
+			logger.warn("Server provides no SRS. ");
+		} else {
+			missingSrs = false;
+		}
+		
+		flyr.setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, flyr.getArcimsStatus()));
+		
+		// we *dont* use PNG always
+		// flyr.setFormat("image/png");
+		flyr.setFormat(imgFormat);
+		flyr.setTransparency(0);
+		flyr.setLayerQuery(sLayer);
+		flyr.setProjection(srs);
+		flyr.setName(name);
+		// ----------- service info ---------------
+		
+		// flyr.getSource().getDriver();
+		// ----------------- 1.0
+		
+		return flyr;
+	}
+
+	public String getTestInfo() {
+		return testInfo;
+	}
+	
+	/**
+	 * This method is invoqued by the wizard's <tt>getLayer()</tt> method
+	 * to create an ArcIMS feature layer.
+	 * 
+	 * @param host server's URL
+	 * @param service service name
+	 * @param sLayer comma-separated list of selected layers
+	 * @param name new gvSIG layer's name
+	 * @param srs project's coordinate system
+	 * @param sep whether it'a grouped set of layers (false) or not (true)
+	 * @return the new layer (of class FRasterLyrArcIMS, which is a
+	 * subclass of FRasterLyrArcIMS, which is a subclass of FLayer)
+	 */
+	public FFeatureLyrArcIMSCollection createArcImsFeatureLayer(String host, String service, String sLayer, String name, IProjection srs, boolean sep)
+	throws Exception {
+		
+		String[] selectedLayerIds = sLayer.split(",");
+		int count = selectedLayerIds.length;
+		
+		FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
+		
+		String item;
+		
+		for (int i=0; i<count; i++) {
+			
+			item = selectedLayerIds[i];
+			FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host, service, item);
+			if (!(drv.connect(myCanc))) throw new Exception();
+			
+			ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
+			VectorialEditableAdapter adapter = new VectorialEditableAdapter();
+			
+			/* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter);
+			/* 2 */ drv.setLayer(individualLayers[i]);
+			
+			ServiceInformation si = drv.getClient().getServiceInformation();
+			ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item);
+			String lyrname = silf.getName(); 
+
+			individualLayers[i].setProjectionInStatus(srs.getAbrev());
+			individualLayers[i].setHostInStatus(new URL(host));
+			individualLayers[i].setServiceInStatus(service);
+
+			String units = si.getMapunits();
+			int theDpi = si.getScreen_dpi();
+			long scale;
+			if (silf.getMaxscale()!=-1){
+				scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMaxscale(), units, theDpi);
+				individualLayers[i].setMaxScale((double) scale);
+			}
+			if (silf.getMinscale()!=-1){
+				scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMinscale(), units, theDpi);
+				individualLayers[i].setMinScale((double) scale);			
+			}
+		
+			individualLayers[i].setServiceInformationInStatus(si);
+			Vector ids = new Vector(); ids.add(item);
+			individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
+			individualLayers[i].setSubfieldsInStatus();
+			
+			
+			/* 3 */ 
+			// individualLayers[i].setLegend(new VectorialUniqueValueLegend());
+			
+			
+			individualLayers[i].setHost(new URL(host));
+			individualLayers[i].setService(service);
+			individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE);
+			individualLayers[i].setTransparency(0);
+			individualLayers[i].setLayerQuery(item);
+			individualLayers[i].setProjection(srs);
+			individualLayers[i].setName(lyrname);
+
+			Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
+			drv.setFullExtent(fext);
+			// individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
+			
+			// ------ -------------
+			drv.setAdapter(adapter);
+			// adapter.setRecordSet(drv.getRecordSet());
+			adapter.setOriginalDataSource(drv.getRecordSet());
+			adapter.setOriginalVectorialAdapter(oldadapter);
+			drv.declareTable();
+			individualLayers[i].setInitialLegend();
+			individualLayers[i].setShapeType(adapter.getShapeType());
+			individualLayers[i].setRecordset(drv.getRecordSet());
+			// ------ -------------
+			
+			if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
+				missingSrs = true;
+				si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
+				logger.warn("Server provides no SRS. ");
+			} else {
+				missingSrs = false;
+			}
+			
+		}
+
+		FFeatureLyrArcIMSCollection collection = new FFeatureLyrArcIMSCollection(mapControl.getMapContext(), null, sep);
+		collection.setName(name);
+		collection.setProjection(srs);
+		for (int i=0; i<count; i++) {
+			collection.addLayer(individualLayers[i]);
+		}
+		return collection;
+	}	
+
+	/**
+	 * Tells whether the SRS was missing on the server.
+	 * 
+	 * @return <tt>true</tt> if and only if the Srs was not provided by the server.
+	 */
+	public boolean isMissingSrs() {
+		return missingSrs;
+	}
+
+	public void setMissingSrs(boolean missingSrs) {
+		this.missingSrs = missingSrs;
+	}
+
+	public void setMapControl(MapControl mapControl) {
+		this.mapControl = mapControl;
+	}
+	
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/datasource/ArcImsWizardData.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsDriver.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsDriver.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsDriver.java	(revision 8301)
@@ -0,0 +1,62 @@
+/**
+ * 
+ */
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.ProtocolException;
+import java.net.URL;
+
+import org.gvsig.remoteClient.arcims.ArcImsStatus;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.wms.ICancellable;
+
+/**
+ * This interface offers the functionality of an ArcIMS client.
+ * 
+ * @see es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver FMapRasterArcImsDriver
+ * @author jldominguez
+ */
+public interface ArcImsDriver {
+	
+	/**
+	* Gets the layers available on the server
+	* (the class that implements this interface will 
+	* get the service name from the user)
+	* 
+	* @param server ArcIMS server's URL
+	*/
+	public void getCapabilities(URL server, ICancellable cancel)
+		throws ArcImsException, IOException, ProtocolException;
+
+	/**
+	* Gets the visual information from the layers of 
+	* the required service (that is, the map itself) depending
+	* on the graphic context (coord. system, view's size, etc)
+	* 
+	* @param status the graphic context in which the request is performed
+	* @return the graphic data to be viewed, that is, the map
+	*/
+	public Object getMap(ArcImsStatus status)
+		throws ArcImsException, IOException, ProtocolException;
+
+	/**
+	* Gets the layer's available information on a particular xy coordinates
+	* (usually derived from a mouse click). If it's a raster layer,
+	* a request will be sent to the server asking for the data associated
+	* to the elements (polygon, line or point) which cover the clicked
+	* pixel.
+	* 
+	* @param status the graphic context in which the request is performed
+	* (ccord. system, view's dimension etc.)
+	* @param i x coordinate of the queried pixel 
+	* @param j y coordinate of the queried pixel
+	* @param  max_value maximun number of vector elements whose information
+	* will be retrieved.
+	* @return the available information at the given coordinates
+	*/
+	public String getFeatureInfo(ArcImsStatus status, int i, int j, int max_value)
+	throws ArcImsException, IOException, ProtocolException;
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsDriver.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapFeatureArcImsDriver.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapFeatureArcImsDriver.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapFeatureArcImsDriver.java	(revision 8301)
@@ -0,0 +1,815 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.Rectangle2D.Double;
+import java.io.File;
+import java.io.IOException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Random;
+import java.util.TreeMap;
+
+import javax.swing.JFileChooser;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.ArcImsClientP;
+import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
+import org.gvsig.remoteClient.arcims.ArcImsStatus;
+import org.gvsig.remoteClient.arcims.ArcImsVectStatus;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.gvsig.remoteClient.exceptions.ServerErrorException;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+import org.gvsig.remoteClient.wms.ICancellable;
+
+import com.hardcode.driverManager.DriverLoadException;
+import com.hardcode.gdbms.engine.data.DataSource;
+import com.hardcode.gdbms.engine.data.DataSourceFactory;
+import com.hardcode.gdbms.engine.data.driver.DriverException;
+import com.hardcode.gdbms.engine.data.object.ObjectSourceInfo;
+import com.hardcode.gdbms.engine.instruction.EvaluationException;
+import com.hardcode.gdbms.engine.instruction.SemanticException;
+import com.hardcode.gdbms.engine.values.IntValue;
+import com.hardcode.gdbms.engine.values.Value;
+import com.hardcode.gdbms.engine.values.ValueFactory;
+import com.hardcode.gdbms.parser.ParseException;
+import com.iver.andami.PluginServices;
+import com.iver.andami.ui.mdiManager.IWindow;
+import com.iver.cit.gvsig.fmap.core.DefaultFeature;
+import com.iver.cit.gvsig.fmap.core.FShape;
+import com.iver.cit.gvsig.fmap.core.IFeature;
+import com.iver.cit.gvsig.fmap.core.IGeometry;
+import com.iver.cit.gvsig.fmap.core.ShapeFactory;
+import com.iver.cit.gvsig.fmap.core.v02.FConstant;
+import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
+import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
+import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
+import com.iver.cit.gvsig.fmap.layers.FBitSet;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.fmap.layers.LayerFactory;
+import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
+import com.iver.cit.gvsig.project.Project;
+import com.iver.cit.gvsig.project.ProjectFactory;
+import com.iver.cit.gvsig.project.documents.table.ProjectTable;
+import com.iver.cit.gvsig.project.documents.view.ProjectView;
+import com.iver.cit.gvsig.project.documents.view.gui.View;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsAttributesDataSourceAdapter;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+
+public class FMapFeatureArcImsDriver implements ArcImsDriver, VectorialDriver {
+	
+	private static Logger logger = Logger.getLogger(FMapFeatureArcImsDriver.class.getName());
+	
+	private ArcImsFeatureClient client;
+	private String server; 
+	private String service;
+	private String serviceType;
+	private String remoteLayerName;
+	private ArcImsAttributesDataSourceAdapter attsDataSourceAdapter;
+	private SelectableDataSource dataSource = null;
+	private DriverAttributes drvAtts;
+	private ArrayList geometries;
+	private HashMap pseudoGeometries;
+	private int shapeType = FShape.NULL;
+	private FFeatureLyrArcIMS layer;
+	
+	private HashMap overallIndexToVisibleIndex;
+	private HashMap visibleIndexToOverallIndex;
+	
+	private DataSourceFactory dataSourceFactory = null;
+	
+	private Rectangle2D fullExtent;
+	private IGeometry invisiblePoint = ShapeFactory.createPoint2D(0.0, 0.0);
+	
+	private VectorialEditableAdapter eadapter;
+	
+	/**
+	* The constructor needs the server's URL and the name of the service to be used.
+	* 
+	* @param host server's URL
+	* @param service name of the service, chosen among the ones retrieved after a
+	* request with the parameter <tt>ServiceName=Catalog</tt>
+	*/
+	public FMapFeatureArcImsDriver(String host, String service, String theRemoteLayerName) {
+		remoteLayerName = theRemoteLayerName;
+		init(host, service);
+		overallIndexToVisibleIndex = new HashMap();
+		visibleIndexToOverallIndex = new HashMap();
+		pseudoGeometries = new HashMap();
+	}
+	
+	/**
+	* The constructor needs the server's URL and the name of the service to be used.
+	* 
+	* @param host server's URL
+	* @param service name of the service, chosen among the ones retrieved after a
+	* request with the parameter <tt>ServiceName=Catalog</tt>
+	*/
+	public FMapFeatureArcImsDriver(String host, String service) {
+		remoteLayerName = "None";
+		init(host, service);
+		overallIndexToVisibleIndex = new HashMap();
+		visibleIndexToOverallIndex = new HashMap();
+	}
+	
+	/**
+	 * This method is called by the constructor and creates the 
+	 * <tt>client</tt> object.
+	 * @param host
+	 * @param service
+	 */
+	public void init(String host, String svc) {
+		server = host;
+		service = svc;
+		// This class is part of libArcIMS:
+		client = new ArcImsFeatureClient(host, service, ServiceInfoTags.vFEATURESERVICE);
+	}
+	
+	private String getIdName() {
+		
+		String id = (String) this.layer.getArcimsStatus().getLayerIds().get(0);
+		ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) client.getServiceInformation().getLayerById(id);
+		
+		ArrayList fi = silf.getFieldInformationByType(FieldInformation.ID);	
+
+		if (fi.size() != 1) {
+			logger.error("ID does not have cardinality one: " + fi.size());
+		}
+		return ((FieldInformation) fi.get(0)).getName();
+	}
+	
+	private ArrayList getClientsColumnNames() {
+		String id = (String) layer.getArcimsStatus().getLayerIds().get(0);
+		ServiceInformationLayerFeatures silf =
+			(ServiceInformationLayerFeatures) client.getServiceInformation().getLayerById(id);
+		int length = silf.getFieldsInfo().size();
+
+		ArrayList resp = new ArrayList();
+		for (int i=0; i<length; i++) {
+			resp.add(silf.getFieldInformation(i).getName());
+		}
+		return resp;
+	}
+	
+	private ArrayList getClientsColumnTypes() {
+		String id = (String) layer.getArcimsStatus().getLayerIds().get(0);
+		ServiceInformationLayerFeatures silf =
+			(ServiceInformationLayerFeatures) client.getServiceInformation().getLayerById(id);
+		int length = silf.getFieldsInfo().size();
+
+		ArrayList resp = new ArrayList();
+		for (int i=0; i<length; i++) {
+			resp.add(new Integer(silf.getFieldInformation(i).getType()));
+		}
+		return resp;
+	}
+
+	public void closeDataSource() {
+		try {
+			dataSource.stop();
+		} catch (DriverException e) {
+			logger.error("While closing data source ", e);
+		}
+	}
+	
+	public SelectableDataSource getRecordSet() {
+		return getRecordSet(null);
+	}
+	
+	public SelectableDataSource getRecordSet(String mustHaveThisName) {
+		
+		if (dataSource != null) return dataSource;
+		
+		String subf[] = new String[1];
+		subf[0] = getIdName();
+		
+		ArrayList ids = new ArrayList();
+		try {
+			// ids = getTestIds(); 
+			ids = client.getAttributes(layer.getArcimsStatus(), subf, "", null);
+		} catch (ArcImsException e1) {
+			logger.error("While getting attributes initially ", e1);
+		}
+		
+		Value[] idval = getAsValueArray(ids);
+
+		dataSourceFactory = LayerFactory.getDataSourceFactory();
+		
+		// dataSourceFactory.
+		// FakeObjectDriver driver = new FakeObjectDriver();
+		attsDataSourceAdapter = new ArcImsAttributesDataSourceAdapter(getClientsColumnNames(),
+				getClientsColumnTypes(), idval, dataSourceFactory, this, mustHaveThisName);
+		
+		dataSourceFactory.addDataSource(attsDataSourceAdapter, attsDataSourceAdapter.getTableName());
+		
+		ObjectSourceInfo osi = (ObjectSourceInfo) dataSourceFactory.getDriverInfo(attsDataSourceAdapter.getTableName());
+		osi.name = attsDataSourceAdapter.getTableName();
+		osi.driverName = "ArcImsAttributesDataSourceAdapter";
+		
+//		String tablename = attsDataSourceAdapter.getTableName();
+//		String sqlstr = "select * from " + tablename + " where " + ArcImsSqlUtils.rowIndexFieldName + " = 8;";
+//		DataSource result = null;
+//		int n = -1;
+		
+		try {
+//			attsDataSourceAdapter.start();
+//			result = dataSourceFactory.executeSQL(sqlstr, DataSourceFactory.AUTOMATIC_OPENING);
+//			attsDataSourceAdapter.stop();
+//			
+//			n = (int) result.getRowCount();
+			dataSource = new SelectableDataSource(attsDataSourceAdapter);
+		} catch (DriverException e) {
+			logger.error("While creating DataSource ", e);
+		}
+		return dataSource;
+	}
+	
+	public void declareTable() {
+		try {
+			IWindow v = PluginServices.getMDIManager().getActiveWindow();
+			
+			if (v == null) {
+				
+				ProjectView pv = new ProjectView();
+				pv.setName("Nueva");
+				View newview = (View) pv.createWindow();
+				newview.setModel(pv);
+				Project newproj = new Project();
+				newproj.setName("nuevo");
+				newproj.addDocument(pv);
+				// newproj.addView(newprojview);
+				v = newview;
+			}
+
+			ProjectView pv = (ProjectView) ((View) v).getModel();
+			ProjectTable pt = ProjectFactory.createTable(attsDataSourceAdapter.getName(), eadapter);
+			pv.getProject().addDocument(pt);
+		} catch (Exception e) {
+			logger.error("While creating DataSource ", e);
+			e.printStackTrace();
+		}
+	}
+	
+	public void loadRecordSet() {
+		
+		if (dataSource != null) return;
+		
+		String subf[] = new String[1];
+		subf[0] = getIdName();
+		
+		ArrayList ids = new ArrayList();
+		try {
+			// ids = getTestIds(); 
+			ids = client.getAttributes(layer.getArcimsStatus(), subf, "", null);
+		} catch (ArcImsException e1) {
+			logger.error("While getting attributes initially ", e1);
+		}
+		
+		Value[] idval = getAsValueArray(ids);
+
+		dataSourceFactory = LayerFactory.getDataSourceFactory();
+		
+		// dataSourceFactory.
+		// FakeObjectDriver driver = new FakeObjectDriver();
+		attsDataSourceAdapter = new ArcImsAttributesDataSourceAdapter(getClientsColumnNames(),
+				getClientsColumnTypes(), idval, dataSourceFactory, this, null);
+		dataSourceFactory.addDataSource(attsDataSourceAdapter, attsDataSourceAdapter.getTableName());
+		try {
+			dataSource = new SelectableDataSource(attsDataSourceAdapter);
+		} catch (DriverException e) {
+			logger.error("While loading selectable data source");
+		}
+		
+//		try {
+//			dataSource = new SelectableDataSource(attsDataSourceAdapter);
+//			View v = PluginServices.getMDIManager().getActiveView();
+//			
+//			if (v == null) {
+//				ProjectView newprojview = ProjectView.createView("Nueva");
+//				com.iver.cit.gvsig.gui.View newview = new com.iver.cit.gvsig.gui.View();
+//				newview.setModel(newprojview);
+//				Project newproj = new Project();
+//				newproj.setName("nuevo");
+//				newproj.addView(newprojview);
+//				v = newview;
+//			}
+//			ProjectView pv = ((com.iver.cit.gvsig.gui.View) v).getModel();
+//			ProjectTable pt = ProjectTable.createTable(attsDataSourceAdapter.getName(), dataSource);
+//			pv.getProject().addTable(pt);
+//		} catch (Exception e) {
+//			logger.error("While creating DataSource ", e);
+//			e.printStackTrace();
+//		}
+	}
+
+	private Value[] getAsValueArray(ArrayList ids) {
+		Value[] resp = new Value[ids.size()];
+		for (int i=0; i<ids.size(); i++) {
+			resp[i] = ((Value []) ids.get(i))[0];
+		}
+		return resp;
+	}
+
+	public void getCapabilities(URL server, ICancellable cancel) throws ArcImsException, IOException, ProtocolException {
+		logger.error("Empty method: nothing done in method getCapabilities(URL) - class: " +
+		getClass().toString());
+	}
+
+	public Object getMap(ArcImsStatus status) throws ArcImsException, IOException, ProtocolException {
+		
+		String[] fieldquery = ((ArcImsVectStatus) status).getSubfields();
+		int nooffields = fieldquery.length;
+
+		try {
+			geometries = client.getMap((ArcImsVectStatus) status);
+			if (geometries.size() > 0) {
+				logger.info("Start updating attributes");
+				updateIndexHashMaps(geometries, fieldquery, nooffields);
+				logger.info("End updating attributes");
+			} else {
+				updateIndexHashMaps(geometries, fieldquery, nooffields);
+				logger.warn("No geometries retrieved from client ");
+			}
+		} catch (ServerErrorException e) {
+			ArcImsException aie = new ArcImsException(e.getMessage()); 
+			logger.error("While getting map ", aie);
+			throw aie;
+		}
+		return geometries;
+	}
+	
+
+	// **************************
+	// 
+	// **************************
+	private void updateIndexHashMaps(ArrayList iFeatArrayList, String[] f_query, int n_of_fields) {
+
+		int added_row_ind;
+		
+		// ------------ get id position --------------
+		int idfieldind = -1;
+		for (int i=0; i<n_of_fields; i++) {
+			if (f_query[i].compareTo(getIdName()) == 0) {
+				idfieldind = i;
+			}
+		}
+		if (idfieldind == -1) {
+			logger.error("ID not found in query ");
+		}
+		// -------------------------------------------
+		
+		IntValue id;
+		
+		try {
+			overallIndexToVisibleIndex.clear();
+			visibleIndexToOverallIndex.clear();
+			
+			for (int i = 0; i < iFeatArrayList.size(); i++) {
+				IFeature ifeat = (IFeature) iFeatArrayList.get(i);
+				id = (IntValue) ifeat.getAttribute(idfieldind);
+				added_row_ind = attsDataSourceAdapter.getRowIndex(id.getValue());
+				
+				addPseudoGeometry(ifeat.getGeometry(), added_row_ind);
+
+//				Value[] newrow = new Value[n_of_fields];
+//				for (int j = 0; j < n_of_fields; j++)
+//					newrow[j] = ifeat.getAttribute(j); 
+//				// System.err.println("Updating row with id = " + ((IntValue) newrow[1]).getValue());
+//				attsDataSourceAdapter..getRowIndex()
+//				added_row_ind = attsDataSourceAdapter.updateRow(newrow, f_query);
+
+				// logger.debug("Added pair:  Visible: " + i + ", Overall: " + added_row_ind);
+				overallIndexToVisibleIndex.put(new Integer(added_row_ind), new Integer(i));
+				visibleIndexToOverallIndex.put(new Integer(i), new Integer(added_row_ind));
+			}
+//			}
+		} catch (DriverException e) {
+			logger.error("While updating attributes ", e);
+		}
+	}
+
+	public String getFeatureInfo(ArcImsStatus status, int i, int j,
+			int max_value) throws ArcImsException, IOException,
+			ProtocolException {
+		// TODO comment
+		return "";
+	}
+	
+//	public ArrayList getGeometries() {
+//		if (geometries == null) {
+//			// geometris = client.get.....
+//			setTestGeometries();
+//		}
+//		return geometries;
+//	}
+//	
+	/**
+	 * This method starts a connection with the server and sends
+	 * a <tt>getCapabilities</tt> request.
+	 * @return <b>true</b> if the connection was successful, <b>false</b>
+	 * otherwise (bad or no server URL, for example)
+	 */
+	public boolean connect(ICancellable cancel) {
+
+		return client.connect(cancel);
+//		File csvFile = null;
+//		// This method is in libArcIMS
+//		// csvFile = client....connect(); (por ejemplo)
+//		
+//		JFileChooser jfc = new JFileChooser();
+//		jfc.setDialogTitle("Indice archivo CSV con los atributos de las geometrias");
+//	    int returnVal = jfc.showOpenDialog(null);
+//	    if (returnVal != JFileChooser.APPROVE_OPTION) {
+//	    	return false;
+//	    }
+//	    csvFile = jfc.getSelectedFile();
+//		if (! jfc.accept(csvFile)) return false;
+//		
+//		// csv = 
+//		// .....
+//		dataSource = getRecordSet(csvFile);
+//		// return client.connect();
+//		return true;
+	}
+	
+	/**
+    * Gets available layers from the current server and service
+    * 
+    * @return a TreeMap with available layers
+	 */
+	public TreeMap getLayers() {
+		return null;
+		// This method is in libArcIMS
+		// return client.getLayers();
+	}
+	
+	/**
+	 * Gets the <tt>ArcImsClientP client</tt> object, onto which requests
+	 * are passed.
+	 * 
+	 * @return the inner object that actually performs requests.
+	 */
+	public ArcImsClientP getClient() {
+		if (client == null) {
+			init(server, service);
+		}
+		return client;
+	}
+	
+	// ========== VECTORIAL DRIVER INTERFACE == START =======
+
+	public int getShapeType() {
+		
+		if (shapeType == FShape.NULL) {
+			
+			ServiceInformationLayerFeatures silf =
+				(ServiceInformationLayerFeatures) client.getServiceInformation().getLayerById(remoteLayerName);
+			
+			shapeType = libArcImsShapeTypeToGvSigType(silf.getIntFclassType());
+		}
+		return shapeType;
+	}
+
+	public int getShapeCount() throws IOException {
+		try {
+			// return geometries.size();
+			return (int) getRecordSet().getRowCount();
+		} catch (DriverException e) {
+			IOException ioe = new IOException(e.getMessage());
+			throw ioe;
+		}
+	}
+
+	public DriverAttributes getDriverAttributes() {
+		if (drvAtts != null) return drvAtts;
+		drvAtts = new DriverAttributes();
+		drvAtts.setLoadedInMemory(true);
+		return drvAtts;
+	}
+
+	public Rectangle2D getFullExtent() throws IOException {
+		return fullExtent;
+	}
+
+//	public IGeometry getShape(int index) throws IOException {
+//		return ((IFeature) geometries.get(index)).getGeometry();
+//	}
+	
+	private void addPseudoGeometry(IGeometry igeom, int row) {
+		pseudoGeometries.put(new Integer(row), igeom);
+	}
+
+	public IGeometry getShape(int index) throws IOException {
+		Integer overallIndex = new Integer(index);
+		Integer visibleIndex = (Integer) overallIndexToVisibleIndex.get(overallIndex);
+		
+		if (visibleIndex == null) {
+			// Somebody asked for a non-visible shape.
+			IGeometry igeo = (IGeometry) pseudoGeometries.get(overallIndex);
+			if (igeo != null) {
+				return igeo;
+			}
+			
+			// We dont have the geometry and we dont have its pseudo envelope
+			// (this happens when loading a project with a selection and the user
+			// performs a zoom to selection)
+			String id = layer.getLayerQuery();
+			BoundaryBox bb = client.getServiceInformation().getLayerById(id).getEnvelope();
+			
+			double[] fullx = new double[4];
+			double[] fully = new double[4];
+			
+			fullx[0] = bb.getXmin(); 
+			fullx[1] = bb.getXmin(); 
+			fullx[2] = bb.getXmax(); 
+			fullx[3] = bb.getXmax();
+			fully[0] = bb.getYmin(); 
+			fully[1] = bb.getYmax(); 
+			fully[2] = bb.getYmin(); 
+			fully[3] = bb.getYmax();
+			
+			IGeometry full = ShapeFactory.createMultipoint2D(fullx, fully);
+			return full;
+			
+		} else {
+			return ((IFeature) geometries.get(visibleIndex.intValue())).getGeometry();
+		}
+	}
+
+	public String getName() {
+		return "FMapFeatureArcImsDriver";
+	}
+	
+	// ========== VECTORIAL DRIVER INTERFACE == END =======
+	
+//	private void setTestGeometries() {
+//		IGeometry g;
+//		File wktfile = null;
+//		JFileChooser jfc = new JFileChooser();
+//		try {
+//			jfc.setDialogTitle("Indice archivo WKT con " + getShapeCount() + " geometrias");
+//		} catch (IOException e) {
+//			logger.error("Error while opening WKT file. ", e);
+//		}
+//	    int returnVal = jfc.showOpenDialog(null);
+//	    if (returnVal != JFileChooser.APPROVE_OPTION) return;
+//	    wktfile = jfc.getSelectedFile();
+//		if (! jfc.accept(wktfile)) return;
+//		WKTFGeometryReader reader = new WKTFGeometryReader(wktfile);
+//		g = reader.getNextFGeometry();
+//		geometries = new ArrayList();
+//		while (g != null) {
+//			geometries.add(g);
+//			g = reader.getNextFGeometry();;
+//		}
+//	}
+
+	public void setFullExtent(Rectangle2D fullExtent) {
+		this.fullExtent = fullExtent;
+	}
+
+	public FFeatureLyrArcIMS getLayer() {
+		return layer;
+	}
+
+	public void setLayer(FFeatureLyrArcIMS layer) {
+		this.layer = layer;
+	}
+	
+//	private ArrayList getTestIds() throws ArcImsException {
+//		Value[] ids = new Value[252];
+//		
+//		for (int i=0; i<252; i++) {
+//			ids[i] = ValueFactory.createValue(i);
+//		}
+//		ArrayList resp = new ArrayList();
+//		resp.add(ids);
+//		return resp;
+//	}
+	
+	public int getOverallIndex(int i) {
+		Integer ov = (Integer) visibleIndexToOverallIndex.get(new Integer(i));
+		return ov.intValue();
+	}
+
+	public void requestFeatureAttributes(FBitSet fbs) throws ArcImsException {
+		if (fbs.cardinality() == 0) return;
+		FBitSet needRequest = leaveBitsThatNeedRequest(fbs);
+		
+		requestFeatureAttributesWithoutChecking(needRequest);
+	}
+
+	public void requestBlockWithoutChecking(int[] indlimits) throws ArcImsException {
+
+		FBitSet fbs = new FBitSet();
+		fbs.set(indlimits[0], indlimits[1] + 1);
+		
+		int length = fbs.cardinality();
+		if (length == 0) return;
+		
+		int[] ids = new int[length];
+		int rowinds[] = new int[length];
+		int idind = 0;
+		
+		try {
+			for (int i = fbs.nextSetBit(0); i >= 0; i = fbs.nextSetBit(i + 1)) {
+				ids[idind] = attsDataSourceAdapter.getRowId(i);
+				rowinds[idind] = i;
+				idind++;
+			}
+
+			String minval = Integer.toString(attsDataSourceAdapter.getRowId(indlimits[0]));
+			String maxval = Integer.toString(attsDataSourceAdapter.getRowId(indlimits[1]));
+			
+			int idcolindex = attsDataSourceAdapter.getIdIndex();
+			String idFieldName = attsDataSourceAdapter.getOriginalFieldName(idcolindex);
+			String whereClause = idFieldName + " &gt;= " + minval + " and "	+
+			idFieldName + " &lt;= " + maxval;
+
+			System.err.println("WHERE = " + whereClause);
+			
+			String subflds[] = new String[1];
+			subflds[0] = "#ALL#";
+			
+			logger.debug("Justo antes de llamar a client.getAttributes(...)");
+			
+			// ---------------- with geometries -----------------------
+//			ArrayList atts = client.getAttributes(layer.getArcimsStatus(),
+//					subflds, whereClause, null);
+			ArrayList atts = client.getAttributesWithEnvelope(layer.getArcimsStatus(),
+					subflds, whereClause, null);
+			// --------------------------------------------------------
+			
+			logger.debug("Justo despues de llamar a client.getAttributes(...)");
+			
+			logger.debug("Justo antes de llamar a attsDataSourceAdapter.updateRow(...) " + atts.size() + " veces");
+
+			for (int i = (atts.size() - 1); i >= 0; i--) {
+				Value[] newrow = ((DefaultFeature) atts.get(i)).getAttributes();
+				// Value[] newrow = (Value[]) atts.get(i);
+				attsDataSourceAdapter.updateRow(newrow, subflds, rowinds[i]);
+			}
+			
+			// -------------- pseudo geometries:
+			for (int i = (atts.size() - 1); i >= 0; i--) {
+				IGeometry ig = ((DefaultFeature) atts.get(i)).getGeometry();
+				addPseudoGeometry(ig, rowinds[i]);
+			}
+			// -------------- 
+
+			logger.debug("Justo despues de llamar a attsDataSourceAdapter.updateRow(...)");
+			logger.debug("Justo antes de llamar a attsDataSourceAdapter.addAsRequested(...)");
+			
+			attsDataSourceAdapter.addAsRequested(fbs);
+			
+			logger.debug("Justo despues de llamar a attsDataSourceAdapter.addAsRequested(...)");
+			
+		} catch (DriverException e) {
+			ArcImsException aie = new ArcImsException("datasource_error");
+			logger.error("While requesting features ", aie);
+			throw aie;
+		}
+	}
+	
+	public void requestFeatureAttributesWithoutChecking(FBitSet fbs) throws ArcImsException {
+
+		int length = fbs.cardinality();
+		if (length == 0) return;
+		
+		int rowcount = 0;
+		int firstnonreq = 0;
+		try {
+			rowcount = (int) attsDataSourceAdapter.getRowCount();
+		} catch (DriverException e1) {
+			logger.error("Unexpected error while getting row count ");
+			return;
+		}
+		
+		firstnonreq = fbs.nextClearBit(fbs.nextSetBit(0));
+		if (firstnonreq >= rowcount) {
+			firstnonreq = 0;
+		}
+		if (length < 10) {
+			fbs.or(
+			attsDataSourceAdapter.getNonRequestedFromHere(
+					firstnonreq,
+					attsDataSourceAdapter.getRowsPerRequest() - length
+					)
+					);
+			length = fbs.cardinality();
+		}
+		
+		int[] ids = new int[length];
+		int rowinds[] = new int[length];
+		int idind = 0;
+		
+		try {
+			for (int i = fbs.nextSetBit(0); i >= 0; i = fbs.nextSetBit(i + 1)) {
+				ids[idind] = attsDataSourceAdapter.getRowId(i);
+				rowinds[idind] = i;
+				idind++;
+			}
+
+			String inParenthesis = getInIntParenthesis(ids);
+			int idcolindex = attsDataSourceAdapter.getIdIndex();
+			String idFieldName = attsDataSourceAdapter.getOriginalFieldName(idcolindex);
+			String whereClause = idFieldName + " " + inParenthesis;
+			String subflds[] = new String[1];
+			subflds[0] = "#ALL#";
+			
+			// -------------- with geometries -------------------------
+			ArrayList atts = client.getAttributesWithEnvelope(layer.getArcimsStatus(),
+					subflds, whereClause, null);
+//			ArrayList atts = client.getAttributes(layer.getArcimsStatus(),
+//					subflds, whereClause, null);
+			// --------------------------------------------------------
+			
+			// -------------- pseudo geometries:
+			for (int i = (atts.size() - 1); i >= 0; i--) {
+				IGeometry ig = ((DefaultFeature) atts.get(i)).getGeometry();
+				addPseudoGeometry(ig, rowinds[i]);
+			}
+			// -------------- 
+			
+
+			for (int i = (atts.size() - 1); i >= 0; i--) {
+				Value[] newrow = ((DefaultFeature) atts.get(i)).getAttributes();
+				// Value[] newrow = (Value[]) atts.get(i);
+				attsDataSourceAdapter.updateRow(newrow, subflds, rowinds[i]);
+			}
+			attsDataSourceAdapter.addAsRequested(fbs);
+		} catch (DriverException e) {
+			ArcImsException aie = new ArcImsException("datasource_error");
+			logger.error("While requesting features ", aie);
+			throw aie;
+		}
+		
+	}
+	
+
+	private FBitSet leaveBitsThatNeedRequest(FBitSet fbs) {
+		FBitSet resp = (FBitSet) fbs.clone();
+		
+		for(int i=resp.nextSetBit(0); i>=0; i=resp.nextSetBit(i+1)) {
+			if (! attsDataSourceAdapter.isNonRequestedRow(i)) {
+				resp.clear(i);
+			} 
+		}
+		return resp;
+	}
+
+	private String getInIntParenthesis(int[] ids) {
+		String resp = "IN (";
+		for (int i=0; i<ids.length; i++) {
+			resp = resp + " " + ids[i] + ","; 
+		}
+		resp = resp.substring(0, resp.length() - 1);
+		resp = resp + ")";
+		return resp;
+	}
+	
+	private int libArcImsShapeTypeToGvSigType(int type) {
+		
+		int resp = type;
+		
+		switch (type) {
+		
+		case FShape.MULTIPOINT:
+			resp = FShape.POINT;
+			break;
+		}
+		
+		return resp;
+	}
+
+	public void setAdapter(VectorialEditableAdapter adapter) {
+		eadapter = adapter;
+	}
+	
+	public VectorialEditableAdapter getAdapter() {
+		return eadapter;
+	}
+
+	public void reload() throws IOException, DriverException {
+	}
+
+	public boolean isWritable() {
+		return false;
+	}
+
+	public String getRemoteLayerName() {
+		return remoteLayerName;
+	}
+
+	public void setRemoteLayerName(String remoteLayerName) {
+		this.remoteLayerName = remoteLayerName;
+	}
+
+}
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapFeatureArcImsDriver.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterDriver.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterDriver.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterDriver.java	(revision 8301)
@@ -0,0 +1,267 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.cresques.cts.ICoordTrans;
+import org.cresques.cts.IProjection;
+import org.cresques.io.GdalFile;
+import org.cresques.io.GeoRasterFile;
+import org.cresques.filter.RasterFilterStack;
+import org.cresques.filter.RasterStats;
+
+import com.iver.cit.gvsig.fmap.ViewPort;
+import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
+import com.iver.cit.gvsig.fmap.drivers.RasterDriver;
+
+public class ArcImsRasterDriver implements RasterDriver {
+	
+	private Rectangle2D fullExtent;
+	private int numBands, width, height;
+	private int rband = 0;
+	private int gband = 1;
+	private int bband = 2;
+	private int transparency = 128;
+	private boolean hasTransparency;
+	private RasterFilterStack filterStack;
+	private String fileName = "";
+	
+	private ArrayList grfiles;
+	private IProjection projection;
+	
+	public ArcImsRasterDriver() {
+		GeoRasterFile.registerExtension("gif", GdalFile.class);
+	}
+
+	public boolean fileAccepted(File fName) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	public void open(File f) throws IOException {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void initialize() throws IOException {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void close() throws IOException {
+		// TODO Auto-generated method stub
+
+	}
+
+	public Rectangle2D getFullExtent() {
+		return fullExtent;
+	}
+
+	public int getNumBands() {
+		return numBands;
+	}
+
+	public int getTransparency() {
+		return transparency;
+	}
+
+	public void setTransparency(int trans) {
+		transparency = trans;
+	}
+
+	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort)
+			throws DriverIOException {
+		// TODO Auto-generated method stub
+
+	}
+
+	public int getRasterDataType() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public Object getData(int x, int y, int band) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public int getDataAsInt(int x, int y, int band) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public byte getDataAsByte(int x, int y, int band) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public float getDataAsFloat(int x, int y, int band) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public double getDataAsDouble(int x, int y, int band) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public Image getImage(Dimension size, Rectangle2D userSize, ICoordTrans rp) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public ArrayList getAttributes() {
+		// TODO Auto-generated method stub
+		Object[] _filename = new Object[2];
+		_filename[0] = new String("Filename");
+		_filename[1] = new String(fileName);
+		
+		Object[] _filesize = new Object[2];
+		_filesize[0] = new String("Filesize");
+		_filesize[1] = new Long(0);
+		
+		Object[] _width = new Object[2];
+		_width[0] = new String("Width");
+		_width[1] = new Integer(width);
+		
+		Object[] _height = new Object[2];
+		_height[0] = new String("Height");
+		_height[1] = new Integer(height);
+		
+		ArrayList resp = new ArrayList();
+		resp.add(_filename);
+		resp.add(_filesize);
+		resp.add(_width);
+		resp.add(_height);
+		
+		return resp;
+	}
+
+	public int getBand(int flag) {
+		switch (flag) {
+		case GeoRasterFile.RED_BAND:
+			return rband;
+		case GeoRasterFile.GREEN_BAND:
+			return gband;
+		case GeoRasterFile.BLUE_BAND:
+			return bband;
+		}
+		return -1;
+	}
+
+	public int getPosFile(int flag) {
+		return -1;
+	}
+
+	public void setTransparency(boolean t) {
+		hasTransparency = t;
+	}
+
+	public void setBand(int flag, int nBand) {
+		switch (flag) {
+		case GeoRasterFile.RED_BAND:
+			rband = nBand;
+			break;
+		case GeoRasterFile.GREEN_BAND:
+			gband = nBand;
+			break;
+		case GeoRasterFile.BLUE_BAND:
+			bband = nBand;
+			break;
+		}
+	}
+
+	public RasterFilterStack getFilterStack() {
+		return filterStack;
+	}
+
+	public void setFilterStack(RasterFilterStack stack) {
+		filterStack = stack;
+	}
+
+	public GeoRasterFile[] getFiles() {
+		GeoRasterFile[] resp = new GeoRasterFile[grfiles.size()];
+		for (int i=0; i<grfiles.size(); i++) {
+			resp[i] = GeoRasterFile.openFile(projection, (String) grfiles.get(i)); 
+		}
+		return resp;
+	}
+	
+	public void clearFiles() {
+		if (grfiles == null) {
+			grfiles = new ArrayList();
+		}
+		grfiles.clear();
+	}
+	
+	public void addFile(String fileName) {
+		
+		int ind = containsStr(grfiles, fileName);
+		if (ind == -1) {
+			grfiles.add(fileName);
+		}
+	}
+	
+	private int containsStr(ArrayList list, String str) {
+		String aux;
+		for (int i=0; i<list.size(); i++) {
+			aux = (String) list.get(i);
+			if (str.compareToIgnoreCase(aux) == 0) {
+				return i;
+			}
+		}
+		return -1;
+	}
+
+	public void delFile(String fileName) {
+		int ind = containsStr(grfiles, fileName);
+		if (ind != -1) {
+			grfiles.remove(ind);
+		}
+	}
+
+	public int[] getPixel(double wcx, double wcy) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public String getName() {
+		// TODO Auto-generated method stub
+		return "ArcImsRasterFilterStack";
+	}
+
+	public void setHeight(int height) {
+		this.height = height;
+	}
+
+	public void setWidth(int width) {
+		this.width = width;
+	}
+
+	public void setFullExtent(Rectangle2D fullExtent) {
+		this.fullExtent = fullExtent;
+	}
+
+	public void setNumBands(int n) {
+		numBands = n;
+	}
+
+	public void setFileName(String name) {
+		fileName = name;
+	}
+
+	public void setProjection(IProjection proj) {
+		projection = proj;
+	}
+
+	public boolean isGeoreferenced() {
+		return true;
+	}
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterDriver.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsInMemoryAttsTableDriver.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsInMemoryAttsTableDriver.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsInMemoryAttsTableDriver.java	(revision 8301)
@@ -0,0 +1,567 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+
+import java.awt.Dimension;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+
+import com.hardcode.driverManager.DriverLoadException;
+import com.hardcode.gdbms.engine.data.DataSource;
+import com.hardcode.gdbms.engine.data.DataSourceFactory;
+import com.hardcode.gdbms.engine.data.driver.DriverException;
+import com.hardcode.gdbms.engine.data.driver.ObjectDriver;
+import com.hardcode.gdbms.engine.instruction.EvaluationException;
+import com.hardcode.gdbms.engine.instruction.SemanticException;
+import com.hardcode.gdbms.engine.values.*;
+import com.hardcode.gdbms.parser.ParseException;
+import com.iver.cit.gvsig.fmap.layers.FBitSet;
+
+public class ArcImsInMemoryAttsTableDriver {
+	
+	
+	private String tableName = "";
+	// private String dataBName = "";
+	private String idOriginalFieldName = "";
+	private String idSqlFieldName = "";
+	
+	// private String rowIndexFieldName = "INMEMORYROWNUMBER";
+	private int idFieldInd = -1;
+	private FBitSet requested;
+	
+	private ArrayList sqlColumnNames = new ArrayList();
+	private ArrayList originalColumnNames = new ArrayList();
+	
+	// private ArrayList originalColumnNames = new ArrayList();
+	private ArrayList columnTypes = new ArrayList();
+	// private int theRowCount = 0;
+	private int theFieldCount = 0;
+	private HashMap idToIndex;
+	private static Logger logger = Logger.getLogger(FMapFeatureArcImsDriver.class.getName());
+	
+	private Dimension lastRequest = new Dimension(-1, -1);
+	
+	// ------------------------------------------------
+	private ArrayList data = new ArrayList();
+	private ArrayList id = new ArrayList();
+	// ------------------------------------------------
+	// private ArcImsAttributesTableCachee attsCache;
+	// private static Logger logger = Logger.getLogger(FMapFeatureArcImsDriver.class.getName());
+	
+	public ArcImsInMemoryAttsTableDriver(String tb_name, ArrayList colnames, ArrayList coltypes) {
+		// super();
+		tableName = tb_name;
+		// dataBName = dbName;
+		idFieldInd = getIdColumnInd(coltypes);
+		
+		idOriginalFieldName = (String) colnames.get(idFieldInd);
+		idSqlFieldName = replaceUnwantedCharacters((String) colnames.get(idFieldInd));
+		
+		requested = new FBitSet();
+		for (int i=0; i<colnames.size(); i++) {
+			sqlColumnNames.add(replaceUnwantedCharacters((String) colnames.get(i) ));
+			originalColumnNames.add(colnames.get(i));
+			columnTypes.add(coltypes.get(i));
+			theFieldCount++;
+		}
+		
+		idToIndex = new HashMap();
+	}
+    /**
+     * user = "as", password = "", dbName = ?
+     * 
+     * @see com.hardcode.gdbms.engine.data.driver.DBDriver#getConnection(java.lang.String,
+     *      int, java.lang.String, java.lang.String, java.lang.String)
+     */
+//    public Connection getConnection(String host, int port, String _dbName,
+//            String _user, String _password) throws SQLException {
+//        	
+////            if (driverException != null) {
+////                throw new RuntimeException(driverException);
+////            }
+//            String connectionString = "jdbc:hsqldb:mem:" + dataBName;
+//            Connection c = DriverManager.getConnection(connectionString, "sa", "");
+//            return c;
+//        }
+        
+//    public Connection getConnection() throws SQLException {
+//    	return getConnection("", 0, "", "", "");
+//        }
+        
+    /**
+     * @see com.hardcode.driverManager.Driver#getName()
+     */
+    public String getName() {
+        return "ArcIMS in-memory attributes data driver";
+    }
+    
+    public void open(String sql) throws SQLException {
+//    	open(getConnection(), sql);
+    }
+    
+    public void execute(String sql) throws SQLException {
+//    	execute(getConnection(), sql);
+    }
+    
+	public String getDbName() {
+		return "No database";
+	}
+	
+	public int getIdFieldInd() {
+		return idFieldInd;
+	}
+	
+	public String getIdFieldName() {
+		return idSqlFieldName;
+	}
+	
+	// public void addRow(DataSourceFactory dsf, Value[] values) throws DriverException {
+	public void addRow(Value[] values, boolean filled) throws DriverException {
+		
+		if (values.length < theFieldCount) {
+			logger.error("Cannot add row with length < field count. ");
+			return;
+		}
+
+		if (values[idFieldInd].toString().compareTo("") != 0) {
+			// not null value
+			int theid = ((IntValue) values[idFieldInd]).intValue();
+			idToIndex.put(new Integer(theid), new Integer(data.size()));
+		}
+
+		requested.set(data.size(), filled);
+		data.add(values);
+
+//		String fieldNames = "";
+//		for (int i=0; i < (values.length + 1); i++) {
+//			fieldNames = fieldNames + ((String) columnNames.get(i)) + ", "; 
+//		}
+//		fieldNames = fieldNames.substring(0, fieldNames.length() - 2);
+//		// + ArcImsSqlUtils.rowIndexFieldName;
+//		
+//		String fieldValues = "";
+//		for (int i=0; i<values.length; i++) {
+//			fieldValues = fieldValues + getValueInSqlFormat(values[i]) + ", "; 
+//		}
+//		fieldValues = fieldValues + getRowCount();
+//		
+//		String sqlStr = "insert into " + tableName + " (";
+//		sqlStr = sqlStr + fieldNames + ") values (";
+//		sqlStr = sqlStr + fieldValues + ")";
+//		/*
+//		* INSERT INTO Table1 (Column1, Column2, Column3?)
+//		* VALUES (Value1, Value2, Value3?)
+//		*/
+//		try {
+//			// dsf.executeSQL(sqlStr, DataSourceFactory.AUTOMATIC_OPENING);
+//			execute(sqlStr);
+//			theRowCount++;
+//		} catch (Exception e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+	}
+	
+	// public void deleteRow(DataSourceFactory dsf, int i) throws DriverException {
+	public void deleteRow(int i) throws DriverException {
+		/*
+		 DELETE FROM Table1 WHERE Some_Column = Some_Value
+		 */
+		logger.warn("deleteRow was invoqued, i = " + i);
+		
+		int theid = getRowId(i);
+		idToIndex.remove(new Integer(theid));
+
+		requested.set(i, false);
+		data.set(i, null);
+		
+//		String sqlStr = "delete from " + tableName + " where ";
+//		sqlStr = sqlStr + rowIndexFieldName + " = ";
+//		sqlStr = sqlStr + i;
+//		/*
+//		* INSERT INTO Table1 (Column1, Column2, Column3?)
+//		* VALUES (Value1, Value2, Value3?)
+//		*/
+//		try {
+//			// dsf.executeSQL(sqlStr, DataSourceFactory.AUTOMATIC_OPENING);
+//			execute(sqlStr);
+//			theRowCount--;
+//		} catch (Exception e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+	}
+	
+//	private String getValueInSqlFormat(Value v) {
+//		String tmp = v.getStringValue(internalValueWriter);
+////		if (v instanceof StringValue) {
+////			tmp = "'" + tmp + "'";
+////		}
+//		return tmp;
+//	}
+	
+	private boolean isEmptyRow(int n) {
+		return (data.get(n) == null);
+	}
+	
+	public int getRowId(int row) throws DriverException {
+		Integer rowid = (Integer) id.get(row);
+		return rowid.intValue();
+//		Value[] therow = (Value []) data.get(row);
+//		return ((IntValue) therow[idFieldInd]).intValue();
+		// return ((Integer) indexToId.get(new Integer(row))).intValue();
+	}
+	
+	public int getRowIndex(int id) throws DriverException {
+		// logger.debug("Searching for id: " + id);
+		return ((Integer) idToIndex.get(new Integer(id))).intValue();
+	}
+	
+//	public int getRowId(DataSourceFactory dsf, int row) throws DriverException {
+//		/*
+//		 SELECT * FROM Customers WHERE LastName = 'Smith'
+//		 */
+//		String sqlStr = "select " + idFieldName + " from " + tableName + " where ";
+//		sqlStr = sqlStr + rowIndexFieldName + " = ";
+//		sqlStr = sqlStr + row + ";";
+//		/*
+//		* INSERT INTO Table1 (Column1, Column2, Column3?)
+//		* VALUES (Value1, Value2, Value3?)
+//		*/
+//		DataSource ds = null;
+//		try {
+//			
+//			ds = dsf.executeSQL(sqlStr, DataSourceFactory.AUTOMATIC_OPENING);
+//			// int respind = ds.getFieldIndexByName(idFieldName);
+//			IntValue resp = (IntValue) ds.getFieldValue(0, 0);
+//			return resp.intValue();
+//		} catch (Exception e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+//	}
+//	
+//	public int getRowIndex(DataSourceFactory dsf, int id) throws DriverException {
+//		String sqlStr = "select " + rowIndexFieldName + " from " + tableName + " where ";
+//		sqlStr = sqlStr + idFieldName + " = ";
+//		sqlStr = sqlStr + id + ";";
+//		/*
+//		* INSERT INTO Table1 (Column1, Column2, Column3?)
+//		* VALUES (Value1, Value2, Value3?)
+//		*/
+//		DataSource ds = null;
+//		try {
+//			ds = dsf.executeSQL(sqlStr, DataSourceFactory.AUTOMATIC_OPENING);
+//
+//			System.err.println("getRowIndex of id = " + id);
+//			System.err.println(ds.getAsString());
+//			System.err.println("------------------------------");
+//			// int respind = ds.getFieldIndexByName(idFieldName);
+//			IntValue resp = (IntValue) ds.getFieldValue(0, 0);
+//			return resp.intValue();
+//		} catch (Exception e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+//	}
+	
+	public boolean isNonRequestedRow(int rowind) {
+		// TODO Auto-generated method stub
+		return (! requested.get(rowind));
+	}
+	
+	// public void updateRow(DataSourceFactory dsf, Value[] new_row, String[] fld_q) throws DriverException {
+	// TODO so far, this method is called with
+	// a full field query (except rowindex)
+	public void updateRow(Value[] upd_row, String[] fld_q, int rowind) throws DriverException {
+
+		if (! isEmptyRow(rowind)) {
+			int newid = 0;
+			int oldid = getRowId(rowind);
+			boolean done = false;
+
+			for (int i = 0; i < fld_q.length; i++) {
+				if (fld_q[i].compareTo(idSqlFieldName) == 0) {
+					newid = ((IntValue) upd_row[i]).intValue();
+					done = true;
+				}
+			}
+			if (done) {
+				idToIndex.remove(new Integer(oldid));
+				idToIndex.put(new Integer(newid), new Integer(rowind));
+			}
+		}
+
+		Value[] newrow = new Value[theFieldCount];
+		
+		if (data.get(rowind) == null) {
+			data.set(rowind, newrow);
+		} else {
+			newrow = (Value []) data.get(rowind);
+		}
+		
+		if (fld_q[0].compareTo("#ALL#") == 0) {
+			for (int i=0; i<upd_row.length; i++) {
+				newrow[i] = upd_row[i];
+			}
+		} else {
+			int fldind = 0;
+			for (int i=0; i<fld_q.length; i++) {
+				String sqlname = replaceUnwantedCharacters(fld_q[i]);
+				fldind = getFieldIndexByName(sqlname);
+				newrow[fldind] = upd_row[i];
+			}
+		}
+		
+//		data.set()
+//		String[] fld_query = null;
+//		if (fld_q[0].compareTo("#ALL#") == 0) {
+//			
+//			int count = getFieldCount() - 1;
+//			fld_query = new String[count];
+//			for (int i=0; i<count; i++) {
+//				fld_query[i] = getFieldName(i);
+//			}
+//			
+//			
+//		} else {
+//			fld_query = new String[fld_q.length];
+//			for (int i=0; i<fld_q.length; i++) {
+//				fld_query[i] = ArcImsSqlUtils.getSqlCompliantFieldName(fld_q[i]);
+//			}
+//		}
+//		
+//		IntValue id = null;
+//		for (int i=0; i<fld_query.length; i++) {
+//			if (fld_query[i].compareTo(idFieldName) == 0) {
+//				id = (IntValue) new_row[i];
+//			}
+//		}
+//		if (id == null) {
+//			DriverException de = new DriverException("id_not_found");
+//			throw de;
+//		}
+//		int intid = id.intValue();
+//		
+//		String sqlStr = "update " + tableName + " set ";
+//		String nthFieldName, nthFieldValue;
+//		for (int i=0; i<fld_query.length; i++) {
+//			nthFieldName = fld_query[i];
+//			nthFieldValue = this.getValueInSqlFormat(new_row[i]);
+//			sqlStr = sqlStr + nthFieldName + " = ";
+//			sqlStr = sqlStr + nthFieldValue + ", ";
+//		}
+//		sqlStr = sqlStr.substring(0, sqlStr.length() - 2);
+//		sqlStr = sqlStr + " where " + idFieldName + " = " + intid + ";";
+//		try {
+//			// dsf.executeSQL(sqlStr, DataSourceFactory.AUTOMATIC_OPENING);
+//			execute(sqlStr);
+//		} catch (Exception e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+	}
+	
+	public int getFieldIndexByName(String arg0) throws DriverException {
+//		String arg00 = ArcImsSqlUtils.getSqlCompliantFieldName(arg0);
+		if (arg0 == null) {
+			logger.error("Somebody asked for the index of a null field ");
+			return -1;
+		}
+		for (int i=0; i<sqlColumnNames.size(); i++) {
+			if (((String) sqlColumnNames.get(i)).compareTo(arg0) == 0) {
+				return i;
+			}
+		}
+		logger.error("Field not found ");
+		return -1;
+	}
+	
+	public Value[] getRow(DataSourceFactory dsf, int n) throws DriverException {
+		return (Value []) data.get(n);
+//		String sqlStr = "select * from " + tableName + " where ";
+//		sqlStr = sqlStr + rowIndexFieldName + " = " + n + ";";
+//
+//		try {
+//			DataSource ds =
+//				dsf.executeSQL(sqlStr, DataSourceFactory.AUTOMATIC_OPENING);
+//			// int respind = ds.getFieldIndexByName(idFieldName);
+//			int count = ds.getFieldCount();
+//			Value[] resp = new Value[count];
+//			for (int i=0; i<count; i++) {
+//				resp[i] = ds.getFieldValue(0, i);
+//			}
+//			return resp;
+//		} catch (Exception e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+	}
+	
+//	public String getRowIndexFieldName() {
+//		return rowIndexFieldName;
+//	}
+	
+	public void setRequested(int n, boolean req) {
+		requested.set(n, req);
+	}
+	
+	public void addTheseAsRequested(FBitSet fbs) {
+		requested.or(fbs);
+	}
+	
+	public long getRowCount() {
+		return (long) data.size();
+	}
+	
+	public int getFieldCount() {
+		return theFieldCount;
+	}
+	
+	public String getFieldName(int i) {
+		return (String) sqlColumnNames.get(i);
+	}
+	
+	public int getFieldType(int i) {
+		return ((Integer) columnTypes.get(i)).intValue();
+	}
+	
+//	public void addInIndexToIdHashMap(int rwcount, int i) {
+//		indexToId.put(new Integer(rwcount), new Integer (i));
+//	}
+	
+	public void addInIdToIndexHashMap(int i, int rwcount) {
+		idToIndex.put(new Integer (i), new Integer(rwcount));
+	}
+	
+//	public String getColumnName(int i) {
+//		return (String) columnNames.get(i);
+//	}
+
+//	public void increaseRowCount(boolean req) {
+//		requested.set(data.size(), req);
+//		theRowCount++;
+//	}
+	
+	public void addAsRequested(FBitSet fbs) {
+		requested.or(fbs);
+	}
+
+	public FBitSet getThisAndNonRequestedUpTo(int _thisone, int total) {
+		
+		int thisone = _thisone;
+		int rowcount = (int) getRowCount();
+		
+		if (_thisone >= rowcount) {
+			thisone = _thisone % rowcount;
+		}
+		
+		FBitSet fbs = new FBitSet();
+		fbs.set(thisone);
+		if (total < 2) return fbs;
+		
+		int othersMustBeSet = total - 1;
+		int checkind;
+		
+		for (int j=1; j<rowcount; j++) {
+			// checkind = (i + j) % noOfRows;
+			checkind = (thisone + j) % rowcount;
+			if (isNonRequestedRow(checkind)) {
+				fbs.set(checkind);
+				othersMustBeSet--;
+			}
+			if (othersMustBeSet == 0) break;
+		}
+		return fbs;
+	}
+	
+	public void addEmptyRowWithId(Value idval, String idcolname) {
+		data.add(null);
+		id.add(new Integer( ((IntValue) idval).intValue() ));
+	}
+	
+	public Value getFieldValue(long row, int colind) {
+		
+		// printLastAndUpdate(row, colind);
+		
+		if (row >= getRowCount() || (row < 0)) {
+			logger.error("Row index out of limits ");
+			return null;
+		}
+
+		Value[] therow = (Value []) data.get((int) row);
+
+		if (therow == null) {
+			logger.error("Tried to get non available value (?) ");
+			return null;
+		}
+		if ((colind >= therow.length) || (colind < 0)) {
+			logger.error("Field index out of limits ");
+			return null;
+		}
+		if (therow[colind] == null) {
+			logger.warn("In order to avoid returning element [ " + row +  ", " + colind + " ] (which is null), returned ValueFactory.createNullValue()");
+			return ValueFactory.createNullValue();
+		} else {
+			return therow[colind];
+		}
+	}
+	
+	private void printLastAndUpdate(long row, int colind) {
+		logger.debug("Last request: [ " + lastRequest.height + " , " + lastRequest.width + " ]");
+		lastRequest.height = (int) row;
+		lastRequest.width = colind;
+		logger.debug("Current request: [ " + lastRequest.height + " , " + lastRequest.width + " ]");
+	}
+	//	public Value getCachedValue(int row, int attind) {
+//		return attsCache.getAttribute(row, attind);
+//	}
+//	
+//	public void setCachedValue(int row, int attind, Value v) {
+//		attsCache.addToCache(row, attind, v);
+//	}
+	public int getIdColumnInd(ArrayList col_Types) {
+		
+		int coltype, idindex = -1;
+		for (int i=0; i<col_Types.size(); i++) {
+			coltype = ((Integer) col_Types.get(i)).intValue();
+			if (coltype == FieldInformation.ID) {
+				idindex = i;
+				break;
+			}
+		}
+		if (idindex == -1) {
+			logger.error("ID not found ");
+		}
+		return idindex;
+	}
+	
+	public String getTableName() {
+		return tableName;
+	}
+	
+	public static String replaceUnwantedCharacters(String str) {
+		String resp = str;
+		resp = resp.replace('.', '_');
+		resp = resp.replace('#', 'z');
+		
+		return resp;
+	}
+
+	public String getOriginalFieldName(int idcolindex) {
+		return (String) originalColumnNames.get(idcolindex);
+	}
+	
+	public String getSqlFieldName(int idcolindex) {
+		return (String) sqlColumnNames.get(idcolindex);
+	}
+	
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsInMemoryAttsTableDriver.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapRasterArcImsDriver.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapRasterArcImsDriver.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapRasterArcImsDriver.java	(revision 8301)
@@ -0,0 +1,194 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import java.io.File;
+import java.net.URL;
+import java.util.TreeMap;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.*;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.exceptions.ServerErrorException;
+import org.gvsig.remoteClient.wms.ICancellable;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.ArcImsLayerNode;
+
+/**
+* ArcIMS driver implementation. Requests are passed to the <tt>ArcImsClientP</tt> object.
+* 
+* @see org.gvsig.remoteClient.arcims.ArcImsImageClient ArcImsImageClient
+* @author jldominguez
+*/
+public class FMapRasterArcImsDriver implements ArcImsDriver {
+	
+	private static Logger logger = Logger.getLogger(FMapRasterArcImsDriver.class.getName());
+	
+	
+	private ArcImsImageClient client;
+	private String server; 
+	private String service;
+	private String serviceType;
+	
+	private boolean connectionDone = false;
+
+	public FMapRasterArcImsDriver() {
+	}
+
+	/**
+	* The constructor needs the server's URL and the name of the service to be used.
+	* 
+	* @param host server's URL
+	* @param service name of the service, chosen among the ones retrieved after a
+	* request with the parameter <tt>ServiceName=Catalog</tt>
+	*/
+	public FMapRasterArcImsDriver(String host, String service, String svcType) {
+		serviceType = svcType;
+		init(host, service);
+	}
+
+	/**
+	 * This method is called by the constructor and creates the
+	 * <tt>client</tt> oject.
+	 * @param host
+	 * @param service
+	 */
+	public void init(String host, String service) {
+		server = host;
+		this.service = service;
+		client = new ArcImsImageClient(host, service, this.serviceType);
+	}
+
+	/**
+     * Gets available layers from the current server and service
+     * 
+     * @return a TreeMap with available layers
+	 */
+	public TreeMap getLayers() {
+		return client.getLayers();
+	}
+
+	/**
+	* Gets the layers available on the server (the class that implements
+	* this interface will get the service name from the user)
+	* 
+	* @param server ArcIMS server's URL
+	*/
+	public void getCapabilities(URL server, ICancellable cancel) throws ArcImsException {
+		
+		if (connectionDone) {
+			return;
+		} else {
+			connectionDone = getClient().connect(server, cancel); 
+		}
+
+		if (! connectionDone) {
+			throw new ArcImsException("connect_error");
+		}
+	}
+
+	/**
+	* Gets the visual information from the layers of 
+	* the required service (that is, the map itself) depending
+	* on the graphic context (coord. system, view's size, etc)
+	* 
+	* @param status the graphic context in which the request is performed
+	* @return the graphic data to be viewed, that is, the map. For the imageservice,
+	* it will be a <tt>File</tt> object.
+	*/
+	public Object getMap(ArcImsStatus status) throws ArcImsException {
+		try {
+			return client.getMap(status);
+		} catch (ServerErrorException e) {
+			logger.error("While getting map ", e);
+			throw new ArcImsException("ArcIMS Unexpected server error."
+					+ e.getMessage());
+		}
+	}
+
+	/**
+	* Gets the layer's available information on a particular xy coordinates
+	* (usually derived from a mouse click). If it's a raster layer,
+	* a request will be sent to the server asking for the data associated
+	* to the elements (polygon, line or point) which cover the clicked
+	* pixel.
+	* 
+	* @param status the graphic context in which the request is performed
+	* (ccord. system, view's dimension etc.)
+	* @param i x coordinate of the queried pixel 
+	* @param j y coordinate of the queried pixel
+	* @param  max_value maximun number of vector elements whose information
+	* will be retrieved.
+	* @return the available information at the given coordinates
+	*/
+	public String getFeatureInfo(ArcImsStatus status, int i, int j, int max_value) throws ArcImsException { 
+		String r = "No info available.";
+			try {
+				r = client.getFeatureInfo(status, i, j, max_value);
+			} catch (ArcImsException e) {
+				logger.error("ArcImsException. ", e);
+				throw e;
+			}
+			return r;
+	}
+
+	/**
+	* Given a layer name, gets a node that contains relevant information
+	* about the layer. 
+	* 
+	* @param layerName the name of the layer
+	* @return a node with layer's information
+	*/
+	public ArcImsLayerNode getLayer(String layerName) {
+		ArcImsLayerNode node = new ArcImsLayerNode();
+		node.setName(layerName);
+		return node;
+	}
+
+	/**
+	 * This method starts a connection with the server and sends
+	 * a <tt>getCapabilities</tt> request.
+	 * @return <b>true</b> if the connection was successful, <b>false</b>
+	 * otherwise (bad or no server URL, for example)
+	 */
+	public boolean connect(ICancellable cancel) {
+		if (connectionDone) {
+			return true;
+		} else {
+			connectionDone = client.connect(cancel);; 
+		 	return connectionDone;
+		}
+	}
+
+	/**
+	 * Gets the <tt>ArcImsClientP</tt> object, onto which requests
+	 * are passed.
+	 * 
+	 * @return the object that actually performs requests.
+	 */
+	public ArcImsClientP getClient() {
+		if (client == null) {
+			init(server, service);
+		}
+		return client;
+	}
+
+	/**
+	 * This method tells whether this layer is queriable with a call to
+	 * <tt>getFeatureInfo(...)</tt>
+	 * 
+	 * @return <b>true</b> if method <tt>getFeatureInfo(...)</tt> can be invoqued,
+	 * <b>false</b> otherwise
+	 */
+	public boolean isQueryable() {
+		return client.isQueryable();
+	}
+
+	public boolean testFormat(ArcImsStatus status, String imgFormat) {
+		
+		try {
+			return client.testFromat(status, imgFormat);
+		} catch (ArcImsException e) {
+			logger.error("While testing omage format ", e);
+		}
+		return false;
+	}
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/FMapRasterArcImsDriver.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterAdapter.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterAdapter.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterAdapter.java	(revision 8301)
@@ -0,0 +1,11 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import com.iver.cit.gvsig.fmap.layers.RasterAdapter;
+
+public class ArcImsRasterAdapter extends RasterAdapter {
+	
+	public ArcImsRasterAdapter(ArcImsRasterDriver drv) {
+		setDriver(drv);
+	}
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsRasterAdapter.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAttributesDataSourceAdapter.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAttributesDataSourceAdapter.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAttributesDataSourceAdapter.java	(revision 8301)
@@ -0,0 +1,626 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+import org.gvsig.remoteClient.arcims.utils.GetFeaturesTags;
+
+import com.hardcode.driverManager.Driver;
+import com.hardcode.driverManager.DriverLoadException;
+import com.hardcode.gdbms.engine.data.DataSource;
+import com.hardcode.gdbms.engine.data.DataSourceFactory;
+import com.hardcode.gdbms.engine.data.IDataSourceListener;
+import com.hardcode.gdbms.engine.data.SourceInfo;
+import com.hardcode.gdbms.engine.data.driver.DriverException;
+import com.hardcode.gdbms.engine.data.driver.ObjectDriver;
+import com.hardcode.gdbms.engine.data.edition.DataWare;
+import com.hardcode.gdbms.engine.data.object.ObjectSourceInfo;
+import com.hardcode.gdbms.engine.data.persistence.DataSourceLayerMemento;
+import com.hardcode.gdbms.engine.data.persistence.Memento;
+import com.hardcode.gdbms.engine.data.persistence.MementoException;
+import com.hardcode.gdbms.engine.instruction.EvaluationException;
+import com.hardcode.gdbms.engine.instruction.SemanticException;
+import com.hardcode.gdbms.engine.values.IntValue;
+import com.hardcode.gdbms.engine.values.Value;
+import com.hardcode.gdbms.engine.values.ValueCollection;
+import com.hardcode.gdbms.engine.values.ValueFactory;
+import com.hardcode.gdbms.parser.ParseException;
+import com.iver.cit.gvsig.fmap.layers.FBitSet;
+
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+
+public class ArcImsAttributesDataSourceAdapter implements ArcImsAlphanumericDataSource, ObjectDriver {
+	
+	private static Logger logger = Logger.getLogger(ArcImsAttributesDataSourceAdapter.class.getName());
+	
+	private ArcImsInMemoryAttsTableDriver dataDriver;
+	// private File csvFile;
+	private String tableName;
+	private DataSourceFactory dsFactory = null;
+	private ObjectSourceInfo sourceInfo;
+	private FMapFeatureArcImsDriver parentDriver;
+	private int rowsPerRequest = 10;
+	// private int privateKeyIndex = 0;
+	
+	// array of Value[]
+	// private AttributesDataa attsData; 
+	
+	public ArcImsAttributesDataSourceAdapter(ArrayList col_Names, ArrayList col_Types,
+			Value[] ids, DataSourceFactory dsf, FMapFeatureArcImsDriver drv, String forcedName) {
+		
+		// attsData = new AttributesDataa(col_Names, col_Types, ids, drv);
+		
+		parentDriver = drv;
+		dsFactory = dsf;
+
+		if (forcedName == null) {
+			long timeid = System.currentTimeMillis();
+			tableName = "table_" + timeid;
+		} else {
+			tableName = forcedName;
+		}
+
+		dataDriver = new ArcImsInMemoryAttsTableDriver(tableName, col_Names, col_Types);
+		
+		sourceInfo = new ObjectSourceInfo();
+		sourceInfo.driver = this;
+		sourceInfo.name = tableName;
+		sourceInfo.driverName = dataDriver.getName();
+		
+//		dsFactory = new DataSourceFactory();
+//		dsFactory.initialize();
+//		dsFactory.addDataSource(this, tableName);
+		
+		// dsFactory.crea
+		
+		try {
+			// dataDriver.open(dataDriver.getConnection(), tableName);
+			
+//			String sqlStr = ArcImsSqlUtils.getSqlSentenceCreateTableWithFieldsAndTypes(tableName, col_Names, col_Types, dataDriver.getRowIndexFieldName());
+//			dataDriver.open(sqlStr);
+			
+			// sqlStr = ArcImsSqlUtils.getSqlSentenceCreateIndex(tableName);
+			// dataDriver.execute(sqlStr);
+			// dsFactory.executeSQL(sqlStr, DataSourceFactory.DATA_WARE_COHERENT_ROW_ORDER);
+			
+			String idcolname = getIdColumnName(col_Names, col_Types);
+			for (int i=0; i<ids.length; i++) {
+				Value id = ids[i];
+				int rwcount = (int) dataDriver.getRowCount(); 
+//				sqlStr = ArcImsSqlUtils.getSqlSentenceSetEmptyRowWithId(
+//						tableName, id, idcolname,
+//						rwcount,
+//						dataDriver.getRowIndexFieldName());
+				dataDriver.addEmptyRowWithId(id, idcolname);
+				// dataDriver.addInIndexToIdHashMap(rwcount, ((IntValue) id).intValue());
+				// logger.debug("Adding id = " + ((IntValue) id).intValue() + " in row = " + rwcount);
+				dataDriver.addInIdToIndexHashMap(((IntValue) id).intValue(), rwcount);
+				// dsFactory.executeSQL(sqlStr, DataSourceFactory.DATA_WARE_DIRECT_MODE);
+//				dataDriver.execute(sqlStr);
+//				dataDriver.increaseRowCount(false);
+			}
+			logger.info("Stored " + ids.length + " IDs");
+			setRowsPerRequest();
+			// String idcolname = dataDriver.executeCreateTableWithFieldsAndTypes(tableName, col_Names, col_Types);
+			// dataDriver.executeSetEmptyRowsWithIds(tableName, ids, idcolname);
+			// System.err.println("dataDriver.getFieldValue(0, 0) = " + dataDriver.getFieldValue(0, 0).getStringValue(dataDriver.internalValueWriter));
+			// getRowId(5);
+			// stop();
+			// logger.debug("Done: dataDriver.close();");
+			
+		} catch (Exception e) {
+			logger.error("While creating in-memory database ", e);
+		}
+		
+	}
+
+	public void deleteRow(long rowInd) throws DriverException {
+		// DriverException de = new DriverException("cannot_delete");
+		logger.warn("So far, you cannot delete ");
+		// throw de;
+//		// dataDriver.setRequested((int) rowInd, false);
+//		start();
+//		dataDriver.deleteRow(dsFactory, (int) rowInd);
+//		stop();
+//		// dataDriver.deleteRow(dsFactory, (int) rowInd);
+	}
+
+	public void insertFilledRowAt(long index, Value[] values) throws DriverException {
+		insertFilledRowAt(index, values, true);
+	}
+	
+	public void insertFilledRowAt(long index, Value[] values, boolean req) throws DriverException {
+		// dataDriver.setRequested((int) dataDriver.getRowCount(), req);
+		// start();
+		dataDriver.addRow(values, req);
+		// stop();
+		logger.warn("Row was added at the end (not inserted at position " + index + ")");
+		// this.
+		// dataDriver.addRow(dsFactory, values);
+		// dataDriver.insertRow((int) index, values);
+	}
+
+	public void insertEmptyRowAt(long index) throws DriverException {
+		
+		// start();
+		int count = dataDriver.getFieldCount();
+		// stop();
+		
+		Value[] empty = new Value[count];
+		for (int i=0; i<count; i++) {
+			empty[i] = ValueFactory.createNullValue();
+		}
+		insertFilledRowAt(index, empty, false);
+	}
+
+	public void start() throws DriverException {
+//		try {
+//			// dataDriver.open("");
+//			dataDriver.open("select * from " + tableName);
+//		} catch (SQLException e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			logger.error("While starting datasource ", e);
+//			throw de;
+//		}
+//		// logger.debug("start()");
+//		// dataDriver.open("");
+	}
+
+	public void stop() throws DriverException {
+//		try {
+//			dataDriver.close();
+//		} catch (SQLException e) {
+//			DriverException de = new DriverException(e.getMessage());
+//			throw de;
+//		}
+	}
+
+	public String getName() {
+		return tableName;
+	}
+
+	public String getAlias() {
+		return tableName;
+		// return tableAlias;
+	}
+
+	public long[] getWhereFilter() throws IOException {
+		// dataDriver.
+		return null;
+//		String message = "'Where' filter not used in method: ArcImsAttributesDataSourceAdapter.getWhereFilter()";
+//		IOException ioe = new IOException(message);
+//		throw ioe;
+	}
+
+	public DataSourceFactory getDataSourceFactory() {
+		return dsFactory;
+	}
+
+	public Memento getMemento() throws MementoException {
+        DataSourceLayerMemento m = new DataSourceLayerMemento(tableName, tableName);
+        return m;
+	}
+
+	public void setDataSourceFactory(DataSourceFactory arg0) {
+		dsFactory = arg0;
+	}
+
+	public void setSourceInfo(SourceInfo arg0) {
+		sourceInfo = (ObjectSourceInfo) arg0;
+	}
+
+	public SourceInfo getSourceInfo() {
+		return sourceInfo;
+	}
+
+	public String getAsString() throws DriverException {
+//		return attsData.getAsString();
+		return dataDriver.toString();
+	}
+
+	public void remove() throws DriverException {
+		if (dsFactory == null) {
+			logger.error("dsFactory is null (?) and cannot receive the remove method ");
+			return;
+		}
+		
+		try {
+			dsFactory.remove(this);
+		} catch (DriverException e) {
+			String message = "Driver Exception in method: "
+				+ "ArcImsAttributesDataSourceAdapter.remove()\n"
+				+ e.getMessage();
+			DriverException de = new DriverException(message);
+			throw de;
+		}
+	}
+
+	public int[] getPrimaryKeys() throws DriverException {
+		int[] resp = new int[1];
+		resp[0] = dataDriver.getIdFieldInd();
+		return resp;
+	}
+
+	public ValueCollection getPKValue(long arg0) throws DriverException {
+		ValueCollection vc = new ValueCollection();
+		vc.add( ValueFactory.createValue(getRowId((int) arg0)) );
+		return vc;
+	}
+
+	public String getPKName(int arg0) throws DriverException {
+		if (arg0 == 0) {
+			return dataDriver.getIdFieldName();
+		} else {
+			DriverException de = new DriverException("pk_error");
+			logger.error("Multiple primary key are never used. ", de);
+			throw de;
+		}
+	}
+
+	public String[] getPKNames() throws DriverException {
+		String[] resp = new String[1];
+		resp[0] = dataDriver.getIdFieldName();
+		return resp;
+		
+	}
+
+	public int getPKType(int arg0) throws DriverException {
+		if (arg0 == 0) {
+//			return attsData.getFieldType(attsData.getIdIndex());
+			return Types.BIGINT;
+		} else {
+			DriverException de = new DriverException("pk_error");
+			logger.error("Multiple primary key are never used. ", de);
+			throw de;
+		}
+	}
+
+	public int getPKCardinality() throws DriverException {
+		// Multiple primary key are never used.
+		return 1;
+	}
+
+	public Value[] getRowWithoutDownloading(long row) throws DriverException {
+		// start();
+		Value[] resp = dataDriver.getRow(dsFactory, (int) row);
+		// stop();
+		return resp;
+	}
+	
+	public Value[] getRow(long arg0) throws DriverException {
+//		Value[] resp = attsData.getRow((int) arg0);
+//		return resp;
+		// return null;
+		FBitSet fbs = dataDriver.getThisAndNonRequestedUpTo((int) arg0, rowsPerRequest);
+		try {
+			parentDriver.requestFeatureAttributesWithoutChecking(fbs);
+		} catch (ArcImsException e) {
+			DriverException de = new DriverException(e.getMessage());
+			logger.error("While getting row ", de);
+			throw de;
+		}
+		// start();
+		Value[] resp = dataDriver.getRow(dsFactory, (int) arg0);
+		// stop();
+		return resp;
+	}
+
+	public String[] getFieldNames() throws DriverException {
+//		String[] resp = attsData.getFieldNames();
+//		return resp;
+		// return null;
+		// start();
+		int count = dataDriver.getFieldCount();
+		String[] resp = new String[count];
+		for (int i=0; i<count; i++) {
+			// resp[i] = dataDriver.getFieldName(i);
+			resp[i] = dataDriver.getSqlFieldName(i);
+		}
+		// stop();
+		return resp;
+		
+		// dataDriver.ge
+	}
+
+	public int getFieldIndexByName(String arg0) throws DriverException {
+//		int resp = attsData.getFieldIndexByName(arg0);
+//		return resp;
+		// start();
+		int resp = dataDriver.getFieldIndexByName(arg0);
+		// stop();
+		return resp;
+		
+		// return 0;
+	}
+
+	public DataWare getDataWare(int arg0) {
+//		DataWare resp = attsData.getDataWare(arg0);
+//		return resp;
+		return null;
+	}
+
+	public Value getFieldValue(long row, int colind) throws DriverException {
+		
+		if (dataDriver.isNonRequestedRow((int) row)) {
+			
+			int[] lim = getBlockLimits((int) row);
+			
+			System.err.println("Se ha pedido fila no disponible: " + row);
+			System.err.println("Limites: [ " + lim[0] + " , " + lim[1] + " ]");
+			// FBitSet fbs = dataDriver.getThisAndNonRequestedUpTo((int) row, rowsPerRequest);
+			try {
+				parentDriver.requestBlockWithoutChecking(lim);
+			} catch (ArcImsException e) {
+				DriverException de = new DriverException(e.getMessage());
+				logger.error("While getting row ", de);
+				throw de;
+			}
+		}
+		
+//		Value v = dataDriver.getCachedValue((int) row, colind);
+//		if (v != null) {
+//			return v;
+//		}
+		
+//		start();
+		Value resp = dataDriver.getFieldValue(row, colind);
+//		stop();
+//		dataDriver.setCachedValue((int) row, colind, resp);
+		return resp;
+	}
+
+	public int getFieldCount() throws DriverException {
+//		int resp = attsData.getFieldCount();
+//		return resp;
+		// start();
+		int resp = dataDriver.getFieldCount();
+		// stop();
+		return resp;
+		
+		// return 0;
+	}
+
+	public String getFieldName(int arg0) throws DriverException {
+//		String resp = attsData.getFieldName(arg0);
+//		return resp;
+		// start();
+		String resp = dataDriver.getSqlFieldName(arg0);
+		// stop();
+		return resp;
+		// return "";
+	}
+
+	public long getRowCount() throws DriverException {
+//		long resp = (int) attsData.getRowCount();
+//		return resp;
+		// start();
+		long resp = (long) dataDriver.getRowCount();
+		// stop();
+		return resp;
+		// return 0;
+	}
+
+	public int getFieldType(int arg0) throws DriverException {
+//		int resp = attsData.getFieldType(arg0);
+//		return resp;
+		// start();
+		int resp = dataDriver.getFieldType(arg0);
+		// stop();
+		return resp;
+		// return 0;
+	}
+
+	// **************************
+	// new_row[0] must contain ID
+	// **************************
+	// returns added row index 
+	public void updateRow(Value[] new_row, String[] fld_query, int rowind) throws DriverException {
+		// dataDriver.
+//		start();
+		// int resp =
+		dataDriver.updateRow(new_row, fld_query, rowind);
+//		stop();
+		// return resp;
+		// return 0;
+		
+//		if (! ((new_row.length == fld_query.length)
+//				|| ((new_row.length == getFieldCount()) && (fld_query[0].compareTo("#ALL#") == 0)))) {
+//			DriverException de = new DriverException("array_error");
+//			logger.error("Wrong array sizes while updating row ", de);
+//			throw de;
+//		}
+//		
+//		if (new_row.length == 0) {
+//			DriverException de = new DriverException("array_error");
+//			logger.error("Wrong array sizes while updating row ", de);
+//			throw de;
+//		}
+//		
+//		if (fld_query[0].compareTo("#ALL#") == 0) {
+//			int length = getFieldCount();
+//			String newfldquery[] = new String[length];
+//			for (int i=0; i<length; i++) {
+//				newfldquery[i] = getFieldName(i);
+//			}
+//			return attsData.updateRow(new_row, newfldquery);
+//		}
+//		
+//		return attsData.updateRow(new_row, fld_query);
+	}
+	
+	public String getIdColName() throws DriverException {
+		String resp = dataDriver.getIdFieldName();
+		return resp;
+//		return attsData.getIdColName();
+		// return "";
+	}
+
+	public int getIdIndex() throws DriverException {
+		int resp = dataDriver.getIdFieldInd();
+		return resp;
+//		return attsData.getIdIndex();
+		// return 0;
+	}
+	
+	public int getRowId(int row) throws DriverException {
+//		start();
+//		int resp = dataDriver.getRowId(dsFactory, row);
+//		stop();
+		int resp = dataDriver.getRowId(row);
+		return resp;
+		// System.out.println("dataDriver.getRowId(dsFactory, " + row + ") = " + dataDriver.getRowId(dsFactory, row));
+		// return 0;
+		// return dataDriver.getRowId(row);
+//		int resp = -1;
+//		try {
+//			resp =  attsData.getRowId(row);
+//		} catch (DriverException e) {
+//			logger.error("While getting row ID ", e);
+//		}
+//		return resp;
+	}
+	
+	public int getRowIndex(int id) throws DriverException {
+//		start();
+//		int resp = dataDriver.getRowIndex(dsFactory, id);
+//		stop();
+		int resp = dataDriver.getRowIndex(id);
+		return resp;
+	}
+	
+	public boolean isNonRequestedRow(int rowind) {
+//		return attsData.isNonRequestedRow(rowind);
+		return dataDriver.isNonRequestedRow(rowind);
+	}
+
+	public void write(DataWare arg0) throws DriverException {
+		// TODO Auto-generated method stub
+	}
+
+	public String getTableName() {
+		return tableName;
+	}
+	
+//	public String getOriginalColumnName(int idcolindex) {
+//		return dataDriver.getOriginalColumnName(idcolindex);
+//	}
+
+	public void addAsRequested(FBitSet fbs) {
+		dataDriver.addAsRequested(fbs);
+	}
+
+	public BitSet getNonRequestedFromHere(int start, int total) {
+		return dataDriver.getThisAndNonRequestedUpTo(start, total);
+	}
+	
+	public String getIdColumnName(ArrayList col_Names, ArrayList col_Types) {
+		
+		int coltype, idindex = -1;
+		for (int i=0; i<col_Types.size(); i++) {
+			coltype = ((Integer) col_Types.get(i)).intValue();
+			if (coltype == FieldInformation.ID) {
+				idindex = i;
+				break;
+			}
+		}
+		if (idindex == -1) {
+			logger.error("ID not found ");
+		}
+		return (String) col_Names.get(idindex);
+	}
+
+	public int getRowsPerRequest() {
+		return rowsPerRequest;
+	}
+	
+	private void setRowsPerRequest() {
+		
+		int rowcount = (int) dataDriver.getRowCount();
+		int sqroot = Math.round( (float) Math.sqrt(1.0 * rowcount) );
+		
+		rowsPerRequest = sqroot;
+		
+		if (rowsPerRequest > GetFeaturesTags.MAX_ROWS_PER_REQUEST) {
+			rowsPerRequest = GetFeaturesTags.MAX_ROWS_PER_REQUEST;
+		}
+		
+		if (rowsPerRequest < GetFeaturesTags.MIN_ROWS_PER_REQUEST) {
+			rowsPerRequest = GetFeaturesTags.MIN_ROWS_PER_REQUEST;
+		}
+		
+		if (rowsPerRequest > rowcount) {
+			rowsPerRequest = rowcount;
+		}
+		logger.info("Rows per request was set to " + rowsPerRequest + " (rowcount = " + rowcount + ")");
+	}
+
+	public String getOriginalFieldName(int idcolindex) {
+		return dataDriver.getOriginalFieldName(idcolindex);
+	}
+
+	public boolean isVirtualField(int fieldId) throws DriverException {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	public int getFieldWidth(int i) throws DriverException {
+		// TODO Auto-generated method stub
+		return 10;
+	}
+	
+	private int[] getBlockLimits(int row) {
+		int[] resp = new int[2];
+		
+		int rcount = 0;
+		try {
+			rcount = (int) getRowCount();
+		} catch (DriverException e) {
+			logger.error("While getting rowcount ", e);
+		}
+		int rperreq = getRowsPerRequest();
+		
+		int bloque = (row / rperreq);
+		int inicio = rperreq * bloque;
+		
+		int fin = inicio + rperreq - 1;
+		if (fin > (rcount-1)) {
+			fin = (rcount-1);
+		}
+		
+		resp[0] = inicio;
+		resp[1] = fin;
+		return resp;
+	}
+
+	public Driver getDriver() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public void reload() throws DriverException, IOException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void addDataSourceListener(IDataSourceListener arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void removeDataSourceListener(IDataSourceListener arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	
+}
+
+

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAttributesDataSourceAdapter.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAlphanumericDataSource.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAlphanumericDataSource.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAlphanumericDataSource.java	(revision 8301)
@@ -0,0 +1,37 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import com.hardcode.gdbms.engine.data.DataSource;
+import com.hardcode.gdbms.engine.data.driver.DriverException;
+import com.hardcode.gdbms.engine.values.Value;
+
+public interface ArcImsAlphanumericDataSource extends DataSource {
+
+    /**
+     * Deletes the ith row of the DataSource
+     *
+     * @param rowId index of the row to be deleted
+     *
+     * @throws DriverException if the row could not be deleted
+     */
+    public void deleteRow(long rowId) throws DriverException;
+
+    /**
+     * Inserts a row at the end of the dataware with the specified values
+     *
+     * @param values Values of the inserted row fields in the field order
+     * @param index index where the row will be inserted. No data is lost.
+     *
+     * @throws DriverException if the row could not be inserted
+     */
+    public void insertFilledRowAt(long index, Value[] values) throws DriverException;
+
+    /**
+     * Inserts a row at the end of the dataware
+     * 
+     * @param index index where the row will be inserted. No data is lost.
+     *
+     * @throws DriverException if the row could not be inserted
+     */
+    public void insertEmptyRowAt(long index) throws DriverException;
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsAlphanumericDataSource.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsVectorialAdapter.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsVectorialAdapter.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsVectorialAdapter.java	(revision 8301)
@@ -0,0 +1,202 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.drivers;
+
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+
+import com.hardcode.driverManager.DriverLoadException;
+import com.hardcode.gdbms.engine.data.DataSource;
+import com.iver.cit.gvsig.fmap.core.IFeature;
+import com.iver.cit.gvsig.fmap.core.IGeometry;
+import com.iver.cit.gvsig.fmap.core.ShapeFactory;
+import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
+import com.iver.cit.gvsig.fmap.layers.FBitSet;
+import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
+import com.iver.cit.gvsig.fmap.layers.VectorialAdapter;
+
+public class ArcImsVectorialAdapter extends VectorialAdapter {
+
+	private IFeature[] testArray;
+
+	public ArcImsVectorialAdapter(FMapFeatureArcImsDriver drv) {
+		setDriver(drv);
+	}
+
+	public IGeometry getShape(int index) throws DriverIOException {
+		try {
+			return getDriver().getShape(index);
+		} catch (IOException e) {
+			DriverIOException dioe = new DriverIOException(e.getMessage());
+			throw dioe;
+		}
+	}
+
+	public int getShapeCount() throws DriverIOException {
+		try {
+			return getDriver().getShapeCount();
+		} catch (IOException e) {
+			DriverIOException dioe = new DriverIOException(e.getMessage());
+			throw dioe;
+		}
+	}
+
+	public Rectangle2D getFullExtent() throws DriverIOException {
+		try {
+			return getDriver().getFullExtent();
+		} catch (IOException e) {
+			DriverIOException dioe = new DriverIOException(e.getMessage());
+			throw dioe;
+		}
+	}
+
+	public int getShapeType() throws DriverIOException {
+		return getDriver().getShapeType();
+	}
+
+	/**
+	 * This method is used when the data source is a proper database that needs
+	 * initialization.
+	 */
+	public void start() throws DriverIOException {
+		try {
+			((FMapFeatureArcImsDriver) getDriver()).getRecordSet().start();
+		} catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
+			DriverIOException dioe = new DriverIOException(e.getMessage());
+			throw dioe;
+		}
+	}
+
+	/**
+	 * This method is used when the data source is a proper database that needs
+	 * to be closed after use.
+	 */
+	public void stop() throws DriverIOException {
+		try {
+			((FMapFeatureArcImsDriver) driver).getRecordSet().stop();
+		} catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
+			DriverIOException dioe = new DriverIOException(e.getMessage());
+			throw dioe;
+		}
+	}
+
+	public SelectableDataSource getRecordset() throws DriverLoadException {
+		return ((FMapFeatureArcImsDriver) driver).getRecordSet();
+	}
+
+	public void requestFeatureAttributes(FBitSet fbs) throws ArcImsException {
+		((FMapFeatureArcImsDriver) driver).requestFeatureAttributes(fbs);
+		}
+	
+
+}
+
+// public class ArcImsVectorialAdapter implements ReadableVectorial {
+//
+// private FMapFeatureArcImsDriver driver;
+// private IGeometry[] testArray;
+// private Random rnd = new Random(System.currentTimeMillis());
+// private DataSource dataSource;
+//
+// public ArcImsVectorialAdapter() {
+//	
+// testArray = new IGeometry[10];
+// for (int i=0; i<testArray.length; i++) {
+// Rectangle2D.Double r = getRandomRect();
+// GeneralPathX gp = new GeneralPathX(r);
+// testArray[i] = ShapeFactory.createPolygon2D(gp);
+// }
+//	
+// }
+//
+// private Double getRandomRect() {
+// double x = -180.0 * rnd.nextDouble();
+// double y = -90.0 * rnd.nextDouble();
+// double w = 180.0 * rnd.nextDouble();
+// double h = 90.0 * rnd.nextDouble();
+// return new Rectangle2D.Double(x, y, w, h);
+// }
+//
+// /**
+// * This method is used when the data source is a proper database
+// * that needs initialization.
+// */
+// public void start() throws DriverIOException {
+// System.out.println("===> public void start()");
+// // TODO Auto-generated method stub
+// }
+//
+// /**
+// * This method is used when the data source is a proper database
+// * that needs to be closed after use.
+// */
+// public void stop() throws DriverIOException {
+// System.out.println("===> public void stop()");
+// // TODO Auto-generated method stub
+// }
+//
+// public IGeometry getShape(int index) throws DriverIOException {
+// // TODO Auto-generated method stub
+// return testArray[index];
+// }
+//
+// public int getShapeCount() throws DriverIOException {
+// // TODO Auto-generated method stub
+// return testArray.length;
+// }
+//
+// public Rectangle2D getFullExtent() throws DriverIOException {
+// // TODO Auto-generated method stub
+// System.out.println("===> public Rectangle2D getFullExtent()");
+// return null;
+// }
+//
+// public int getShapeType() throws DriverIOException {
+// // TODO Auto-generated method stub
+// System.out.println("===> public int getShapeType()");
+// return 0;
+// }
+//
+// public FMapFeatureArcImsDriver getDriver() {
+// return driver;
+// }
+//
+// public void setDriver(FMapFeatureArcImsDriver driver) {
+// this.driver = driver;
+// }
+//
+// public Rectangle2D getTestExtent() {
+// return new Rectangle(-180, -90, 360, 180);
+// }
+//
+// public DataSource getRecordset() throws DriverLoadException {
+//	
+// if (dataSource != null) return dataSource;
+//	
+// if (getDriver() instanceof ObjectDriver)
+// {
+// String name =
+// LayerFactory.getDataSourceFactory().addDataSource((ObjectDriver)
+// getDriver());
+// try {
+// dataSource = LayerFactory.getDataSourceFactory().createRandomDataSource(name,
+// DataSourceFactory.AUTOMATIC_OPENING);
+// return dataSource;
+// } catch (NoSuchTableException e) {
+// throw new RuntimeException(e);
+// } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
+// throw new RuntimeException(e);
+// }
+// }
+// System.err.println("Unable to get Data source in method public DataSource
+// getRecordset().");
+// System.err.println("class: ArcImsVectorialAdapter.");
+// return null;
+// }
+//
+// public void setRecordSet(DataSource ds) {
+// dataSource = ds;
+// }
+//
+// }
+

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/drivers/ArcImsVectorialAdapter.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollectionItem.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollectionItem.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollectionItem.java	(revision 8301)
@@ -0,0 +1,43 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.layers;
+
+public class FFeatureLyrArcIMSCollectionItem {
+	
+	private FFeatureLyrArcIMS layer;
+	private int id;
+	private String name;
+	
+	public FFeatureLyrArcIMSCollectionItem(FFeatureLyrArcIMS lyr,
+			int theId, String theName) {
+		
+		layer = lyr;
+		id = theId;
+		name = theName;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public FFeatureLyrArcIMS getLayer() {
+		return layer;
+	}
+
+	public void setLayer(FFeatureLyrArcIMS layer) {
+		this.layer = layer;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollectionItem.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollection.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollection.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollection.java	(revision 8301)
@@ -0,0 +1,457 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.layers;
+
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.cresques.cts.IProjection;
+import org.cresques.cts.ProjectionPool;
+import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
+import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
+import org.gvsig.remoteClient.arcims.utils.MyCancellable;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+
+import com.iver.cit.gvsig.fmap.DriverException;
+import com.iver.cit.gvsig.fmap.MapContext;
+import com.iver.cit.gvsig.fmap.ViewPort;
+import com.iver.cit.gvsig.fmap.crs.CRSFactory;
+import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
+import com.iver.cit.gvsig.fmap.layers.CancelationException;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.fmap.layers.FLayers;
+import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
+import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
+import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
+import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
+import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
+import com.iver.cit.gvsig.fmap.layers.SelectionListener;
+import com.iver.cit.gvsig.fmap.layers.XMLException;
+import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
+import com.iver.utiles.XMLEntity;
+import com.iver.utiles.connections.ConnectionException;
+import com.iver.utiles.swing.threads.Cancellable;
+import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
+
+public class FFeatureLyrArcIMSCollection extends FLayers implements SelectionListener, LayerCollectionListener {
+	
+	private static Logger logger = Logger.getLogger(FFeatureLyrArcIMSCollection.class.getName());
+	private ArrayList layerlist = new ArrayList();
+	
+	private boolean mustBeSeparated = false;
+	
+	private MapContext myFMap;
+	
+	public FFeatureLyrArcIMSCollection(MapContext fmap, FLayers parent, boolean willbesep) {
+		super(fmap, parent);
+		myFMap = fmap;
+		mustBeSeparated = willbesep;
+	}
+	
+	public FFeatureLyrArcIMSCollection() {
+		super(null, null);
+	}
+	
+	public MapContext getMapContext() {
+		return myFMap;
+	}
+	
+	public boolean mustBeSeparated() {
+		return mustBeSeparated;
+	}
+	
+	public void hasBeenSeparated() {
+		mustBeSeparated = false;
+	}
+	
+	public void setParentLayer(FLayers lyr) {
+		
+		super.setParentLayer(lyr);
+		
+		if (lyr == null) {
+			return;
+		}
+		
+		myFMap = lyr.getMapContext();
+		if (lyr instanceof LayerCollection) {
+			LayerCollection lyrcol = (LayerCollection) lyr;
+			lyrcol.addLayerCollectionListener(this);
+		}
+	}
+	
+	private List myGetList() {
+		List resp = Collections.synchronizedList(new ArrayList());
+		
+		int count = getLayersCount();
+		for (int i=0; i<count; i++) {
+			resp.add(getLayer(i));
+		}
+		return resp;
+	}
+	
+	// we need to rewrite this method because we dont have access to fmap
+	// and list
+	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
+			Cancellable cancel,double scale) throws DriverException {
+		
+		List myList = myGetList();
+		
+		Iterator iter = myList.iterator();
+		try {
+			while (iter.hasNext()) {
+				if (cancel.isCanceled()) {
+	                    break; // Más que nada porque las capas raster no son interrumpibles por ahora.
+				}
+				FLayer lyr = (FLayer) iter.next();
+				LayerDrawEvent beforeEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_BEFORE_DRAW);
+				
+				myFMap.fireLayerDrawingEvent(beforeEvent);
+				
+				if (lyr.isVisible()) {
+					long t1 = System.currentTimeMillis();
+					try {
+						lyr.draw(image, g, viewPort, cancel,scale);
+					} catch (DriverException e) {
+						myFMap.addLayerError("La capa " + lyr.getName() + " es errónea.");
+						e.printStackTrace();
+					}
+					long t2 = System.currentTimeMillis();
+					System.out.println("Layer " + lyr.getName() + " "
+	    					        + (t2-t1) + " milisecs.");
+				}
+				LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
+				myFMap.fireLayerDrawingEvent(afterEvent);
+			}
+			if (getVirtualLayers() != null) {
+				getVirtualLayers().draw(image, g, viewPort, cancel,scale);
+			}
+		} catch (ConcurrentModificationException e) {
+			System.err.println(e.getMessage());
+		}
+	}
+
+	public void addLayer(FLayer layer) throws CancelationException {
+		if (! (layer instanceof FFeatureLyrArcIMS)) {
+			logger.error("Only FFeatureLyrArcIMS layers allowed in this collection. ");
+			return;
+		}
+		FFeatureLyrArcIMS lyr = (FFeatureLyrArcIMS) layer;
+		// lyr.addSelectionListener(this);
+		super.addLayer(layer);
+		layerlist.add(layer);
+	}
+
+	public void selectionChanged(SelectionEvent e) {
+		// e.get
+		getMapContext().invalidate();
+		// System.out.println("==========> Selection changed somewhere....");
+		// TODO Auto-generated method stub
+		
+	}
+	
+	public void setXMLEntity(XMLEntity xml) throws XMLException{
+		
+		setActive(xml.getBooleanProperty("active"));
+		setName(xml.getStringProperty("name"));
+		setMinScale(xml.getDoubleProperty("minScale"));
+		setMaxScale(xml.getDoubleProperty("maxScale"));
+		setVisible(xml.getBooleanProperty("visible"));
+		
+		if (xml.contains("proj")) {
+			setProjection(CRSFactory.getCRS(xml.getStringProperty("proj")));
+		}
+		
+		if (xml.contains("transparency")) {
+			setTransparency(xml.getIntProperty("transparency"));
+		}
+
+		// ------------
+		
+		int numLayers = xml.getIntProperty("numLayers");
+		String[] s = xml.getStringArrayProperty("LayerNames");
+		
+		for (int i = 0; i < numLayers; i++) {
+			FLayer layer = null;
+			try {
+				String className = xml.getChild(i).getStringProperty("className");
+				Class clase = Class.forName(className);
+				layer = (FLayer) clase.newInstance();
+				layer.setName(s[i]);
+				layer.setXMLEntity(xml.getChild(i));
+				layer.load();
+				logger.debug("Layer: "+ layer.getName() +" has been loaded.");
+			} catch (Exception e) {
+				logger.error("While loading layer: " + layer.getName() + " (visible = false)", e);
+				layer.setVisible(false);
+			}
+			addLayer(layer);
+		}
+	}
+	
+	public XMLEntity getXMLEntity() throws XMLException {
+		
+		XMLEntity xml = new XMLEntity();
+		xml.putProperty("className", this.getClass().getName());
+		xml.putProperty("active", isActive());
+		xml.putProperty("name", getName());
+		xml.putProperty("minScale", getMinScale());
+		xml.putProperty("maxScale", getMaxScale());
+		xml.putProperty("visible", isVisible());
+		
+		if (getProjection() != null) {
+			xml.putProperty("proj", getProjection().getAbrev());
+		}
+		xml.putProperty("transparency", getTransparency());
+		
+		// --------------------
+
+		xml.putProperty("numLayers", layerlist.size());
+
+		String[] s = new String[layerlist.size()];
+
+		for (int i = 0; i < layerlist.size(); i++) {
+			s[i] = ((FFeatureLyrArcIMS) layerlist.get(i)).getName();
+		}
+
+		xml.putProperty("LayerNames", s);
+
+		for (int i = 0; i < layerlist.size(); i++) {
+			xml.addChild(((FFeatureLyrArcIMS) layerlist.get(i)).getXMLEntity());
+		}
+
+		return xml;
+	}
+
+	public void layerAdded(LayerCollectionEvent e) {
+		// this layer has been added to a collection
+		// if it has to be separated, it will be separated now:
+		
+		if (!mustBeSeparated) {
+			return;
+		}
+		
+		hasBeenSeparated();
+		
+		FLayers lyr = getParentLayer();
+		if (lyr == null) {
+			return;
+		}
+		
+		FLayer item;
+		int count;
+		
+		if (lyr instanceof LayerCollection) {
+			LayerCollection lyrcol = (LayerCollection) lyr;
+			count = getLayersCount();
+			while (count > 0) {
+				item = getLayer(count - 1);
+				removeLayer(item);
+				lyrcol.addLayer(item);
+				count = getLayersCount();
+			}
+			lyrcol.removeLayer(this);
+		}
+	}
+
+	public void layerMoved(LayerPositionEvent e) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void layerRemoved(LayerCollectionEvent e) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void layerAdding(LayerCollectionEvent e) throws CancelationException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void layerMoving(LayerPositionEvent e) throws CancelationException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void layerRemoving(LayerCollectionEvent e) throws CancelationException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void activationChanged(LayerCollectionEvent e) throws CancelationException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void visibilityChanged(LayerCollectionEvent e) throws CancelationException {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	public void setXMLEntity03(XMLEntity xml) throws XMLException{
+		// TODO
+	}
+	
+	public void replaceLayer(String layerName, FLayer layer) {
+		// TODO
+	}
+	
+	/**
+	 * The extCatalogYNomenclator needs this creator.
+	 * 
+	 * @param p a Map object with the following keys:
+	 * 
+	 * (key, object type returned)
+	 * ---------------------------
+	 * "host", String (with or without the servlet path)
+	 * "service_name", String (remote service name)
+	 * "srs", String (coordinate system)
+	 * "layer_name", String (local layer name)
+	 * 
+	 * @return a FFeatureLyrArcIMSCollection layer
+	 * @throws ConnectionException 
+	 */
+	public FFeatureLyrArcIMSCollection(Map m) throws ConnectionException {
+		
+		super(null, null);
+		
+		try {
+		String _host = (String) m.get("host");
+		String host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host)).toString();
+		String service = (String) m.get("service_name");
+		String _srs = (String) m.get("srs");
+		String name = (String) m.get("layer_name");
+		
+		// in case layer_name is missing or equals the empty string:
+		if ((name == null) || (name.length() == 0)) {
+			name = service;
+		}
+		// --------------------------------------------
+		
+		IProjection srs = CRSFactory.getCRS(_srs);
+
+		MyCancellable myCanc = new MyCancellable(new DefaultCancellableMonitorable());
+		FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host, service);
+		if (!drv.connect(myCanc)) {
+			throw new Exception("Unable to connect to server. ");
+		}
+		ServiceInformation si = drv.getClient().getServiceInformation();
+		int layercount = si.getLayers().size();
+		String layerQuery = "";
+		for (int i=0; i<layercount; i++) {
+			if (isTrueString(((ServiceInformationLayer) si.getLayer(i)).getVisible())) {
+				layerQuery = layerQuery + "," + ((ServiceInformationLayer) si.getLayer(i)).getId();
+			}
+		}
+		
+		if (layerQuery.length() == 0) {
+			throw new Exception("No layers are visible by default ");
+		} else {
+			layerQuery = layerQuery.substring(1);
+		}
+		
+		String[] selectedLayerIds = layerQuery.split(",");
+		int count = selectedLayerIds.length;
+		
+		FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count];
+		
+		String item;
+		
+		for (int i=0; i<count; i++) {
+			
+			item = selectedLayerIds[i];
+			
+			drv = new FMapFeatureArcImsDriver(host, service, item);
+			if (!(drv.connect(myCanc))) throw new Exception();
+			
+			ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
+			VectorialEditableAdapter adapter = new VectorialEditableAdapter();
+			
+			/* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter);
+			/* 2 */ drv.setLayer(individualLayers[i]);
+			
+			si = drv.getClient().getServiceInformation();
+			ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item);
+			String lyrname = silf.getName(); 
+
+			individualLayers[i].setProjectionInStatus(srs.getAbrev());
+			individualLayers[i].setHostInStatus(new URL(host));
+			individualLayers[i].setServiceInStatus(service);
+
+			String units = si.getMapunits();
+			int theDpi = si.getScreen_dpi();
+			long scale;
+			if (silf.getMaxscale()!=-1){
+				scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMaxscale(), units, theDpi);
+				individualLayers[i].setMaxScale((double) scale);
+			}
+			if (silf.getMinscale()!=-1){
+				scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMinscale(), units, theDpi);
+				individualLayers[i].setMinScale((double) scale);			
+			}
+		
+			individualLayers[i].setServiceInformationInStatus(si);
+			Vector ids = new Vector(); ids.add(item);
+			individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
+			individualLayers[i].setSubfieldsInStatus();
+			/* 3 */ 
+			// individualLayers[i].setLegend(new VectorialUniqueValueLegend());
+			individualLayers[i].setHost(new URL(host));
+			individualLayers[i].setService(service);
+			individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE);
+			individualLayers[i].setTransparency(0);
+			individualLayers[i].setLayerQuery(item);
+			individualLayers[i].setProjection(srs);
+			individualLayers[i].setName(lyrname);
+
+			Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
+			drv.setFullExtent(fext);
+			// individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
+			
+			// ------ -------------
+			drv.setAdapter(adapter);
+			// adapter.setRecordSet(drv.getRecordSet());
+			adapter.setOriginalDataSource(drv.getRecordSet());
+			adapter.setOriginalVectorialAdapter(oldadapter);
+			drv.declareTable();
+			individualLayers[i].setInitialLegend();
+			individualLayers[i].setShapeType(adapter.getShapeType());
+			individualLayers[i].setRecordset(drv.getRecordSet());
+			// ------ -------------
+			
+			if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
+				si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
+				logger.warn("Server provides no SRS. ");
+			}
+		}
+		setName(name);
+		setProjection(srs);
+		for (int i=0; i<count; i++) {
+			addLayer(individualLayers[i]);
+		}
+		} catch (Exception e) {
+			throw new ConnectionException("Unable to create ArcIMS feature layer collection ", e);
+		}
+	}
+
+	private boolean isTrueString(String visible) {
+		if (visible.compareToIgnoreCase("true") == 0) {
+			return true;
+		}
+		return false;
+	}	
+}
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMSCollection.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMS.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMS.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMS.java	(revision 8301)
@@ -0,0 +1,808 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.layers;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.NoninvertibleTransformException;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.cresques.cts.ICoordTrans;
+import org.cresques.cts.IProjection;
+import org.gvsig.remoteClient.arcims.ArcImsClientP;
+import org.gvsig.remoteClient.arcims.ArcImsFeatureClient;
+import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
+import org.gvsig.remoteClient.arcims.ArcImsVectStatus;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.FieldInformation;
+import org.gvsig.remoteClient.arcims.utils.MyCancellable;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.gvsig.remoteClient.utils.Utilities;
+
+import com.hardcode.driverManager.DriverLoadException;
+import com.hardcode.gdbms.engine.data.DataSource;
+import com.iver.cit.gvsig.fmap.DriverException;
+import com.iver.cit.gvsig.fmap.MapContext;
+import com.iver.cit.gvsig.fmap.ViewPort;
+import com.iver.cit.gvsig.fmap.core.DefaultFeature;
+import com.iver.cit.gvsig.fmap.core.IGeometry;
+import com.iver.cit.gvsig.fmap.core.ISymbol;
+import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
+import com.iver.cit.gvsig.fmap.crs.CRSFactory;
+import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
+import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
+import com.iver.cit.gvsig.fmap.layers.FBitSet;
+import com.iver.cit.gvsig.fmap.layers.FLyrText;
+import com.iver.cit.gvsig.fmap.layers.FLyrVect;
+import com.iver.cit.gvsig.fmap.layers.LegendListener;
+import com.iver.cit.gvsig.fmap.layers.XMLException;
+import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
+import com.iver.cit.gvsig.fmap.operations.Cancel;
+import com.iver.cit.gvsig.fmap.rendering.Legend;
+import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
+import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
+import com.iver.utiles.XMLEntity;
+import com.iver.utiles.connections.ConnectionException;
+import com.iver.utiles.swing.threads.Cancellable;
+import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsInMemoryAttsTableDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
+
+public class FFeatureLyrArcIMS extends FLyrVect implements InfoByPoint, LegendListener {
+	// ClassifiableVectorial, Selectable, AlphanumericData, VectorialData,
+	// Labelable, SingleLayer, RandomVectorialData {
+
+	private static Logger logger = Logger.getLogger(FFeatureLyrArcIMS.class.getName());
+
+	private URL host;
+	private String service;
+	private String serviceType;
+	private Rectangle2D fullExtent;
+	private boolean firstLoad = true;
+	private ArcImsVectStatus arcimsStatus = new ArcImsVectStatus();
+	private String SRS;
+	private String srsAbrev;
+	private String layerQuery;
+	private VisualStatusArcIms visualStatus = new VisualStatusArcIms();
+	private int transparency = -1;
+	private boolean arcImsTransparency = true;
+	private int shapeType = 0;
+//	private ArrayList initialColors = new ArrayList();
+	
+	private ArrayList geometries;
+	
+	private MyCancellable myCanc;
+
+	// from ancestor FLyrVect:
+	// private VectorialAdapter source;
+	// private SelectableDataSource sds; --> is created like this --> new SelectableDataSource(source.getRecordSet()) 
+
+	/**
+	 * Constructor needs ArcImsVectorialAdapter.
+	 * 
+	 * @param vectAdapter
+	 */
+	public FFeatureLyrArcIMS(VectorialEditableAdapter vectAdapter) {
+		
+		myCanc = new MyCancellable(new DefaultCancellableMonitorable());
+
+		setSource(vectAdapter);
+//		try {
+//			// setRecordset(((FMapFeatureArcImsDriver) getSource().getDriver()).getRecordSet());
+//			shapeType = vectAdapter.getShapeType();
+//			// ((VectorialLegend) getLegend()).setShapeType(shapeType);
+//		} catch (Exception e) {
+//			logger.error("Unexpected error while getting shape type ", e);
+//		}
+		addLegendListener(this);
+//		loadInitialColors();
+	}
+	
+	public FFeatureLyrArcIMS() {
+	}
+	
+	public void setShapeType(int shpType) {
+		shapeType = shpType;
+	}
+	
+	public void setAdapter(VectorialEditableAdapter edapter) {
+		setSource(edapter);
+		try {
+			shapeType = edapter.getShapeType();
+			// ((VectorialLegend) getLegend()).setShapeType(shapeType);
+		} catch (DriverIOException e) {
+			logger.error("Unexpected error while getting shape type ", e);
+		}
+		addLegendListener(this);
+		myCanc = new MyCancellable(new DefaultCancellableMonitorable());
+//		loadInitialColors();
+	}
+	
+	
+	/*
+	public void setLegend(VectorialLegend r)
+		throws DriverException, FieldNotFoundException {
+		VectorialLegend oldLegend = legend;
+		legend = r;
+
+		try {
+			legend.setDataSource(getRecordset());
+
+			if (legend.getLabelField() != null) {
+			    // sds.start();
+				// int idLabelField = getRecordset().getFieldIndexByName(legend.getLabelField());
+				createLabelLayer(sds);
+				// sds.stop();
+			}
+			else
+			    removeLabels();
+		} catch (DriverException e) {
+			throw new DriverException(e);
+		} catch (FieldNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+        }
+
+		LegendChangedEvent e = LegendChangedEvent.createLegendChangedEvent(oldLegend, legend);
+		callLegendChanged(e);
+	}
+	 */
+	
+//	private void loadInitialColors() {
+//		// Color[] cols = 
+//		initialColors.add(new Color(179, 226, 205));
+//		initialColors.add(new Color(253, 205, 172));
+//		initialColors.add(new Color(203, 213, 232));
+//		initialColors.add(new Color(230, 245, 201));
+//		initialColors.add(new Color(141, 211, 199));
+//		initialColors.add(new Color(255, 255, 179));
+//		initialColors.add(new Color(190, 186, 218));
+//		initialColors.add(new Color(251, 128, 114));
+//		initialColors.add(new Color(128, 177, 211));
+//	}
+
+	/**
+	 * 
+	 */
+	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
+			Cancellable cancel, double scale) throws DriverException {
+
+		if (!isVisible()) return;
+		if (!isWithinScale(scale)) return;
+
+		// In case gvSIG calls the getVisualStatus method... (?)
+		visualStatus.width = viewPort.getImageWidth();
+		visualStatus.height = viewPort.getImageHeight();
+		visualStatus.minX = viewPort.getAdjustedExtent().getMinX();
+		visualStatus.minY = viewPort.getAdjustedExtent().getMinY();
+		visualStatus.maxX = viewPort.getAdjustedExtent().getMaxX();
+		visualStatus.maxY = viewPort.getAdjustedExtent().getMaxY();
+
+		IGeometry geom, clonedGeom;
+		ICoordTrans layerTransf = getCoordTrans();
+		Rectangle2D bBox = viewPort.getAdjustedExtent();
+		
+		// CSV-WKT   or   LIBARCIMS
+		boolean test = false;
+		
+		if (test) {
+			// -------------------------- TEST START ---------------------------------
+			// geometries = ((FMapFeatureArcImsDriver) getSource().getDriver()).getGeometries();
+			
+			for (int i = 0; i < geometries.size(); i++) {
+				geom = (IGeometry) geometries.get(i);
+				if (geom.intersects(bBox)) {
+					clonedGeom = geom.cloneGeometry();
+					ISymbol symbol = (ISymbol) ((VectorialLegend) getLegend()).getSymbol(i);
+					// FSymbol symbol = ((VectorialLegend) getLegend()).getSymbol(i);
+					if (layerTransf != null) geom.reProject(layerTransf);
+					clonedGeom.draw(g, viewPort, symbol);
+				}
+			}
+			// -------------------------- TEST END   ---------------------------------
+		} else {
+			// -------------------------- NOT TEST START ---------------------------------
+			arcimsStatus.setExtent(bBox);
+			arcimsStatus.setHeight(viewPort.getImageHeight());
+			arcimsStatus.setWidth(viewPort.getImageWidth());
+			// one-item vector:
+			arcimsStatus.setLayerIds(Utilities.createVector(layerQuery, ","));
+			arcimsStatus.setServer(host.toString());
+			arcimsStatus.setService(service);
+			arcimsStatus.setSrs(this.getProjection().getAbrev());
+			arcimsStatus.setTransparency(this.arcImsTransparency);
+			
+			FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource().getDriver();
+			
+			try {
+				
+				// ********************************************
+				// first item in query must contain ID or #ALL#
+				// ********************************************
+				geometries = (ArrayList) drv.getMap(arcimsStatus);
+				
+			} catch (ProtocolException e) {
+				DriverException de = new DriverException(e.getMessage());
+				logger.error("While getting map (ArrayList of geometries) ", e);
+				throw de;
+			} catch (ArcImsException e) {
+				DriverException de = new DriverException(e.getMessage());
+				logger.error("While getting map (ArrayList of geometries) ", e);
+				throw de;
+			} catch (IOException e) {
+				DriverException de = new DriverException(e.getMessage());
+				logger.error("While getting map (ArrayList of geometries) ", e);
+				throw de;
+			} 
+			
+			for (int i = 0; i < geometries.size(); i++) {
+				geom = (IGeometry) ((DefaultFeature) geometries.get(i)).getGeometry();
+				
+				if (geom == null) {
+					logger.error("Retrieved null geometry ");
+				} else {
+					clonedGeom = geom.cloneGeometry();
+					int ov_index = drv.getOverallIndex(i);
+					ISymbol symbol = (ISymbol) getSymbolOrSelected(ov_index,
+							(FSymbol) ((VectorialLegend) getLegend()).getSymbol(ov_index));
+					// FSymbol symbol = getSymbolOrSelected(ov_index, ((VectorialLegend) getLegend()).getSymbol(ov_index));
+					if (layerTransf != null)
+						geom.reProject(layerTransf);
+					clonedGeom.draw(g, viewPort, symbol);
+				}
+			}
+			
+			FLyrText possibleLabels = getLayerText(); 
+			if (possibleLabels != null) {
+				possibleLabels.createLabels(this);
+				possibleLabels.draw(image, g, viewPort, cancel, scale);
+			}
+			// -------------------------- NOT TEST END   ---------------------------------
+		}
+	}
+
+	private FSymbol getSymbolOrSelected(int i, FSymbol symbol) {
+		
+		boolean sel = false;
+		try {
+			sel = getRecordset().getSelectionSupport().isSelected(i);
+		} catch (DriverException e) {
+			logger.error("While getting selection", e);
+		}
+		
+		if (sel) {
+			return new FSymbol(shapeType, Color.YELLOW);
+		} else {
+			return symbol;
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
+			double scale) throws DriverException {
+
+		draw(null, g, viewPort, cancel, scale);
+	}
+
+	/**
+	 * 
+	 */
+	public String queryByPoint(Point p) throws DriverException {
+		Point2D screenCoords, geoCoords;
+		double screenTol, geoTol;
+		
+		screenCoords = new Point2D.Double(p.getX(), p.getY());
+		geoCoords = new Point2D.Double(p.getX(), p.getY());
+		AffineTransform af = getMapContext().getViewPort().getAffineTransform();
+		try {
+			af.inverseTransform(screenCoords, geoCoords);
+		} catch (NoninvertibleTransformException e) {
+			logger.error("Non invertible AffineTransform ", e);
+		}
+		screenTol = 2.0; geoTol = 1.0;		
+		geoTol = screenTol / af.getScaleX();
+		
+		FBitSet fbs = queryByPoint(geoCoords, geoTol);
+		
+		// this invoques the client to get attrs.
+		try {
+			((ArcImsVectorialAdapter) getSource()).requestFeatureAttributes(fbs);
+		} catch (ArcImsException e) {
+			DriverException de = new DriverException(e.getMessage());
+			logger.error("While querying by point ", de);
+			throw de;
+		}
+
+		String resp = getFormattedFieldsFromSetFeatures(fbs);
+		System.err.println(resp); //TODO BORRAR ESTO
+		return resp;
+	}
+	
+
+	// TODO: move this to another class:
+	private String getFormattedFieldsFromSetFeatures(FBitSet fbs) {
+		String r = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
+		r = r + "<FeatureInfoResponse>";
+		r = r + "<LAYER ID=\"" + layerQuery + "\" NAME=\"" + getName() + "\">";
+		
+		for(int i=fbs.nextSetBit(0); i>=0; i=fbs.nextSetBit(i+1)) {
+			r = r + getFormattedFieldsFromFeature(i);
+		}
+		
+		r = r + "</LAYER>";
+		r = r + "</FeatureInfoResponse>";
+		return r;
+	}
+
+	// TODO: move this to another class:
+	private String getFormattedFieldsFromFeature(int j) {
+
+		String r = "<FIELDS ";
+		String fieldName, fieldValue;
+		DataSource ds = null;
+		
+		try {
+			ds = getSource().getRecordset();
+		} catch (DriverLoadException e1) {
+			logger.error("DriverException while getting field values. ", e1);
+		}
+		
+		int count;
+		try {
+			count = ds.getFieldCount();
+			for (int i=0; i<count; i++) {
+				
+				fieldName = ds.getFieldName(i);
+				fieldName = ArcImsInMemoryAttsTableDriver.replaceUnwantedCharacters(fieldName);
+				
+				fieldValue = restoreSpecialChars(ds.getFieldValue((long) j, i).toString());
+				logger.debug("fieldvalue = " + fieldValue);
+				r = r + " " + fieldName + "=" + "\"" + fieldValue + "\"";
+			}
+			// <FIELDS NOMBRE="LR-542" OBSERVACIO="" TIPO="CAUT3" _SHAPE_="[Geometry]" _ID_="1975" />
+			r = r + "/>";
+		} catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
+			logger.error("DriverException while getting field values. ", e);
+		}
+		
+		return r;
+	}
+
+	private String restoreSpecialChars(String str) {
+		/*
+		 * < 60 3c, > 62 3e, & 38 26, " 34 22, ' 39 27
+		 */
+		String resp = str.replaceAll("\\x26", "&amp;");
+		resp = resp.replaceAll("\\x3c", "&lt;");
+		resp = resp.replaceAll("\\x3e", "&gt;");
+		
+		resp = resp.replaceAll("\\x22", "&quot;");
+		resp = resp.replaceAll("\\x27", "&#39;");
+		return resp;
+	}
+
+
+	public void setInitialLegend() {
+
+		FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource()
+				.getDriver();
+		
+		//Try to get the legend from the service information
+		try {
+			Legend initialleg = drv.getClient().getLegend(
+					(String) this.arcimsStatus.getLayerIds().get(0));
+
+			if (initialleg != null) {
+
+				setLegend((VectorialLegend) initialleg);
+			}
+			return;
+		} catch (Exception e) {
+			logger.error("While setting initial legend ", e);
+		}
+		
+//		//If no legend is returned create a default legend
+//		if (drv.getShapeType() == FShape.MULTIPOINT) {
+//			SingleSymbolLegend initialleg = new SingleSymbolLegend();
+//			initialleg.setShapeType(drv.getShapeType());
+//			try {
+//				setLegend(initialleg);
+//			} catch (Exception e) {
+//				logger.error("While setting initial legend ", e);
+//			}
+//			return;
+//		}
+//
+//		try {
+//			int colorind = (int) (System.currentTimeMillis() % ((long) initialColors
+//					.size()));
+//			FSymbol symb = new FSymbol(drv.getShapeType(),
+//					(Color) initialColors.get(colorind));
+//			SingleSymbolLegend initialleg = new SingleSymbolLegend(symb);
+//			initialleg.setShapeType(drv.getShapeType());
+//			setLegend(initialleg);
+//		} catch (FieldNotFoundException e) {
+//			logger.error("Whuile setting initial legend ", e);
+//		} catch (DriverException e) {
+//			logger.error("Whuile setting initial legend ", e);
+//		}
+	}
+
+	// Classifiable
+	public int getShapeType() throws DriverException {
+		FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource().getDriver();
+		return drv.getShapeType();
+	}
+
+	/**
+	 * Keeps the image's height and width or the image's tiles' height and
+	 * width, if any. These values are the same as the viewPort's height and
+	 * width,
+	 */
+	private class VisualStatusArcIms {
+		protected int width = 0, height = 0;
+
+		protected double minX = 0D, minY = 0D, maxX = 0D, maxY = 0D;
+	}
+
+	public void setServiceInformationInStatus(ServiceInformation si) {
+		this.arcimsStatus.setServiceInformation(si);
+	}
+
+	public ArcImsVectStatus getArcimsStatus() {
+		return arcimsStatus;
+	}
+
+	public void setArcimsStatus(ArcImsVectStatus arcimsStatus) {
+		this.arcimsStatus = arcimsStatus;
+	}
+
+	public boolean isFirstLoad() {
+		return firstLoad;
+	}
+
+	public void setFirstLoad(boolean firstLoad) {
+		this.firstLoad = firstLoad;
+	}
+
+	public URL getHost() {
+		return host;
+	}
+
+	public void setHost(URL host) {
+		this.host = host;
+	}
+
+	public String getLayerQuery() {
+		return layerQuery;
+	}
+
+	public void setLayerQuery(String lQuery) {
+		this.layerQuery = lQuery;
+		if (layerQuery.substring(0, 1).compareTo(",") == 0)
+			layerQuery = layerQuery.substring(1);
+	}
+
+	public String getService() {
+		return service;
+	}
+
+	public void setService(String service) {
+		this.service = service;
+	}
+
+	public String getServiceType() {
+		return serviceType;
+	}
+
+	public void setServiceType(String serviceType) {
+		this.serviceType = serviceType;
+	}
+
+	public String getSRS() {
+		return SRS;
+	}
+
+	public void setSRS(String srs) {
+		SRS = srs;
+	}
+
+	public boolean getArcImsTransparency() {
+		return arcImsTransparency;
+	}
+
+	public void setArcImsTransparency(boolean arcImsTransparency) {
+		this.arcImsTransparency = arcImsTransparency;
+	}
+
+	public int getTransparency() {
+		return transparency;
+	}
+
+	public void setTransparency(int transparency) {
+		this.transparency = transparency;
+	}
+
+	public HashMap getProperties() {
+		HashMap info = new HashMap();
+		String[] layerNames = getLayerQuery().split(",");
+		Vector layers = new Vector(layerNames.length);
+		FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) getSource()
+		.getDriver();
+		
+		try {
+			if (drv.connect(myCanc)) {
+				info.put("layerName", this.getName());
+				info.put("serverUrl", this.getHost());
+				info.put("serviceName", this.getService());
+				info.put("serviceType", this.getServiceType());
+				for (int i = 0; i < layerNames.length; i++)
+					layers.add(layerNames[i]);
+				info.put("layerIds", layers);
+				return info;
+			}
+		} catch (Exception e) {
+			logger.error("Error in FRasterLyrArcIMS.getProperties() ", e);
+		}
+		return null;
+	}
+
+	public void setLayerIdsInStatus(Vector idsv) {
+		arcimsStatus.setLayerIds(idsv);
+	}
+
+	public void setProjectionInStatus(String abbrev_srs) {
+		arcimsStatus.setSrs(abbrev_srs);
+	}
+
+	public void setHostInStatus(URL url) {
+		arcimsStatus.setServer(url.toString());
+	}
+
+	public void setServiceInStatus(String srv) {
+		arcimsStatus.setService(srv);
+	}
+
+	public void setSubfieldsInStatus() {
+		String[] subfields = new String[2];
+		String id = (String) arcimsStatus.getLayerIds().get(0);
+		ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) arcimsStatus.getServiceInfo().getLayerById(id);
+		FieldInformation fi = (FieldInformation) silf.getFieldInformationByType(FieldInformation.ID).get(0);
+		subfields[1] = fi.getName();
+		fi = (FieldInformation) silf.getFieldInformationByType(FieldInformation.SHAPE).get(0);
+		subfields[0] = fi.getName();
+		arcimsStatus.setSubfields(subfields);
+	}
+
+	public void legendChanged(LegendChangedEvent e) {
+		MapContext fmap = getMapContext();
+		if (fmap != null) {
+			fmap.invalidate();
+			
+		}
+	}
+	
+	public void setXMLEntity(XMLEntity xml) throws XMLException {
+		try {
+			setHost(new URL(xml.getStringProperty("_host")));
+		} catch (MalformedURLException e) {
+			logger.error("Bad url ", e);
+		}
+		setService(xml.getStringProperty("_service"));
+		setLayerQuery(xml.getStringProperty("layerQuery"));
+		setSrsAbrev(xml.getStringProperty("srs_abrev"));
+		
+		FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host.toString(), service, layerQuery);
+		if (!(drv.connect(myCanc))) {
+			throw new XMLException(new DriverException("Unable to connect to server"));
+		}
+		drv.setLayer(this);
+		
+		Vector ids = new Vector();
+		ids.add(getLayerQuery());
+		setLayerIdsInStatus(ids);
+		
+		ArcImsClientP cli = drv.getClient();
+		ServiceInformation si = cli.getServiceInformation();
+		arcimsStatus.setServiceInformation(si);
+		
+		String srs = getSrsAbrev();
+		arcimsStatus.setSrs(srs);
+		
+		if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) {
+			si.setFeaturecoordsys(srs.substring(ServiceInfoTags.vINI_SRS.length()).trim());
+			logger.warn("Server provides no SRS. ");
+		} 
+		
+		Rectangle2D fext = null;
+		try {
+			fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(arcimsStatus);
+		} catch (Exception e) {
+			logger.error("While loading ArcIMS layer ", e);
+		}
+		arcimsStatus.setExtent(fext);
+		drv.setFullExtent(fext);
+		
+		setSubfieldsInStatus();
+		
+		
+		// drv.loadRecordSet();
+		
+		ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
+		VectorialEditableAdapter adapter = new VectorialEditableAdapter();
+		
+		String recordsetName = xml.getStringProperty("recordset-name");
+		
+		try {
+			adapter.setOriginalDataSource(drv.getRecordSet(recordsetName));
+		} catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
+			logger.error("While setting original data source ", e);
+		}
+		adapter.setOriginalVectorialAdapter(oldadapter);
+		
+		setAdapter(adapter);
+
+		drv.setAdapter(adapter);
+		
+		setInitialLegend();
+		
+		try {
+			setRecordset(((FMapFeatureArcImsDriver) getSource().getDriver()).getRecordSet());
+		} catch (Exception e) {
+			logger.error("While setting data source ", e);
+		}
+		super.setXMLEntity(xml);
+	}
+	
+	public XMLEntity getXMLEntity() throws XMLException {
+		
+		XMLEntity resp = super.getXMLEntity();
+		
+		// PluginServices.getMDIManager().addView(null);
+		
+		resp.putProperty("srs_abrev", getMapContext().getProjection().getAbrev());
+		resp.putProperty("_host", host.toString());
+		resp.putProperty("_service", service);
+		resp.putProperty("layerQuery", layerQuery);
+		return resp;
+	}
+
+	public String getSrsAbrev() {
+		return srsAbrev;
+	}
+
+	public void setSrsAbrev(String srsAbrev) {
+		this.srsAbrev = srsAbrev;
+	}
+	
+	/**
+	 * The extCatalogYNomenclator needs this creator.
+	 * 
+	 * @param p a Map object with the following keys:
+	 * 
+	 * (key, object type returned)
+	 * ---------------------------
+	 * "host", String (with or without the servlet path)
+	 * "service_name", String (remote service name)
+	 * "srs", String (coordinate system)
+	 * "layer_id", String (*single* remote layer's ID)
+	 * "layer_name", String (local layer name)
+	 * 
+	 * @return a FRasterLyrArcIMS layer
+	 * @throws ConnectionException 
+	 */
+	
+	/*
+
+	public FFeatureLyrArcIMS(Map m) throws ConnectionException {
+		
+		String _host = (String) m.get("host");
+		
+		try {
+			
+			String _layer_id = (String) m.get("layer_id");
+			String _service_name = (String) m.get("service_name");
+			String _layer_name = (String) m.get("layer_name");
+			String _srs = (String) m.get("srs");
+			
+			// ----------------------------------
+			
+			URL _true_host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host));
+			IProjection _true_srs = CRSFactory.getCRS(_srs);
+
+
+			FMapFeatureArcImsDriver _drv = new FMapFeatureArcImsDriver(_true_host.toString(),
+					_service_name, _layer_id);
+			if (!(_drv.connect(myCanc))) throw new Exception();
+			ArcImsVectorialAdapter _oldadapter = new ArcImsVectorialAdapter(_drv);
+			VectorialEditableAdapter _adapter = new VectorialEditableAdapter();
+			_drv.setLayer(this);
+
+			ServiceInformation _si = _drv.getClient().getServiceInformation();
+			ServiceInformationLayerFeatures _silf = (ServiceInformationLayerFeatures)
+			_si.getLayerById(_layer_id);
+			
+			setProjectionInStatus(_true_srs.getAbrev());
+			setHostInStatus(_true_host);
+			setServiceInStatus(_service_name);
+
+			String _units = _si.getMapunits();
+			int _theDpi = _si.getScreen_dpi();
+			long _scale;
+			if (_silf.getMaxscale()!=-1) {
+				_scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(
+						_silf.getMaxscale(), _units, _theDpi);
+				setMaxScale((double) _scale);
+			}
+			if (_silf.getMinscale()!=-1) {
+				_scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(
+						_silf.getMinscale(), _units, _theDpi);
+				setMinScale((double) _scale);			
+			}
+		
+			setServiceInformationInStatus(_si);
+			Vector _ids = new Vector(); _ids.add(_layer_id);
+			setLayerIdsInStatus((Vector) _ids.clone());
+			setSubfieldsInStatus();
+
+			setHost(_true_host);
+			setService(_service_name);
+			setServiceType(ServiceInfoTags.vFEATURESERVICE);
+			setTransparency(0);
+			setLayerQuery(_layer_id);
+			setProjection(_true_srs);
+			setName(_layer_name);
+
+			Rectangle2D _fext = ((ArcImsFeatureClient)
+					_drv.getClient()).getLayerExtent(getArcimsStatus());
+			_drv.setFullExtent(_fext);
+			// individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
+			
+			// ------ -------------
+			_drv.setAdapter(_adapter);
+			// adapter.setRecordSet(drv.getRecordSet());
+			_adapter.setOriginalDataSource(_drv.getRecordSet());
+			_adapter.setOriginalVectorialAdapter(_oldadapter);
+			_drv.declareTable();
+			
+			setSource(_adapter);
+			_adapter.setDriver(_drv);
+			
+			getSource().setDriver(_drv);
+			setInitialLegend();
+			setShapeType(_adapter.getShapeType());
+			setRecordset(_drv.getRecordSet());
+			// ------ -------------
+			
+			if ((_si.getFeaturecoordsys() == null) ||
+					(_si.getFeaturecoordsys().equals(""))) {
+				_si.setFeaturecoordsys(_true_srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim());
+				logger.warn("Server provides no SRS. ");
+			}
+		} catch (Exception e) {
+			throw new ConnectionException("Unable to connect to host " + _host, e);
+		}
+	}
+	
+	*/
+	
+
+}
+

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FFeatureLyrArcIMS.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FRasterLyrArcIMS.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FRasterLyrArcIMS.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FRasterLyrArcIMS.java	(revision 8301)
@@ -0,0 +1,1107 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.layers;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.listeners.FRasterLyrArcIMSListener;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.NoninvertibleTransformException;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.cresques.geo.ViewPortData;
+import org.cresques.io.GdalFile;
+import org.cresques.io.GeoRasterFile;
+import org.cresques.cts.IProjection;
+import org.cresques.filter.RasterFilterStack;
+import org.cresques.filter.RasterFilterStackManager;
+import org.cresques.px.Extent;
+import org.cresques.px.PxRaster;
+import org.gvsig.remoteClient.arcims.ArcImsClientP;
+import org.gvsig.remoteClient.arcims.ArcImsProtImageHandler;
+import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
+import org.gvsig.remoteClient.arcims.ArcImsStatus;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.MyCancellable;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+import org.gvsig.remoteClient.utils.Utilities;
+
+import com.iver.cit.gvsig.fmap.DriverException;
+import com.iver.cit.gvsig.fmap.ViewPort;
+import com.iver.cit.gvsig.fmap.crs.CRSFactory;
+import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
+
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
+import com.iver.cit.gvsig.fmap.layers.RasterAdapter;
+import com.iver.cit.gvsig.fmap.layers.RasterOperations;
+import com.iver.cit.gvsig.fmap.layers.StatusLayerRaster;
+import com.iver.cit.gvsig.fmap.layers.StatusRasterInterface;
+import com.iver.cit.gvsig.fmap.layers.Tiling;
+import com.iver.cit.gvsig.fmap.layers.XMLException;
+import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
+import com.iver.cit.gvsig.fmap.layers.layerOperations.StringXMLItem;
+import com.iver.cit.gvsig.fmap.layers.layerOperations.XMLItem;
+import com.iver.utiles.StringUtilities;
+import com.iver.utiles.XMLEntity;
+import com.iver.utiles.connections.ConnectionException;
+import com.iver.utiles.swing.threads.Cancellable;
+import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
+
+import org.gvsig.remoteClient.wms.ICancellable;
+
+/**
+ * This class implements an ArcIMS raster layer.
+ * 
+ * @author jldominguez
+ */
+public class FRasterLyrArcIMS extends FLyrDefault implements RasterOperations, InfoByPoint {
+	
+	private MyCancellable myCanc;
+
+	private static Logger logger = Logger.getLogger(FRasterLyrArcIMS.class.getName());
+	
+	private URL host;
+	private String service;
+	private String serviceType;
+	private Rectangle2D fullExtent;
+	private boolean firstLoad = false;
+	private ArcImsStatus arcimsStatus = new ArcImsStatus();
+	private String SRS;
+	private String layerQuery;
+	private ArcImsDriver driver;
+	private VisualStatusArcIms visualStatus = new VisualStatusArcIms();
+	
+	private int transparency = -1;
+	private boolean arcImsTransparency = true;
+
+	private String format;
+	private StatusRasterInterface status = null;
+	private GeoRasterFile rasterFile = null;
+	private PxRaster raster = null;
+	private int rband = 0, gband = 1, bband = 2;
+	private RasterFilterStackManager stackManager = null;
+	private RasterFilterStack filterStack = null;
+	private int posX = 0, posY = 0;
+	private double posXWC = 0, posYWC = 0;
+	private int r = 0, g = 0, b = 0;
+	private ArrayList actionListeners = new ArrayList();
+	private int maxTileWidth = 1023;
+	private int maxTileHeight = 1023;
+	
+	private boolean nameQueryChange = false;
+	
+	private ArrayList listeners = new ArrayList();
+	
+	private boolean tiled = false;
+	private int[] tileSize = new int[2];
+	
+	
+	public static final String SCALE_CHANGED_COMMAND = "SCALE_HAS_CHANGED";
+	private ActionEvent scaleChangedEvent = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, SCALE_CHANGED_COMMAND);
+	
+	public FRasterLyrArcIMS() {
+		myCanc = new MyCancellable(new DefaultCancellableMonitorable());
+	}
+
+	/**
+	 * Gets the driver object onto which <tt>getMap()</tt> and
+	 * <tt>getFeatureInfo()</tt> requests are passed. If the driver was not
+	 * created, this methdo creates it with the server's URL and the service
+	 * name.
+	 * 
+	 * @return the driver that actually performs the requests.
+	 */
+	public ArcImsDriver getDriver() {
+		if (driver == null) {
+			driver = new FMapRasterArcImsDriver(host.toString(), service,
+					this.serviceType);
+		}
+		return driver;
+	}
+
+	public void setDriver(FMapRasterArcImsDriver d) {
+		driver = d;
+	}
+
+	/**
+	 * Gets the transformation matrix to be written in the georeference file.
+	 * The second and the third coefficients will always be zero (it doesn't
+	 * implement image rotation)
+	 * 
+	 * @param bBox
+	 *            Image's size and position (user's coordinates)
+	 * @param sz
+	 *            Images' size in pixels
+	 * @return the worldfile, as a String
+	 * @throws IOException
+	 */
+	public String getDataWorldFile(Rectangle2D bBox, Dimension sz)
+			throws IOException {
+		StringBuffer data = new StringBuffer();
+		data.append((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1)
+				+ "\n");
+		data.append("0.0\n");
+		data.append("0.0\n");
+		data.append((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1)
+				+ "\n");
+		data.append("" + bBox.getMinX() + "\n");
+		data.append("" + bBox.getMinY() + "\n");
+		return data.toString();
+	}
+
+	/**
+	 * Gets the raster status
+	 * 
+	 * @return the raster status
+	 */
+	public StatusRasterInterface getStatus() {
+		return this.status;
+	}
+
+	public void setStatus(StatusRasterInterface s) {
+		this.status = s;
+	}
+
+	/**
+	 * This method must be invoqued with <b>true</b> if the layer must show its
+	 * transparency. The level of transparency is set by another method.
+	 * 
+	 * @param t
+	 *            Whether or not the transparency must be shown.
+	 */
+	public void setArcImsTransparency(boolean t) {
+		this.arcImsTransparency = t;
+	}
+
+	/**
+	 * Drawing method invoqued from outside the plugin.
+	 * 
+	 * @param g
+	 *            graphic object on which drawing is made.
+	 * @param vp
+	 *            the view
+	 * @param cancel
+	 *            allows drawing abortion
+	 * @throws DriverException
+	 */
+	private void drawTile(Graphics2D g, ViewPort vp, Cancellable cancel)
+			throws DriverException {
+		// This is the extent that will be requested
+		Rectangle2D bBox = vp.getAdjustedExtent();// getFullExtent();
+		Dimension sz = vp.getImageSize();
+
+		try {
+			arcimsStatus.setExtent(bBox);
+			arcimsStatus.setFormat(getFormat());
+			arcimsStatus.setHeight(vp.getImageHeight());
+			arcimsStatus.setWidth(vp.getImageWidth());
+			arcimsStatus.setLayerIds(Utilities.createVector(layerQuery, ","));
+			arcimsStatus.setServer(host.toString());
+			arcimsStatus.setService(service);
+			arcimsStatus.setSrs(this.getProjection().getAbrev());
+			arcimsStatus.setTransparency(this.arcImsTransparency);
+
+			// We need to cast because driver returns an Object
+			File f = (File) getDriver().getMap(arcimsStatus);
+			
+			int lastp = f.getPath().lastIndexOf(".");
+			String noext = f.getPath().substring(0,lastp);
+			
+			String nameWorldFile = noext
+					+ getExtensionWordFile(getFormat());
+
+			com.iver.andami.Utilities.createTemp(nameWorldFile, this
+					.getDataWorldFile(bBox, sz));
+
+			if (status != null && firstLoad) {
+				status.applyStatus(this);
+				firstLoad = false;
+			}
+
+			// And finally, obtain the extent intersecting the view and the BBox
+			// to draw to.
+			// ------------------------------ START (?)
+			// Rectangle2D extent = new Rectangle2D.Double();
+			// Rectangle2D.intersect(vp.getAdjustedExtent(), bBox, extent);
+			// ViewPortData vpData = new ViewPortData(vp.getProjection(),
+			// new Extent(extent), sz);
+			// vpData.setMat(vp.getAffineTransform());
+			// ------------------------------ END (?)
+
+			// ------------------------------ START
+			ViewPortData vpData = new ViewPortData(vp.getProjection(),
+					new Extent(bBox), sz);
+			vpData.setMat(vp.getAffineTransform());
+			// ------------------------------ END
+
+			rasterProcess(g, vpData, f);
+
+		} catch (IOException e) {
+			DriverException de = new DriverException("connect_error");
+			logger.error("While connecting ", e);
+			throw de;
+		} catch (ArcImsException e) {
+			logger.error("While drawing ", e);
+			this.setVisible(false);
+			DriverException de = new DriverException(e.getMessage());
+			throw de;
+		}
+
+	}
+
+	/**
+	 * Drawing method invoqued from gvSIG to draw this layer. Uses a <tt>Tiling</tt>
+	 * object to prevent downloading images too large to be retrieved
+	 * (pixel count limit)
+	 * 
+	 * @param image
+	 *            used to speed up drawing process
+	 * @param g
+	 *            graphic object on which drawing is make
+	 * @param viewPort
+	 *            the view's properties
+	 * @param cancel
+	 *            allows drawing abortion
+	 * @param scale the current scale
+	 * 				
+	 * @throws DriverException
+	 */
+	public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
+			Cancellable cancel, double scale) throws DriverException {
+		
+		if (! isVisible()) return;
+		if (! isWithinScale(scale)) return;
+		
+		visualStatus.width = viewPort.getImageWidth();
+		visualStatus.height = viewPort.getImageHeight();
+		visualStatus.minX = viewPort.getAdjustedExtent().getMinX();
+		visualStatus.minY = viewPort.getAdjustedExtent().getMinY();
+		visualStatus.maxX = viewPort.getAdjustedExtent().getMaxX();
+		visualStatus.maxY = viewPort.getAdjustedExtent().getMaxY();
+		
+		setTileDimensions(viewPort);
+			
+		Point2D p = viewPort.getOffset();
+		Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
+		Tiling tiles = new Tiling(maxTileWidth, maxTileHeight, r);
+		tiles.setAffineTransform((AffineTransform) viewPort
+				.getAffineTransform().clone());
+		
+		tiled = false;
+		if (tiles.getNumTiles() > 1) {
+			tiled = true;
+			tileSize[0] = tiles.getMaxTileWidth();
+			tileSize[1] = tiles.getMaxTileHeight();
+		}
+		for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
+			// drawing part
+			try {
+				ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
+				drawTile(g, vp, cancel);
+			} catch (NoninvertibleTransformException e) {
+				logger.error("Non invertible matrix ", e);
+			}
+		}
+		
+		// the status needs to be reset because the drawTile
+		// method had changed its extent and dimension:
+		arcimsStatus.setExtent(viewPort.getAdjustedExtent());
+		arcimsStatus.setHeight(viewPort.getImageHeight());
+		arcimsStatus.setWidth(viewPort.getImageWidth());
+
+		callActionListeners(scaleChangedEvent);
+		if (nameQueryChange) {
+			callNameOrQueryListeners();
+			nameQueryChange = false;
+		}
+	}
+
+	private void setTileDimensions(ViewPort vp) {
+		maxTileHeight =  vp.getImageHeight();
+		try {
+			maxTileWidth =
+				Integer.parseInt(arcimsStatus.getServiceInfo().getImagelimit_pixelcount()) / maxTileHeight;
+			maxTileWidth--;
+		} catch (NumberFormatException nfe) {
+			logger.error("getImagelimit_pixelcount() returned a non parseable string. maxTileWidth was set to 100.", nfe);
+			maxTileWidth = 100;
+		}
+		logger.info("Tile size = [ " + maxTileWidth + " , " + maxTileHeight + " ]");
+	}
+
+	/**
+	 * Gets the georeference file extension depending on the image's format.
+	 * 
+	 * @param f
+	 *            raster file format
+	 * @return georeference file extension (".wld", ".tfw", etc)
+	 */
+	private String getExtensionWordFile(String f) {
+		String extWorldFile = ".wld";
+		if (f.equals("tif") || f.equals("tiff"))
+			extWorldFile = ".tfw";
+		if (f.equals("jpeg"))
+			extWorldFile = ".jpgw";
+		return extWorldFile;
+	}
+
+	/**
+	 * Draws an image using PxRaster
+	 * 
+	 * @param g
+	 *            graphics object on which drawing will be made
+	 * @param vpData
+	 *            viewport's properties
+	 * @param file
+	 *            the image file
+	 */
+	private void rasterProcess(Graphics2D g, ViewPortData vpData, File file) {
+
+		// PxRaster is created
+		rasterFile = new GdalFile(vpData.getProjection(), file
+				.getAbsolutePath());
+		raster = new PxRaster(rasterFile, null, rasterFile.getExtent());
+
+		if (this.filterStack != null)
+			raster.filterStack = this.filterStack;
+
+		raster.setTransparency(false); 
+
+		if (this.transparency == -1 && !firstLoad)
+			;
+		else
+			raster.setTransparency(this.transparency);
+
+		raster.setBand(GeoRasterFile.RED_BAND, rband);
+		raster.setBand(GeoRasterFile.GREEN_BAND, gband);
+		raster.setBand(GeoRasterFile.BLUE_BAND, bband);
+
+		if (this.stackManager != null)
+			raster.setStackManager(this.stackManager);
+		
+		if(visualStatus != null){
+			visualStatus.bandCount = raster.getBandCount();
+			visualStatus.dataType = raster.getDataType();
+		}
+
+		raster.draw(g, vpData);
+
+		// We get the Stack Manager with the first pxRaster of an image
+		// so we can modify it afterwards from the properties dialog
+		if (this.stackManager == null)
+			this.stackManager = raster.getStackManager();
+
+		if (this.filterStack == null)
+			this.filterStack = raster.filterStack;
+	}
+
+	public void repaintRaster(Graphics2D g, ViewPortData vpData, File file) {
+		rasterProcess(g, vpData, file);
+	}
+
+	public String getFormat() {
+		return format;
+	}
+
+	public void setFormat(String format) {
+		this.format = format;
+	}
+
+
+	/**
+	 * Gets a series of attributes that describe the layer's raster: Filename,
+	 * Filesize, Height, Width and Bands.
+	 * 
+	 * @return A list of 2-element arrays { "Attribute name" , Value }
+	 */
+	public ArrayList getAttributes() {
+		if (rasterFile != null) {
+			ArrayList attr = new ArrayList();
+			Object[][] a = {
+					{
+							"Filename",
+							rasterFile.getName().substring(
+									rasterFile.getName().lastIndexOf("/") + 1,
+									rasterFile.getName().length()) },
+					{ "Filesize", new Long(rasterFile.getFileSize()) },
+					{
+							"Width",
+							new Integer((new Double(this.getWidth()))
+									.intValue()) },
+					{
+							"Height",
+							new Integer((new Double(this.getHeight()))
+									.intValue()) },
+					{ "Bands", new Integer(rasterFile.getBandCount()) } };
+			for (int i = 0; i < a.length; i++) {
+				attr.add(a[i]);
+			}
+			return attr;
+		}
+		return null;
+	}
+
+	/**
+	 * 
+	/**
+	 * Invoqued from gvSIG to draw this layer on a printable map. Uses a
+	 * <tt>Tiling</tt> object to prevent downloading images too large to be
+	 * retrieved (pixel count limit).
+	 * 
+	 * @param g
+	 *            graphic object on which drawing is make
+	 * @param viewPort
+	 *            the view's properties
+	 * @param cancel
+	 *            allows drawing abortion
+	 * @param scale the current scale
+	 * 				
+	 * @throws DriverException
+	 */
+	public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
+			double scale) throws DriverException {
+
+		draw(null, g, viewPort, cancel, scale);
+	}
+
+	public HashMap getProperties() {
+		HashMap info = new HashMap();
+		String[] layerNames = getLayerQuery().split(",");
+		Vector layers = new Vector(layerNames.length);
+		try {
+			if (((FMapRasterArcImsDriver) getDriver()).connect(myCanc)) {
+				info.put("layerName", this.getName());
+				info.put("serverUrl", this.getHost());
+				info.put("serviceName", this.getService());
+				info.put("serviceType", this.getServiceType());
+				info.put("format", this.format);
+				for (int i = 0; i < layerNames.length; i++)
+					layers.add(layerNames[i]);
+				info.put("layerIds", layers);
+				return info;
+			}
+		} catch (Exception e) {
+			logger.error("Error while reading FRasterLyrArcIMS properties. ", e);
+		}
+		return null;
+	}
+
+	public RasterFilterStack getFilterStack() {
+		if (raster != null)
+			return raster.filterStack;
+		return null;
+	}
+
+	public double getHeight() {
+		return visualStatus.height;
+	}
+
+	public double getMaxX() {
+		return visualStatus.maxX;
+	}
+
+	public double getMaxY() {
+		return visualStatus.maxY;
+	}
+
+	public double getMinX() {
+		return visualStatus.minX;
+	}
+
+	public double getMinY() {
+		return visualStatus.minY;
+	}
+
+	public int[] getPixel(double wcx, double wcy) {
+		if (getPxRaster() != null)
+			return getPxRaster().getPixel(wcx, wcy);
+		return null;
+	}
+
+	public RasterAdapter getSource() {
+		return null;
+	}
+
+	public double getWidth() {
+		return visualStatus.width;
+	}
+
+	public void setBand(int flag, int nBand) {
+		switch (flag) {
+		case GeoRasterFile.RED_BAND:
+			setBandR(nBand);
+			break;
+		case GeoRasterFile.GREEN_BAND:
+			setBandG(nBand);
+			break;
+		case GeoRasterFile.BLUE_BAND:
+			setBandB(nBand);
+			break;
+		}
+	}
+
+	
+	public void setFilterStack(RasterFilterStack stack) {
+		this.filterStack = stack;
+	}
+
+	public void setPos(int x, int y) {
+		this.posX = x;
+		this.posY = y;
+	}
+
+	public void setPosWC(double x, double y) {
+		this.posXWC = x;
+		this.posYWC = y;
+	}
+
+	public void setRGB(int r, int g, int b) {
+		this.r = r;
+		this.g = g;
+		this.b = b;
+	}
+	
+	public Color getRGB() {
+		return new Color(r, g, b);
+	}
+
+	public void setSource(RasterAdapter ra) {
+	}
+
+	/**
+	 * @return Returns the raster.
+	 */
+	public PxRaster getPxRaster() {
+		return raster;
+	}
+
+	/**
+	 * @return Returns the rasterFile.
+	 */
+	public GeoRasterFile getGeoRasterFile() {
+		return rasterFile;
+	}
+
+
+	/**
+	 * Sets the R-band.
+	 * 
+	 * @param r
+	 */
+	public void setBandR(int r) {
+		this.rband = r;
+	}
+
+	/**
+	 * Sets the G-band.
+	 * 
+	 * @param g
+	 */
+	public void setBandG(int g) {
+		this.gband = g;
+	}
+
+	/**
+	 * Sets the B-band.
+	 * 
+	 * @param b
+	 */
+	public void setBandB(int b) {
+		this.bband = b;
+	}
+
+	/**
+	 * 
+	 * @return XMLEntity.
+	 * @throws XMLException
+	 */
+	public XMLEntity getXMLEntity() throws XMLException {
+		XMLEntity xml = super.getXMLEntity();
+
+		xml.putProperty("fullExtent", StringUtilities.rect2String(fullExtent));
+		xml.putProperty("host", host.toExternalForm());
+		xml.putProperty("serviceName", service);
+		xml.putProperty("serviceType", serviceType);
+		xml.putProperty("layerQuery", layerQuery);
+		xml.putProperty("format", format);
+		if (status != null) {
+			status.getXMLEntity(xml, true, this);
+		} else {
+			status = new StatusLayerRaster();
+			status.getXMLEntity(xml, true, this);
+		}
+		xml.putProperty("arcims_transparency", arcImsTransparency);
+		return xml;
+	}
+
+	/**
+	 * 
+	 * @param xml
+	 *            XMLEntity
+	 * 
+	 * @throws XMLException
+	 * @throws DriverException
+	 * @throws DriverIOException
+	 */
+	public void setXMLEntity(XMLEntity xml) throws XMLException {
+
+		super.setXMLEntity(xml);
+		fullExtent = StringUtilities.string2Rect(xml
+				.getStringProperty("fullExtent"));
+		try {
+			host = new URL(xml.getStringProperty("host"));
+		} catch (MalformedURLException e) {
+			logger.error("Whle reading XML file ", e);
+			throw new XMLException(e);
+		}
+
+		this.layerQuery = xml.getStringProperty("layerQuery");
+		this.service = xml.getStringProperty("serviceName");
+		this.serviceType = xml.getStringProperty("serviceType");
+		this.format = xml.getStringProperty("format");
+		
+		FMapRasterArcImsDriver drv = new FMapRasterArcImsDriver(host.toString(), service, serviceType);
+		if (!drv.connect(myCanc)) {
+			logger.error("Error while loading service information. ");
+		}
+		ArcImsClientP cli = (ArcImsClientP) drv.getClient();
+		ServiceInformation si = cli.getServiceInformation();
+		this.arcimsStatus.setServiceInformation(si);
+
+		if (xml.contains("arcims_transparency"))
+			this.arcImsTransparency = xml
+					.getBooleanProperty("arcims_transparency");
+
+		String claseStr = StatusLayerRaster.defaultClass;
+		if (xml.contains("raster.class"))
+			claseStr = xml.getStringProperty("raster.class");
+
+		if (status != null) {
+			status.setXMLEntity(xml, this);
+		} else {
+			// When we load a project
+			if (claseStr != null && !claseStr.equals("")) {
+				try {
+					Class clase = Class.forName(claseStr);
+					Constructor constr = clase.getConstructor(null);
+					status = (StatusRasterInterface) constr.newInstance(null);
+					if (status != null)
+						status.setXMLEntity(xml, this);
+				} catch (ClassNotFoundException exc) {
+					logger.error("Whle reading XML file ", exc);
+				} catch (InstantiationException exc) {
+					logger.error("Whle reading XML file ", exc);
+				} catch (IllegalAccessException exc) {
+					logger.error("Whle reading XML file ", exc);
+				} catch (NoSuchMethodException exc) {
+					logger.error("Whle reading XML file ", exc);
+				} catch (InvocationTargetException exc) {
+					logger.error("Whle reading XML file ", exc);
+				}
+			}
+		}
+		firstLoad = true;
+	}
+
+	public Vector getLayerScaleInfoVector() {
+		Vector v = new Vector();
+		String id;
+
+		for (int i = 0; i < arcimsStatus.getLayerIds().size(); i++) {
+			id = (String) arcimsStatus.getLayerIds().get(i);
+			v.add(getScaleInfo(id));
+		}
+		return v;
+	}
+
+	public LayerScaleData getScaleInfo(String theId) {
+		ServiceInformation si;
+		ServiceInformationLayer sil;
+		int noflayers;
+		long true_max_scale, true_min_scale;
+
+		LayerScaleData theLayerScaleData = null;
+
+		si = arcimsStatus.getServiceInfo();
+		int _dpi = si.getScreen_dpi();
+		String mapUnits = si.getMapunits();
+
+		noflayers = si.getLayers().size();
+		for (int i = 0; i < noflayers; i++) {
+			sil = (ServiceInformationLayer) si.getLayer(i);
+			if ((sil.getId().compareTo(theId)) == 0) {
+				true_max_scale = LayerScaleData
+						.getTrueScaleFromRelativeScaleAndMapUnits(sil.getMaxscale(),
+								mapUnits, _dpi);
+				true_min_scale = LayerScaleData
+						.getTrueScaleFromRelativeScaleAndMapUnits(sil.getMinscale(),
+								mapUnits, _dpi);
+				theLayerScaleData = new LayerScaleData(sil.getName(), sil.getId(),
+						true_min_scale, true_max_scale, sil.getType());
+			}
+		}
+		return theLayerScaleData;
+	}
+
+	public void addActionlistener(ActionListener al) {
+		if (actionListeners.contains(al)) return;
+		actionListeners.add(al);
+	}
+	
+	public void removeActionlistener(ActionListener al) {
+		actionListeners.remove(al);
+	}
+	
+	private void callActionListeners(ActionEvent ae) {
+		ActionListener al;
+		for (int i=0; i<actionListeners.size(); i++) {
+			al = (ActionListener) actionListeners.get(i);
+			al.actionPerformed(ae);
+		}
+	}
+	
+	public long getScale() {
+		return getMapContext().getScaleView();
+	}
+
+	public int getMaxTileHeight() {
+		return maxTileHeight;
+	}
+
+	public void setMaxTileHeight(int maxTileHeight) {
+		this.maxTileHeight = maxTileHeight;
+	}
+
+	public int getMaxTileWidth() {
+		return maxTileWidth;
+	}
+
+	public void setMaxTileWidth(int maxTileWidth) {
+		this.maxTileWidth = maxTileWidth;
+	}
+	
+	public void setServiceInformationInStatus(ServiceInformation si) {
+		this.arcimsStatus.setServiceInformation(si);
+	}
+
+	/**
+	 * This is the <tt>getDriver</tt> method. The <tt>getDriver</tt>
+	 * method will be implemented by sub-classes.
+	 *  
+	 * @param d the new driver.
+	 */
+	public void setDriver(ArcImsDriver d) {
+		driver = d;
+	}
+
+	public ArcImsStatus getArcimsStatus() {
+		return arcimsStatus;
+	}
+
+	public void setArcimsStatus(ArcImsStatus arcimsStatus) {
+		this.arcimsStatus = arcimsStatus;
+	}
+
+	public boolean isFirstLoad() {
+		return firstLoad;
+	}
+
+	public void setFirstLoad(boolean firstLoad) {
+		this.firstLoad = firstLoad;
+	}
+
+	public URL getHost() {
+		return host;
+	}
+
+	public void setHost(URL host) {
+		this.host = host;
+	}
+
+	public String getLayerQuery() {
+		return layerQuery;
+	}
+
+	public void setLayerQuery(String lQuery) {
+		this.layerQuery = lQuery;
+		if (layerQuery.substring(0, 1).compareTo(",") == 0)
+			layerQuery = layerQuery.substring(1);
+	}
+
+	public String getService() {
+		return service;
+	}
+
+	public void setService(String service) {
+		this.service = service;
+	}
+
+	public String getServiceType() {
+		return serviceType;
+	}
+
+	public void setServiceType(String serviceType) {
+		this.serviceType = serviceType;
+	}
+
+	public String getSRS() {
+		return SRS;
+	}
+
+	public void setSRS(String srs) {
+		SRS = srs;
+	}
+
+	public void setFullExtent(Rectangle2D fullExtent) {
+		this.fullExtent = fullExtent;
+	}
+	
+	public Rectangle2D getFullExtent() {
+		return fullExtent;
+	}
+
+	public boolean getArcImsTransparency() {
+		return arcImsTransparency;
+	}
+
+	public int getTransparency() {
+		return transparency;
+	}
+
+	public void setTransparency(int transparency) {
+		this.transparency = transparency;
+	}
+	
+	
+	
+	private class VisualStatusArcIms {
+		/**
+		 * Ancho y alto de la imagen o del conjunto de tiles si los tiene. Coincide con 
+		 * el ancho y alto del viewPort
+		 */
+		private	int							width = 0, height = 0;
+		private double						minX = 0D, minY = 0D, maxX = 0D, maxY = 0D;
+		private int 						bandCount = 0;
+		private int							dataType = DataBuffer.TYPE_UNDEFINED;
+	}
+
+
+
+	public int getPosX() {
+		return posX;
+	}
+
+	public void setPosX(int posX) {
+		this.posX = posX;
+	}
+
+	public double getPosXWC() {
+		return posXWC;
+	}
+
+	public void setPosXWC(double posXWC) {
+		this.posXWC = posXWC;
+	}
+
+	public int getPosY() {
+		return posY;
+	}
+
+	public void setPosY(int posY) {
+		this.posY = posY;
+	}
+
+	public double getPosYWC() {
+		return posYWC;
+	}
+
+	public void setPosYWC(double posYWC) {
+		this.posYWC = posYWC;
+	}
+
+	public void setFormatInStatus(String imgFormat) {
+		arcimsStatus.setFormat(imgFormat);
+	}
+
+	/**
+	 * This method invoques the <tt>FMapRasterArcImsDriver</tt>'s
+	 * <tt>getFeatureInfo</tt> method with the given coordinates as a
+	 * parameter
+	 * 
+	 * @param p
+	 *            the corrdinates of the screen pixel to be queried
+	 * 
+	 * @return the data retrieved for that pixel
+	 * @throws DriverException 
+	 */
+	public XMLItem[] getInfo(Point p, double tolerance) throws DriverException {
+		StringXMLItem[] resp = new StringXMLItem[1];
+		String respStr;
+
+		if (  ((FMapRasterArcImsDriver) driver).isQueryable()) {
+			try {
+				respStr = ((FMapRasterArcImsDriver) driver).getFeatureInfo(arcimsStatus, (int) p.getX(), (int) p
+						.getY(), Integer.MAX_VALUE);
+			} catch (ArcImsException e) {
+				DriverException de = new DriverException(e.getMessage());
+				logger.error("In query by point ", e);
+				throw de;
+			}
+		} else {
+			DriverException de = new DriverException("layer_not_queriable");
+			throw de;
+		}
+		System.err.println(resp); //TODO BORRAR ESTO
+		resp[0] = new StringXMLItem(respStr, this);
+		return resp;
+	}
+
+	public boolean isTiled() {
+		return tiled;
+	}
+
+	public int[] getTileSize() {
+		return tileSize;
+	}
+	
+	/**
+	 * The extCatalogYNomenclator needs this creator.
+	 * 
+	 * @param p a Map object with the following keys:
+	 * 
+	 * (key, object type returned)
+	 * ---------------------------
+	 * "host", String (with or without the servlet path, example:
+	 * 					"http://www.geographynetwork.com")
+	 * "service_name", String (remote service name)
+	 * "srs", String (coordinate system)
+	 * "layer_name", String (local layer's name)
+	 * 
+	 * @return a FRasterLyrArcIMS layer
+	 */
+	public FRasterLyrArcIMS(Map m) throws ConnectionException {
+		myCanc = new MyCancellable(new DefaultCancellableMonitorable());
+		String _host = "";
+		try {
+			_host = (String) m.get("host");
+			String _service_name = (String) m.get("service_name");
+			String _srs = (String) m.get("srs");
+			String _image_format = "JPG";
+			String _layer_name = (String) m.get("layer_name");
+			
+			// in case layer_name is missing or equals the empty string:
+			if ((_layer_name == null) || (_layer_name.length() == 0)) {
+				_layer_name = _service_name;
+			}
+			// ----------------------------
+			
+			URL _true_host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host));
+			IProjection _true_srs = CRSFactory.getCRS(_srs);
+			
+			
+
+			FMapRasterArcImsDriver _drv = new FMapRasterArcImsDriver(
+					_true_host.toString(),
+					_service_name, ServiceInfoTags.vIMAGESERVICE);
+			if (!_drv.connect(myCanc))
+				throw new ConnectionException("Unable to connect to host ",
+						new Exception(_host));
+
+			setDriver(_drv);
+			setHost(_true_host);
+			setService(_service_name);
+			setServiceType(ServiceInfoTags.vIMAGESERVICE);
+			setServiceInformationInStatus(_drv.getClient()
+					.getServiceInformation());
+			ServiceInformation _si = getArcimsStatus().getServiceInfo();
+
+			if ((_si.getFeaturecoordsys() == null)
+					|| (_si.getFeaturecoordsys().equals(""))) {
+				_si.setFeaturecoordsys(_true_srs.getAbrev().substring(
+						ServiceInfoTags.vINI_SRS.length()).trim());
+				logger.warn("Server provides no SRS. ");
+			}
+			setFullExtent(((ArcImsProtImageHandler) _drv.getClient()
+					.getHandler()).getServiceExtent(_true_srs, getArcimsStatus()));
+
+			//  JPG
+			setFormat(_image_format);
+			setTransparency(0);
+			
+			// =================================== query
+			int layercount = _si.getLayers().size();
+			String _layer_query = "";
+			for (int i=0; i<layercount; i++) {
+				if (isTrueString(((ServiceInformationLayer) _si.getLayer(i)).getVisible())) {
+					_layer_query = _layer_query + "," + ((ServiceInformationLayer) _si.getLayer(i)).getId();
+				}
+			}
+			if (_layer_query.length() == 0) {
+				throw new Exception("No layers are visible by default ");
+			} else {
+				_layer_query = _layer_query.substring(1);
+			}
+			// ===================================
+			
+			setLayerQuery(_layer_query);
+			setProjection(_true_srs);
+			setName(_layer_name);
+		} catch (Exception e) {
+			new ConnectionException("Unable to connect to host " + _host, e);
+		}
+	}	
+	
+	private boolean isTrueString(String visible) {
+		if (visible.compareToIgnoreCase("true") == 0) {
+			return true;
+		}
+		return false;
+	}
+
+	public void callNameOrQueryListeners() {
+		for (int i=0; i<listeners.size(); i++) {
+			((FRasterLyrArcIMSListener) listeners.get(i)).thingsHaveChanged(
+					getLayerQuery(), getName());
+		}
+	}	
+	
+	public void addNameOrQueryListener(FRasterLyrArcIMSListener l) {
+		if (! listeners.contains(l)) {
+			listeners.add(l);
+		}
+	}
+	
+	public void removeNameOrQueryListener(FRasterLyrArcIMSListener l) {
+		listeners.remove(l);
+	}
+
+	public void setNameQueryChange(boolean c) {
+		nameQueryChange = c;
+	}
+	
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/FRasterLyrArcIMS.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/LayerScaleData.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/LayerScaleData.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/LayerScaleData.java	(revision 8301)
@@ -0,0 +1,140 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.layers;
+
+import java.awt.Color;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+/**
+ * This class keeps a simple layer scale limits data.
+ * 
+ * @author jldominguez
+ * 
+ */
+public class LayerScaleData {
+	
+	private static Logger logger = Logger.getLogger(LayerScaleData.class.getName());
+	
+	private final long Min_Allowed_Scale = 1;
+	private final long Max_Allowed_Scale = 1000000000;
+	
+	public static Color imagColor = new Color(254, 237, 214);
+	public static Color featColor = new Color(251, 255, 225);
+	public static Color unknownColor = new Color(210, 255, 210);
+
+	private String name;
+	private String id;
+	private double maxSc;
+	private double minSc;
+	private String type; // 	LAYERTYPE_F, LAYERTYPE_I
+
+	public LayerScaleData(String layerName, String layerId, long minScale,
+			long maxScale, String theType) {
+
+		name = layerName;
+		id = layerId;
+		maxSc = maxScale;
+		minSc = minScale;
+		if ((maxSc < 0.0) || (maxSc > Max_Allowed_Scale)) maxSc = 1.0 * Max_Allowed_Scale; 
+		if ((minSc < 0.0) || (minSc < Min_Allowed_Scale)) minSc = 1.0 * Min_Allowed_Scale; 
+		type = theType;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public double getMaxSc() {
+		return maxSc;
+	}
+
+	public double getMinSc() {
+		return minSc;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Gets the color depending on the type of layer and whether
+	 * the current scale is inside the limits or not.
+	 * 
+	 * @param current current scale
+	 * @return the color to be used when painting the limits
+	 */
+	public Color getColor(double current) {
+		
+		Color resp = unknownColor;
+		// LAYERTYPE_F, LAYERTYPE_I
+		if (type.compareTo(ServiceInfoTags.vLAYERTYPE_F) == 0) {
+			if (between(minSc, current, maxSc)) {
+				resp = darker(featColor);
+			} else {
+				resp = featColor;
+			}
+		}
+		if (type.compareTo(ServiceInfoTags.vLAYERTYPE_I) == 0) {
+			if (between(minSc, current, maxSc)) {
+				resp = darker(imagColor);
+			} else {
+				resp = imagColor;
+			}
+		}
+		return resp;
+	}
+	
+	public static Color darker(Color c) {
+		int r = c.getRed();
+		int g = c.getGreen();
+		int b = c.getBlue();
+
+		float f = (float) 0.7;
+		Color newcolor = new Color( Math.round(r*f), Math.round(g*f),Math.round(b*f) );
+		return newcolor;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	private boolean between(double a, double d, double b) {
+		if ((a > b) && (d < b))
+			return false;
+		if ((a > b) && (d > a))
+			return false;
+		if ((a < b) && (d < a))
+			return false;
+		if ((a < b) && (d > b))
+			return false;
+		return true;
+	}
+	
+	/**
+	 * Computes real scale from unit-dependant scale and the dpi.
+	 * 
+	 * @param rs unit-dependant scale 
+	 * @param units units used
+	 * @param theDpi
+	 * @return the real scale (the <i>x</i> in "1:<i>x</i>")
+	 */
+	public static long getTrueScaleFromRelativeScaleAndMapUnits(double rs, String units, int theDpi) {
+		// decimal_degrees | feet | meters
+		double fromMetersPerPixelToTrueScale = theDpi / ArcImsProtocolHandler.INCHES;
+		double fromDegreesPerPixelToTrueScale = fromMetersPerPixelToTrueScale * 40000000.0 / 360.0;
+		double fromFeetPerPixelToTrueScale = fromMetersPerPixelToTrueScale * 0.3048;
+		if (units.compareToIgnoreCase(ServiceInfoTags.vMAP_UNITS_FEET) == 0) {
+			return Math.round( fromFeetPerPixelToTrueScale * rs );
+		}
+		if (units.compareToIgnoreCase(ServiceInfoTags.vMAP_UNITS_METERS) == 0) {
+			return Math.round( fromMetersPerPixelToTrueScale * rs );
+		}
+		if (units.compareToIgnoreCase(ServiceInfoTags.vMAP_UNITS_DECIMAL_DEGREES) == 0) {
+			return Math.round( fromDegreesPerPixelToTrueScale * rs );
+		}
+		logger.error("Unable to compute true scale. Returned value: scale = 1:1");
+		return 1;
+	}
+	
+}
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/LayerScaleData.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/ArcImsLayerNode.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/ArcImsLayerNode.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/ArcImsLayerNode.java	(revision 8301)
@@ -0,0 +1,16 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.layers;
+
+/**
+ * Encapsulates the characteristics of an ArcIMS layer.
+ * So far, the ArcIMS plugin accesses the name only.
+ * 
+ * @author jldominguez
+ */
+public class ArcImsLayerNode {
+	
+    private String _name;
+
+	public String getName() { return _name; }
+	public void setName(String n) { _name = n; }
+	
+}
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/layers/ArcImsLayerNode.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/listeners/FRasterLyrArcIMSListener.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/listeners/FRasterLyrArcIMSListener.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/listeners/FRasterLyrArcIMSListener.java	(revision 8301)
@@ -0,0 +1,7 @@
+package es.prodevelop.cit.gvsig.arcims.fmap.listeners;
+
+public interface FRasterLyrArcIMSListener {
+	
+	public void thingsHaveChanged(String query, String name);
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/fmap/listeners/FRasterLyrArcIMSListener.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsPropsDialog.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsPropsDialog.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsPropsDialog.java	(revision 8301)
@@ -0,0 +1,382 @@
+package es.prodevelop.cit.gvsig.arcims.gui.dialogs;
+
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.net.URL;
+import java.util.HashMap;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.DefaultListModel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.apache.log4j.Logger;
+
+import com.iver.andami.PluginServices;
+import com.iver.andami.ui.mdiManager.WindowInfo;
+import com.iver.andami.ui.mdiManager.IWindow;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.FeatureServicePanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.ImageServicePanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.LayersListElement;
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+
+/**
+ * The TOC ArcIMS properties container panel. It allows users to change 
+ * a previous request (not the server or service name). 
+ * 
+ * @author jldominguez
+ * 
+ */
+public class ArcImsPropsDialog extends JPanel implements IWindow, ActionListener,
+		KeyListener, ListDataListener {
+	
+	private static Logger logger = Logger.getLogger(ArcImsPropsDialog.class.getName());
+	
+	private JPanel buttonsPanel = null;
+	private FLayer fLayer = null;
+	private String layerName;
+	private URL hostURL;
+	private String svcName;
+	private String svcType;
+	private String imageFormat;
+	private JButton btnApply = null;
+	private JButton btnOk = null;
+	private JButton btnCancel = null;
+	private ArcImsWizard arcImsWizard;
+	private WindowInfo theViewInfo;
+	
+	private JTextField pointerToLayerNameTextField;
+	private DefaultListModel pointerToSelectedLayersListModel;
+	private static final long serialVersionUID = 0;
+
+
+	public ArcImsPropsDialog(FLayer layer) {
+		super();
+		initialize(layer);
+	}
+
+	private void initialize(FLayer layer) {
+		setFLayer(layer);
+		
+		JPanel theServicePanel = null;
+		
+		if (layer instanceof FRasterLyrArcIMS) {
+			arcImsWizard = getArcImsWizard(((FRasterLyrArcIMS) layer).getProperties(), true);
+			theServicePanel = arcImsWizard.getImgServicePanel();
+		} else {
+			if (layer instanceof FFeatureLyrArcIMS) {
+				arcImsWizard = getArcImsWizard(((FFeatureLyrArcIMS) layer).getProperties(), false);
+				theServicePanel = arcImsWizard.getFeaServicePanel();
+			} else {
+				logger.error("Unknow type of layer. ArcImsPropsDialog was not initialized. ");
+				return;
+			}
+		}
+		
+		
+		arcImsWizard.setBounds(0, 0, 510, 510);
+		buttonsPanel = getButtonsPanel();
+		buttonsPanel.setBounds(0, 510, 510, 45);
+
+		this.setLayout(null);
+		this.add(arcImsWizard); //, BorderLayout.CENTER);
+		this.add(buttonsPanel); //, BorderLayout.SOUTH);
+		this.setSize(new java.awt.Dimension(512, 475));
+		this.setPreferredSize(new java.awt.Dimension(512, 475));
+
+		loadControlPointers(theServicePanel);
+		loadAndDisableControls(theServicePanel,layer);
+	}
+
+	private void loadControlPointers(JPanel svcPanel) {
+		
+		if (svcPanel instanceof ImageServicePanel) {
+			pointerToLayerNameTextField = ((ImageServicePanel) svcPanel).getNewLayerNameTextField();
+			pointerToSelectedLayersListModel = ((ImageServicePanel) svcPanel).getOrderedLayersListModel();
+		}
+		if ((svcPanel instanceof FeatureServicePanel) && (!(svcPanel instanceof ImageServicePanel))) {
+			pointerToLayerNameTextField = ((FeatureServicePanel) svcPanel).getNewLayerNameTextField();
+			pointerToSelectedLayersListModel = ((FeatureServicePanel) svcPanel).getOrderedLayersListModel();
+		}
+		pointerToLayerNameTextField.addKeyListener(this);
+		pointerToSelectedLayersListModel.addListDataListener(this);
+	}
+
+	private void getNewLayerConfig() {
+		if (fLayer instanceof FRasterLyrArcIMS) {
+			((FRasterLyrArcIMS) fLayer).setLayerQuery(arcImsWizard.getLayerQuery());
+			((FRasterLyrArcIMS) fLayer).setName(arcImsWizard.getNewLayerName());
+			((FRasterLyrArcIMS) fLayer).setFormat(arcImsWizard.getImageFormat());
+			
+			((FRasterLyrArcIMS) fLayer).setNameQueryChange(true);
+		}
+		if (fLayer instanceof FFeatureLyrArcIMS) {
+			((FFeatureLyrArcIMS) fLayer).setLayerQuery(arcImsWizard.getLayerQuery());
+			((FFeatureLyrArcIMS) fLayer).setName(arcImsWizard.getNewLayerName());
+		}
+	}
+
+	private void loadAndDisableControls(JPanel svcPanel, FLayer lyr) {
+		
+		arcImsWizard.getSvsNamesPanel().setServerComboText(hostURL.toString());
+		
+		JButton connB = arcImsWizard.getSvsNamesPanel().getConnectButton();
+		ActionEvent ae = new ActionEvent(connB, ActionEvent.ACTION_PERFORMED, "");
+		arcImsWizard.getSvsNamesPanel().actionPerformed(ae);
+		
+		// JRadioButton userRadio = arcImsWizard.getSvsNamesPanel().getServiceNameSelectionModeRadioButton();
+		// userRadio.setSelected(true);
+		// ae = new ActionEvent(userRadio, ActionEvent.ACTION_PERFORMED, "");
+		arcImsWizard.getSvsNamesPanel().setUserDecisionTrue();
+
+		arcImsWizard.getSvsNamesPanel().setServiceType(svcType);
+		arcImsWizard.getSvsNamesPanel().setUserServiceName(svcName);
+		
+		JButton nextB = arcImsWizard.getSvsNamesPanel().getNextButton();
+		ae = new ActionEvent(nextB, ActionEvent.ACTION_PERFORMED, "");
+		
+		// arcImsWizard.getSvsNamesPanel().actionPerformed(ae);
+		arcImsWizard.getSvsNamesPanel().pseudoNextFired(lyr);
+		
+		if (svcPanel instanceof ImageServicePanel) { // ((ImageServicePanel) svcPanel)
+			JTree avTree = ((ImageServicePanel) svcPanel).getAvailableLayersTree();
+			Object root = avTree.getModel().getRoot();
+			int nofchildren = avTree.getModel().getChildCount(root);
+			
+			String[] lyrIds = new String[1];
+			lyrIds = ((FRasterLyrArcIMS) fLayer).getLayerQuery().split(",");
+			
+			int i, j;
+			LayersListElement lle;
+			DefaultMutableTreeNode dmtn;
+			for (i = 0; i < lyrIds.length; i++) {
+				String id = lyrIds[i];
+				for (j = (nofchildren - 1); j >= 0; j--) {
+					dmtn = (DefaultMutableTreeNode) avTree.getModel().getChild(root, j);
+					lle = (LayersListElement) dmtn.getUserObject();
+					if (lle.getID().compareTo(id) == 0) {
+						// arcImsWizard.getImgServicePanel().addLayerToSelectedList(lle);
+						((ImageServicePanel) svcPanel).addLayerToSelectedListNoConfirm(lle);
+					}
+				}
+			}
+			((ImageServicePanel) svcPanel).refreshSelectedLayersList();
+			((ImageServicePanel) svcPanel).getNewLayerNameTextField().setText(layerName);
+			((ImageServicePanel) svcPanel).getChangeServerButton().setEnabled(false);
+			((ImageServicePanel) svcPanel).setInImageFormatCombo(imageFormat);
+		}
+		
+		if ((svcPanel instanceof FeatureServicePanel) && (!(svcPanel instanceof ImageServicePanel))) {
+			
+			// ((FeatureServicePanel) svcPanel).getImgServiceTab_2().setVisible(false);
+			// ((FeatureServicePanel) svcPanel).getServiceInfoNextButton().setEnabled(false);
+			
+			((FeatureServicePanel) svcPanel).getChangeServerPanel().setVisible(false);
+			
+			
+			// ((FeatureServicePanel) svcPanel)
+//			JTree avTree = ((FeatureServicePanel) svcPanel).getAvailableLayersTree();
+//			Object root = avTree.getModel().getRoot();
+//			int nofchildren = avTree.getModel().getChildCount(root);
+//			
+//			String[] lyrIds = new String[1];
+//			lyrIds = ((FFeatureLyrArcIMS) fLayer).getLayerQuery().split(",");
+//
+//			int i, j;
+//			LayersListElement lle;
+//			DefaultMutableTreeNode dmtn;
+//			for (i = 0; i < lyrIds.length; i++) {
+//				String id = lyrIds[i];
+//				for (j = (nofchildren - 1); j >= 0; j--) {
+//					dmtn = (DefaultMutableTreeNode) avTree.getModel().getChild(root, j);
+//					lle = (LayersListElement) dmtn.getUserObject();
+//					if (lle.getID().compareTo(id) == 0) {
+//						// arcImsWizard.getImgServicePanel().addLayerToSelectedList(lle);
+//						((FeatureServicePanel) svcPanel).addLayerToSelectedListNoConfirm(lle);
+//					}
+//				}
+//			}
+//			((FeatureServicePanel) svcPanel).refreshSelectedLayersList();
+			((FeatureServicePanel) svcPanel).getNewLayerNameTextField().setText(layerName);
+			// ((FeatureServicePanel) svcPanel).getChangeServerButton().setEnabled(false);
+			btnApply.setEnabled(false);
+		}
+		
+	}
+
+	public void setFLayer(FLayer f) {
+		fLayer = f;
+	}
+
+	/**
+	 * Gets a new ArcImsWizard to allow the user to update the ArcIMS
+	 * layer's seetings. Needs the original layer info.
+	 * 
+	 * @param info the layer info
+	 * @return a new ArcImsWizard to allow the user to update the ArcIMS settings
+	 */
+	public ArcImsWizard getArcImsWizard(HashMap info, boolean editionallowed) {
+		if (info != null) {
+			try {
+				layerName = (String) info.get("layerName");
+				hostURL = (URL) info.get("serverUrl");
+				svcName = (String) info.get("serviceName");
+				svcType = (String) info.get("serviceType");
+				imageFormat = (String) info.get("format");
+				// this.imasvcType = (String) info.get("serviceType");
+
+				ArcImsWizard wiz = new ArcImsWizard(editionallowed, true);
+				wiz.initWizard();
+				// wiz.getDataSource().setHostService(hostURL, svcName,
+				// svcType);
+				return wiz;
+			} catch (Exception e) {
+				logger.error("While starting wizard ", e);
+				JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
+						JOptionPane.ERROR_MESSAGE);
+				e.printStackTrace();
+			}
+		}
+		return null;
+	}
+
+	public JPanel getButtonsPanel() {
+		if (buttonsPanel == null) {
+			buttonsPanel = new JPanel();
+			buttonsPanel.setLayout(null);
+			buttonsPanel.setName("buttonPanel");
+
+			buttonsPanel.add(getBtnOk(), null);
+			buttonsPanel.add(getBtnApply(), null);
+			buttonsPanel.add(getBtnCancel(), null);
+		}
+		return buttonsPanel;
+	}
+
+	public JButton getBtnOk() {
+		if (btnOk == null) {
+			btnOk = new JButton("ok");
+			btnOk.setText(PluginServices.getText(this, "ok"));
+			btnOk.setActionCommand("OK");
+			btnOk.addActionListener(this);
+			btnOk.setBounds(338, 10, 90, 25);
+		}
+		return btnOk;
+	}
+
+	public JButton getBtnApply() {
+		if (btnApply == null) {
+			btnApply = new JButton("apply");
+			btnApply.setText(PluginServices.getText(this, "apply"));
+			btnApply.setEnabled(true);
+			btnApply.setActionCommand("APPLY");
+			btnApply.addActionListener(this);
+			btnApply.setBounds(238, 10, 90, 25);
+		}
+		return btnApply;
+	}
+
+	public JButton getBtnCancel() {
+		if (btnCancel == null) {
+			btnCancel = new JButton("cancel");
+			btnCancel.setText(PluginServices.getText(this, "cancel"));
+			btnCancel.setActionCommand("CANCEL");
+			btnCancel.addActionListener(this);
+			btnCancel.setBounds(80, 10, 90, 25);
+		}
+		return btnCancel;
+	}
+
+	public void close() {
+		PluginServices.getMDIManager().closeWindow(this);
+	}
+
+	public WindowInfo getWindowInfo() {
+		if (theViewInfo == null) {
+			theViewInfo = new WindowInfo(WindowInfo.MODALDIALOG);
+			theViewInfo.setTitle(PluginServices.getText(this,
+					"fit_ArcIms_layer"));
+			theViewInfo.setWidth(this.getWidth() + 10);
+			theViewInfo.setHeight(this.getHeight() + 40);
+		}
+		return theViewInfo;
+	}
+
+	public void actionPerformed(ActionEvent e) {
+
+		if (e.getSource() == this.btnApply) {
+			getNewLayerConfig();
+			fLayer.getMapContext().invalidate();
+		}
+
+		if (e.getSource() == this.btnOk) {
+			
+			if (fLayer instanceof FFeatureLyrArcIMS) {
+				
+			} else {
+				getNewLayerConfig();
+				fLayer.getMapContext().invalidate();
+			}
+			close();
+		}
+
+		if (e.getSource() == this.btnCancel) {
+			close();
+		}
+
+	}
+
+	/**
+	 * Utility method to center the given JDialog on the screen.
+	 * 
+	 * @param jd
+	 */
+	public void centerThis(JDialog jd) {
+		int dw = jd.getBounds().width;
+		int dh = jd.getBounds().height;
+		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
+		jd.setBounds((screen.width - dw) / 2, (screen.height - dh) / 2, dw, dh);
+	}
+
+
+	public void keyPressed(KeyEvent e) { }
+	public void keyTyped(KeyEvent e) { }
+	public void keyReleased(KeyEvent e) {
+		if (e.getSource() == pointerToLayerNameTextField) {
+			boolean correct = isCorrectlyConfigured();
+			btnOk.setEnabled(correct);
+			btnApply.setEnabled(correct);
+		}
+	}
+
+	public void contentsChanged(ListDataEvent e) { }
+	private void contentChanged() {
+		boolean correct = isCorrectlyConfigured();
+		btnOk.setEnabled(correct);
+		btnApply.setEnabled(correct);
+	}
+	public void intervalAdded(ListDataEvent e) { contentChanged(); }
+	public void intervalRemoved(ListDataEvent e) { contentChanged(); }
+	
+	private boolean isCorrectlyConfigured() {
+		if (pointerToSelectedLayersListModel.size() == 0) return false;
+		if (pointerToLayerNameTextField.getText().length() == 0) return false;
+		return true;
+	}
+} // @jve:decl-index=0:visual-constraint="10,10"
+

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsPropsDialog.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsRasterPropsDialog.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsRasterPropsDialog.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsRasterPropsDialog.java	(revision 8301)
@@ -0,0 +1,765 @@
+package es.prodevelop.cit.gvsig.arcims.gui.dialogs;
+
+import java.awt.Container;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.geom.Rectangle2D;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Vector;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import org.cresques.cts.IProjection;
+import org.cresques.io.GeoRasterFile;
+import org.cresques.filter.RasterFilterStackManager;
+import org.cresques.filter.BrightnessContrast.BrightnessContrastStackManager;
+import org.cresques.px.Extent;
+import org.cresques.px.PxRaster;
+import org.cresques.ui.BrightnessContrast.EnhancedBrightnessContrastPanel;
+import org.cresques.ui.raster.BandSetupPanel;
+import org.cresques.ui.raster.EnhancedPanel;
+import org.cresques.ui.raster.FilterRasterDialogPanel;
+import org.cresques.ui.raster.InfoPanel;
+import org.cresques.ui.raster.RasterTransparencyPanel;
+
+import com.hardcode.driverManager.Driver;
+import com.hardcode.driverManager.DriverLoadException;
+import com.iver.andami.PluginServices;
+import com.iver.andami.messages.NotificationManager;
+import com.iver.andami.ui.mdiManager.IWindow;
+import com.iver.andami.ui.mdiManager.WindowInfo;
+import com.iver.cit.gvsig.fmap.drivers.RasterDriver;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+
+import com.iver.cit.gvsig.fmap.layers.LayerFactory;
+import com.iver.cit.gvsig.fmap.layers.StatusLayerRaster;
+
+/**
+ * <P>
+ * Dialog for the raster properties of a ArcIMS layer.
+ * It manages the avants and aplies
+ * filters to the raster through the filter stack manager according to the user's
+ * selection. This dialog contains some panels.
+ * </P>
+ * <UL>
+ * <LI>Propierties</LI>
+ * <LI>Band selection</LI>
+ * <LI>Transparency</LI>
+ * <LI>Enhancement</LI>
+ * </UL>
+ * 
+ */
+public class ArcImsRasterPropsDialog extends FilterRasterDialogPanel implements IWindow,
+MouseListener, KeyListener, ActionListener {
+	
+	private IProjection 							currentProjection = null;
+	private FRasterLyrArcIMS								fLayer = null;
+	private static final int						nprops = 13;
+	private Object[][]								props = null;
+	private RasterFilterStackManager 				stackManager = null;
+	private Status									status = null;
+	private StatusLayerRaster						rasterStatus = null;
+	private JFileChooser							fileChooser = null;
+	private String									lastPath = new String("./");
+	private	PxRaster								px = null;
+	private GeoRasterFile							grf = null;
+	private static final long serialVersionUID = 0;
+	
+	/**
+	 * Class that holds the dialog state and restores the initial state if it
+	 * is cancelled.
+	 * @author Nacho Brodin <brodin_ign@gva.es>
+	 */
+	class Status{
+		public String					inicAlpha;
+		public int 						bandR;
+		public int 						bandG;
+		public int 						bandB;
+		private ArrayList				filters = new ArrayList();
+		
+		public Status(String alpha, int bandR, int bandG, int bandB){
+			this.inicAlpha = alpha;
+			this.bandR = bandR;
+			this.bandG = bandG;
+			this.bandB = bandB;
+			filters = stackManager.getStringsFromStack();
+		}
+				
+		/**
+		 * Restaura el Estado salvado 
+		 */
+		public void restoreStatus(ArcImsRasterPropsDialog props){
+			// Reset the filter stack to the original state
+			// if(stackManager != null) stackManager.deleteTempFilters();
+			// Reset alpha
+
+			int opac = Integer.parseInt(status.inicAlpha);
+			opac = (int)((opac*255)/100);
+			fLayer.setTransparency(255-opac);
+			
+			if (fLayer != null) {
+				fLayer.setBandR(bandR);
+				fLayer.setBandG(bandG);
+				fLayer.setBandB(bandB);
+			}
+			
+			// Restore filters
+			if(filters!=null)
+				stackManager.createStackFromStrings(filters);
+			
+			fLayer.getMapContext().invalidate();
+		}
+	}
+	
+	public class DriverFileFilter extends FileFilter{
+		
+		private Driver driver;
+		
+		public DriverFileFilter(String driverName) throws DriverLoadException{
+			driver = LayerFactory.getDM().getDriver(driverName);
+		}
+
+		/**
+		 * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
+		 */
+		public boolean accept(File f) {
+			if (f.isDirectory()) return true;
+			if (driver instanceof RasterDriver){
+				return ((RasterDriver) driver).fileAccepted(f);
+			}else{
+				throw new RuntimeException("Tipo no reconocido");
+			}
+		}
+
+		/**
+		 * @see javax.swing.filechooser.FileFilter#getDescription()
+		 */
+		public String getDescription() {
+			return ((Driver) driver).getName();
+		}
+	}
+	
+
+	/**
+	 * Dialog window constructor.
+	 * 
+	 * @param layer the layer
+	 * @param rangeR r band
+	 * @param rangeG g band
+	 * @param rangeB b band
+	 */
+	public ArcImsRasterPropsDialog(FRasterLyrArcIMS layer, ArrayList ranges){
+		super();
+		fLayer = layer;
+		this.px = layer.getPxRaster();
+		this.grf = layer.getGeoRasterFile();
+		if(fLayer.getStatus()==null){
+			rasterStatus = new StatusLayerRaster();
+			fLayer.setStatus(rasterStatus);
+		}else
+			rasterStatus = (StatusLayerRaster)fLayer.getStatus();
+		
+		init();
+		this.setRanges(ranges);
+		FilterRasterDialogPanel fr = ((FilterRasterDialogPanel)this.getContentPane());
+		BandSetupPanel bandSetup = (BandSetupPanel)fr.getPanelByClassName("BandSetupPanel");
+		bandSetup.getFileList().getJButtonAdd().setEnabled(false);
+		bandSetup.getFileList().getJButtonRemove().setEnabled(false);
+		this.setTranslation();
+		
+		EnhancedBrightnessContrastPanel ep = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		ep.lstBrightness.getJSlider().addMouseListener(this);
+		ep.lstContrast.getJSlider().addMouseListener(this);
+		ep.getCheckSliderText().getJTextField().addKeyListener(this);
+		ep.getLabelSliderText().getJTextField().addActionListener(this);
+		ep.getLabelSliderText1().getJTextField().addActionListener(this);
+	}
+	
+	/**
+	 * Sets the panels' texts
+	 */
+	private void setTranslation(){
+		FilterRasterDialogPanel fr = ((FilterRasterDialogPanel)this.getContentPane());
+		BandSetupPanel bandSetup = (BandSetupPanel)fr.getPanelByClassName("BandSetupPanel");
+		bandSetup.getFileList().getJButtonAdd().setText(PluginServices.getText(this,"add"));
+		bandSetup.getFileList().getJButtonRemove().setText(PluginServices.getText(this,"remove"));
+		bandSetup.getFileList().lbandasVisibles.setText(PluginServices.getText(this,"bands"));
+		
+		RasterTransparencyPanel tpan = (RasterTransparencyPanel)fr.getPanelByClassName("RasterTransparencyPanel");
+				
+		tpan.getTransparencyCheck().setText(PluginServices.getText(this,"transparencia"));
+		tpan.getOpacityCheck().setText(PluginServices.getText(this,"opacidad"));
+			
+		EnhancedBrightnessContrastPanel ep = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		
+		ep.lLineal.setText(PluginServices.getText(this, "lineal_directo"));
+		ep.lRemove.setText(PluginServices.getText(this, "eliminar_extremos"));
+		ep.cstEnhanced.setName(PluginServices.getText(this, "recorte_colas")+" ( % )");
+		ep.lBrightC.setText(PluginServices.getText(this, "brillo_y_contraste"));
+		ep.lstBrightness.setName(PluginServices.getText(this, "brillo"));
+		ep.lstContrast.setName(PluginServices.getText(this, "contraste"));
+		ep.lpreview.setText(PluginServices.getText(this, "previsualizacion"));
+		ep.getPBrightCont().setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1), (PluginServices.getText(this, "brillo_y_contraste")), javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, java.awt.Color.black));
+		ep.getPEnhanced().setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1), (PluginServices.getText(this, "realce")), javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, java.awt.Color.black));
+		
+		
+		InfoPanel ip = (InfoPanel)super.getPanelByClassName("InfoPanel");
+		
+		ip.cabInfo = new String(PluginServices.getText(this, "Informacion"));
+		ip.cabCoord = new String(PluginServices.getText(this, "coor_geograficas"));
+		ip.cabProy = new String(PluginServices.getText(this, "Proyecciones"));
+		ip.cabOrig = new String(PluginServices.getText(this, "origen_de_datos"));
+		ip.cabMeta = new String(PluginServices.getText(this, "metadatos"));
+		ip.refresh();
+		
+		
+		//Recorremos los Tab y traducimos el nombre
+		for(int i=0;i<this.getTab().getTabCount();i++){
+			if(this.getTab().getTitleAt(i).equals("Info"))
+				this.getTab().setTitleAt(i,PluginServices.getText(this,"info"));
+			if(this.getTab().getTitleAt(i).equals("Transparencia"))
+				this.getTab().setTitleAt(i,PluginServices.getText(this,"transparencia"));
+			if(this.getTab().getTitleAt(i).equals("Bands"))
+				this.getTab().setTitleAt(i,PluginServices.getText(this,"bands"));
+			if(this.getTab().getTitleAt(i).equals("Realce"))
+				this.getTab().setTitleAt(i,PluginServices.getText(this,"realce"));
+		}
+		
+		this.getAcceptButton().setText(PluginServices.getText(this,"ok"));
+		this.getApplyButton().setText(PluginServices.getText(this,"apply"));
+		this.getCancelButton().setText(PluginServices.getText(this,"cancel"));
+	}
+	
+	/**
+	 * Assigns a FLayerRaster
+	 * @param layer	layer to be assigned
+	 */
+	public void setFLyrWMS(FRasterLyrArcIMS layer){
+		fLayer = layer;
+	}
+	
+	/**
+	 * Dialog window constructor.
+	 */
+	public ArcImsRasterPropsDialog() {
+		init();
+	}
+			
+	/**
+	 * Loads the info panel data.
+	 */
+	private void loadInfoData(){
+
+		if(fLayer!=null){
+			props = new Object[nprops][2];
+			props[0][0] = new String(PluginServices.getText(this,"Fichero"));
+			props[0][1] = "http://" + fLayer.getHost().getHost() + fLayer.getHost().getFile();
+			props[1][0] = new String(PluginServices.getText(this,"num_bandas"));
+			props[1][1] = new String(String.valueOf( grf.getBandCount()));
+			props[2][0] = new String(PluginServices.getText(this,"ancho_alto"));
+			props[2][1] = (int)(fLayer.getWidth())+" X "+(int)(fLayer.getHeight());
+			props[3][0] = new String(PluginServices.getText(this,"format"));
+			props[3][1] = fLayer.getFormat();
+			props[4][0] = new String(PluginServices.getText(this,"tipo_dato"));
+			String type = null;
+			switch(grf.getDataType()){
+				case 0: type = new String("BYTE");break;
+				case 1: type = new String("USHORT");break;
+				case 2: type = new String("SHORT");break;
+				case 3: type = new String("INT");break;
+				case 4: type = new String("FLOAT");break;
+				case 5: type = new String("DOUBLE");break;
+				default: type = new String("UNDEFINED");break;
+			}
+		    props[4][1] = type;
+			props[5][0] = new String(PluginServices.getText(this,"coor_geograficas"));
+			props[6][0] = new String(PluginServices.getText(this,"xmin"));
+			props[6][1] = String.valueOf(px.getExtent().minX());
+			props[7][0] = new String(PluginServices.getText(this,"ymin"));
+			props[7][1] = String.valueOf(px.getExtent().minY());
+			props[8][0] = new String(PluginServices.getText(this,"xmax"));
+			props[8][1] = String.valueOf(px.getExtent().maxX());
+			props[9][0] = new String(PluginServices.getText(this,"ymax"));
+			props[9][1] = String.valueOf(px.getExtent().maxY());
+			
+		}else{
+			props = new Object[1][2];
+			props[0][0] = new String("No props");
+			props[0][1] = new String("-");
+		}
+		
+	}
+	
+	/**
+	 * Adds bands to the FilterRasterDialogPanel's  band coounter 
+	 * @param numBands Número de bandas a añadir
+	 */
+	public void addNumBands(int numBands){
+		nbands += numBands;
+		FilterRasterDialogPanel fr = ((FilterRasterDialogPanel)this.getContentPane());
+		RasterTransparencyPanel rasterTrans = (RasterTransparencyPanel)fr.getPanelByClassName("RasterTransparencyPanel");
+		if(rasterTrans != null && rasterTrans.getPTranspByPixel().isControlEnabled())
+			rasterTrans.setActiveTransparencyControl(true); 
+	}
+	
+	/**
+	 * Inits the jDialog	
+	 */    
+	public void init() {
+		
+		//this.setLayout(new FlowLayout());
+			
+		setName("filterRaster");
+			   		
+   		this.loadInfoData();
+		super.init(props);
+		this.setTabVisible("Pansharpening", false);
+		
+		//this.add(getContentPane());
+	
+		this.setSize(486, 352);
+		
+		//contentPane.getAcceptButton().setEnabled(false);
+		this.getAcceptButton().addActionListener(new java.awt.event.ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent evt) {
+				acceptButtonActionPerformed(evt);
+				closeJDialog();
+			}
+		});
+		this.getCancelButton().addActionListener(new java.awt.event.ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent evt) {
+				cancelButtonActionPerformed(evt);
+				closeJDialog();
+			}
+		});
+		this.getApplyButton().addActionListener(new java.awt.event.ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent evt) {
+				acceptButtonActionPerformed(evt);
+			}
+		});
+		BandSetupPanel bandSetup = (BandSetupPanel)((FilterRasterDialogPanel)this.getContentPane()).getPanelByClassName("BandSetupPanel");
+		bandSetup.getFileList().getJButtonAdd().addActionListener(new java.awt.event.ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent evt){
+				addFileBand(evt);
+				
+			}
+		});
+		bandSetup.getFileList().getJButtonRemove().addActionListener(new java.awt.event.ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent evt){
+				delFileBand(evt);
+			}
+		});
+
+	
+	}
+	
+	/**
+	 * Saves the initial state to restore it if cancel.
+	 */
+	public void readStat(){
+		FilterRasterDialogPanel fr = ((FilterRasterDialogPanel)this.getContentPane());
+		RasterTransparencyPanel rasterTrans = (RasterTransparencyPanel)fr.getPanelByClassName("RasterTransparencyPanel");
+		status = new Status(rasterTrans.getOpacityText().getText(),
+							getAssignedBand(GeoRasterFile.RED_BAND),
+							getAssignedBand(GeoRasterFile.GREEN_BAND),
+							getAssignedBand(GeoRasterFile.BLUE_BAND)
+							);				
+	}
+	
+	/**
+	 * This method initializes jContentPane		
+	 */    
+	public Container getContentPane() {
+		return this;
+	}
+	
+	/**
+	 * Sets a projection.
+	 * 
+	 * @param prj
+	 */
+	public void setProjection(IProjection prj) {
+		this.currentProjection = prj;
+	}
+	
+	/**
+	 * Gets the projection.
+	 * 
+	 * @return the projection
+	 */
+	public IProjection getProjection() {
+		return this.currentProjection;
+	}
+	
+	
+	
+	public void closeJDialog() {
+		PluginServices.getMDIManager().closeWindow(ArcImsRasterPropsDialog.this);
+	}
+	
+	/**
+	 * Sets the RasterFilterStackManager
+	 * @param stackManager
+	 */
+	public void setRasterFilterStackManager(RasterFilterStackManager stackManager){
+		this.stackManager = stackManager;
+		stackManager.resetTempFilters();
+	}
+	
+	/**
+	 * 
+	 * @param flag the flag to be assigned
+	 * 
+	 * @return the assigned band
+	 */
+	public int getAssignedBand(int flag) {
+		BandSetupPanel bandSetup = (BandSetupPanel)((FilterRasterDialogPanel)this.getContentPane()).getPanelByClassName("BandSetupPanel");
+		return bandSetup.getAssignedBand(flag);
+	}
+	
+	/**
+	 * Pressing OK with the bands panel selected makes its values to be
+	 * processed.
+	 * 
+	 * @return true if the bands panel was selected and the action is processed, false it
+	 * was not selected.
+	 */
+	public boolean processBandPanel(){
+		fLayer.setBandR(getAssignedBand(GeoRasterFile.RED_BAND));
+		fLayer.setBandG(getAssignedBand(GeoRasterFile.GREEN_BAND));
+		fLayer.setBandB(getAssignedBand(GeoRasterFile.BLUE_BAND));
+		rasterStatus.bandR = getAssignedBand(GeoRasterFile.RED_BAND);
+		rasterStatus.bandG = getAssignedBand(GeoRasterFile.GREEN_BAND);
+		rasterStatus.bandB = getAssignedBand(GeoRasterFile.BLUE_BAND);
+			
+		// Check whether there is any non-assigned band
+		// and apply the filter
+		StringBuffer sb = new StringBuffer();
+		if(getAssignedBand(GeoRasterFile.RED_BAND) == -1)
+			sb.append("R");
+		if(getAssignedBand(GeoRasterFile.GREEN_BAND) == -1)
+			sb.append("G");
+		if(getAssignedBand(GeoRasterFile.BLUE_BAND) == -1)
+			sb.append("B");
+			
+		if(!sb.toString().equals(""))
+			stackManager.addRemoveBands(sb.toString());
+		else
+			stackManager.removeFilter(stackManager.getTypeFilter("removebands"));
+			
+		fLayer.getMapContext().invalidate();
+		
+		InfoPanel pInfo = (InfoPanel)super.getPanelByClassName("InfoPanel");
+		pInfo.setBands(getAssignedBand(GeoRasterFile.RED_BAND),getAssignedBand(GeoRasterFile.GREEN_BAND),getAssignedBand(GeoRasterFile.BLUE_BAND));
+		
+		return true;
+	}
+	
+	/**
+	 * Pressing OK with the transparency panel selected makes its values to be processed.
+	 * @return true if the transparency panel was selected and the action is processed, false it
+	 * was not selected.
+	 */
+	public boolean processTransparencyPanel(){
+		//OPACIDAD
+		RasterTransparencyPanel tpan = (RasterTransparencyPanel)((FilterRasterDialogPanel)this.getContentPane()).getPanelByClassName("RasterTransparencyPanel");
+		String sOpac = tpan.getOpacityText().getText();
+		if(!sOpac.equals("") && tpan.getOpacityCheck().isSelected()){
+			int opac = Integer.parseInt(sOpac);
+			opac = (int)((opac*255)/100);
+			px.setTransparency(true);
+			//px.setTransparency(255-opac);
+			fLayer.setTransparency(255-opac);
+			rasterStatus.transparency = 255-opac;
+		}else{
+			px.setTransparency(false);
+			fLayer.setTransparency(0);
+			rasterStatus.transparency = 0;
+		}
+				
+		//TRANSPARENCIA
+		if(	tpan.getTransparencyCheck().isSelected()){
+			
+			stackManager.addTransparencyFilter(		tpan.getPTranspByPixel().getEntries(),
+													0x10,	//Transparencia
+													0xff,	//Color Transparencia R
+													0xff,	//Color Transparencia G
+													0xff);	//Color Transparencia B
+													
+		}else
+			px.filterStack.removeFilter(stackManager.getTypeFilter("transparency"));
+			
+		fLayer.getMapContext().invalidate();
+		return true;	
+	}
+	
+	
+	private void processBrightnessContrastPanel(){
+		EnhancedBrightnessContrastPanel ebcPanel = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		// Si está activo el panel de brillo y contraste tomamos los valores y cargamos un filtro de 
+		// brillo y contraste
+		
+		BrightnessContrastStackManager bcStackManager = (BrightnessContrastStackManager)stackManager.getManagerByClass(BrightnessContrastStackManager.class);
+		if(ebcPanel.getCBrightC().isSelected()){
+			int incrBrillo = (int)Math.round(Double.valueOf(ebcPanel.lstBrightness.getTextValue()).doubleValue());
+			int incrContraste = (int)Math.round(Double.valueOf(ebcPanel.lstContrast.getTextValue()).doubleValue());
+			bcStackManager.addBrightnessFilter(incrBrillo);
+			bcStackManager.addContrastFilter(incrContraste);
+		}else{
+			stackManager.removeFilter(bcStackManager.brightness);
+			stackManager.removeFilter(bcStackManager.contrast);
+		}	
+		fLayer.getMapContext().invalidate();
+	}
+	
+	
+	/**
+	 * Pressing OK with the enhancement panel selected makes its values to be processed.
+	 * @return true if the enhancement panel was selected and the action is processed, false it
+	 * was not selected.
+	 */
+	public void processEnhancedPanel(){
+		EnhancedBrightnessContrastPanel ebcPanel = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		
+		//Filtro de realce lineal seleccionado
+		if(ebcPanel.getCEnhanced().isSelected()){
+			if((ebcPanel.getJCheckBox().isSelected()) && (!ebcPanel.getCheckSliderText().getJCheckBox().isSelected()))
+				stackManager.addEnhancedFilter(true);
+			else
+				stackManager.addEnhancedFilter(false);
+				
+			//Recorte de colas seleccionado
+			if(ebcPanel.getCheckSliderText().getJCheckBox().isSelected()){
+				stackManager.removeFilter(stackManager.getTypeFilter("computeminmax"));
+				double recorte = Double.parseDouble(ebcPanel.getCheckSliderText().getTextValue())/100;
+				if(ebcPanel.getJCheckBox().isSelected())
+					stackManager.addTailFilter(recorte, 0D, true);
+				else
+					stackManager.addTailFilter(recorte, 0D, false);
+			}else{
+				stackManager.removeFilter(stackManager.getTypeFilter("tail"));
+				stackManager.addComputeMinMaxFilter();
+			}
+			
+		}
+		// Sin filtro lineal seleccionado
+		if(!ebcPanel.getCEnhanced().isSelected()){
+			stackManager.removeFilter(stackManager.getTypeFilter("computeminmax"));
+			stackManager.removeFilter(stackManager.getTypeFilter("tail"));
+			stackManager.removeFilter(stackManager.getTypeFilter("enhanced"));
+		}
+		fLayer.getMapContext().invalidate();
+	}
+	
+	/**
+	 * Manages the action perfomed when Apply/OK is pressed or Apply at the raster
+	 * properties control.
+	 * @param e
+	 */
+	private void acceptButtonActionPerformed(ActionEvent e) {
+		processBandPanel();
+		processTransparencyPanel();	
+		processEnhancedPanel();	
+		processBrightnessContrastPanel();
+	}
+	
+	/**
+	 * Adds a band to the raster.
+	 * @param e
+	 */
+	private void addFileBand(ActionEvent e){
+		String[] driverNames = null;
+		String rasterDriver = null;
+				
+		//Creación del dialogo para selección de ficheros
+		
+		fileChooser = new JFileChooser(lastPath);
+		fileChooser.setMultiSelectionEnabled(true);
+		fileChooser.setAcceptAllFileFilterUsed(false);
+        try {
+			driverNames = LayerFactory.getDM().getDriverNames();
+			FileFilter defaultFileFilter = null, auxF;
+			for (int i = 0; i < driverNames.length; i++) {
+				
+				if (driverNames[i].endsWith("gvSIG Image Driver")){
+					rasterDriver = driverNames[i];
+				    auxF = new DriverFileFilter(driverNames[i]);
+					fileChooser.addChoosableFileFilter(auxF);
+					defaultFileFilter = auxF;
+				}
+			}
+		} catch (DriverLoadException e1) {
+			NotificationManager.addError("No se pudo acceder a los drivers", e1);
+		}
+		int result = fileChooser.showOpenDialog(ArcImsRasterPropsDialog.this);
+		
+		if(result == JFileChooser.APPROVE_OPTION){
+			File[] files = fileChooser.getSelectedFiles();
+		 	FileFilter filter = fileChooser.getFileFilter();
+		 	BandSetupPanel bandSetup = (BandSetupPanel)((FilterRasterDialogPanel)this.getContentPane()).getPanelByClassName("BandSetupPanel");
+		 	lastPath = files[0].getPath();
+		 	
+		 	//Lo añadimos a la capa si no esta
+		 	
+		 	Vector v = new Vector();
+            for(int i=0;i<files.length;i++){
+            	boolean exist = false;
+            	for(int j=0;j<px.getFiles().length;j++){
+            		if(px.getFiles()[j].getName().endsWith(files[i].getName()))
+            			exist = true;
+            	}
+            	if(!exist){
+            		try{
+            			Rectangle2D extentOrigin = fLayer.getFullExtent();
+            			
+            			Extent extentNewFile = GeoRasterFile.openFile(fLayer.getProjection(), files[i].getAbsolutePath()).getExtent();
+            			
+						//Comprobamos que el extent y tamaño del fichero añadido sea igual al 
+						//fichero original. Si no es así no abrimos la capa y mostramos un aviso
+						
+            			double widthNewFile = (extentNewFile.getMax().getX()-extentNewFile.getMin().getX());
+            			double heightNewFile = (extentNewFile.getMax().getY()-extentNewFile.getMin().getY());
+            				                                                                                                
+            			if( (widthNewFile-extentOrigin.getWidth()) > 1.0 ||
+            				(widthNewFile-extentOrigin.getWidth()) < -1.0 ||
+            				(heightNewFile-extentOrigin.getHeight()) > 1.0 ||
+            				(heightNewFile-extentOrigin.getHeight()) < -1.0){       
+            				JOptionPane.showMessageDialog(	null,
+            												PluginServices.getText(this, "extents_no_coincidentes"), 
+															"",
+															JOptionPane.ERROR_MESSAGE);
+            				return;
+            			}
+            				                                
+            			if(	(extentNewFile.getMax().getX()-extentNewFile.getMin().getX())!=extentOrigin.getWidth() ||
+								(extentNewFile.getMax().getY()-extentNewFile.getMin().getY())!=extentOrigin.getHeight()	){
+            				JOptionPane.showMessageDialog(null, 
+									PluginServices.getText(this, "extents_no_coincidentes"), "", JOptionPane.ERROR_MESSAGE);
+							return;
+            			}
+														
+            		}catch(Exception exc){
+            			exc.printStackTrace();
+            		}
+            		
+            		//Lo añadimos a la capa
+            		px.addFile(files[i].getAbsolutePath());
+
+            	}else{
+            		JOptionPane.showMessageDialog(null, 
+							PluginServices.getText(this, "fichero_existe")+" "+files[i].getAbsolutePath(), "", JOptionPane.ERROR_MESSAGE);
+            	}
+            }
+		 	            
+            //Añadimos los georasterfile a la tabla del Panel
+            
+            v = new Vector();
+            Vector vInfo = new Vector();
+            for(int i=0;i<px.getFiles().length;i++){
+            	boolean exist = false;
+            	for(int j=0;j<bandSetup.getNBands();j++){
+            		if(px.getFiles()[i].getName().endsWith(bandSetup.getBandName(j)))
+            			exist = true;
+            	}
+            	if(!exist){
+            		v.add(px.getFiles()[i]);
+            		vInfo.add(px.getFiles()[i]);
+            	}
+            }
+            
+            GeoRasterFile[] grf = new GeoRasterFile[v.size()];
+            for(int i=0;i<grf.length;i++){
+            	grf[i] = (GeoRasterFile)v.get(i);
+            }
+            GeoRasterFile[] infoGrf = new GeoRasterFile[vInfo.size()];
+            for(int i = 0; i<infoGrf.length ; i++){
+            	infoGrf[i] = (GeoRasterFile)vInfo.get(i);
+            }
+            bandSetup.addFiles(grf);
+            this.addInfoFiles(infoGrf);
+		}
+	}
+	
+	/**
+	 * Deletes a band from the raster. If there is only a file or no band is
+	 * selected then it does nothing.
+	 * 
+	 * @param e
+	 */
+	private void delFileBand(ActionEvent e){
+		BandSetupPanel bandSetup = (BandSetupPanel)((FilterRasterDialogPanel)this.getContentPane()).getPanelByClassName("BandSetupPanel");
+		
+		if(	bandSetup.getFileList().getJList().getSelectedValue()!=null &&
+			bandSetup.getFileList().getNFiles() > 1){
+			String pathName = bandSetup.getFileList().getJList().getSelectedValue().toString();
+			px.delFile(pathName);
+			String file = pathName.substring(pathName.lastIndexOf("/")+1);
+			file = file.substring(file.lastIndexOf("\\")+1);
+			bandSetup.removeFile(file);
+			
+		}
+		
+		Vector vInfo = new Vector();
+        for(int i=0;i<px.getFiles().length;i++){
+        	vInfo.add(px.getFiles()[i]);
+        }
+		
+		GeoRasterFile[] infoGrf = new GeoRasterFile[vInfo.size()];
+        for(int i = 0; i<infoGrf.length ; i++){
+        	infoGrf[i] = (GeoRasterFile)vInfo.get(i);
+        }
+        
+        this.addInfoFiles(infoGrf);
+		
+	}
+	
+	/**
+	 * The cancel button restores the previous state to the loading of this dialog
+	 * @param e	Evento
+	 */
+	private void cancelButtonActionPerformed(ActionEvent e) {
+		this.status.restoreStatus(this);
+		fLayer.getMapContext().invalidate();
+	}
+	
+	public WindowInfo getWindowInfo() {
+		WindowInfo m_viewinfo=new WindowInfo(WindowInfo.MODALDIALOG | WindowInfo.RESIZABLE);
+    		m_viewinfo.setTitle(PluginServices.getText(this, "propiedades_raster"));
+		return m_viewinfo;
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		EnhancedBrightnessContrastPanel ebcPanel = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		if((e.getSource() == ebcPanel.getLabelSliderText().getJTextField()) ||
+			(e.getSource() == ebcPanel.getLabelSliderText1().getJTextField())){
+				
+			if(ebcPanel.getJCheckBox1().isSelected()){		
+				processBrightnessContrastPanel();
+			}
+		
+		}
+	}
+	
+	public void mouseReleased(MouseEvent e) {
+		EnhancedBrightnessContrastPanel ebcPanel = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		if (((e.getSource() == ebcPanel.lstBrightness.getJSlider()) || (e.getSource() == ebcPanel.lstContrast.getJSlider())) &&
+			 (ebcPanel.getJCheckBox1().isSelected() == true))
+			processBrightnessContrastPanel();		
+	}
+
+	public void keyPressed(KeyEvent e) {
+		EnhancedBrightnessContrastPanel ebcPanel = (EnhancedBrightnessContrastPanel)super.getPanelByClassName("EnhancedBrightnessContrastPanel");
+		if(e.getSource() == ebcPanel.getCheckSliderText().getJTextField()){
+			ebcPanel.getCheckSliderText().getJSlider().setValue((int) Math.round(Double.valueOf(ebcPanel.getCheckSliderText().getTextValue()).doubleValue()));
+		}
+		
+	}
+}  

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/ArcImsRasterPropsDialog.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/LayerScaleDialog.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/LayerScaleDialog.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/LayerScaleDialog.java	(revision 8301)
@@ -0,0 +1,185 @@
+package es.prodevelop.cit.gvsig.arcims.gui.dialogs;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Vector;
+
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.listeners.FRasterLyrArcIMSListener;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.LayerScaleDrawPanel;
+
+import com.iver.andami.PluginServices;
+import com.iver.andami.ui.mdiManager.IWindow;
+import com.iver.andami.ui.mdiManager.WindowInfo;
+import com.iver.cit.gvsig.project.documents.view.gui.View;
+
+/**
+ * This class shows the ArcIMS layer's scale limits status.
+ * 
+ * @author jldominguez
+ */
+public class LayerScaleDialog extends JPanel implements ActionListener,
+IWindow, FRasterLyrArcIMSListener {
+
+	private JPanel button_p;
+	private JButton b;
+	private LayerScaleDrawPanel dp;
+	private FRasterLyrArcIMS layer;
+	private WindowInfo theViewInfo;
+	private JScrollPane sp;
+	private static final long serialVersionUID = 0;
+	private String vistaName;
+	
+	private JLabel southLabel;
+
+
+	/**
+	 * Needs the layer as parameter.
+	 * 
+	 * @param lyr the layer
+	 */
+	public LayerScaleDialog(FRasterLyrArcIMS lyr, View v) {
+		super();
+		layer = lyr;
+		southLabel = new JLabel();
+
+		if (v != null) {
+			vistaName = v.getModel().getName();
+		} else {
+			vistaName = "Unknown";
+		}
+
+		lyr.addActionlistener(this);
+		lyr.addNameOrQueryListener(this);
+		Vector infoV = layer.getLayerScaleInfoVector();
+		int spHeight = 201 + 15 * infoV.size();
+		if (spHeight > 500) spHeight = 500;
+		
+		setLayout(new BorderLayout());
+		setSize(140 + 680, spHeight + 10);
+		setMinimumSize(new Dimension(410, 226));
+		
+		b = new JButton(PluginServices.getText(this, "close"));
+		b.setBounds(10, 10, 90, 25);
+		b.addActionListener(this);
+		
+		button_p = new JPanel();
+		button_p.setLayout(new BorderLayout());
+		button_p.add(southLabel, BorderLayout.WEST); // setPreferredSize(new Dimension(10, 5));
+		// button_p.add(b);
+		
+		dp = new LayerScaleDrawPanel(infoV, this, southLabel);
+		dp.setDpi(lyr.getArcimsStatus().getServiceInfo().getScreen_dpi());
+		dp.setCurrentScale(1.0 * layer.getMapContext().getScaleView());
+		
+		southLabel.setText(PluginServices.getText(this, "Escala") + "  1 : " +
+				getFormattedInteger(Math.round(dp.getCurrentScale()))
+				);
+		
+		dp.setPreferredSize(new Dimension(300, 200 + 15 * infoV.size()));
+
+		sp = new JScrollPane(dp);
+		sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+		sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+		
+		add(BorderLayout.CENTER, sp);
+		add(BorderLayout.SOUTH, button_p);
+	}
+	
+	public void resetDrawingPanel() {
+		Vector infoV = layer.getLayerScaleInfoVector();
+		dp.resetInfo(infoV);
+		dp.setPreferredSize(new Dimension(300, 200 + 15 * infoV.size()));
+		dp.repaint();
+	}
+	
+
+	public void actionPerformed(ActionEvent arg0) {
+		
+		if (arg0.getActionCommand().compareToIgnoreCase(FRasterLyrArcIMS.SCALE_CHANGED_COMMAND) == 0) {
+			dp.setCurrentScale(1.0 * layer.getScale());
+			dp.repaint();
+			return;
+		}
+		
+		if (arg0.getSource() == b) {
+			this.close();
+		}
+
+	}
+	
+	public void close() {
+		PluginServices.getMDIManager().closeWindow(this);
+	}
+
+	public WindowInfo getWindowInfo() {
+		if (theViewInfo == null) {
+			theViewInfo = new WindowInfo(
+					0 + // palette
+					16 + // no modal
+					0 + // modal
+					4 + // iconifiable
+					2 + // maximizable
+					1 // resizable
+					);
+			theViewInfo.setTitle(
+					PluginServices.getText(this, "view") +
+					": " + 
+					vistaName + 
+					" - " + 
+					PluginServices.getText(this, "layer") +
+					": " + 
+					layer.getName() + 
+					" - " + 
+					PluginServices.getText(this, "layer_scale_status")
+					);
+			theViewInfo.setWidth(getInitialWidth());
+			theViewInfo.setHeight(getInitialHeight());
+		}
+		return theViewInfo;
+	}
+
+	public FRasterLyrArcIMS getLayer() {
+		return layer;
+	}
+
+	public void setLayer(FRasterLyrArcIMS layer) {
+		this.layer = layer;
+	}
+	
+
+	private int getInitialWidth() {
+		return 365;
+	}
+
+	private int getInitialHeight() {
+		return 290 - 35;
+	}
+
+
+	public void thingsHaveChanged(String query, String name) {
+		resetDrawingPanel();
+	}
+	
+	public static String getFormattedInteger(int n) {
+		DecimalFormat df = new DecimalFormat();
+		df.setGroupingUsed(true);
+		df.setGroupingSize(3);
+		DecimalFormatSymbols dfs = new DecimalFormatSymbols();
+		dfs.setGroupingSeparator('.');
+		df.setDecimalFormatSymbols(dfs);
+		return df.format(n);
+	}
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/dialogs/LayerScaleDialog.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/FeatureServicePanel.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/FeatureServicePanel.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/FeatureServicePanel.java	(revision 8301)
@@ -0,0 +1,1235 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JPanel;
+import javax.swing.DefaultListModel;
+import javax.swing.JLabel;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextField;
+import javax.swing.JEditorPane;
+import javax.swing.JList;
+import javax.swing.JToolTip;
+import javax.swing.JTree;
+import javax.swing.ImageIcon;
+import javax.swing.ToolTipManager;
+import javax.swing.event.ListDataListener;
+import javax.swing.event.TreeSelectionListener;
+
+import java.util.Vector;
+
+import com.iver.andami.PluginServices;
+import com.iver.cit.gvsig.project.documents.gui.FOpenDialog;
+import com.iver.utiles.swing.JComboBox;
+
+import javax.swing.JScrollPane;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.JOptionPane;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.AvailableLayersTreeCellRenderer;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.JMultilineToolTip;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.LayersListElement;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.ServicesTableModel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.SelectedLayersListCellRenderer;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.ServiceNamesObject;
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+
+import javax.swing.tree.*;
+
+/**
+ * This class implements the ArcIMS wizard's panel which enables the user to
+ * select which layers must be retrieved from a Image Service (selected on the
+ * ServiceNamesPanel).
+ * 
+ * @see es.prodevelop.cit.gvsig.arcims.gui.panels.ServiceNamesPanel
+ * 
+ * 
+ * @author jldominguez
+ */
+public class FeatureServicePanel extends JPanel implements ActionListener,
+		ItemListener, ListDataListener, KeyListener, ChangeListener,
+		TreeSelectionListener, MouseListener {
+	
+	protected static Logger logger = Logger.getLogger(FeatureServicePanel.class.getName());
+
+	protected ArcImsWizard parentWizard = null;
+	protected JPanel detailsPanel = null;
+	protected JPanel layersPanel = null;
+	protected JPanel selectedLayersPanel = null;
+	protected JPanel finalPanel = null;
+	protected JLabel newLayerNameLabel = null;
+	protected JTextField newLayerNameTextField = null;
+	protected JButton selectedLayersUpButton = null;
+	protected JButton selectedLayersDownButton = null;
+	protected JList orderedLayersList = null;
+	protected JTree availableLayersTree = null;
+	protected DefaultTreeModel availableLayersTreeModel = null;
+	protected DefaultMutableTreeNode layersTreeRootNode = null;
+	protected ServiceNamesObject layersTreeRootObject = null;
+	protected DefaultListModel orderedLayersListModel = null;
+	protected JButton addLayerButton = null;
+	protected JButton removeLayerButton = null;
+	protected JScrollPane availableLayersScrollPane = null;
+	protected JScrollPane selectedLayersScrollPane = null;
+	protected JButton addAllButton = null;
+	protected JButton removeAllButton = null;
+	protected JScrollPane serviceDetailsScrollPane = null;
+	protected JEditorPane serviceDetailsTable = null;
+	protected Vector serviceDetailsTableDataVector = null;
+	protected Vector serviceDetailsTableColumnNamesVector = null;
+	protected JTabbedPane imgServiceTabbedPane = null;
+	protected JPanel tabPanel = null;
+	protected JPanel imgServiceTab_1 = null;
+	protected JPanel imgServiceTab_2 = null;
+	protected JPanel changeServerPanel = null;
+	protected JButton serviceInfoNextButton = null;
+	protected JButton serviceInfoPreviousButton = null;
+	protected JButton changeServerButton = null;
+	protected JCheckBox showIdCheckBox = null;
+	protected final String bgColor0 = "\"#FEEDD6\""; // light -
+	protected final String bgColor3 = "\"#FBFFE1\""; // light yellow
+	protected final String font = "Arial";
+	
+	private JPanel groupCheckPanel;
+	private JCheckBox groupCheckBox;
+	
+	private JLabel versionTitleLabel = null;
+	private JLabel versionLabel = null;
+
+	private static final long serialVersionUID = 0;
+	
+	protected boolean isProperties = false;
+	
+
+	/**
+	 * The owning wizard is useds as a parameter to allow easy <i>upwards</i>
+	 * references.
+	 * 
+	 * @param parent
+	 *            the wizard that owns this panel
+	 */
+	public FeatureServicePanel(ArcImsWizard parent, boolean editionallowed, boolean properties) {
+		super();
+		isProperties = properties;
+		parentWizard = parent;
+		initialize(editionallowed);
+	}
+
+	protected void initialize(boolean editionallowed) {
+		setLayout(null);
+		this.setSize(new java.awt.Dimension(511, 470));
+		this.initInfoVectors();
+
+		imgServiceTab_1 = new JPanel();
+		imgServiceTab_1.setLayout(null);
+		imgServiceTab_2 = new JPanel();
+		imgServiceTab_2.setLayout(null);
+
+		imgServiceTab_1.add(getDetailsPanel(), null);
+		imgServiceTab_2.add(getFinalPanel(), null);
+		imgServiceTab_2.add(getLayersPanel(), null);
+		imgServiceTab_2.add(getShowIdCheckBox(), null);
+		imgServiceTab_2.add(getSelectedLayersPanel(), null);
+		
+		addImageFormatPanel();
+
+		tabPanel = new JPanel();
+		tabPanel.setBounds(18, 8, 490 - 15, 415);
+		tabPanel.setLayout(new BorderLayout());
+		
+		imgServiceTabbedPane = new JTabbedPane();
+		// imgServiceTabbedPane.setBounds(0, 0, 510, 432);
+		imgServiceTabbedPane.addTab(PluginServices
+				.getText(this, "info"), imgServiceTab_1);
+		
+		if (editionallowed) {
+			imgServiceTabbedPane.addTab(PluginServices.getText(this, "layers"), imgServiceTab_2);
+		}
+		
+		imgServiceTabbedPane.addChangeListener(this);
+
+		changeServerButton = new JButton(PluginServices.getText(this,
+				"change_service"));
+		changeServerButton.addActionListener(this);
+		changeServerButton.setBounds(95, 8, 120, 25);
+		serviceInfoPreviousButton = new JButton(PluginServices.getText(this,
+				"previous"));
+		serviceInfoPreviousButton.addActionListener(this);
+		serviceInfoPreviousButton.setBounds(395 - 103, 4, 100, 20);
+		serviceInfoNextButton = new JButton(PluginServices
+				.getText(this, "next"));
+		serviceInfoNextButton.addActionListener(this);
+		serviceInfoNextButton.setBounds(395, 4, 100, 20);
+
+		changeServerPanel = new JPanel();
+		changeServerPanel.setLayout(null);
+		changeServerPanel.setBounds(0, 440, 525, 42);
+		// changeServerPanel.add(changeServerButton);
+		changeServerPanel.add(serviceInfoPreviousButton);
+		changeServerPanel.add(serviceInfoNextButton);
+		
+		versionTitleLabel = new JLabel(PluginServices.getText(this, "server_version") + ":");
+		versionTitleLabel.setBounds(new java.awt.Rectangle(39, 443, 125, 21));
+		add(versionTitleLabel, null);
+		versionLabel = new JLabel("-");
+		versionLabel.setBounds(new java.awt.Rectangle(170 - 15, 443, 160, 21));
+		add(versionLabel, null);
+
+		tabPanel.add(imgServiceTabbedPane, BorderLayout.CENTER);
+		add(tabPanel);
+		add(changeServerPanel);
+	}
+	// previous (395 - 103, 444, 100, 20));
+	
+	
+	protected void addImageFormatPanel() {
+		groupCheckPanel = new JPanel();
+		groupCheckPanel.setBounds(180 - 6, 210 - 8, 501 - 180 - 34, 54); // hasta y = 264 
+		groupCheckPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
+						null, PluginServices.getText(this, "group_layers_option"),
+						javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+						javax.swing.border.TitledBorder.DEFAULT_POSITION,
+						null, null));
+		
+		groupCheckBox = new JCheckBox(
+				PluginServices.getText(this, "group_layers"),
+				false);
+		groupCheckBox.setBounds(14, 20, 155, 21);
+		
+		groupCheckPanel.setLayout(null);
+		groupCheckPanel.add(groupCheckBox);
+		imgServiceTab_2.add(groupCheckPanel);
+	}
+	
+	// private J
+	
+
+	protected void initInfoVectors() {
+		serviceDetailsTableDataVector = new Vector();
+
+		orderedLayersListModel = new DefaultListModel();
+		orderedLayersListModel.addListDataListener(this);
+	}
+
+	/**
+	 * Gets a list model that contains the layers that have been selected by the
+	 * user (among those offered by the server)
+	 * 
+	 * @return the selected layers' list model
+	 */
+	public DefaultListModel getOrderedLayersListModel() {
+		return this.orderedLayersListModel;
+	}
+
+	/**
+	 * This method initializes detailsPanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	public JPanel getDetailsPanel() {
+		if (detailsPanel == null) {
+			detailsPanel = new JPanel();
+			detailsPanel.setLayout(null);
+			detailsPanel.setBounds(new java.awt.Rectangle(5, 5, 470 - 15, 345 + 30));
+			serviceDetailsScrollPane = new JScrollPane();
+			detailsPanel.add(serviceDetailsScrollPane, null);
+		}
+		return detailsPanel;
+	}
+
+	public void setDetailsPanelServiceNameInBorder(String name) {
+		this.detailsPanel.setBorder(javax.swing.BorderFactory
+				.createTitledBorder(null, PluginServices.getText(this,
+						"service_info")
+						+ ": " + name,
+						javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+						javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
+						null));
+
+	}
+
+	/**
+	 * This method initializes layersPanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	protected JPanel getLayersPanel() {
+		if (layersPanel == null) {
+			layersPanel = new JPanel();
+			layersPanel.setLayout(null);
+			layersPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
+					null, PluginServices.getText(this, "available_layers"),
+					javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+					javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
+					null));
+			layersPanel.setBounds(new java.awt.Rectangle(4, 58, 491 - 34, 151 - 8)); // hasta y = 209
+			layersPanel.add(getAvailableLayersScrollPane(), null);
+		}
+		return layersPanel;
+	}
+
+	protected JCheckBox getShowIdCheckBox() {
+		if (showIdCheckBox == null) {
+			showIdCheckBox = new JCheckBox(PluginServices.getText(this,
+					"show_layer_ids"), false);
+			showIdCheckBox.setBounds(4, 230 - 8, 168, 15);
+			showIdCheckBox.addItemListener(this);
+		}
+		return showIdCheckBox;
+	}
+
+	/**
+	 * This method initializes jPanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	protected JPanel getSelectedLayersPanel() {
+		if (selectedLayersPanel == null) {
+			selectedLayersPanel = new JPanel();
+			selectedLayersPanel.setLayout(null);
+			selectedLayersPanel
+					.setBorder(javax.swing.BorderFactory
+							.createTitledBorder(
+									null,
+									PluginServices.getText(this,
+											"selected_layers"),
+									javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+									javax.swing.border.TitledBorder.DEFAULT_POSITION,
+									null, null));
+			selectedLayersPanel.setBounds(new java.awt.Rectangle(4, 265 - 8, 491 - 34,
+					130));
+			selectedLayersPanel.add(getSelectedLayersUpButton(), null);
+			selectedLayersPanel.add(getSelectedLayersDownButton(), null);
+			selectedLayersPanel.add(getAddLayerButton(), null);
+			selectedLayersPanel.add(getRemoveLayerButton(), null);
+			selectedLayersPanel.add(getSelectedLayersScrollPane(), null);
+			selectedLayersPanel.add(getAddAllButton(), null);
+			selectedLayersPanel.add(getRemoveAllButton(), null);
+		}
+		return selectedLayersPanel;
+	}
+
+	/**
+	 * This method initializes finalPanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	protected JPanel getFinalPanel() {
+		if (finalPanel == null) {
+			newLayerNameLabel = new JLabel();
+			newLayerNameLabel
+					.setBounds(new java.awt.Rectangle(60, 18, 195, 21));
+			newLayerNameLabel.setText(PluginServices.getText(this,
+					"enter_new_layer_name"));
+			finalPanel = new JPanel();
+			finalPanel.setLayout(null);
+			finalPanel.setBounds(new java.awt.Rectangle(4, 8, 491 - 34, 49)); // hasta y = 58
+			finalPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
+					null, PluginServices.getText(this, "new_layer_name"),
+					javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+					javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
+					null));
+
+			// finalPanel.add(newLayerNameLabel, null);
+			finalPanel.add(getNewLayerNameTextField(), null);
+		}
+		return finalPanel;
+	}
+
+	/**
+	 * This method initializes newLayerNameTextField
+	 * 
+	 * @return javax.swing.JTextField
+	 */
+	public JTextField getNewLayerNameTextField() {
+		if (newLayerNameTextField == null) {
+			newLayerNameTextField = new JTextField();
+			newLayerNameTextField.addKeyListener(this);
+			newLayerNameTextField.addActionListener(this);
+			newLayerNameTextField.setBounds(new java.awt.Rectangle(10, 19,
+					437, 20));
+		}
+		return newLayerNameTextField;
+	}
+
+	/**
+	 * This method initializes availableLayersTree
+	 * 
+	 * @return javax.swing.JTree
+	 */
+	public void setAvailableLayersTree(JTree t) {
+		availableLayersTree = t;
+	}
+
+	public JTree getAvailableLayersTree() {
+		if (availableLayersTree == null) {
+			availableLayersTreeModel = new DefaultTreeModel(layersTreeRootNode);
+			availableLayersTree = new JTree(availableLayersTreeModel) {
+				public JToolTip createToolTip() {
+					JMultilineToolTip jmtt = new JMultilineToolTip();
+					return jmtt;
+				}
+				private static final long serialVersionUID = 0;
+			};
+
+			ToolTipManager.sharedInstance().registerComponent(
+					availableLayersTree);
+			availableLayersTree
+					.setCellRenderer(new AvailableLayersTreeCellRenderer());
+
+			availableLayersTree.addTreeSelectionListener(this);
+			availableLayersTree.addMouseListener(this);
+		}
+		return availableLayersTree;
+	}
+
+	/**
+	 * This method initializes selectedLayersUpButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	protected JButton getSelectedLayersUpButton() {
+		if (selectedLayersUpButton == null) {
+			selectedLayersUpButton = new JButton();
+			ImageIcon ii = createImageIcon("images/up-arrow.png");
+			selectedLayersUpButton.setIcon(ii);
+			selectedLayersUpButton.setBounds(new java.awt.Rectangle(10, 35, 36,
+					36));
+			selectedLayersUpButton.addActionListener(this);
+		}
+		return selectedLayersUpButton;
+	}
+
+	/**
+	 * This method initializes selectedLayersDownButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	protected JButton getSelectedLayersDownButton() {
+		if (selectedLayersDownButton == null) {
+			selectedLayersDownButton = new JButton();
+			ImageIcon ii = createImageIcon("images/down-arrow.png");
+			selectedLayersDownButton.setIcon(ii);
+			selectedLayersDownButton.setBounds(new java.awt.Rectangle(10, 75,
+					36, 36));
+			selectedLayersDownButton.addActionListener(this);
+		}
+		return selectedLayersDownButton;
+	}
+
+	/**
+	 * This method initializes orderedLayersList
+	 * 
+	 * @return javax.swing.JList
+	 */
+	public void setOrderedLayersList(JList l) {
+		orderedLayersList = l;
+	}
+
+	public JList getOrderedLayersList() {
+		if (orderedLayersList == null) {
+			if (orderedLayersListModel == null) {
+				orderedLayersListModel = new DefaultListModel();
+				orderedLayersListModel.addListDataListener(this);
+			}
+
+			orderedLayersList = new JList(orderedLayersListModel) {
+				public JToolTip createToolTip() {
+					JMultilineToolTip jmltt = new JMultilineToolTip();
+					return jmltt;
+				}
+				private static final long serialVersionUID = 0;
+			};
+			ToolTipManager.sharedInstance()
+					.registerComponent(orderedLayersList);
+			orderedLayersList
+					.setCellRenderer(new SelectedLayersListCellRenderer());
+		}
+		return orderedLayersList;
+	}
+
+	/**
+	 * This method initializes addLayerButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	protected JButton getAddLayerButton() {
+		if (addLayerButton == null) {
+			addLayerButton = new JButton();
+			addLayerButton.setText(PluginServices.getText(this, "add"));
+			addLayerButton.addActionListener(this);
+			addLayerButton.setBounds(new java.awt.Rectangle(365 - 34, 25, 111, 21));
+		}
+		return addLayerButton;
+	}
+
+	/**
+	 * This method initializes removeLayerButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	protected JButton getRemoveLayerButton() {
+		if (removeLayerButton == null) {
+			removeLayerButton = new JButton();
+			removeLayerButton.setText(PluginServices.getText(this, "remove"));
+			removeLayerButton.addActionListener(this);
+			removeLayerButton
+					.setBounds(new java.awt.Rectangle(365 - 34, 75, 111, 21));
+		}
+		return removeLayerButton;
+	}
+
+	public void setSelectedLayersScrollPaneViewPort() {
+		this.selectedLayersScrollPane.setViewportView(orderedLayersList);
+	}
+
+	/**
+	 * Adds a layer to the list of available lists. This is done while parsing
+	 * the server's reponse after a <tt>getCapabilities()</tt> request.
+	 * 
+	 * @param e
+	 *            the element to be added
+	 */
+	public void addLayerToAvailableList(LayersListElement e) {
+		DefaultMutableTreeNode node = new DefaultMutableTreeNode(e);
+		this.layersTreeRootNode.add(node);
+	}
+
+	/**
+	 * Adds a layer to the list of selected layers after the user has clicked on
+	 * the <i>Add</i> button or double-clicked on an item on the available
+	 * layers list.
+	 * 
+	 * @param e
+	 *            the element to be added
+	 */
+	public void addLayerToSelectedList(LayersListElement e) {
+		if (orderedLayersListModel.contains(e)) {
+			int r;
+			String the_message = PluginServices.getText(this,
+					"this_layer_was_already_added")
+					+ ". "
+					+ PluginServices.getText(this, "add_again_question")
+					+ "\n"
+					+ PluginServices.getText(this, "layer")
+					+ ": "
+					+ e.getName();
+			String the_title = PluginServices.getText(this,
+					"this_layer_was_already_added");
+
+			r = JOptionPane.showOptionDialog(this, the_message, the_title,
+					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
+					null, null, null);
+			if (r == JOptionPane.NO_OPTION)
+				return;
+		}
+		e.setAdded(true);
+		this.orderedLayersListModel.add(0, e);
+	}
+
+	/**
+	 * Adds a layer to the list of selected layers without confirmation.
+	 * 
+	 * @param e
+	 *            the element to be added
+	 */
+	public void addLayerToSelectedListNoConfirm(LayersListElement e) {
+		e.setAdded(true);
+		this.orderedLayersListModel.add(0, e);
+	}
+
+	/**
+	 * This method initializes availableLayersScrollPane
+	 * 
+	 * @return javax.swing.JScrollPane
+	 */
+	public JScrollPane getAvailableLayersScrollPane() {
+		if (availableLayersScrollPane == null) {
+			availableLayersScrollPane = new JScrollPane();
+			availableLayersScrollPane.setBounds(new java.awt.Rectangle(10, 20,
+					471 - 34, 123 - 8));
+		}
+		return availableLayersScrollPane;
+	}
+
+	/**
+	 * This method initializes selectedLayersScrollPane
+	 * 
+	 * @return javax.swing.JScrollPane
+	 */
+	public JScrollPane getSelectedLayersScrollPane() {
+		if (selectedLayersScrollPane == null) {
+			selectedLayersScrollPane = new JScrollPane();
+			selectedLayersScrollPane.setBounds(new java.awt.Rectangle(55, 20,
+					301 - 34, 101));
+		}
+		return selectedLayersScrollPane;
+	}
+
+	/**
+	 * This method initializes addAllButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	protected JButton getAddAllButton() {
+		if (addAllButton == null) {
+			addAllButton = new JButton();
+			addAllButton.setText(PluginServices.getText(this, "add_all"));
+			addAllButton.addActionListener(this);
+			addAllButton.setBounds(new java.awt.Rectangle(365 - 34, 50, 111, 21));
+		}
+		return addAllButton;
+	}
+
+	/**
+	 * This method initializes removeAllButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	protected JButton getRemoveAllButton() {
+		if (removeAllButton == null) {
+			removeAllButton = new JButton();
+			removeAllButton.setText(PluginServices.getText(this, "remove_all"));
+			removeAllButton.addActionListener(this);
+			removeAllButton
+					.setBounds(new java.awt.Rectangle(365 - 34, 100, 111, 21));
+		}
+		return removeAllButton;
+	}
+
+	public void contentsChanged(ListDataEvent e) {
+	}
+
+	/**
+	 * Automatically invoqued when new layers are added to the selected layers
+	 * list. It checks whether the wizard is ready to finish and send gvSIG the
+	 * user's selection.
+	 */
+	public void intervalAdded(ListDataEvent e) {
+		logger.info("Added. Now selected: " + orderedLayersListModel.size());
+		updateWizardLayerQuery();
+		parentWizard.fireWizardComplete(this.isCorrectlyConfigured());
+	}
+
+	/**
+	 * Automatically invoqued when new layers are removed from the selected
+	 * layers list. It checks whether the wizard is ready to finish and send
+	 * gvSIG the user's selection.
+	 */
+	public void intervalRemoved(ListDataEvent e) {
+		logger.info("Removed. Now selected: " + orderedLayersListModel.size());
+		updateWizardLayerQuery();
+		this.parentWizard.fireWizardComplete(this.isCorrectlyConfigured());
+	}
+
+	/**
+	 * Checks whether the wizard is ready to finish and send gvSIG the user's
+	 * selection.
+	 * 
+	 * @return <b>true</b> if the wizard is ready to finish, <b>false</b>
+	 *         otherwise
+	 */
+	public boolean isCorrectlyConfigured() {
+		if (this.orderedLayersListModel.size() == 0)
+			return false;
+		if (this.newLayerNameTextField.getText().length() == 0)
+			return false;
+		return true;
+	}
+
+	/**
+	 * Updates panel's local variables: <tt>setLayerQuery(String)</tt> sets a
+	 * comma-separated list of layers (the selected ones) and
+	 * <tt>setNewLayerName(String)</tt> sets the name of the new layer to be
+	 * created and sent to gvSIG.
+	 */
+	protected void updateWizardLayerQuery() {
+		if (orderedLayersListModel.size() == 0)
+			return;
+
+		String idAcum = "";
+		for (int i = orderedLayersListModel.size() - 1; i >= 0; i--) {
+			idAcum = idAcum
+					+ ","
+					+ ((LayersListElement) orderedLayersListModel.get(i))
+							.getID();
+		}
+		idAcum = idAcum.substring(1); // elimina la coma inicial
+
+		parentWizard.setLayerQuery(idAcum);
+		parentWizard.setNewLayerName(this.newLayerNameTextField.getText());
+	}
+
+	/**
+	 * Empties both lists: available layers list and selected layers list.
+	 */
+	public void emptyTables() {
+		// re-start available layers' tree node:
+		layersTreeRootObject = new ServiceNamesObject(parentWizard
+				.getServiceName(), "ImageServer", "Enabled");
+		layersTreeRootNode = new DefaultMutableTreeNode(layersTreeRootObject);
+
+		// empty the service dateails table:
+		loadServiceDetailsTable(null);
+
+		if (availableLayersTree != null) {
+			availableLayersTree.removeAll();
+		}
+		refreshAvailableLayersTree();
+
+		if (orderedLayersListModel != null) {
+			orderedLayersListModel.removeAllElements();
+		}
+		refreshSelectedLayersList();
+
+		newLayerNameTextField.setText(parentWizard.getServiceName());
+		
+	}
+
+	/**
+	 * Listens to button events: Add (all) layer, Remove (all) layer, Move up,
+	 * Move down.
+	 */
+	public void actionPerformed(ActionEvent e) {
+		LayersListElement sel;
+		DefaultMutableTreeNode node;
+		int ind;
+		int noofremoved;
+		int[] selInds;
+
+		if (e.getSource() == addLayerButton) {
+			// JTable.getSelectionRows() is 0-based but root is displayed so
+			// item 0 is the root itself
+			selInds = availableLayersTree.getSelectionRows();
+			if (selInds == null)
+				return;
+			if (selInds.length == 0)
+				return;
+
+			Object root = availableLayersTree.getModel().getRoot();
+			int noofchildren = availableLayersTree.getModel().getChildCount(
+					root);
+			for (int i = 0; i < noofchildren; i++) {
+				// JTable.getSelectionRows() is 0-based but root is displayed so
+				// item 0 is the root itself, and we ignore it here of course:
+				ind = LayersListElement.getFirstIndexInIntArray(selInds, i + 1);
+				if (ind != -1) {
+					node = (DefaultMutableTreeNode) availableLayersTree
+							.getModel().getChild(root, i);
+					sel = (LayersListElement) node.getUserObject();
+					addLayerToSelectedList(sel);
+				}
+			}
+			refreshAvailableLayersTree();
+			refreshSelectedLayersList();
+		}
+
+		if (e.getSource() == removeLayerButton) {
+			selInds = orderedLayersList.getSelectedIndices();
+			if (selInds.length == 0)
+				return;
+			noofremoved = 0;
+			for (int i = 0; i < selInds.length; i++) {
+				sel = (LayersListElement) orderedLayersListModel
+						.remove(selInds[i] - noofremoved);
+				noofremoved++;
+				sel.setAdded(orderedLayersListModel.contains(sel));
+			}
+			refreshAvailableLayersTree();
+			refreshSelectedLayersList();
+		}
+
+		if (e.getSource() == addAllButton) {
+			Object root = availableLayersTree.getModel().getRoot();
+			int nofchildren = this.availableLayersTree.getModel()
+					.getChildCount(root);
+			for (int i = 0; i < nofchildren; i++) {
+				node = (DefaultMutableTreeNode) availableLayersTree.getModel()
+						.getChild(root, i);
+				sel = (LayersListElement) node.getUserObject();
+				logger.info("Adding element: " + sel.toString());
+				addLayerToSelectedList(sel);
+			}
+			refreshAvailableLayersTree();
+			refreshSelectedLayersList();
+		}
+
+		if (e.getSource() == removeAllButton) {
+			while (orderedLayersListModel.size() > 0) {
+				sel = (LayersListElement) this.orderedLayersListModel.remove(0);
+				sel.setAdded(false);
+			}
+			refreshAvailableLayersTree();
+			refreshSelectedLayersList();
+		}
+
+		if (e.getSource() == selectedLayersDownButton) {
+			int l = orderedLayersListModel.size();
+			if (l == 0)
+				return;
+			selInds = orderedLayersList.getSelectedIndices();
+			if (selInds.length != 1)
+				return;
+			if (l == (selInds[0] + 1))
+				return; // last item cannot be moved down
+
+			sel = (LayersListElement) orderedLayersListModel.remove(selInds[0]);
+			orderedLayersListModel.add(selInds[0] + 1, sel);
+			refreshSelectedLayersList();
+			orderedLayersList.setSelectedIndex(selInds[0] + 1);
+			refreshAvailableLayersTree();
+		}
+
+		if (e.getSource() == selectedLayersUpButton) {
+			int l = orderedLayersListModel.size();
+			if (l == 0)
+				return;
+			selInds = orderedLayersList.getSelectedIndices();
+			if (selInds.length != 1)
+				return;
+			if (selInds[0] == 0)
+				return; // first item cannot be moved up
+
+			sel = (LayersListElement) orderedLayersListModel.remove(selInds[0]);
+			orderedLayersListModel.add(selInds[0] - 1, sel);
+			refreshSelectedLayersList();
+			orderedLayersList.setSelectedIndex(selInds[0] - 1);
+			refreshAvailableLayersTree();
+		}
+
+		if (e.getSource() == newLayerNameTextField) {
+			try {
+				JTabbedPane jtp = ((JTabbedPane) parentWizard.getParent());
+				FOpenDialog fod = (FOpenDialog) jtp.getParent();
+				JPanel jp = (JPanel) fod.getComponent(1);
+				JButton acceptButton = (JButton) jp.getComponent(0);
+				ActionListener[] clickListeners = acceptButton
+						.getActionListeners();
+				ActionEvent artificialEvent = new ActionEvent(acceptButton,
+						ActionEvent.ACTION_PERFORMED, "");
+				if (!acceptButton.isEnabled())
+					return;
+				for (int i = 0; i < clickListeners.length; i++)
+					clickListeners[i].actionPerformed(artificialEvent);
+			} catch (RuntimeException e1) {
+				logger.error("Unable to send the click event to the FOpenDialog 'Accept' button. ", e1);
+			}
+		}
+
+		if (e.getSource() == changeServerButton) {
+			this.parentWizard.setEnabledPanels("main");
+		}
+
+		if (e.getSource() == serviceInfoNextButton) {
+			int currentTab = this.imgServiceTabbedPane.getSelectedIndex();
+			int maxTab = this.imgServiceTabbedPane.getTabCount() - 1;
+			if (currentTab < maxTab)
+				imgServiceTabbedPane.setSelectedIndex(currentTab + 1);
+		}
+
+		if (e.getSource() == serviceInfoPreviousButton) {
+			int currentTab = this.imgServiceTabbedPane.getSelectedIndex();
+			if (currentTab > 0) {
+				imgServiceTabbedPane.setSelectedIndex(currentTab - 1);
+			} else {
+				if (currentTab == 0) {
+					parentWizard.setEnabledPanels("main");
+				}
+			}
+		}
+	}
+
+	public void keyTyped(KeyEvent e) {
+	}
+
+	public void keyPressed(KeyEvent e) {
+	}
+
+	/**
+	 * Listens to changes in the text field where the new layer's name is typed.
+	 * The decision whether the wizard is ready to finish or not depends on this
+	 * event too.
+	 */
+	public void keyReleased(KeyEvent e) {
+		if (e.getSource() == newLayerNameTextField) {
+			this.parentWizard.setNewLayerName(this.newLayerNameTextField
+					.getText());
+			this.parentWizard.fireWizardComplete(this.isCorrectlyConfigured());
+		}
+	}
+
+	/**
+	 * This method initializes serviceDetailsTable
+	 * 
+	 * @return JEditorPane
+	 */
+	protected JEditorPane getServiceDetailsTable() {
+		if (serviceDetailsTable == null) {
+			serviceDetailsTable = new JEditorPane();
+			serviceDetailsTable.setContentType("text/html");
+			serviceDetailsTable.setEditable(false);
+			String htmlInfo = this.getFormattedHtmlInfo(
+					serviceDetailsTableDataVector,
+					serviceDetailsTableColumnNamesVector);
+			serviceDetailsTable.setText(htmlInfo);
+		}
+		return serviceDetailsTable;
+	}
+
+	public void loadServiceDetailsTable(ServiceInformation si) {
+
+		Vector data = new Vector();
+		Vector item = new Vector();
+		Vector cols = new Vector();
+
+		if (si != null) {
+			// A valid ArcImsProtocolHandler.ServiceInformation parameter
+			cols.add(PluginServices.getText(this, "property"));
+			cols.add(PluginServices.getText(this, "value"));
+
+			if (si.getEnvelope() != null) {
+				item.add(PluginServices.getText(this, "xrange"));
+				item.add("[ "
+						+ ServicesTableModel.leaveNDigits(si.getEnvelope().getXmin(), 10)
+						+ ", "
+						+ ServicesTableModel.leaveNDigits(si.getEnvelope().getXmax(), 10)
+						+ " ]");
+				data.add(item.clone());
+				item.removeAllElements();
+				item.add(PluginServices.getText(this, "yrange"));
+				item.add("[ "
+						+ ServicesTableModel.leaveNDigits(si.getEnvelope().getYmin(), 10)
+						+ ", "
+						+ ServicesTableModel.leaveNDigits(si.getEnvelope().getYmax(), 10)
+						+ " ]");
+				data.add(item.clone());
+				item.removeAllElements();
+			} else {
+				item.add(PluginServices.getText(this, "xrange"));
+				item.add(PluginServices.getText(this, "not_available"));
+				data.add(item.clone());
+				item.removeAllElements();
+				item.add(PluginServices.getText(this, "yrange"));
+				item.add(PluginServices.getText(this, "not_available"));
+				data.add(item.clone());
+				item.removeAllElements();
+			}
+			if (si.getLocale().getLanguage().length() > 0) {
+				item.add(PluginServices.getText(this, "language"));
+				item.add(lowerPS(si.getLocale().getLanguage() + "_language"));
+				data.add(item.clone());
+				item.removeAllElements();
+			} else {
+				item.add(PluginServices.getText(this, "language"));
+				item.add(PluginServices.getText(this, "not_available"));
+				data.add(item.clone());
+				item.removeAllElements();
+			}
+			if (si.getMapunits().length() > 0) {
+				item.add(PluginServices.getText(this, "units"));
+				item.add(lowerPS(si.getMapunits()));
+				data.add(item.clone());
+				item.removeAllElements();
+			} else {
+				item.add(PluginServices.getText(this, "units"));
+				item.add(PluginServices.getText(this, "not_available"));
+				data.add(item.clone());
+				item.removeAllElements();
+			}
+			if (si.getLocale().getCountry().length() > 0) {
+				item.add(PluginServices.getText(this, "country"));
+				item.add(lowerPS(si.getLocale().getCountry() + "_country"));
+				data.add(item.clone());
+				item.removeAllElements();
+			} else {
+				item.add(PluginServices.getText(this, "country"));
+				item.add(PluginServices.getText(this, "not_available"));
+				data.add(item.clone());
+				item.removeAllElements();
+			}
+			if (si.getFeaturecoordsys().length() > 0) {
+				item.add(PluginServices.getText(this, "coord_system"));
+				item.add(si.getFeaturecoordsys());
+				data.add(item.clone());
+				item.removeAllElements();
+			} else {
+				item.add(PluginServices.getText(this, "coord_system"));
+				item.add(PluginServices.getText(this, "not_available"));
+				data.add(item.clone());
+				item.removeAllElements();
+			}
+			if (si.getScreen_dpi() != -1) {
+				item.add("DPI");
+				item.add(Integer.toString(si.getScreen_dpi()));
+				data.add(item.clone());
+				item.removeAllElements();
+			} else {
+				item.add("DPI");
+				item.add(PluginServices.getText(this, "default") + ", 96");
+				data.add(item.clone());
+				item.removeAllElements();
+			}
+			
+			if (this instanceof ImageServicePanel) {
+				if (si.getImagelimit_pixelcount().length() > 0) {
+					item.add(PluginServices.getText(this, "max_no_of_pixels"));
+					item.add(si.getImagelimit_pixelcount());
+					data.add(item.clone());
+					item.removeAllElements();
+				} else {
+					item.add(PluginServices.getText(this, "max_no_of_pixels"));
+					item.add(PluginServices.getText(this, "not_available"));
+					data.add(item.clone());
+					item.removeAllElements();
+				}
+			}
+		} else {
+			// A null ServiceInformation parameter (we must empty the
+			// table). do nothing, because 'data' and 'cols' vectors are empty
+		}
+
+		serviceDetailsTableDataVector = (Vector) data.clone();
+		serviceDetailsTableColumnNamesVector = (Vector) cols.clone();
+		serviceDetailsTable = null;
+		serviceDetailsTable = getServiceDetailsTable();
+		serviceDetailsScrollPane.setBounds(new java.awt.Rectangle(0, 0, 470 - 14, 345 + 31));
+		serviceDetailsScrollPane.setViewportView(serviceDetailsTable);
+	}
+
+	protected ImageIcon createImageIcon(String path) {
+		java.net.URL imgURL = createResourceUrl(path);
+		if (imgURL != null) {
+			return new ImageIcon(imgURL);
+		} else {
+			logger.error("File not found: " + path);
+			return null;
+		}
+	}
+
+	protected void setNextPreviousEnabled(int selectedTab) {
+		int lastTabIndex = imgServiceTabbedPane.getTabCount() - 1;
+		serviceInfoNextButton.setEnabled(selectedTab < lastTabIndex);
+		serviceInfoPreviousButton.setEnabled(
+				(selectedTab > 0) || (!isProperties)
+				 );
+	}
+
+	public void stateChanged(ChangeEvent e) {
+		if (e.getSource() == imgServiceTabbedPane) {
+			setNextPreviousEnabled(imgServiceTabbedPane.getSelectedIndex());
+		}
+	}
+
+	public void setServiceInfoTabNumber(int i) {
+		imgServiceTabbedPane.setSelectedIndex(i);
+	}
+
+	protected String getFormattedHtmlInfo(Vector data, Vector colnames) {
+		String location_title_text = PluginServices
+				.getText(this, "data_origin");
+		String properties_title_text = PluginServices.getText(this,
+				"properties");
+
+		String server_title = PluginServices.getText(this, "server");
+		String service_name_title = PluginServices.getText(this, "service");
+		String service_type_title = PluginServices
+				.getText(this, "service_type");
+
+		String serverURL = parentWizard.getHostName();
+		String serviceName = parentWizard.getServiceName();
+		String serviceType = lowerPS(parentWizard.getServiceType());
+
+		String html = "<html><body>\n"
+				+ "<table align=\"center\" width=\"425\" border=\"0\" cellpadding=\"4\" cellspacing=\"4\">\n"
+				+ "<tr valign=\"top\" bgcolor=\"#FFFFFF\">\n"
+				+ "<td height=\"18\" bgcolor=" + bgColor3
+				+ " colspan=\"2\"><font face=\"" + font + "\" size=\"4\"><b>"
+				+ location_title_text + "</font></b></td>\n</tr>\n";
+		html = html
+				+ "<tr valign=\"top\" bgcolor="
+				+ bgColor0
+				+ ">\n"
+				+ "<td width=\"110\" height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\""
+				+ font + "\" size=\"3\"><b>" + server_title
+				+ "</b></font></td>" + "<td><font face=\"" + font
+				+ "\" size=\"3\">" + serverURL + "</font></td>\n</tr>\n";
+		html = html
+				+ "<tr valign=\"top\" bgcolor="
+				+ bgColor0
+				+ ">\n"
+				+ "<td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\""
+				+ font + "\" size=\"3\"><b>" + service_name_title
+				+ "</b></font></td>" + "<td bgcolor=\"#eaeaea\"><font face=\"" + font
+				+ "\" size=\"3\">" + serviceName
+				+ "</font></td>\n</tr>\n";
+		html = html
+				+ "<tr valign=\"top\" bgcolor="
+				+ bgColor0
+				+ ">\n"
+				+ "<td height=\"18\" bgcolor=\"#D6D6D6\" align=\"right\"><font face=\""
+				+ font + "\" size=\"3\"><b>" + service_type_title
+				+ "</b></font></td>" + "<td><font face=\"" + font
+				+ "\" size=\"3\">" + serviceType
+				+ "</font></td>\n</tr>\n</table>\n\n";
+		html = html
+				+ "<table align=\"center\" width=\"425\" border=\"0\" cellpadding=\"4\" cellspacing=\"4\">\n"
+				+ "<tr valign=\"top\" bgcolor=\"#FFFFFF\">\n"
+				+ "<td height=\"18\" bgcolor=" + bgColor3
+				+ " colspan=\"2\"><font face=\"" + font + "\" size=\"4\"><b>"
+				+ properties_title_text + "</font></b></td>\n</tr>\n";
+		for (int i = 0; i < data.size(); i++) {
+			html = html + getTwoStringsOfNthItemIntoHtmlCode(data, i);
+		}
+		html = html + "</table>\n</body></html>";
+		return html;
+	}
+
+	protected String getTwoStringsOfNthItemIntoHtmlCode(Vector d, int i) {
+		String string_1 = (String) ((Vector) d.get(i)).get(0);
+		String string_2 = (String) ((Vector) d.get(i)).get(1);
+		String bgrColor[] = new String[2];
+		bgrColor[0] = "\"#feedd6\""; 
+		bgrColor[1] = "\"#eaeaea\"";
+		
+		String response = "<tr valign=\"top\">\n"
+				+ "    <td width=\"110\" height=\"18\" bgcolor=\"#d6d6d6\" align=\"right\"><font face=\""
+				+ font + "\" size=\"3\"><b>" + string_1 + "</b></font></td>"
+				+ "    <td bgcolor=" + bgrColor[i % 2] + "><font face=\"" + font + "\" size=\"3\">" + string_2
+				+ "</font></td>" + "\n</tr>\n";
+		return response;
+	}
+
+	public void valueChanged(TreeSelectionEvent e) {
+		if (e.getSource() == availableLayersTree) {
+			availableLayersTree.removeSelectionRow(0);
+		}
+	}
+
+	public void itemStateChanged(ItemEvent e) {
+		if (e.getSource() == showIdCheckBox) {
+			setShowIdsToTwoLists(showIdCheckBox.isSelected());
+			refreshAvailableLayersTree();
+			refreshSelectedLayersList();
+		}
+	}
+
+	protected void setShowIdsToTwoLists(boolean show) {
+		// available layers tree:
+		DefaultMutableTreeNode dmtn;
+		LayersListElement lle;
+		Object root = availableLayersTreeModel.getRoot();
+		int nofchildren = availableLayersTreeModel.getChildCount(root);
+		for (int i = 0; i < nofchildren; i++) {
+			dmtn = (DefaultMutableTreeNode) availableLayersTreeModel.getChild(
+					root, i);
+			lle = (LayersListElement) dmtn.getUserObject();
+			lle.setShowIds(show);
+		}
+		availableLayersTree.repaint();
+
+		// selected layers list:
+		for (int i = 0; i < orderedLayersListModel.size(); i++) {
+			lle = (LayersListElement) orderedLayersListModel.get(i);
+			lle.setShowIds(show);
+		}
+		orderedLayersList.repaint();
+	}
+
+	public void refreshAvailableLayersTree() {
+		setAvailableLayersTree(null);
+		availableLayersTree = getAvailableLayersTree();
+		availableLayersScrollPane.setViewportView(availableLayersTree);
+	}
+
+	public void refreshSelectedLayersList() {
+		setOrderedLayersList(null);
+		orderedLayersList = getOrderedLayersList();
+		selectedLayersScrollPane.setViewportView(orderedLayersList);
+	}
+
+	public JButton getChangeServerButton() {
+		return changeServerButton;
+	}
+
+	public void mouseClicked(MouseEvent e) {
+		if ((e.getSource() == this.availableLayersTree) && (e.getClickCount() == 2)) {
+			ActionEvent artificialEvent =
+				new ActionEvent(this.addLayerButton, ActionEvent.ACTION_PERFORMED, "");
+			this.actionPerformed(artificialEvent);
+		}
+	}
+
+	public void mouseEntered(MouseEvent e) { }
+	public void mouseExited(MouseEvent e) {	}
+	public void mousePressed(MouseEvent e) { }
+	public void mouseReleased(MouseEvent e) { }
+
+	public JPanel getImgServiceTab_2() {
+		return imgServiceTab_2;
+	}
+
+	public JButton getServiceInfoNextButton() {
+		return serviceInfoNextButton;
+	}
+
+	public JPanel getChangeServerPanel() {
+		return changeServerPanel;
+	}
+	
+	private String lowerPS(String str) {
+		return PluginServices.getText(this, str.toLowerCase());
+		
+	}
+	
+	protected java.net.URL createResourceUrl(String path) {
+		return getClass().getClassLoader().getResource(path);
+	}
+	
+	public boolean isGroupOptionSelected() {
+		return groupCheckBox.isSelected();
+	}
+
+	public void setTextInVersionLabel(String vers) {
+		versionLabel.setText(vers);
+	}
+	
+	private boolean isVisibleByDefault(ServiceInformation _si, String layerid) {
+		int layercount = _si.getLayers().size();
+		for (int i=0; i<layercount; i++) {
+			ServiceInformationLayer sil =
+				(ServiceInformationLayer) _si.getLayerById(layerid);
+			if (isTrueString(sil.getVisible())) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	private boolean isTrueString(String visible) {
+		if (visible.compareToIgnoreCase("true") == 0) {
+			return true;
+		}
+		return false;
+	}	
+	
+
+	
+} // @jve:decl-index=0:visual-constraint="10,10"

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/FeatureServicePanel.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/LayersListElement.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/LayersListElement.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/LayersListElement.java	(revision 8301)
@@ -0,0 +1,191 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import java.util.Vector;
+
+import javax.swing.JComponent;
+
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerImage;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+import com.iver.andami.PluginServices;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.LayerScaleData;
+
+/**
+ * Implements the class used as a list element in most lists
+ * in this plugin. 
+ * 
+ * @author jldominguez
+ *
+ */
+public class LayersListElement extends JComponent {
+	
+	private String name, type, id, theFclasstype, visible, mapUnits;
+	private double maxscale, minscale;
+	private BoundaryBox envelope;
+	private boolean showIds = false;
+	private boolean isAdded = false;
+	private int theDPI;
+	private static final long serialVersionUID = 0;
+	
+	public boolean isAdded() {
+		return isAdded;
+	}
+	public void setAdded(boolean isAdded) {
+		this.isAdded = isAdded;
+	}
+	public void setShowIds(boolean show) {
+		this.showIds = show;
+	}
+	public String getID() { return id; }
+	public String getName() { return name; }
+	
+	public LayersListElement(ServiceInformationLayer sil, String mapunits, int dpi) {
+		if (sil instanceof ServiceInformationLayerImage) {
+			ServiceInformationLayerImage sili = (ServiceInformationLayerImage) sil;
+			id = sili.getId(); if (id == null) id = "";
+			name = sili.getName(); if (name == null) name = "";
+			type = sili.getType(); if (type == null) type = "";
+			theFclasstype = "";
+			maxscale = sili.getMaxscale(); minscale = sili.getMinscale();
+			visible = sili.getVisible(); if (visible == null) visible = "";
+			envelope = sili.getEnvelope();
+		}
+		
+		if (sil instanceof ServiceInformationLayerFeatures) {
+			ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) sil;
+			id = silf.getId(); if (id == null) id = "";
+			name = silf.getName(); if (name == null) name = "";
+			type = silf.getType(); if (type == null) type = "";
+			theFclasstype = silf.getFclasstype(); if (theFclasstype == null) theFclasstype = "";
+			maxscale = silf.getMaxscale(); minscale = silf.getMinscale();
+			visible = silf.getVisible(); if (visible == null) visible = "";
+			envelope = silf.getEnvelope();
+		}
+		mapUnits = mapunits; theDPI = dpi;
+	}
+	private String boundaryBoxXRangeToString(BoundaryBox bb) {
+		String r = "[ " + ServicesTableModel.leaveNDigits(bb.getXmin(), 10) + " , ";
+		r = r + ServicesTableModel.leaveNDigits(bb.getXmax(), 10) + " ]";
+		return r;
+	}
+	
+	private String boundaryBoxYRangeToString(BoundaryBox bb) {
+		String r = "[ " + ServicesTableModel.leaveNDigits(bb.getYmin(), 10) + " , ";
+		r = r + ServicesTableModel.leaveNDigits(bb.getYmax(), 10) + " ]";
+		return r;
+	}
+	
+
+	/**
+	 * Gets a description of the layer to be shown on one of the
+	 * wizard's panes.
+	 * 
+	 * @return a description of the layer
+	 */
+	public Vector getDataVector() {
+		long true_scale;
+		Vector data = new Vector();
+		Vector item = new Vector();
+		
+		item.add("ID"); item.add(id);
+		data.add(item.clone()); item.removeAllElements();
+		
+		item.add(PluginServices.getText(this, "name"));
+		item.add(name); data.add(item.clone()); item.removeAllElements();
+		
+		item.add(PluginServices.getText(this, "type"));
+		item.add(PluginServices.getText(this, type)); data.add(item.clone()); item.removeAllElements();
+		
+		item.add(PluginServices.getText(this, "vector_type"));
+		if (theFclasstype.length() != 0) { item.add(PluginServices.getText(this, theFclasstype)); } else {
+			item.add(PluginServices.getText(this, "not_available"));
+		}
+		data.add(item.clone()); item.removeAllElements();
+		
+		item.add(PluginServices.getText(this, "max_scale"));
+		true_scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(maxscale, mapUnits, theDPI);
+		if (maxscale != -1.0) { item.add("1 : " + String.valueOf(true_scale)); } else {
+			item.add(PluginServices.getText(this, "not_available"));
+		}
+		data.add(item.clone()); item.removeAllElements();
+		
+		item.add(PluginServices.getText(this, "min_scale"));
+		true_scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(minscale, mapUnits, theDPI);
+		if (minscale != -1.0) { item.add("1 : " + String.valueOf(true_scale)); } else {
+			item.add(PluginServices.getText(this, "not_available"));
+		}
+		data.add(item.clone()); item.removeAllElements();
+		
+		item.add(PluginServices.getText(this, "visible"));
+		if (visible.length() != 0) { item.add(visible); } else {
+			item.add(PluginServices.getText(this, "not_available"));
+		}
+		data.add(item.clone()); item.removeAllElements();
+		
+		if (envelope == null) {
+			item.add(PluginServices.getText(this, "envelope"));
+			item.add(PluginServices.getText(this, "not_available"));
+			data.add(item.clone()); item.removeAllElements();
+		} else {
+			item.add(PluginServices.getText(this, "envelope") + " (" + PluginServices.getText(this, "xrange") + ")");
+			item.add(boundaryBoxXRangeToString(envelope));
+			data.add(item.clone()); item.removeAllElements();
+			item.add(PluginServices.getText(this, "envelope") + " (" + PluginServices.getText(this, "yrange") + ")");
+			item.add(boundaryBoxYRangeToString(envelope));
+			data.add(item.clone()); item.removeAllElements();
+		}
+		return data;
+	}
+	
+	/**
+	 * Implements the toString() method automatically invoqued by the system
+	 * to paint a list.
+	 * 
+	 * @return a String that identifies the layer on the list
+	 */
+	public String toString() {
+		if (showIds) {
+			return  "[" + id + "] " + name;
+		} else {
+			// String tail = repeatString(" ", id.length() + 5);
+			// return  name + tail;
+			return name;
+		}
+	 }
+	
+	public String toolTipText() {
+		Vector v = getDataVector();
+		Vector vv = null;
+		String r = "";
+		for (int i=0; i<v.size(); i++) {
+			vv = (Vector) v.get(i);
+			r = r + "\n " + ((String) vv.get(0)) + ": ";
+			r = r + ((String) vv.get(1)) + " ";
+		}
+		r = r.substring(1);
+		return r;
+	}
+	
+	/**
+	 * Utility method. 
+	 * @param array
+	 * @param s
+	 * @return index of the first occurrence of <tt>s</tt> in <tt>array</tt>.
+	 */
+	public static int getFirstIndexInIntArray(int[] array, int s) {
+		for (int i = 0; i < array.length; i++) {
+			if (array[i] == s) return i; 
+		}
+		return -1;
+	}
+	
+	public static String repeatString(String s, int n) {
+		String r = "";
+		for (int i = 0; i < n; i++) r = r + s;
+		return r;
+	}
+	
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/LayersListElement.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableDataSource.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableDataSource.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableDataSource.java	(revision 8301)
@@ -0,0 +1,203 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import java.awt.geom.Rectangle2D;
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import javax.swing.event.TableModelListener;
+import javax.swing.table.TableModel;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.JTable;
+import javax.swing.JLabel;
+import java.lang.NoSuchMethodException;
+
+import org.kxml2.io.KXmlParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.FeatureServicePanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.ServiceNamesPanel.*;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.ArcImsDownloadUtils;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+import com.iver.andami.PluginServices;
+
+
+/**
+* This class is used to get and use the data model of the
+* available services table.
+
+* @author jldominguez
+*/
+
+
+public class ServicesTableDataSource {
+	private Vector colNames;
+	private Vector data; // vector of vectors
+	
+	protected static Logger logger = Logger.getLogger(ServicesTableDataSource.class.getName());
+	private String nameColString = PluginServices.getText(this, "name");
+	private String typeColString = PluginServices.getText(this, "arcims_server_type_col_name");
+	private String statusColString = PluginServices.getText(this, "arcims_server_status_col_name");
+	
+	
+	/**
+	* The constructor is called with the server's URL as a parameter.
+	* Sets the columns names to "Name", "Type" and 
+	* "Status" and gets the table data by sending a request to the server.
+	 * @throws ArcImsException 
+	*/
+	public ServicesTableDataSource(URL svrURL, boolean overrride) throws ArcImsException {
+		colNames = new Vector();
+		loadDataAndColNames(svrURL, overrride);
+		if (data.size() > 0) {
+			colNames.addElement(nameColString);
+			colNames.addElement(typeColString);
+			colNames.addElement(statusColString);
+		}
+	}
+
+	/**
+	* Gets a vector with the column names.
+	* 
+	* @return the vector with the column names.
+	*/
+	public Vector getColNamesVector() { return colNames; }
+	
+	/**
+	* Gets a vector with the table's data.
+	* 
+	* @return the table's data is a vector of vectors
+	*/
+	public Vector getDataVector() { return data; } 
+
+	/**
+	* Sends a request to the server (ServiceName=catalog)
+	* and loads the private vectors (data and column names)
+	 * @param tmpDriver 
+	* 
+	* @param serverURL server's URL
+	 * @throws ArcImsException 
+	*/
+	private void loadDataAndColNames(URL serverURL, boolean override) throws ArcImsException {
+		
+		ArrayList _services = ArcImsProtocolHandler.getCatalog(serverURL, override);
+		
+		ArrayList services = leaveKnownServices(_services);
+		
+		data = new Vector();
+		
+		TreeSet auxTree = new TreeSet();
+		for (int i=0; i<services.size(); i++) {
+			ArrayList item = (ArrayList) services.get(i);
+			auxTree.add(item.get(0));
+		}
+		
+		Iterator iter = auxTree.iterator();
+		while (iter.hasNext()) {
+			String name = (String) iter.next();
+			data.add( getItemWithName(services, name) );
+		}
+		
+		
+//		for (int i=0; i<services.size(); i++) {
+//			ArrayList item = (ArrayList) services.get(i);
+//			Vector vv = new Vector();
+//			vv.addElement( item.get(0) );
+//			vv.addElement( item.get(1) );
+//			vv.addElement( item.get(2) );
+//			// int insert = getInsertPosition(String str, data);
+//			// data.insertElementAt(vv); //, insert);
+//		}
+	}
+	
+	private ArrayList leaveKnownServices(ArrayList list) {
+		ArrayList resp = new ArrayList();
+		ArrayList item;
+		String type, enabled;
+		
+		for (int i=0; i<list.size(); i++) {
+			item = (ArrayList) list.get(i);
+			type = (String) item.get(1);
+			enabled = (String) item.get(2);
+			if (isKnownServiceType(type) && (isEnabled(enabled))) {
+				resp.add((ArrayList) item.clone());
+			}
+		}
+		return resp;
+	}
+
+	private boolean isEnabled(String str) {
+		if (str.compareToIgnoreCase("enabled") == 0) {
+			return true;
+		}
+		return false;
+	}
+
+	private boolean isKnownServiceType(String type) {
+		if (type.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			return true;
+		}
+		if (type.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			return true;
+		}
+		return false;
+	}
+	
+	private Vector getItemWithName(ArrayList allitems, String name) {
+		
+		for (int i=0; i<allitems.size(); i++) {
+			if (((String) ((ArrayList) allitems.get(i)).get(0)).compareToIgnoreCase(name) == 0) {
+				Vector vv = new Vector();
+				vv.addElement( ((ArrayList) allitems.get(i)).get(0) );
+				vv.addElement( ((ArrayList) allitems.get(i)).get(1) );
+				vv.addElement( ((ArrayList) allitems.get(i)).get(2) );
+				return vv;
+			}
+		}
+		logger.error("Service name not found ");
+		return null;
+	}
+	
+	private int getInsertPosition(String str, Vector data) {
+		for (int i=0; i<data.size(); i++) {
+			String aux = (String) ((ArrayList) data.get(i)).get(0);
+			if (aux.compareToIgnoreCase(str) > 0) {
+				return i;
+			}
+		}
+		return data.size();
+	}
+	
+	/**
+	* Gets the name of the <i>n</i>th column (<i>n</i> = columnIndex)
+	* 
+	* @return column name
+	*/
+	public String getColumnName(int columnIndex) {
+		if (columnIndex == 0) { return nameColString; }
+		if (columnIndex == 1) { return typeColString; }
+		if (columnIndex == 2) { return statusColString; }
+		return "(Columna desconocida)";
+	}
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableDataSource.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/AvailableLayersTreeCellRenderer.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/AvailableLayersTreeCellRenderer.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/AvailableLayersTreeCellRenderer.java	(revision 8301)
@@ -0,0 +1,79 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import java.awt.Color;
+import java.awt.Component;
+
+import javax.swing.JComponent;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+
+/**
+ * This class overrides the jtree cell renderer to allow
+ * a different tool tip for each node.
+ * 
+ * @author jldominguez
+ *
+ */
+public class AvailableLayersTreeCellRenderer extends DefaultTreeCellRenderer {
+
+	/**
+	 * Colors used to indicate whether a node has been added or not.
+	 * This has a sense in the FeatureServicePanel:
+	 * 
+	 * @see es.prodevelop.cit.gvsig.arcims.gui.panels.FeatureServicePanel
+	 */
+	private Color addedLeafForeground = Color.LIGHT_GRAY;
+	private Color notAddedLeafForeground = Color.BLACK;
+	private static final long serialVersionUID = 0;
+
+	
+	/**
+	 * This method sets the specific tool tip for each node
+	 * and the root node
+	 */
+	public Component getTreeCellRendererComponent(JTree tree, Object value,
+			boolean selected, boolean expanded, boolean leaf, int row,
+			boolean hasFocus) {
+
+		Component c = super.getTreeCellRendererComponent(tree, value, selected,
+				expanded, leaf, row, hasFocus);
+		JComponent jc;
+		
+		DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) value;
+		Object innerObj = dmtn.getUserObject();
+		if (innerObj instanceof LayersListElement) {
+			// tree nodes, with the LayersListElement's tool tip
+			LayersListElement lle = (LayersListElement) dmtn.getUserObject();
+			c.setForeground(this.getLeafForegroundColor(leaf, lle.isAdded(), selected));
+			jc = (JComponent) c;
+			jc.setToolTipText(lle.toolTipText()); 		
+		}
+		if (innerObj instanceof ServiceNamesObject) {
+			// tree root node, with the ServiceNamesObject's tool tip
+			ServiceNamesObject sno = (ServiceNamesObject) dmtn.getUserObject(); 
+			jc = (JComponent) c;
+			jc.setToolTipText(sno.toolTipText()); 		
+		}
+		return c;
+	}
+
+	/**
+	 * Gets the tree node's font color.
+	 * 
+	 * @param lf whether it is a leaf or not.
+	 * @param added whether the node has been added or not.
+	 * @param sel whether the node is selected or not.
+	 * @return the node's font color.
+	 */
+	private Color getLeafForegroundColor(boolean lf, boolean added, boolean sel) {
+		if (!lf) return Color.BLACK;
+		if (sel) return Color.WHITE;
+		if (added) {
+			return addedLeafForeground;
+		} else {
+			return notAddedLeafForeground;
+		}
+	}
+	
+}
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/AvailableLayersTreeCellRenderer.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/JMultilineToolTip.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/JMultilineToolTip.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/JMultilineToolTip.java	(revision 8301)
@@ -0,0 +1,47 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import javax.swing.JToolTip;
+
+/**
+ * This class allows nice multiline tool tips.
+ *  
+ * @author Zafir Anjum
+ * @author jldominguez
+ */
+public class JMultilineToolTip extends JToolTip {
+
+	private static final long serialVersionUID = 0;
+
+
+	String tipText;
+
+	public JMultilineToolTip() {
+		updateUI();
+	}
+	
+	public void updateUI() {
+		setUI(MultilineToolTipUI.createUI(this));
+	}
+
+	public void setColumns(int columns) {
+		this.columns = columns;
+		this.fixedwidth = 0;
+	}
+
+	public int getColumns() {
+		return columns;
+	}
+
+	public void setFixedWidth(int width) {
+		this.fixedwidth = width;
+		this.columns = 0;
+	}
+
+	public int getFixedWidth() {
+		return fixedwidth;
+	}
+	
+	protected int columns = 0;
+
+	protected int fixedwidth = 0;
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/JMultilineToolTip.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableSelectionListener.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableSelectionListener.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableSelectionListener.java	(revision 8301)
@@ -0,0 +1,58 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.DefaultTableColumnModel;
+
+import org.apache.log4j.Logger;
+
+import com.iver.andami.PluginServices;
+
+import es.prodevelop.cit.gvsig.arcims.gui.panels.ServiceNamesPanel;
+
+/**
+ * This class detects changes on the available services list.
+ * 
+ * @author jldominguez
+ */
+public class ServicesTableSelectionListener extends DefaultTableColumnModel {
+	
+	private static Logger logger = Logger.getLogger(ServicesTableSelectionListener.class.getName());
+	private ServiceNamesPanel thePanel;
+	private static final long serialVersionUID = 0;
+
+	public ServicesTableSelectionListener(ServiceNamesPanel panel) {
+		super();
+		thePanel = panel;
+	}
+
+	/**
+	 * Updates local variables which keep the service's name and type. The
+	 * service name must be in the first column of the table; the service type
+	 * must be in the second column.
+	 */
+	public void valueChanged(ListSelectionEvent e) {
+		if (e.getValueIsAdjusting())
+			return;
+		if (thePanel == null)
+			return;
+		if (thePanel.getServicesTable() == null)
+			return;
+
+		int i = thePanel.getServicesTable().getSelectedRow();
+		if (i == -1)
+			return; // no selection
+
+		thePanel.setSelectedServiceType(ServicesTableModel.getColumnValueOfRow(
+				thePanel.getServicesTable(), PluginServices.getText(this,
+						"arcims_server_type_col_name"), i));
+
+		thePanel.setSelectedServiceName(ServicesTableModel
+				.getColumnValueOfRow(thePanel.getServicesTable(), PluginServices
+						.getText(this, "name"), i));
+
+		thePanel.getNextButton().setEnabled(true);
+
+		logger.info("New selection in services table: type = " + thePanel.getSelectedServiceType()
+				+ ", name = " + thePanel.getSelectedServiceName());
+	}
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableSelectionListener.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/MultilineToolTipUI.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/MultilineToolTipUI.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/MultilineToolTipUI.java	(revision 8301)
@@ -0,0 +1,107 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Insets;
+
+import javax.swing.CellRendererPane;
+import javax.swing.JComponent;
+import javax.swing.JTextArea;
+import javax.swing.JToolTip;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.basic.*;
+
+/**
+ * This class allows nice multiline tool tips.
+ * 
+ * @author Zafir Anjum
+ * @author jldominguez
+ */
+public class MultilineToolTipUI extends BasicToolTipUI {
+	static MultilineToolTipUI sharedInstance = new MultilineToolTipUI();
+
+	Font smallFont = new Font("Dialog", Font.PLAIN, 12);
+	// Dialog, SansSerif - similar to Arial
+	// DialogInput, Monospaced - similar to Courier
+	// Serif - similar to Times New Roman 
+
+	static JToolTip tip;
+	protected CellRendererPane rendererPane;
+	private static JTextArea textArea;
+
+	public static ComponentUI createUI(JComponent c) {
+		return sharedInstance;
+	}
+
+	public MultilineToolTipUI() {
+		super();
+	}
+
+	public void installUI(JComponent c) {
+		super.installUI(c);
+		tip = (JToolTip) c;
+		rendererPane = new CellRendererPane();
+		c.add(rendererPane);
+	}
+
+	public void uninstallUI(JComponent c) {
+		super.uninstallUI(c);
+
+		c.remove(rendererPane);
+		rendererPane = null;
+	}
+
+	public void paint(Graphics g, JComponent c) {
+		Dimension size = c.getSize();
+		rendererPane.paintComponent(g, textArea, c, 1, 1, size.width - 1,
+				size.height - 1, true);
+	}
+
+	/**
+	 * Overrides a method that is called by the system and,
+	 * at the same time, creates a nice textarea and displays the tool tip in it.
+	 */
+	public Dimension getPreferredSize(JComponent c) {
+		String tipText = ((JToolTip) c).getTipText();
+		if (tipText == null)
+			return new Dimension(0, 0);
+		textArea = new JTextArea(tipText);
+		textArea.setMargin(new Insets(10, 10, 10, 10));
+		textArea.setBackground(tip.getBackground());
+		rendererPane.removeAll();
+		rendererPane.add(textArea);
+		textArea.setWrapStyleWord(true);
+		textArea.setFont(smallFont);
+		int width = ((JMultilineToolTip) c).getFixedWidth();
+		int columns = ((JMultilineToolTip) c).getColumns();
+
+		if (columns > 0) {
+			textArea.setColumns(columns);
+			textArea.setSize(0, 0);
+			textArea.setLineWrap(true);
+			textArea.setSize(textArea.getPreferredSize());
+		} else if (width > 0) {
+			textArea.setLineWrap(true);
+			Dimension d = textArea.getPreferredSize();
+			d.width = width;
+			d.height++;
+			textArea.setSize(d);
+		} else
+			textArea.setLineWrap(false);
+
+		Dimension dim = textArea.getPreferredSize();
+
+		dim.height += 1; 
+		dim.width += 1; 
+		return dim;
+	}
+
+	public Dimension getMinimumSize(JComponent c) {
+		return getPreferredSize(c);
+	}
+
+	public Dimension getMaximumSize(JComponent c) {
+		return getPreferredSize(c);
+	}
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/MultilineToolTipUI.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/SelectedLayersListCellRenderer.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/SelectedLayersListCellRenderer.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/SelectedLayersListCellRenderer.java	(revision 8301)
@@ -0,0 +1,79 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import java.awt.Component;
+
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+
+/**
+ * This class sets the tool tips in a JList component.
+ * 
+ * @author jldominguez
+ */
+public class SelectedLayersListCellRenderer extends DefaultListCellRenderer {
+
+	private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1,
+			1);
+	private static final long serialVersionUID = 0;
+
+	public SelectedLayersListCellRenderer() {
+		super();
+	}
+
+	/**
+	 * Sets special graphic properties (colors, and tool tips) in list elements
+	 * and returns <tt>this</tt>.
+	 */
+	public Component getListCellRendererComponent(JList list, Object value,
+			int index, boolean isSelected, boolean cellHasFocus) {
+
+		JComponent jc;
+		LayersListElement lle;
+		setComponentOrientation(list.getComponentOrientation());
+
+		if (isSelected) {
+			setBackground(list.getSelectionBackground());
+			setForeground(list.getSelectionForeground());
+		} else {
+			setBackground(list.getBackground());
+			setForeground(list.getForeground());
+		}
+
+		if (value instanceof Icon) {
+			setIcon((Icon) value);
+			setText("");
+		} else {
+			setIcon(null);
+			setText((value == null) ? "" : value.toString());
+		}
+
+		setEnabled(list.isEnabled());
+		setFont(list.getFont());
+		setBorder((cellHasFocus) ? UIManager
+				.getBorder("List.focusCellHighlightBorder")
+				: getNoFocusBorder());
+
+		// Set the specific tool tip:
+		if (value instanceof LayersListElement) {
+			lle = (LayersListElement) value;
+			jc = (JComponent) this;
+			jc.setToolTipText(lle.toolTipText());
+		}
+
+		return this;
+	}
+
+	private static Border getNoFocusBorder() {
+		if (System.getSecurityManager() != null) {
+			return SAFE_NO_FOCUS_BORDER;
+		} else {
+			return noFocusBorder;
+		}
+	}
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/SelectedLayersListCellRenderer.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServiceNamesObject.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServiceNamesObject.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServiceNamesObject.java	(revision 8301)
@@ -0,0 +1,55 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import com.iver.andami.PluginServices;
+
+/**
+* This class simply stores the name, type and status of one services that is
+* available in an ArcIMS server. It is used to model the services list in the
+* wizard's services JTable.
+
+* @author jldominguez
+*/
+public class ServiceNamesObject {
+	private String serviceName = "";
+	private String serviceType = "";
+	private String serviceStatus = "";
+
+	public ServiceNamesObject(String name, String type, String status) {
+		serviceName = name;
+		serviceType = type;
+		serviceStatus = status;
+	}
+
+	/**
+	 * Gets the service name
+	*/
+	public String getServiceName() {
+		return serviceName;
+	}
+
+	/**
+	 * Gets the service type (ImageService or FeatureService)
+	*/
+	public String getServiceType() {
+		return serviceType;
+	}
+
+	/**
+	 * Gets the service's status (should be ENABLED)
+	*/
+	public String getServiceStatus() {
+		return serviceStatus;
+	}
+	
+	public String toString() {
+		String r = " " + PluginServices.getText(this, "service") + ": " + serviceName + " ";
+		return r; 
+	}
+	
+	public String toolTipText() {
+		String r = " " + PluginServices.getText(this, "service") + ": " + serviceName +  " \n";
+		r = r + " " + PluginServices.getText(this, "service_type") + ": " + serviceType + " \n";
+		r = r + " " + PluginServices.getText(this, "status") + ": " + serviceStatus + " ";
+		return r; 
+	}
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServiceNamesObject.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ImageFormatSelector.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ImageFormatSelector.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ImageFormatSelector.java	(revision 8301)
@@ -0,0 +1,136 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.plaf.basic.BasicArrowButton;
+
+import es.prodevelop.cit.gvsig.arcims.gui.panels.FeatureServicePanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.ImageServicePanel;
+
+public class ImageFormatSelector extends JPanel implements ChangeListener {
+	
+	private JRadioButton jpgRB, gifRB, png8RB, png24RB;
+	private ButtonGroup formatBG;
+	private ActionListener listener;
+
+	public ImageFormatSelector() {
+		jpgRB = new JRadioButton("JPG", true);
+		jpgRB.addChangeListener(this);
+		jpgRB.setBounds(10, 0, 60, 20);
+		
+		gifRB =  new JRadioButton("GIF", false);
+		gifRB.addChangeListener(this);
+		gifRB.setBounds(70, 0, 60, 20);
+		
+		png8RB =  new JRadioButton("PNG8", false);
+		png8RB.addChangeListener(this);
+		png8RB.setBounds(130, 0, 60, 20);
+		
+		png24RB =  new JRadioButton("PNG24", false);
+		png24RB.addChangeListener(this);
+		png24RB.setBounds(190, 0, 60, 20); // llega hasta 10 + 4 * 60 = 250
+		
+		formatBG = new ButtonGroup();
+		
+		formatBG.add(jpgRB);
+		formatBG.add(gifRB);
+		formatBG.add(png8RB);
+		formatBG.add(png24RB);
+		
+		setLayout(null);
+		setBounds(15, 23, 260, 20);
+		
+		add(jpgRB);
+		add(gifRB);
+		add(png8RB);
+		add(png24RB);
+	}
+	
+	public void setSelected(String format) {
+		
+		setAll(false);
+		
+		if (format.compareToIgnoreCase(jpgRB.getText()) == 0) {
+			jpgRB.setSelected(true);
+		}
+		if (format.compareToIgnoreCase(gifRB.getText()) == 0) {
+			gifRB.setSelected(true);
+		}
+		if (format.compareToIgnoreCase(png8RB.getText()) == 0) {
+			png8RB.setSelected(true);
+		}
+		if (format.compareToIgnoreCase(png24RB.getText()) == 0) {
+			png24RB.setSelected(true);
+		}
+	}
+	
+	public String getSelected() {
+		if (jpgRB.isSelected()) {
+			return jpgRB.getText();
+		}
+		if (gifRB.isSelected()) {
+			return gifRB.getText();
+		}
+		if (png8RB.isSelected()) {
+			return png8RB.getText();
+		}
+		if (png24RB.isSelected()) {
+			return png24RB.getText();
+		}
+		return "";
+	}
+	
+	private void setAll(boolean selected) {
+		jpgRB.setSelected(selected);
+		gifRB.setSelected(selected);
+		png8RB.setSelected(selected);
+		png24RB.setSelected(selected);
+	}
+	
+	public void setAllEnabled(boolean enabled) {
+		jpgRB.setEnabled(enabled);
+		gifRB.setEnabled(enabled);
+		png8RB.setEnabled(enabled);
+		png24RB.setEnabled(enabled);
+	}
+	
+	public void setThisEnabled(String format) {
+		if (format.compareToIgnoreCase(jpgRB.getText()) == 0) {
+			jpgRB.setEnabled(true);
+		}
+		if (format.compareToIgnoreCase(gifRB.getText()) == 0) {
+			gifRB.setEnabled(true);
+		}
+		if (format.compareToIgnoreCase(png8RB.getText()) == 0) {
+			png8RB.setEnabled(true);
+		}
+		if (format.compareToIgnoreCase(png24RB.getText()) == 0) {
+			png24RB.setEnabled(true);
+		}
+	}
+
+	public void addListener(ImageServicePanel panel) {
+		listener = panel;
+	}
+
+	public void stateChanged(ChangeEvent arg0) {
+		if (listener != null) {
+			ActionEvent ae = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "");
+			listener.actionPerformed(ae);
+		}
+	}
+	
+	
+	
+	
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ImageFormatSelector.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableModel.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableModel.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableModel.java	(revision 8301)
@@ -0,0 +1,179 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels.utils;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableModel;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+
+import com.iver.andami.PluginServices;
+
+import java.util.Vector;
+
+/**
+* This is a subclass of the JTable's data model.
+* It simply prevents cells from being edited.
+* 
+* @see javax.swing.table.DefaultTableModel
+* 
+* @author jldominguez
+*/
+public class ServicesTableModel extends DefaultTableModel {
+	private static Logger logger = Logger.getLogger(ServicesTableModel.class.getName());
+	private static final long serialVersionUID = 0;
+
+
+	public ServicesTableModel(Vector data, Vector cols) {
+		super(data, cols);
+		
+	}
+	
+	/**
+	* Sets to <b>false</b> the possibility to edit any cell.
+	*  
+	* @return <b>false</b> (always)
+	*/
+	public boolean isCellEditable(int x, int y) { return false; }
+	
+	/**
+	 * Utility method to leave <tt>n</tt> significant digits in a double
+	 * number.
+	 * 
+	 * @param d the original number
+	 * @param n the number of significant digits desired
+	 * @return the number with n significant digits
+	 */
+	public static String leaveNDigits(double d, int n) {
+		if (d == 0.0) return "0.0";
+		
+		long integ = Math.round(d);
+		if ((d - integ) == 0) return Double.toString(d);
+		
+		long digitsBeforePoint = Math.round(Math.floor( 1.0 + (Math.log(Math.abs(d)) / Math.log(10.0)) ));
+		// if (d < 0) sigDigits++;
+		if (digitsBeforePoint >= n) {
+			logger.warn("Unable to round double: " + Double.toString(d));
+			return Double.toString(d);
+		}
+		
+		double factor = Math.pow(10.0, 1.0 * (n-digitsBeforePoint));
+		double newd = d * factor;
+		integ = Math.round(Math.floor(newd));
+		newd = 1.0 * integ / factor;
+		return Double.toString(newd);
+	}
+	
+	/**
+	 * Gets the value stored in a row under a certain column name.
+	 * 
+	 * @param t the JTable
+	 * @param colname the column name
+	 * @param row the row index
+	 * @return the value stored in the row under that column name
+	 */
+	public static String getColumnValueOfRow(JTable t, String colname, int row) {
+		for (int i=0; i<t.getColumnCount(); i++) {
+			if ((t.getColumnName(i).compareToIgnoreCase(colname)) == 0) {
+				return (String) t.getValueAt(row, i);
+			}
+		}
+		return "Not found";
+	}
+	
+	/**
+	 * Gets the value stored in a row under a certain column index.
+	 * 
+	 * @param t the JTable
+	 * @param colind the column index
+	 * @param row the row index
+	 * @return the value stored in the row under that column name
+	 */
+	public static String getColumnValueOfRowWithIndex(JTable t, int colind, int row) {
+		return (String) t.getValueAt(row, colind);
+//		for (int i=0; i<t.getColumnCount(); i++) {
+//			if ((t.getColumnName(i).compareToIgnoreCase(colname)) == 0) {
+//				return (String) t.getValueAt(row, i);
+//			}
+//		}
+		// return "Not found";
+	}
+	
+	public static int getColumnIndex(JTable t, String colName) {
+		int col_ind = -1;
+		for (int i=0; i<t.getColumnCount(); i++) {
+			if (t.getColumnName(i).compareToIgnoreCase(colName) == 0) {
+				col_ind = i;
+				break;
+			}
+		}
+		return col_ind;
+	}
+
+	/**
+	 * Finds out the index of the first row containing a certain string under
+	 * a certain column name.
+	 * 
+	 * @param t the table
+	 * @param colName the column name
+	 * @param val the value to be searched for
+	 * @return the index of the row that contains the value
+	 * @throws ArcImsException
+	 */
+	public static int getFirstRowWithValueInColumnName(JTable t, String colName, String val) throws ArcImsException {
+		ArcImsException aie;
+		
+		int col_ind = getColumnIndex(t, colName);
+		if (col_ind == -1) {
+			aie = new ArcImsException(PluginServices.getText(null, "column_not_found") + ": " + colName); 
+			logger.error("Column not found. ", aie);
+			throw aie; 
+		}
+		
+		for (int i=0; i<t.getRowCount(); i++) {
+			if (((String) t.getValueAt(i, col_ind)).compareToIgnoreCase(val) == 0) {
+				return i;
+			}
+		}
+		aie = new ArcImsException(PluginServices.getText(null, "value_not_found") + ": " + val); 
+		logger.error("Value not found in that column. ", aie);
+		throw aie; 
+	}
+	
+	/**
+	 * Finds out the index of the first row containing a certain string under
+	 * a certain column index.
+	 * 
+	 * @param t the table
+	 * @param colIndex the column index
+	 * @param val the value to be searched for
+	 * @return the index of the row that contains the value
+	 * @throws ArcImsException
+	 */
+	public static int getFirstRowWithValueInColumnIndex(JTable t, int colIndex, String val) throws ArcImsException {
+		ArcImsException aie;
+		
+		if ((colIndex < 0) || (colIndex >= t.getColumnCount())) {
+			aie = new ArcImsException(PluginServices.getText(null, "column_not_found") + ": " + colIndex); 
+			logger.error("Column not found. ", aie);
+			throw aie; 
+		}
+		
+		for (int i=0; i<t.getRowCount(); i++) {
+			if (((String) t.getValueAt(i, colIndex)).compareToIgnoreCase(val) == 0) {
+				return i;
+			}
+		}
+		aie = new ArcImsException(PluginServices.getText(null, "value_not_found") + ": " + val); 
+		logger.error("Value not found in that column. ", aie);
+		throw aie; 
+	}
+	
+	
+	
+	public void moveRow(int start,
+            int end,
+            int to) {
+		
+	}
+	
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/utils/ServicesTableModel.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/LayerScaleDrawPanel.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/LayerScaleDrawPanel.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/LayerScaleDrawPanel.java	(revision 8301)
@@ -0,0 +1,447 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+import java.awt.geom.AffineTransform;
+import java.util.Vector;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import com.iver.andami.PluginServices;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.LayerScaleData;
+import es.prodevelop.cit.gvsig.arcims.gui.dialogs.LayerScaleDialog;
+
+/**
+ * This is the 'canvas' where layer scale limits status is
+ * painted.
+ * 
+ * @author jldominguez
+ *
+ */
+public class LayerScaleDrawPanel extends JPanel {
+	
+	private LayerScaleDialog parentDialog;
+	private Vector layerLabelsVector = new Vector();
+	private Vector layerInfo = new Vector();
+	private float currentScale;
+	private int dpi = 96;
+	private String fontName = "Dialog";
+	private rulerItem[] rulerItems;
+
+	// ----------------------------------------------------------------------------
+	private double minScale = 500.0;
+	private double maxScale = 10000000.0;
+	private int minScaleX = 88; // +- 8 for less than and more than
+	private int maxScaleX = 762;
+	private int margin = 8;
+	private int rowHeight = 12;
+	private int rowSep = 15;
+	private int parentDialogMinLimitForNormalTitle = 485;
+	private int parentDialogMinLimitForShortTitle = 350;
+	// ----------------------------------------------------------------------------
+	private double logDist = Math.log(maxScale) - Math.log(minScale);
+	private String title = "";
+	private double medScale;
+	
+	private JLabel updateLabel;
+
+	private static final long serialVersionUID = 0;
+
+	
+	/**
+	 * @param info this vector contains the layers' scale info
+	 */
+	public LayerScaleDrawPanel(Vector info, LayerScaleDialog dlg, JLabel ulabel) {
+		super();
+		parentDialog = dlg;
+		updateLabel = ulabel;
+		LayerScaleData theInfo;
+		LayerLabel ll;
+		currentScale = (float) 1.0;
+		setBackground(Color.WHITE);
+		setLayout(null);
+		layerInfo = invertedVector(info);
+		int size = info.size();
+		for (int i=0; i<size; i++) {
+			theInfo = (LayerScaleData) layerInfo.get(i);
+			ll = new LayerLabel(theInfo.getName(), theInfo.getId());
+			ll.setBounds(5, indexDomainToYDomain( i ), getLabelsWidth(), rowHeight);
+			layerLabelsVector.add(ll);
+			add(ll);
+		}
+		rulerItems = getRulerItems();
+		medScale = Math.sqrt(maxScale * minScale);
+		medScale = Math.sqrt(medScale * minScale);
+	}
+	
+	public void resetInfo(Vector info) {
+		
+		layerLabelsVector.removeAllElements();
+		removeAll();
+		
+		layerInfo = info;
+		LayerScaleData theInfo;
+		LayerLabel ll;
+		int size = info.size();
+		for (int i=0; i<size; i++) {
+			theInfo = (LayerScaleData) layerInfo.get(i);
+			ll = new LayerLabel(theInfo.getName(), theInfo.getId());
+			ll.setBounds(5, indexDomainToYDomain( (size-1) - i ), getLabelsWidth(), rowHeight);
+			layerLabelsVector.add(ll);
+			add(ll);
+		}
+	}
+	
+	private Vector invertedVector(Vector v) {
+		Vector res = new Vector();
+		for (int i=(v.size()-1); i>=0; i--) {
+			res.add(v.get(i));
+		}
+		return res;
+	}
+	
+	/**
+	 * Sets current scale (it is represented as a vertical line)
+	 * @param s
+	 */
+	public void setCurrentScale(double s) {
+		currentScale = (float) s;
+		updateLabel.setText(PluginServices.getText(this, "Escala") + "  1 : " +
+				LayerScaleDialog.getFormattedInteger(Math.round(currentScale))
+				);
+		}
+	
+	public void setCurrentScale(float s) {
+		currentScale = s;
+		updateLabel.setText(PluginServices.getText(this, "Escala") + "  1 : " +
+				LayerScaleDialog.getFormattedInteger(Math.round(currentScale))
+				);
+		}
+	
+	public float getCurrentScale() { return currentScale; }
+	
+	
+	private int getLabelsWidth() {
+		return minScaleX - margin;
+	}
+	
+	public void paint(Graphics g) {
+		
+		super.paint(g);
+		Graphics2D g2d = (Graphics2D) g;
+
+		System.err.println("WIDTH = " + getWidth());
+		maxScaleX = getWidth() - 20;
+
+		if (getParentWidth() < parentDialogMinLimitForNormalTitle) {
+			if (getParentWidth() < parentDialogMinLimitForShortTitle) {
+				setEmptyTitle();
+			} else {
+				setShortTitle();
+			}
+		} else {
+			setNormalTitle();
+		}
+		
+		drawTitle(g2d);
+
+		g2d.setStroke(new BasicStroke(1));
+		g2d.setFont(new Font(fontName, Font.PLAIN, 12));
+		int size = layerInfo.size();
+
+		for (int i=0; i<size; i++) {
+			
+			LayerScaleData info = (LayerScaleData) layerInfo.get(i);
+			
+			int x_min, y_min, w;
+			int x_max = this.scaleDomainToXDomain(Math.pow(10.0, 9.0));
+			
+			x_min = scaleDomainToXDomain(info.getMinSc()); 
+			w = scaleDomainToXDomain(info.getMaxSc()) - x_min;
+			y_min = indexDomainToYDomain(i);
+			
+			g2d.setColor( new Color(235, 235, 235) );
+			g2d.fillRect((minScaleX - margin), y_min, x_max - (minScaleX - margin), rowHeight);
+			
+			g2d.setColor( info.getColor(currentScale) );
+			g2d.fillRect(x_min, y_min, w, rowHeight);
+			
+			g2d.setColor( Color.BLACK );
+			}
+		
+		drawRuler(g2d, size);
+		drawCurrentScale(g2d, size);
+		int x = Math.min(getWidth() - 136, ((getParentWidth() - parentDialogMinLimitForNormalTitle) / 2) + (parentDialogMinLimitForNormalTitle - 136));
+		drawLegend(g2d, x, 10);
+	}
+	
+	private void setEmptyTitle() {
+		title = "";
+	}
+
+	private void setNormalTitle() {
+		title = PluginServices.getText(this, "scale_limits_status");
+	}
+
+	private void setShortTitle() {
+		title = PluginServices.getText(this, "scale_limits");
+	}
+	
+	private void drawTitle(Graphics2D g) {
+		g.setColor(Color.GRAY);
+		g.setFont(new Font(fontName, Font.BOLD, 20));
+		g.drawString(title, 20, 55);
+	}
+
+	private void drawRuler(Graphics2D g, int i) {
+		g.setColor(Color.DARK_GRAY);
+		
+		int x_min = this.scaleDomainToXDomain(minScale - 1.0);
+		int x_max = this.scaleDomainToXDomain(maxScale + 1.0);
+		int y = this.indexDomainToYDomain(0) - 10;
+		int offsetFromTagsToRuler = 8;
+		
+		g.drawLine(x_min, y, x_max, y);
+		// arrows
+		int[] xp = {x_min-2, x_min+5, x_min+5};
+		int[] yp = {y, y-3, y+3};
+		g.fillPolygon(xp, yp, 3);
+		int[] x2p = {x_max+2, x_max-5, x_max-5};
+		g.fillPolygon(x2p, yp, 3);
+
+		// ---------------- scale label -------------------------
+		g.setFont(new Font(fontName, Font.BOLD, 12));
+		g.drawString(PluginServices.getText(this, "the_scale"), 20, y - 44);		
+		g.drawString("(DPI = " + dpi + ")", 20, y + 12 - 44);		
+		g.setFont(new Font(fontName, Font.PLAIN, 12));
+		// ------------------------------------------------------
+		
+		rulerItem ruIt;
+		
+		g.drawString("1:", scaleDomainToXDomain(minScale) - 30, y - offsetFromTagsToRuler);
+		
+		AffineTransform oldt = g.getTransform();
+		AffineTransform newt, rott, trat;
+		double angulo = -65.0;
+		
+		for (int ind=0; ind<rulerItems.length; ind++) {
+			ruIt = this.rulerItems[ind];
+			g.drawLine(ruIt.getScaleInXDomain() , y - 3, ruIt.getScaleInXDomain() , y + 3);
+			int strx = ruIt.getScaleInXDomain();
+			int stry = y - offsetFromTagsToRuler;
+			trat = AffineTransform.getTranslateInstance(1.0 * strx, 1.0 * stry);
+			rott = AffineTransform.getRotateInstance(angulo * 3.1415926 / 180.0);
+			newt = (AffineTransform) oldt.clone();
+			newt.concatenate(trat);
+			newt.concatenate(rott);
+			g.setTransform(newt);
+			g.drawString(ruIt.getTag(), 0, 0);
+			g.setTransform(oldt);
+		}
+	}
+
+	private int indexDomainToYDomain(int i) {
+		return Math.round( (float) (158.0 + rowSep * i));
+		}
+
+	private int scaleDomainToXDomain(double d) {
+		if (d < minScale) return minScaleX - margin;
+		if (d > maxScale) return maxScaleX + margin;
+		double dist = Math.log(d) - Math.log(minScale);
+		return Math.round( (float) (1.0 * minScaleX + dist * (maxScaleX - minScaleX) / logDist));
+		}
+
+	private void drawCurrentScale(Graphics2D g, int i) {
+		int footLength = 90;
+		int x = this.scaleDomainToXDomain(currentScale);
+		int y_min = indexDomainToYDomain(0) - 10;
+		int y_max = indexDomainToYDomain(layerInfo.size()) + 18;
+		
+		Stroke old = g.getStroke();
+		g.setStroke(new BasicStroke(1));
+		g.setColor(Color.ORANGE);
+		g.drawLine(x, y_min, x, y_max);
+		
+		// little square
+		int[] xp = {x-1, x+2, x+2, x-1};
+		int[] yp = {y_min-1, y_min-1, y_min+2, y_min+2};
+		g.fillPolygon(xp, yp, 4);
+		
+		if (currentScale > medScale) { // label to the left
+			g.drawLine(x, y_max, x - footLength, y_max);
+			g.setColor(LayerScaleData.darker(Color.ORANGE));
+			g.setFont(new Font(fontName, Font.BOLD, 12));
+			g.drawString(PluginServices.getText(this, "current_scale"), x - footLength, y_max - 4);
+		} else { // label to the right
+			g.drawLine(x, y_max, x + 10, y_max);
+			g.setColor(LayerScaleData.darker(Color.ORANGE));
+			g.setFont(new Font(fontName, Font.BOLD, 12));
+			g.drawString(PluginServices.getText(this, "current_scale"), x + 15, y_max + 4);
+		}
+		g.setFont(new Font(fontName, Font.PLAIN, 12));
+		g.setStroke(old);
+		}
+	
+	private void drawLegend(Graphics2D g, int orx, int ory) {
+		// width = 2 * margin + 2 * sampleW + labelW = 126 
+		// height = 2 * margin + 4 * rowSep = 76
+		int sampleW = 25;
+		int margin = 8;
+		int labelW = 60;
+		// -----------------------------------------
+		int correction = -2;
+		int smpx = orx + margin + labelW;
+		int smpy = ory + margin + 2 * rowSep + (rowSep - rowHeight);
+		int auxx, auxy;
+		
+		g.setFont(new Font(fontName, Font.PLAIN, 12));
+		
+		auxx = orx + margin;
+		auxy = ory + 2 * rowSep + margin;
+		g.setColor(Color.GRAY);
+		g.drawString(PluginServices.getText(this, "type"), auxx, auxy + correction);
+		
+		auxy = auxy + rowSep;
+		g.setColor(Color.BLACK);
+		g.drawString(PluginServices.getText(this, "vectorial"), auxx, auxy);
+		
+		auxy = auxy + rowSep;
+		g.drawString(PluginServices.getText(this, "raster"), auxx, auxy);
+
+		auxx = orx + margin + labelW;
+		auxy = ory + rowSep + margin;
+		g.setColor(Color.GRAY);
+		g.drawString(PluginServices.getText(this, "visible"), auxx, auxy + correction);
+		
+		auxy = auxy + rowSep;
+		g.setFont(new Font(fontName, Font.PLAIN, 10));
+		g.setColor(Color.BLACK);
+		g.drawString(PluginServices.getText(this, "YES"), auxx, auxy + correction);
+		
+		auxx = auxx + sampleW;
+		g.drawString(PluginServices.getText(this, "NO"), auxx, auxy + correction);
+
+		// --------- samples ---------------------
+		g.setColor(LayerScaleData.darker(LayerScaleData.featColor));
+		g.fillRect(smpx, smpy, sampleW, rowHeight);
+		
+		g.setColor(LayerScaleData.featColor);
+		g.fillRect(smpx + sampleW, smpy, sampleW, rowHeight);
+		
+		g.setColor(LayerScaleData.darker(LayerScaleData.imagColor));
+		g.fillRect(smpx, smpy + rowSep, sampleW, rowHeight);
+		
+		g.setColor(LayerScaleData.imagColor);
+		g.fillRect(smpx + sampleW, smpy + rowSep, sampleW, rowHeight);
+		
+		g.setColor(Color.BLACK);
+		g.drawRect(orx, ory, 2 * margin + 2 * sampleW + labelW, 2 * margin + 4 * rowSep);
+		// ------------------------------------------
+	}
+
+//	public void setLayerInfo(Vector v) {
+//		layerInfo = invertedVector(v);
+//	}
+
+	public void setDpi(int dpi) {
+		this.dpi = dpi;
+	}
+	
+	/**
+	 * Utility class used to allow tool tips.
+	 * 
+	 * @author jldominguez
+	 *
+	 */
+	public class LayerLabel extends JLabel {
+		
+		private String theName = "";
+		private String theId = "";
+		private static final long serialVersionUID = 0;
+		
+		public LayerLabel(String name, String id) {
+			theName = name;
+			theId = id;
+			setToolTipText(toolTipString());
+			setText(toString());
+			setFont(new Font(fontName, Font.BOLD, 12));
+		}
+		
+		public String toString() {
+			if (theName.length() < 19) return theName;
+			return theName.substring(0, 16) + "...";
+		}
+		
+		public String toolTipString() {
+			return "[" + theId + "] " + theName;
+		}
+		
+		
+	}
+	
+	private class rulerItem {
+		
+		private int scale;
+		
+		public rulerItem(int sc) {
+			scale = sc;
+		}
+		
+		public String getTag() {
+			return intToAbbrev(scale);
+		}
+		
+		public int getScale() {
+			return scale;
+		}
+		
+		public int getScaleInXDomain() {
+			return scaleDomainToXDomain(1.0 * scale);
+		}
+		
+		public int xAxisOffset() {
+			return getTag().length() * 4 + 3;
+		}
+		
+		private String intToAbbrev(int n) {
+			if (n >= 1000000) return String.valueOf(n/1000000) + " M";
+			return String.valueOf(n);
+		}
+	}
+	
+	/**
+	 * 
+	 * @return Scale items shown on ruler
+	 */
+	private rulerItem[] getRulerItems() {
+		rulerItem[] ri = new rulerItem[12];
+		ri[0] = new rulerItem(500);
+		ri[1] = new rulerItem(2000);
+		ri[2] = new rulerItem(5000);
+		ri[3] = new rulerItem(10000);
+		ri[4] = new rulerItem(25000);
+		ri[5] = new rulerItem(50000);
+		ri[6] = new rulerItem(100000);
+		ri[7] = new rulerItem(250000);
+		ri[8] = new rulerItem(500000);
+		ri[9] = new rulerItem(1000000);
+		ri[10] = new rulerItem(5000000);
+		ri[11] = new rulerItem(10000000); // must be the same as 'private double maxScale'
+		return ri;
+	}
+	
+	private int getParentWidth() {
+		if (parentDialog == null) {
+			return parentDialogMinLimitForNormalTitle;
+		} else {
+			return parentDialog.getWidth();
+		}
+	}
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/LayerScaleDrawPanel.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ImageServicePanel.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ImageServicePanel.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ImageServicePanel.java	(revision 8301)
@@ -0,0 +1,147 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels;
+
+import java.awt.BorderLayout;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.plaf.basic.BasicArrowButton;
+
+import org.gvsig.remoteClient.arcims.ArcImsClientP;
+import org.gvsig.remoteClient.arcims.ArcImsImageClient;
+import org.gvsig.remoteClient.arcims.ArcImsStatus;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+
+import com.iver.andami.PluginServices;
+import com.iver.utiles.swing.JComboBox;
+
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.ImageFormatSelector;
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+
+public class ImageServicePanel extends FeatureServicePanel {
+	
+	private static final long serialVersionUID = 0;
+	
+	private ImageFormatSelector formatSelector;
+	// protected ImageFormatSelector imageFormatCombo;
+	
+	protected BasicArrowButton emergencyArrowButton;
+	protected JPanel imageFormatPanel;
+	
+	private String imageFormat;
+
+	public ImageServicePanel(ArcImsWizard parent, boolean prop) {
+		super(parent, true, prop);
+		imageFormat = ServiceInfoTags.vPNG8;
+	}
+	
+	protected void addImageFormatPanel() {
+
+		imageFormatPanel = new JPanel();
+		imageFormatPanel.setBounds(180 - 6, 210 - 8, 287, 54); // hasta y = 264 
+		imageFormatPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
+						null, PluginServices.getText(this, "choose_image_format"),
+						javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+						javax.swing.border.TitledBorder.DEFAULT_POSITION,
+						null, null));
+
+		
+		formatSelector = new ImageFormatSelector();
+		formatSelector.addListener(this);
+		
+		imageFormatPanel.setLayout(null);
+		
+		imgServiceTab_2.add(imageFormatPanel);
+		imageFormatPanel.add(formatSelector); // setBounds(5, 15, 260, 20);
+	}
+	
+	public void actionPerformed(ActionEvent e) {
+		super.actionPerformed(e);
+		
+		if (e.getSource() == formatSelector) {
+			imageFormat = formatSelector.getSelected();
+			if (imageFormat.length() == 0) {
+				return;
+			}
+			parentWizard.setImageFormat(captionToFormatInImageFormatCombo(imageFormat));
+		}
+
+	}
+	
+	protected void updateWizardLayerQuery() {
+		super.updateWizardLayerQuery();
+		System.err.println("Image - updateWizardLayerQuery()");
+		parentWizard.setImageFormat(getImageFormat());
+	}
+	
+	public String getImageFormat() {
+		return imageFormat;
+	}
+
+	public void loadImageFormatCombo(ArcImsImageClient client, ArcImsStatus tmpStatus) {
+		try {
+			formatSelector.setAllEnabled(false);
+			
+			if (client.testFromat(tmpStatus, ServiceInfoTags.vPNG8)) {
+				formatSelector.setThisEnabled("PNG8");
+				formatSelector.setSelected("PNG8");
+			}
+			
+			if (client.testFromat(tmpStatus, ServiceInfoTags.vPNG24)) {
+				formatSelector.setThisEnabled("PNG24");
+				formatSelector.setSelected("PNG24");
+			}
+			
+			if (client.testFromat(tmpStatus, ServiceInfoTags.vJPEG)) {
+				formatSelector.setThisEnabled("JPG");
+				formatSelector.setSelected("JPG");
+			}
+			
+			if (client.testFromat(tmpStatus, ServiceInfoTags.vGIF)) {
+				formatSelector.setThisEnabled("GIF");
+				formatSelector.setSelected("GIF");
+			}
+			
+			parentWizard.setImageFormat(ServiceInfoTags.vPNG8);
+		} catch (ArcImsException e) {
+			logger.error("While loading image formats combo ", e);
+		}
+	}
+
+	public void setInImageFormatCombo(String imgFormat) {
+		String caption = formatToCaptionInImageFormatCombo(imgFormat);
+		formatSelector.setSelected(caption);
+	}
+
+	public void emptyFormatsCombo() {
+		formatSelector.setAllEnabled(false);
+	}
+
+	public ImageFormatSelector getImageFormatCombo() {
+		return formatSelector;
+	}
+	
+	private String captionToFormatInImageFormatCombo(String caption) {
+		String resp = "Unknown";
+		if (caption.compareToIgnoreCase("JPG") == 0) { return ServiceInfoTags.vJPEG; }
+		if (caption.compareToIgnoreCase("PNG8") == 0) { return ServiceInfoTags.vPNG8; }
+		if (caption.compareToIgnoreCase("PNG24") == 0) { return ServiceInfoTags.vPNG24; }
+		if (caption.compareToIgnoreCase("GIF") == 0) { return ServiceInfoTags.vGIF; }
+		return resp;
+	}
+
+	private String formatToCaptionInImageFormatCombo(String format) {
+		String resp = "Unknown";
+		if (format.compareToIgnoreCase(ServiceInfoTags.vJPEG) == 0) { return "JPG"; }
+		if (format.compareToIgnoreCase(ServiceInfoTags.vPNG8) == 0) { return "PNG8"; }
+		if (format.compareToIgnoreCase(ServiceInfoTags.vPNG24) == 0) { return "PNG24"; }
+		if (format.compareToIgnoreCase(ServiceInfoTags.vGIF) == 0) { return "GIF"; }
+		return resp;
+	}
+
+	
+	
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ImageServicePanel.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ServiceNamesPanel.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ServiceNamesPanel.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ServiceNamesPanel.java	(revision 8301)
@@ -0,0 +1,939 @@
+package es.prodevelop.cit.gvsig.arcims.gui.panels;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Vector;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+
+import java.awt.Color;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+import javax.swing.JComboBox;
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.ServicesTableModel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.ServicesTableSelectionListener;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.ServicesTableDataSource;
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+import com.iver.andami.PluginServices;
+
+import javax.swing.JScrollPane;
+
+import com.iver.cit.gvsig.fmap.DriverException;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.utiles.NotExistInXMLEntity;
+import com.iver.utiles.XMLEntity;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.ArcImsClientP;
+import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
+import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+
+import javax.swing.JRadioButton;
+
+/**
+ * This class implements the first panels of the ArcIMS wizard. It
+ * asks for the server's URL and the service name (which can be either an
+ * ImageService or a FeatureService). Depending on the type of service, one
+ * panel (Image Service Panel) or the other (Feature Service Panel) will be enabled.
+ * All three panels are owned by the ArcIMS wizard.
+ * 
+ * @see es.prodevelop.cit.gvsig.arcims.gui.panels.FeatureServicePanel
+ * 
+ * 
+ * @author jldominguez
+ */
+public class ServiceNamesPanel extends JPanel implements ActionListener,
+		MouseListener, KeyListener, ItemListener {
+	
+	private static Logger logger = Logger.getLogger(ServiceNamesPanel.class.getName());
+
+	private ArcImsWizard parentWizard = null;
+	private JPanel northPanel = null;
+	private JLabel serverLabel = null;
+	private JComboBox serverComboBox = null;
+	private JButton connectButton = null;
+	private JScrollPane servicesTableScrollPane = null;
+	private JButton nextButton = null;
+	private JButton previousButton = null;
+	private JTable servicesTable = new JTable();
+	private String selectedServiceType = "";
+	private String selectedServiceName = "";
+	private Vector favoriteServers = new Vector();
+	private ServicesTableSelectionListener tableSelectionListener;
+	private JPanel userDefinedServiceNamePanel = null;
+	// private JRadioButton serviceNameSelectionModeUserRadioButton = null;
+	// private JRadioButton serviceNameSelectionModeListRadioButton = null;
+	// private ButtonGroup serviceSelectionModeButtonGroup = null;
+	private JLabel serviceNameLabel = null;
+	private JTextField userDefinedServiceNameTextField = null;
+	private String serviceType = "";
+	private URL completeURL = null;
+	private JLabel versionTitleLabel = null;
+	private JLabel versionLabel = null;
+	private JCheckBox cacheOverride = null;
+	
+	private static final long serialVersionUID = 0;
+	
+
+	/**
+	 * The owning wizard is used as a parameter to allow easy <i>upwards</i>
+	 * references.
+	 * 
+	 * @param parent
+	 *            the wizard that owns this panel
+	 */
+	public ServiceNamesPanel(ArcImsWizard parent) {
+		super();
+		parentWizard = parent;
+		initialize();
+	}
+
+	private void initialize() {
+		this.setSize(501, 470);
+		this.setLayout(null);
+		this.add(getNorthPanel(), null);
+		tableSelectionListener = new ServicesTableSelectionListener(this);
+		this.add(getServicesTableScrollPane(), null);
+		this.add(getNextButton(), null);
+		this.add(getPreviousButton(), null);
+		this.add(getUserDefinedServiceNamePanel(), null);
+		this.nextButton.setEnabled(false);
+		
+		versionTitleLabel = new JLabel(PluginServices.getText(this, "server_version") + ":");
+		versionTitleLabel.setBounds(new java.awt.Rectangle(39, 443, 125, 21));
+		this.add(versionTitleLabel, null);
+		versionLabel = new JLabel("-");
+		versionLabel.setBounds(new java.awt.Rectangle(170 - 15, 443, 160, 21));
+		this.add(versionLabel, null);
+		
+		servicesTable.addMouseListener(this);
+		servicesTable.setBounds(new java.awt.Rectangle(15, 45, 400, 181));
+		servicesTable.setDragEnabled(false);
+		servicesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+		servicesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+		
+		fireServerUrlUnknown();
+	}
+
+	/**
+	 * Gets the service type of the selected service (ImageService or
+	 * FeatureService)
+	 * 
+	 * @return service type of the service selected by the user
+	 */
+	public String getSelectedServiceType() {
+		return selectedServiceType;
+	}
+
+	/**
+	 * This method initializes northPanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getNorthPanel() {
+		if (northPanel == null) {
+			serverLabel = new JLabel();
+			serverLabel.setText("URL:");
+			serverLabel.setBounds(new java.awt.Rectangle(10, 20, 71, 20));
+			
+			versionTitleLabel = new JLabel(PluginServices.getText(this, "version") + ":");
+			versionTitleLabel.setBounds(new java.awt.Rectangle(10, 40, 71, 20));
+			versionLabel = new JLabel("-");
+			versionLabel.setBounds(new java.awt.Rectangle(60, 40, 200, 20));
+			
+			cacheOverride = new JCheckBox(PluginServices.getText(this, "update_catalog"), false);
+			cacheOverride.setBounds(new java.awt.Rectangle(7, 60 - 9, 200, 20));
+			
+			northPanel = new JPanel();
+			northPanel.setLayout(null);
+			northPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
+					null, PluginServices.getText(this, "server"),
+					javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+					javax.swing.border.TitledBorder.DEFAULT_POSITION, null,
+					null));
+			northPanel.setBounds(new java.awt.Rectangle(17, 10, 477, 85)); // hasta y = 96
+			// northPanel.add(serverLabel, null);
+			northPanel.add(getServerComboBox(), null);
+			northPanel.add(getConnectButton(), null);
+			
+			// northPanel.add(versionTitleLabel);
+			// northPanel.add(versionLabel);
+			northPanel.add(cacheOverride);
+		}
+		return northPanel;
+	}
+
+	/**
+	 * Initializes the JComboBox that contains the URLs of the favorite servers,
+	 * read from a XML file located on the user's local directory.
+	 * 
+	 * @return javax.swing.JComboBox
+	 */
+	public JComboBox getServerComboBox() {
+		if (serverComboBox == null) {
+			serverComboBox = new JComboBox();
+			serverComboBox.setEditable(true);
+			
+			serverComboBox.getEditor().getEditorComponent().addKeyListener(this);
+			serverComboBox.addItemListener(this);
+
+			loadFavoriteServers();
+			addServersFromVector();
+
+			serverComboBox.setBounds(new java.awt.Rectangle(11, 26, 380 + 74, 20));
+		}
+		return serverComboBox;
+	}
+
+	/**
+	 * Inicializes the connectButton
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	public JButton getConnectButton() {
+		if (connectButton == null) {
+			connectButton = new JButton();
+			connectButton.setText(PluginServices.getText(this, "conectar"));
+			connectButton.setBounds(new java.awt.Rectangle(383 - 17, 33 + 17, 100, 20));
+
+			connectButton.addActionListener(this);
+		}
+		return connectButton;
+	}
+
+	/**
+	 * Inicializes the servicesTableScrollPane
+	 * 
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getServicesTableScrollPane() {
+		if (servicesTableScrollPane == null) {
+			servicesTableScrollPane = new JScrollPane();
+			servicesTableScrollPane
+					.setBorder(javax.swing.BorderFactory
+							.createTitledBorder(
+									null,
+									PluginServices.getText(this,
+											"available_services"),
+									javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+									javax.swing.border.TitledBorder.DEFAULT_POSITION,
+									null, null));
+
+			servicesTableScrollPane.setBounds(new java.awt.Rectangle(17, 152, 477, 261 + 12)); // hasta y = 413
+		}
+		return servicesTableScrollPane;
+	}
+
+	/**
+	 * Inicializes the nextButton, which will enable and open a new panel
+	 * depending on the user's selection
+	 * 
+	 * @return javax.swing.JButton
+	 */
+	public JButton getNextButton() {
+		if (nextButton == null) {
+			nextButton = new JButton(); // 
+			nextButton.setText(PluginServices.getText(this, "siguiente"));
+			nextButton.setBounds(new java.awt.Rectangle(395, 444, 100, 20));
+			nextButton.addActionListener(this);
+		}
+		return nextButton;
+	}
+	
+	public JButton getPreviousButton() {
+		if (previousButton == null) {
+			previousButton = new JButton(); // 
+			previousButton.setText(PluginServices.getText(this, "anterior"));
+			previousButton.setBounds(new java.awt.Rectangle(395 - 103, 444, 100, 20));
+			previousButton.setEnabled(false);
+			previousButton.addActionListener(this);
+		}
+		return previousButton;
+	}
+	
+	
+	
+
+	public void setServerComboText(String s) {
+		this.serverComboBox.addItem(s);
+		this.serverComboBox.setSelectedItem(s);
+	}
+
+	/**
+	 * Writes the list of ArcIMS servers contained in the serverComboBox on a
+	 * XML local file. It should remove server URLs from unsuccessful
+	 * connections.
+	 * 
+	 * @param v
+	 *            a vector of Strings (servers' URLs)
+	 */
+	private void writeServerVectorToXML(Vector v) {
+		String s = "";
+		for (int i = 0; i < v.size(); i++)
+			s = s + "," + ((String) v.get(i));
+		s = s.substring(1);
+
+		XMLEntity xml = PluginServices.getPluginServices(this)
+				.getPersistentXML();
+		if (xml == null) {
+			xml = new XMLEntity();
+			xml.putProperty("arcims-servers", s);
+		} else {
+			xml.putProperty("arcims-servers", s);
+		}
+	}
+
+	/**
+	 * Loads a local variable (favoriteServers) with a list of servers and the
+	 * ones found in the local persistent data XML file.
+	 * 
+	 */
+	private void loadFavoriteServers() {
+		
+		favoriteServers.add("http://www.geographynetwork.com");
+		favoriteServers.add("http://cartoweb.paeria.es"); // Ayunt. de Lerida
+		favoriteServers.add("http://geodaten.stadt-bottrop.de"); // Ayunt. de Bottrop (Alemania)
+
+		XMLEntity xml = PluginServices.getPluginServices(this)
+				.getPersistentXML();
+		if (xml == null)
+			return;
+		try {
+			String[] s = xml.getStringArrayProperty("arcims-servers");
+			String[] servers = s[0].split(",");
+
+			for (int i = 0; i < servers.length; i++)
+				addIfNotRepeated(favoriteServers, servers[i]);
+		} catch (NotExistInXMLEntity e) {
+			logger.warn("Property 'arcims-servers' not found in XML file. ");
+		}
+	}
+
+	private void addIfNotRepeated(Vector v, String s) {
+		if (v.contains(s))
+			return;
+		v.add(0, s);
+	}
+
+	private void removeServerFromVector(Vector v, String s) {
+		if (!(v.contains(s)))
+			return;
+		v.remove(s);
+	}
+
+	/**
+	 * Utility method to load the server names from a 'favoriteServers' vector
+	 * into the server names combobox.
+	 */
+	private void addServersFromVector() {
+		for (int i = 0; i < favoriteServers.size(); i++)
+			this.serverComboBox.addItem((String) favoriteServers.get(i));
+	}
+
+	/**
+	 * Listens to mouse events on the available services list. A double click
+	 * will have the same effect as a click on the nextButton.
+	 */
+	public void mouseClicked(MouseEvent e) {
+		if (e.getSource() == this.servicesTable) {
+			if (! this.servicesTable.isEnabled()) {
+				return;
+			}
+			
+			int selrow = servicesTable.getSelectedRow();
+			if (selrow == -1) {
+				return;
+			}
+			String servname = ServicesTableModel.getColumnValueOfRow(servicesTable, PluginServices
+					.getText(this, "name"), selrow);
+			userDefinedServiceNameTextField.setText(servname);
+			
+			// double click event:
+			if (e.getClickCount() == 2) {
+				ActionEvent artificialEvent = new ActionEvent(nextButton,
+						ActionEvent.ACTION_PERFORMED, "");
+				this.actionPerformed(artificialEvent);
+			}
+		}
+	}
+
+	public void mouseEntered(MouseEvent e) {
+	}
+
+	public void mouseExited(MouseEvent e) {
+	}
+
+	public void mousePressed(MouseEvent e) {
+	}
+
+	public void mouseReleased(MouseEvent e) {
+	}
+
+	/**
+	 * Listens to button events: connectButton will retrieve the server's
+	 * available services list (catalog). NextButton will be enabled if a valid
+	 * service (imageservice or featureservice) has been selected by the user.
+	 */
+	public void actionPerformed(ActionEvent e) {
+
+		if (e.getSource() == connectButton) {
+
+			// ---------------------- CONNECT BUTTON - START
+			this.nextButton.setEnabled(false);
+			boolean badURL = false;
+			URL url = null;
+			ServicesTableDataSource stds = null;
+			url = null;
+
+			// find out complete url (using libArcIMS):
+			try {
+				url = new URL(serverComboBox.getSelectedItem().toString());
+				completeURL = ArcImsProtocolHandler.getUrlWithServlet(url);
+				// this truly loads the service names, types and status:
+				stds = new ServicesTableDataSource(completeURL, cacheOverride.isSelected());
+			} catch (MalformedURLException e1) {
+				badURL = true;
+			} catch (ArcImsException e1) {
+				badURL = true;
+			}
+
+			if (badURL) {
+				logger.info("Wrong url");
+				JOptionPane.showMessageDialog(this, PluginServices.getText(
+						this, "wrong_url")
+						+ ": " + serverComboBox.getSelectedItem().toString(),
+						PluginServices.getText(this, "wrong_url"),
+						JOptionPane.ERROR_MESSAGE);
+				return;
+			} else {
+				// check that the list is non-empty:
+				if (stds.getDataVector().size() == 0) {
+					JOptionPane.showMessageDialog(this, PluginServices.getText(
+							this, "server_has_no_services")
+							+ ": " + url, PluginServices.getText(this,
+							"server_has_no_services"),
+							JOptionPane.ERROR_MESSAGE);
+					// remove useless url:
+					removeServerFromVector(favoriteServers, url.toString());
+					writeServerVectorToXML(favoriteServers);
+					return;
+				}
+			}
+
+			// enables certain controls if the url is ok and there are services:
+			fireServerUrlOk();
+			
+			// save working url:
+			favoriteServers.add(0, url.toString());
+			writeServerVectorToXML(favoriteServers);
+
+			parentWizard.setHostName(completeURL.toString());
+			ServicesTableModel dtm = new ServicesTableModel(stds.getDataVector(), stds.getColNamesVector());
+			setModelAndWidths(servicesTable, dtm);
+
+			// Ask to be notified of selection changes.
+			ListSelectionModel rowSM = servicesTable.getSelectionModel();
+			rowSM.addListSelectionListener(this.tableSelectionListener);
+
+			servicesTableScrollPane.setViewportView(servicesTable);
+			servicesTable.repaint();
+			servicesTableScrollPane.repaint();
+			
+			// setEnableComponent(servicesTable, serviceNameSelectionModeListRadioButton.isSelected());
+			// ---------------------- CONNECT BUTTON - END
+		}
+
+		// ---------------------- NEXT BUTTON - START
+
+		if (e.getSource() == nextButton) {
+			
+			// if the 'user defined' option is set, local variables get values from
+			// the combobox
+			// if (serviceNameSelectionModeUserRadioButton.isSelected()) {
+				String userServiceName = userDefinedServiceNameTextField.getText();
+				int ind = -1;
+				
+				try {
+					ind = ServicesTableModel.getFirstRowWithValueInColumnName(servicesTable,
+							PluginServices.getText(this, ServiceInfoTags.aNAME), userServiceName);
+				} catch (ArcImsException e1) {
+					logger.error("While searching value in table ", e1);
+					ind = -1;
+				}
+				if (ind == -1) {
+					JOptionPane.showMessageDialog(this, PluginServices
+							.getText(this, "service_does_not_exist")
+							+ ": " + userServiceName, "Error", JOptionPane.ERROR_MESSAGE);
+					return;
+				}
+
+				selectedServiceType = ServicesTableModel.getColumnValueOfRowWithIndex(servicesTable,
+						1, ind); 
+				selectedServiceName = userServiceName;
+			// }
+			
+			// check that service type is supported:
+			if (! isSupportedServiceType(selectedServiceName)) {
+				return;
+			}
+
+			try {
+				// +++++++++++++  This line truly starts the connection:          ++++++++++++
+				// +++++++++++++  creates driver, client and gets capabilities    ++++++++++++
+				parentWizard.getDataSource().setHostService(completeURL, selectedServiceName,
+						selectedServiceType);
+			} catch (DriverException de) {
+				logger.error("While setting host service ", de);
+				showErrorMessage(de.getMessage());
+				return;
+			}
+			
+			// get service information:
+			ArcImsClientP cli = null;
+			if (selectedServiceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+				FMapRasterArcImsDriver idrv = (FMapRasterArcImsDriver) parentWizard.getDataSource().getDriver();
+				cli = (ArcImsClientP) idrv.getClient();
+			}
+			if (selectedServiceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+				FMapFeatureArcImsDriver fdrv = (FMapFeatureArcImsDriver) parentWizard.getDataSource().getDriver();
+				cli = (ArcImsClientP) fdrv.getClient();
+			}
+			
+			ServiceInformation si = cli.getServiceInformation();
+			
+			// 
+			if ((si.getLayers() == null) || (si.getLayers().size() == 0)) {
+				logger.warn("No layers found ");
+				JOptionPane.showMessageDialog(this,
+						PluginServices.getText(this, "no_layers_found")
+						+ ". " + PluginServices.getText(this, "service") + ": "
+						+ selectedServiceName,
+						PluginServices.getText(this, "no_layers_found"),
+						JOptionPane.ERROR_MESSAGE);
+				return;
+			}
+
+			parentWizard.setServiceName(selectedServiceName);
+			parentWizard.setServiceType(selectedServiceType);
+			parentWizard.fillAndMoveTabbedPaneToEnabled();
+			// ---------------------- NEXT BUTTON - END
+		}
+	}
+	
+	public void pseudoNextFired(FLayer lyr) {
+		// if the 'user defined' option is set, local variables get values from
+		// the combobox
+		// if (serviceNameSelectionModeUserRadioButton.isSelected()) {
+			String userServiceName = userDefinedServiceNameTextField.getText();
+			int ind = -1;
+			
+			try {
+				ind = ServicesTableModel.getFirstRowWithValueInColumnName(servicesTable,
+						PluginServices.getText(this, ServiceInfoTags.aNAME), userServiceName);
+			} catch (ArcImsException e1) {
+				logger.error("While searching value in table ", e1);
+				ind = -1;
+			}
+			if (ind == -1) {
+				JOptionPane.showMessageDialog(this, PluginServices
+						.getText(this, "service_does_not_exist")
+						+ ": " + userServiceName, "Error", JOptionPane.ERROR_MESSAGE);
+				return;
+			}
+
+			selectedServiceType = ServicesTableModel.getColumnValueOfRowWithIndex(servicesTable,
+					1, ind); 
+			selectedServiceName = userServiceName;
+		// }
+		
+		// check that service type is supported:
+		if (! isSupportedServiceType(selectedServiceName)) {
+			return;
+		}
+
+		try {
+			// +++++++++++++  This line truly starts the connection:          ++++++++++++
+			// +++++++++++++  creates driver, client and gets capabilities    ++++++++++++
+			parentWizard.getDataSource().setHostService(completeURL, selectedServiceName,
+					selectedServiceType, lyr);
+		} catch (DriverException de) {
+			logger.error("While setting host service ", de);
+			showErrorMessage(de.getMessage());
+			return;
+		}
+		
+		// get service information:
+		ArcImsClientP cli = null;
+		if (selectedServiceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			FMapRasterArcImsDriver idrv = (FMapRasterArcImsDriver) parentWizard.getDataSource().getDriver();
+			cli = (ArcImsClientP) idrv.getClient();
+		}
+		if (selectedServiceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			FMapFeatureArcImsDriver fdrv = (FMapFeatureArcImsDriver) parentWizard.getDataSource().getDriver();
+			cli = (ArcImsClientP) fdrv.getClient();
+		}
+		
+		ServiceInformation si = cli.getServiceInformation();
+		
+		// 
+		if ((si.getLayers() == null) || (si.getLayers().size() == 0)) {
+			logger.warn("No layers found ");
+			JOptionPane.showMessageDialog(this,
+					PluginServices.getText(this, "no_layers_found")
+					+ ". " + PluginServices.getText(this, "service") + ": "
+					+ selectedServiceName,
+					PluginServices.getText(this, "no_layers_found"),
+					JOptionPane.ERROR_MESSAGE);
+			return;
+		}
+
+		parentWizard.setServiceName(selectedServiceName);
+		parentWizard.setServiceType(selectedServiceType);
+		parentWizard.fillAndMoveTabbedPaneToEnabled();
+	}
+	
+
+	private void setModelAndWidths(JTable table, ServicesTableModel m) {
+		table.setModel(m);
+		TableColumnModel cm = table.getColumnModel();
+		TableColumn col;
+		int count = cm.getColumnCount();
+		if (count == 3) {
+			col = cm.getColumn(0);
+			col.setPreferredWidth(230);
+			col = cm.getColumn(1);
+			col.setPreferredWidth(110);
+			col = cm.getColumn(2);
+			col.setPreferredWidth(110);
+			table.repaint();
+		}
+	}
+
+	private void showErrorMessage(String message) {
+		JOptionPane.showMessageDialog(this,
+				PluginServices.getText(this, message),
+				PluginServices.getText(this, "error"),
+				JOptionPane.ERROR_MESSAGE);
+	}
+
+	private boolean servicesTableHasSelection() {
+		return (servicesTable.getSelectedRow() != -1);
+	}
+
+	/**
+	 * Utility method to manage the services names table.
+	 * 
+	 * @param sName service name
+	 * @return row that contains it
+	 */
+	public int getRowNumberOfServiceName(String sName) {
+		int l = servicesTable.getRowCount();
+		String s;
+		for (int i = 0; i < l; i++) {
+			s = ServicesTableModel.getColumnValueOfRow(servicesTable, PluginServices
+					.getText(this, "name"), i);
+			if (s.compareToIgnoreCase(sName) == 0)
+				return i;
+		}
+		logger.error("Service name not found: " + sName);
+		return -1;
+	}
+
+	public JTable getServicesTable() {
+		return servicesTable;
+	}
+
+	public void setServicesTable(JTable servicesTable) {
+		this.servicesTable = servicesTable;
+	}
+
+	public void setSelectedServiceType(String selectedServiceType) {
+		this.selectedServiceType = selectedServiceType;
+	}
+
+	public String getSelectedServiceName() {
+		return selectedServiceName;
+	}
+
+	public void setSelectedServiceName(String selectedServiceName) {
+		this.selectedServiceName = selectedServiceName;
+	}
+
+	public ArcImsWizard getParentWizard() {
+		return parentWizard;
+	}
+
+	public void setParentWizard(ArcImsWizard parentWizard) {
+		this.parentWizard = parentWizard;
+	}
+
+	public ServicesTableSelectionListener getTableSelectionListener() {
+		return tableSelectionListener;
+	}
+
+	public void setTableSelectionListener(
+			ServicesTableSelectionListener tableSelectionListener) {
+		this.tableSelectionListener = tableSelectionListener;
+	}
+
+	/**
+	 * This method initializes userDefinedServiceNamePanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getUserDefinedServiceNamePanel() {
+		if (userDefinedServiceNamePanel == null) {
+			userDefinedServiceNamePanel = new JPanel();
+			userDefinedServiceNamePanel.setBounds(new java.awt.Rectangle(17, 97, 477, 56)); // hasta y = 151
+			userDefinedServiceNamePanel.setLayout(null);
+			userDefinedServiceNamePanel
+					.setBorder(javax.swing.BorderFactory
+							.createTitledBorder(
+									null,
+									PluginServices.getText(this,
+											"service_name"),
+									javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
+									javax.swing.border.TitledBorder.DEFAULT_POSITION,
+									null, null));
+			userDefinedServiceNameTextField = new JTextField();
+			userDefinedServiceNameTextField.setBounds(11, 21, 380 + 74, 20);
+			userDefinedServiceNameTextField.addKeyListener(this);
+			
+			serviceNameLabel = new JLabel(PluginServices.getText(this, "service_name"));
+			serviceNameLabel.setBounds(70, 21, 120, 20);
+			
+
+			// serviceSelectionModeButtonGroup = new ButtonGroup();
+			// serviceSelectionModeButtonGroup.add(getServiceNameSelectionModeRadioButton());
+			// serviceSelectionModeButtonGroup.add(getServiceNameSelectionModeListRadioButton());
+			
+			// userDefinedServiceNamePanel.add(getServiceNameSelectionModeRadioButton());
+			// userDefinedServiceNamePanel.add(getServiceNameSelectionModeListRadioButton());
+			userDefinedServiceNamePanel.add(userDefinedServiceNameTextField);
+			// userDefinedServiceNamePanel.add(serviceNameLabel);
+			
+
+		}
+		return userDefinedServiceNamePanel;
+	}
+
+	/**
+	 * This method initializes serviceNameSelectionModeRadioButton
+	 * 
+	 * @return javax.swing.JRadioButton
+	 */
+	/*
+	public JRadioButton getServiceNameSelectionModeRadioButton() {
+		if (serviceNameSelectionModeUserRadioButton == null) {
+			serviceNameSelectionModeUserRadioButton = new JRadioButton();
+			serviceNameSelectionModeUserRadioButton.addActionListener(this);
+			serviceNameSelectionModeUserRadioButton
+					.setBounds(new java.awt.Rectangle(170, 20, 160, 20));
+			serviceNameSelectionModeUserRadioButton.setText(PluginServices
+					.getText(this, "defined_by_user") + ":");
+		}
+		return serviceNameSelectionModeUserRadioButton;
+	}
+	*/
+
+	/**
+	 * This method initializes serviceNameSelectionModeListRadioButton
+	 * 
+	 * @return javax.swing.JRadioButton
+	 */
+	/*
+	private JRadioButton getServiceNameSelectionModeListRadioButton() {
+		if (serviceNameSelectionModeListRadioButton == null) {
+			serviceNameSelectionModeListRadioButton = new JRadioButton();
+			serviceNameSelectionModeListRadioButton.addActionListener(this);
+			serviceNameSelectionModeListRadioButton
+					.setBounds(new java.awt.Rectangle(10, 20, 160, 20));
+			serviceNameSelectionModeListRadioButton.setText(PluginServices
+					.getText(this, "selected_from_list"));
+
+		}
+		return serviceNameSelectionModeListRadioButton;
+	}
+	*/
+
+	private void setEnableComponent(JComponent c, boolean v) {
+		if (c == null) return;
+		c.setEnabled(v);
+
+		if (c instanceof JTable) {
+			if (v) {
+				c.setForeground(Color.BLACK);
+			} else {
+				c.setForeground(Color.LIGHT_GRAY);
+			}
+		}
+	}
+
+	public void keyPressed(KeyEvent e) {
+	}
+	
+	public void keyTyped(KeyEvent e) {
+	}
+
+	public void keyReleased(KeyEvent e) {
+		if (e.getSource() == userDefinedServiceNameTextField) {
+			boolean user = true;
+			int length = userDefinedServiceNameTextField.getText().length();
+			setServiceType("");
+			nextButton.setEnabled(user && (length > 0));
+		}
+		if (e.getSource() == serverComboBox.getEditor().getEditorComponent()) {
+			fireServerUrlUnknown();
+		}
+		
+	}
+
+	private void fireServerUrlUnknown() {
+		// setEnableComponent(serviceNameSelectionModeListRadioButton, false);
+		// setEnableComponent(serviceNameSelectionModeUserRadioButton, false);
+		setEnableComponent(servicesTable, false);
+		setEnableComponent(nextButton, false);
+		setEnableComponent(userDefinedServiceNameTextField, false);
+		if (versionLabel != null) {
+			versionLabel.setText("-");
+		}
+	}
+	
+	private void fireServerUrlOk() {
+		// setEnableComponent(serviceNameSelectionModeListRadioButton, true);
+		// setEnableComponent(serviceNameSelectionModeUserRadioButton, true);
+		setEnableComponent(servicesTable, true);
+		setEnableComponent(nextButton, true);
+		
+		String str = "-";
+		
+		if (versionLabel != null) {
+			str = getServerVersion(completeURL);
+			versionLabel.setText(str);
+			parentWizard.setServerVersionInPanels(str);
+		}
+		
+		
+		
+		// serviceNameSelectionModeListRadioButton.setSelected(true);
+		// ActionEvent ae = new ActionEvent(serviceNameSelectionModeListRadioButton, ActionEvent.ACTION_PERFORMED, "");
+		// actionPerformed(ae);
+		
+		setUserDecisionTrue();
+	}
+
+	/**
+	 * This method calls the liArcIMS library to quickly find out
+	 * the server full url (with '/servlet/...')
+	 * 
+	 * @param url server short url
+	 * @return full url
+	 */
+	private String getServerVersion(URL url) {
+		String vers[];
+		try {
+			vers = ArcImsProtocolHandler.getVersion(url);
+		} catch (ArcImsException e) {
+			logger.error("Server version not found ", e);
+			JOptionPane.showMessageDialog(this,
+					PluginServices.getText(this, "unable_to_findout_server_version"),
+					PluginServices.getText(this, "unable_to_findout_server_version"),
+					JOptionPane.ERROR_MESSAGE);
+			return "-";
+		}
+		return vers[0] + " (" + vers[1] + ")";
+	}
+
+	public String getServiceType() {
+		return serviceType;
+	}
+
+	public void setServiceType(String serviceType) {
+		this.serviceType = serviceType;
+	}
+
+	public void setUserServiceName(String str) {
+		userDefinedServiceNameTextField.setText(str);
+	}
+
+	public void itemStateChanged(ItemEvent e) {
+		this.fireServerUrlUnknown();
+	}
+	
+	/**
+	 * 
+	 * Utility method to decide if a service type is supported
+	 * or not (ServiceInfoTags.IMAGESERVICE, etc)
+	 */
+	private boolean isSupportedServiceType(String svcName) {
+		
+		int ind = -1;
+		try {
+			ind = ServicesTableModel.getFirstRowWithValueInColumnIndex(servicesTable,
+					0, svcName);
+		} catch (ArcImsException e1) {
+			logger.error("While searching value in table ", e1);
+			ind = -1;
+		}
+		if (ind == -1) {
+			// should never happen
+			JOptionPane.showMessageDialog(this, PluginServices
+					.getText(this, "service_does_not_exist")
+					+ ": " + svcName, "Error", JOptionPane.ERROR_MESSAGE);
+			return false;
+		}
+		
+		String svcType = ServicesTableModel.getColumnValueOfRowWithIndex(servicesTable,
+				1, ind);
+		
+		if (
+		(svcType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) != 0)
+		&&
+		(svcType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) != 0)
+		) {
+			showNotImplementedMessage();
+			return false;
+		}
+		return true;
+	}
+
+	
+	private void showNotImplementedMessage() {
+		JOptionPane.showMessageDialog(this,
+				PluginServices.getText(this, "service_type_not_supported"),
+				PluginServices.getText(this, "error"),
+				JOptionPane.ERROR_MESSAGE);
+	}
+	
+	public void setUserDecisionTrue() {
+		setEnableComponent(userDefinedServiceNameTextField, true);
+		setEnableComponent(servicesTable, true);
+		int length = userDefinedServiceNameTextField.getText().length();
+		setEnableComponent(nextButton, (length > 0));
+	}
+
+
+} // @jve:decl-index=0:visual-constraint="10,8"

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/ServiceNamesPanel.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/.cvsignore
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/.cvsignore	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/.cvsignore	(revision 8301)
@@ -0,0 +1 @@
+Thumbs.db

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/.cvsignore
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/up-arrow.png
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/up-arrow.png	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/up-arrow.png	(revision 8301)
@@ -0,0 +1,6 @@
+‰PNG
+
+
+IHDRv¥æñ	pHYsÃÃÇo¨dZIDATxœíÒ»ÀPFg47#•MNü´¹žú* 	.¡nŸi’"9BˆXA-�™ Ø@+`‚Ö@�á
+TrxÇ=•·®'r.Û�|©Jå�©|
+“–ã9´IEND®B`‚
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/up-arrow.png
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/down-arrow.png
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/down-arrow.png	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/down-arrow.png	(revision 8301)
@@ -0,0 +1,5 @@
+‰PNG
+
+
+IHDRv¥æñ	pHYsÃÃÇo¨dnIDATxœíÔ;À P=GóÍÜ‰ª€¡k;xAè!å$aIEÄwWì!Ièò#ßFÜPE„EÒ»îÕJžS’:…Æ5¸kP…ÜuÅÜAÙ"N]É Õ&ÛöŽÐë¯ A; ET–Hƒv€$\9N
+“BxûIEND®B`‚
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images/down-arrow.png
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native


Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/panels/images
___________________________________________________________________
Added: svn:ignore
   + Thumbs.db


Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/wizards/ArcImsWizard.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/wizards/ArcImsWizard.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/wizards/ArcImsWizard.java	(revision 8301)
@@ -0,0 +1,488 @@
+package es.prodevelop.cit.gvsig.arcims.gui.wizards;
+
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTree;
+import javax.swing.JScrollPane;
+
+import java.awt.BorderLayout;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.iver.andami.PluginServices;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.project.documents.view.gui.View;
+import com.iver.cit.gvsig.gui.WizardPanel;
+import com.iver.cit.gvsig.gui.wizards.WizardListener;
+import com.iver.cit.gvsig.gui.wizards.WizardListenerSupport;
+import com.iver.utiles.connections.ConnectionException;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.datasource.ArcImsWizardData;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMSCollection;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.FeatureServicePanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.ImageServicePanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.ServiceNamesPanel;
+import es.prodevelop.cit.gvsig.arcims.gui.panels.utils.LayersListElement;
+
+import org.apache.log4j.Logger;
+import org.gvsig.remoteClient.arcims.ArcImsClientP;
+import org.gvsig.remoteClient.arcims.ArcImsImageClient;
+import org.gvsig.remoteClient.arcims.ArcImsStatus;
+import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures;
+import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerImage;
+import org.gvsig.remoteClient.utils.BoundaryBox;
+
+/**
+ * This class implements the wizard that enables the user to load an ArcIMS
+ * layer. Passes most requests on to its <tt>ArcImsWizardData dataSource</tt>
+ * object.
+ * 
+ * @see es.prodevelop.cit.gvsig.arcims.fmap.datasource.ArcImsWizardData
+ * 
+ * @author jldominguez
+ */
+public class ArcImsWizard extends WizardPanel {
+
+	private static Logger logger = Logger.getLogger(ArcImsWizard.class.getName());
+	private WizardListenerSupport listenerSupport = new WizardListenerSupport();
+	private ArcImsWizardData dataSource;
+	private ServiceNamesPanel svsNamesPanel;
+	
+	private FeatureServicePanel feaServicePanel;
+	private ImageServicePanel imgServicePanel;
+	
+	private JPanel mainPanel = null;
+	private String nombreTema = "ArcIMS layer";
+	private String layerQuery = "Empty query";
+	private String host = "";
+	private String serviceName = "";
+	private String serviceType = "";
+	private String imageFormat; 
+	private FLayer theLayer;
+	private View theView;
+	
+	private static final long serialVersionUID = 0;
+
+	public ArcImsWizard() {
+		super();
+		initialize(true, false);
+	}
+
+	public ArcImsWizard(boolean editionallowed, boolean props) {
+		super();
+		initialize(editionallowed, props);
+	}
+
+	public ServiceNamesPanel getSvsNamesPanel() {
+		return svsNamesPanel;
+	}
+
+	public void setSvsNamesPanel(ServiceNamesPanel svsNamesPanel) {
+		this.svsNamesPanel = svsNamesPanel;
+	}
+
+	public void setLayerQuery(String lq) {
+		layerQuery = lq;
+	}
+
+	public String getLayerQuery() {
+		return layerQuery;
+	}
+
+	public void setHostName(String h) {
+		host = h;
+	}
+
+	public String getHostName() {
+		return host;
+	}
+
+	public void setServiceName(String n) {
+		serviceName = n;
+	}
+
+	public String getServiceName() {
+		return serviceName;
+	}
+
+	public void setNewLayerName(String n) {
+		nombreTema = n;
+	}
+
+	public String getNewLayerName() {
+		return nombreTema;
+	}
+
+	/**
+	 * Sets tab name and creates gui panels.
+	 *
+	 */
+	private void initialize(boolean editionallowed, boolean props) {
+		setTabName("ArcIMS");
+		svsNamesPanel = new ServiceNamesPanel(this);
+		
+		imgServicePanel = new ImageServicePanel(this, props);
+		feaServicePanel = new FeatureServicePanel(this, editionallowed, props);
+
+		setSize(646, 359);
+		setLayout(new BorderLayout(10, 10));
+
+		setPreferredSize(new java.awt.Dimension(750, 420));
+		this.add(getMainPanel(), BorderLayout.CENTER);
+		this.setEnabledPanels("main");
+		this.validate();
+	}
+
+	public ArcImsWizardData getDataSource() {
+		return dataSource;
+	}
+
+	public void setDataSource(ArcImsWizardData ds) {
+		dataSource = ds;
+	}
+
+	public void initWizard() {
+		dataSource = new ArcImsWizardData();
+	}
+
+	public void execute() {
+	}
+
+	/**
+	 * This method will be invoqued by gvSIG when the user clicks on the
+	 * <i>Accept</i> button to retrieve the layers selected by the user. They
+	 * will be seen from gvSIG as one layer.
+	 * 
+	 * @return the new ArcIMS layer to be added to the project
+	 */
+	public FLayer getLayer() {
+//		HashMap m = new HashMap();
+//		m.put("host", "http://noruega:9080");
+//		m.put("service_name", "CarreterasIS");
+//		m.put("srs", "EPSG:23030");
+//		// m.put("layer_name", "Prueba");
+//		
+//		try {
+//			return new FRasterLyrArcIMS(m);
+//		} catch (ConnectionException e) {
+//			// TODO Auto-generated catch block
+//			return null;
+//		}
+
+		// now we have the mapControl
+		dataSource.setMapControl(getMapCtrl());
+		
+		theLayer = null;
+		
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vIMAGESERVICE) == 0) {
+			theLayer = createArcImsRasterLayer();
+		}
+		
+		if (theLayer == null) {
+			logger.error("Error while creating ArcIms layer.");
+		}
+		
+		if (serviceType.compareToIgnoreCase(ServiceInfoTags.vFEATURESERVICE) == 0) {
+			
+			if (feaServicePanel.isGroupOptionSelected()) { // agrupar
+				theLayer = createArcImsFeatureLayer(false);
+			} else { // no agrupar
+				theLayer = createArcImsFeatureLayer(true);
+			}
+		}
+		if (theLayer == null) {
+			logger.info("Returned a null layer (layers were added manually).");
+		}
+		return theLayer;
+	}
+	
+	public FLayer getLayerAsIs() {
+		return theLayer;
+	}
+	
+	/**
+	 * Creates an ArcIMS feature layer. This method will use the
+	 * ArcImsWizardData method to create the layer.
+	 * 
+	 * @return the ArcIMS raster layer
+	 */
+	private FFeatureLyrArcIMSCollection createArcImsFeatureLayer(boolean sep) {
+		FFeatureLyrArcIMSCollection layer = null;
+		try {
+			layer = dataSource.createArcImsFeatureLayer(host,
+					serviceName, layerQuery, nombreTema, getMapCtrl()
+							.getMapContext().getProjection(), sep);
+		} catch (Exception e1) {
+			e1.printStackTrace();
+		}
+		return layer;
+	}
+
+	/**
+	 * Creates an ArcIMS raster layer. This method will use the
+	 * ArcImsWizardData method to create the layer.
+	 * 
+	 * @return the ArcIMS raster layer
+	 */
+	private FRasterLyrArcIMS createArcImsRasterLayer() {
+		FRasterLyrArcIMS layer = null;
+		try {
+			// the value of these parameters was set by other gui objects (panels, etc)
+			layer = dataSource.createArcImsRasterLayer(host,
+					serviceName, layerQuery, nombreTema, getMapCtrl()
+							.getMapContext().getProjection(), imageFormat);
+		} catch (Exception e1) {
+			logger.error("While creating ArcImsRasterLayer ", e1);
+		}
+		
+		// a warning is shown if the SRS was not provided by the server:
+//		if (dataSource.isMissingSrs()) {
+//			showMissingSrsMessage();
+//		}
+
+//		if (layer != null) {
+//			ArcImsStatus status = layer.getArcimsStatus();
+//			String fmt = imageFormat.getFormatString();
+//			boolean imagefmtok = ((FMapRasterArcImsDriver) layer.getDriver()).testFormat(status, fmt);
+//			if (!imagefmtok) {
+//				showImageFmtNotSupportedMessage(fmt);
+//				return null;
+//			}
+//		}
+		
+		return layer;
+	}
+	
+	private void showImageFmtNotSupportedMessage(String fmt) {
+		JOptionPane.showMessageDialog(this,
+				PluginServices.getText(this, "server_doesnt_support_selected_image_format") + ": " +
+				fmt.toUpperCase(),
+				PluginServices.getText(this, "error"),
+				JOptionPane.WARNING_MESSAGE);
+	}
+
+	/**
+	 * Utility method to display warning message. 
+	 *
+	 */
+	private void showMissingSrsMessage() {
+		JOptionPane.showMessageDialog(this,
+				PluginServices.getText(this, "server_provides_no_srs__scale_data_may_be_wrong"),
+				PluginServices.getText(this, "warning"),
+				JOptionPane.WARNING_MESSAGE);
+	}
+
+	/**
+	 * This method initializes mainPanel
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getMainPanel() {
+		if (mainPanel == null) {
+			mainPanel = new JPanel();
+			mainPanel.setBounds(new java.awt.Rectangle(15, 90, 616, 256));
+			mainPanel.setLayout(new BorderLayout());
+		}
+		return mainPanel;
+	}
+
+	public void addWizardListener(WizardListener listener) {
+		listenerSupport.addWizardListener(listener);
+	}
+
+	public void removeWizardListener(WizardListener listener) {
+		listenerSupport.removeWizardListener(listener);
+	}
+
+	/**
+	 * Enables or disables the main panel and the layer selection panel.
+	 * 
+	 * @param selectedPanel a String that identifies which panel must be enabled:
+	 * "main" (for the service names panel) or "service" (for the layer
+	 * selection panel).
+	 */
+	public void setEnabledPanels(String selectedPanel) {
+		mainPanel.removeAll();
+		
+		svsNamesPanel.setVisible(false);
+		imgServicePanel.setVisible(false);
+		feaServicePanel.setVisible(false);
+		
+		if (selectedPanel.compareToIgnoreCase("main") == 0) {
+			mainPanel.add(svsNamesPanel, BorderLayout.CENTER);
+			svsNamesPanel.setVisible(true);
+		}
+		
+		if (selectedPanel.compareToIgnoreCase("feature") == 0) {
+			mainPanel.add(feaServicePanel, BorderLayout.CENTER);
+			feaServicePanel.setVisible(true);
+		}
+		
+		if (selectedPanel.compareToIgnoreCase("image") == 0) {
+			mainPanel.add(imgServicePanel, BorderLayout.CENTER);
+			imgServicePanel.setVisible(true);
+			imgServicePanel.getImageFormatCombo().revalidate();
+			
+		}
+		
+	}
+
+	/**
+	 * Fires a notification to this wizard listeners telling them if the
+	 * configuration is fair enough to send a GetMap request.
+	 * 
+	 * @param b
+	 *            <b>true</b> if the data in the wizard is enough to send a
+	 *            <tt>getMap</tt> request and therefore create a new layer in
+	 *            the project; <b>false</b> otherwise.
+	 */
+	public void fireWizardComplete(boolean b) {
+		listenerSupport.callStateChanged(b);
+		callStateChanged(b);
+	}
+
+	/**
+	 * Decides which Panel must be loaded (ServiceNamesPanel or
+	 * ...ServicePanel) depending on the type of the service selected by the
+	 * user.
+	 */
+	public void fillAndMoveTabbedPaneToEnabled() {
+		if (this.svsNamesPanel.getSelectedServiceType().compareToIgnoreCase(
+				ServiceInfoTags.vIMAGESERVICE) == 0) {
+			this.fillImageServiceTab();
+			this.setEnabledPanels("image");
+		}
+		if (this.svsNamesPanel.getSelectedServiceType().compareToIgnoreCase(
+				ServiceInfoTags.vFEATURESERVICE) == 0) {
+			this.fillFeatureServiceTab();
+			this.setEnabledPanels("feature");
+		}
+	}
+
+	/**
+	 * Loads FeatureServicePanel's controls.
+	 */
+	private void fillImageServiceTab() {
+		FMapRasterArcImsDriver drv = (FMapRasterArcImsDriver) this.dataSource.getDriver();
+		ArcImsClientP cli = (ArcImsClientP) drv.getClient();
+		ServiceInformation si = cli.getServiceInformation();
+		String map_units = si.getMapunits();
+		int _dpi = si.getScreen_dpi();
+
+		this.imgServicePanel.setDetailsPanelServiceNameInBorder(this.serviceName);
+		this.imgServicePanel.emptyTables();
+		this.imgServicePanel.emptyFormatsCombo();
+		this.imgServicePanel.loadServiceDetailsTable(si);
+		
+		ArcImsStatus tmpStatus = new ArcImsStatus();
+		tmpStatus.setServiceInformation(si);
+		tmpStatus.setService(serviceName);
+		this.imgServicePanel.loadImageFormatCombo((ArcImsImageClient) cli, tmpStatus);
+
+		// load available layers list
+		for (int i = 0; i < si.getLayers().size(); i++) {
+			if (si.getLayers().get(i) instanceof ServiceInformationLayerImage) {
+				ServiceInformationLayerImage sii = (ServiceInformationLayerImage) si.getLayers().get(i);
+				this.imgServicePanel
+						.addLayerToAvailableList(new LayersListElement(sii, map_units, _dpi));
+			}
+
+			if (si.getLayers().get(i) instanceof ServiceInformationLayerFeatures) {
+				ServiceInformationLayerFeatures sif = (ServiceInformationLayerFeatures) si.getLayers().get(i);
+				this.imgServicePanel
+						.addLayerToAvailableList(new LayersListElement(sif, map_units, _dpi));
+			}
+		}
+		JScrollPane sp = imgServicePanel.getAvailableLayersScrollPane();
+		this.imgServicePanel.setAvailableLayersTree(null);
+		JTree t = imgServicePanel.getAvailableLayersTree();
+		sp.setViewportView(t);
+		imgServicePanel.setServiceInfoTabNumber(1);
+		imgServicePanel.setServiceInfoTabNumber(0);
+	}
+
+	/**
+	 * Loads the Feature Service Panel's controls.
+	 */
+	private void fillFeatureServiceTab() {
+		FMapFeatureArcImsDriver drv = (FMapFeatureArcImsDriver) this.dataSource.getDriver();
+		ArcImsClientP cli = (ArcImsClientP) drv.getClient();
+
+		ServiceInformation si = cli.getServiceInformation();
+		String map_units = si.getMapunits();
+		int _dpi = si.getScreen_dpi();
+		
+		feaServicePanel.setDetailsPanelServiceNameInBorder(serviceName);
+		feaServicePanel.emptyTables();
+		// ------------------- Test -------------------
+		// this.imgServicePanel.addLayerToAvailableList(new LayersListElement(sif, "meters", 96));
+		// ------------------- Test -------------------
+
+		this.feaServicePanel.loadServiceDetailsTable(si);
+
+		// load available layers list
+		for (int i = 0; i < si.getLayers().size(); i++) {
+				ServiceInformationLayerFeatures sif = (ServiceInformationLayerFeatures) si.getLayers().get(i);
+				this.feaServicePanel.addLayerToAvailableList(new LayersListElement(sif, map_units, _dpi));
+		}
+
+		
+		
+		JScrollPane sp = feaServicePanel.getAvailableLayersScrollPane();
+		this.feaServicePanel.setAvailableLayersTree(null);
+		JTree t = feaServicePanel.getAvailableLayersTree();
+		sp.setViewportView(t);
+		// feaServicePanel.setServiceInfoTabNumber(1);
+		feaServicePanel.setServiceInfoTabNumber(0);
+	}
+
+	public String getServiceType() {
+		return serviceType;
+	}
+
+	public void setServiceType(String serviceType) {
+		this.serviceType = serviceType;
+	}
+
+	public FeatureServicePanel getFeaServicePanel() {
+		return feaServicePanel;
+	}
+
+	public void setFeaServicePanel(FeatureServicePanel feaServicePanel) {
+		this.feaServicePanel = feaServicePanel;
+	}
+
+	public ImageServicePanel getImgServicePanel() {
+		return imgServicePanel;
+	}
+
+	public void setImgServicePanel(ImageServicePanel imgServicePanel) {
+		this.imgServicePanel = imgServicePanel;
+	}
+
+	public void setImageFormat(String fmt) {
+		this.imageFormat = fmt;
+	}
+
+	public String getImageFormat() {
+		return imageFormat;
+	}
+
+	public void setServerVersionInPanels(String vers) {
+		if (imgServicePanel != null) {
+			imgServicePanel.setTextInVersionLabel(vers);
+		}
+		
+		if (feaServicePanel != null) {
+			feaServicePanel.setTextInVersionLabel(vers);
+		}
+	}
+} // @jve:decl-index=0:visual-constraint="11,8"
+

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/wizards/ArcImsWizard.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsPropsTocMenuEntry.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsPropsTocMenuEntry.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsPropsTocMenuEntry.java	(revision 8301)
@@ -0,0 +1,67 @@
+package es.prodevelop.cit.gvsig.arcims.gui.toc;
+
+import java.awt.event.ActionEvent;
+import javax.swing.JMenuItem;
+
+import com.iver.andami.PluginServices;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.project.documents.view.toc.TocMenuEntry;
+import com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.dialogs.ArcImsPropsDialog;
+
+/**
+ * This class implements the layer properties menu item that is
+ * added to the ArcIMS layer's popup menu.
+ * 
+ * @author jldominguez
+ */
+public class ArcImsPropsTocMenuEntry extends TocMenuEntry {
+	
+	private JMenuItem propsMenuItem;
+	FLayer lyr = null;
+	private ArcImsPropsDialog propsDialog;
+
+	public void initialize(FPopupMenu m) {
+		super.initialize(m);
+		
+		if (isTocItemBranch()) {
+			lyr = getNodeLayer();
+    		// ArcIMS layer
+    		if ((lyr instanceof FRasterLyrArcIMS)) {
+    			propsMenuItem = new JMenuItem(PluginServices.getText(this, "arcims_properties"));
+    			getMenu().add( propsMenuItem );
+    			propsMenuItem.setFont(FPopupMenu.theFont);
+    			getMenu().setEnabled(true);
+    			propsMenuItem.addActionListener(this);   			
+     		}
+    		
+    		if ((lyr instanceof FFeatureLyrArcIMS)) {
+    			propsMenuItem = new JMenuItem(PluginServices.getText(this, "arcims_properties"));
+    			getMenu().add( propsMenuItem );
+    			propsMenuItem.setFont(FPopupMenu.theFont);
+    			getMenu().setEnabled(true);
+    			propsMenuItem.addActionListener(this);   			
+     		}
+		}
+		
+	}
+
+	/**
+	 * Creates an ArcImsPropsDialog object and adds it to the MDIManager.
+	 */
+	public void actionPerformed(ActionEvent e) {
+		lyr = getNodeLayer();
+		if (lyr instanceof FRasterLyrArcIMS) {
+			propsDialog = new ArcImsPropsDialog((FRasterLyrArcIMS) lyr);
+			PluginServices.getMDIManager().addWindow(propsDialog);
+			}
+		if (lyr instanceof FFeatureLyrArcIMS) {
+			propsDialog = new ArcImsPropsDialog((FFeatureLyrArcIMS) lyr);
+			PluginServices.getMDIManager().addWindow(propsDialog);
+			}
+	}
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsPropsTocMenuEntry.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsLayerScaleTocMenuEntry.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsLayerScaleTocMenuEntry.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsLayerScaleTocMenuEntry.java	(revision 8301)
@@ -0,0 +1,66 @@
+package es.prodevelop.cit.gvsig.arcims.gui.toc;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JMenuItem;
+
+import com.iver.andami.PluginServices;
+import com.iver.andami.ui.mdiManager.IWindow;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.project.documents.view.gui.View;
+import com.iver.cit.gvsig.project.documents.view.toc.TocMenuEntry;
+import com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.dialogs.LayerScaleDialog;
+
+
+/**
+ * This class implements the scale limits status properties menu item that is
+ * added to the ArcIMS layer's popup menu.
+
+ * @author jldominguez
+ */
+public class ArcImsLayerScaleTocMenuEntry extends TocMenuEntry {
+	
+	private JMenuItem scaleMenuItem;
+	FLayer lyr = null;
+	private LayerScaleDialog scaleDialog;
+
+	public void initialize(FPopupMenu m) {
+		super.initialize(m);
+		
+		if (isTocItemBranch()) {
+			lyr = getNodeLayer();
+    		// ArcIMS layer
+    		if ((lyr instanceof FRasterLyrArcIMS)) {
+    			scaleMenuItem = new JMenuItem(PluginServices.getText(this, "layer_scale_status"));
+    			getMenu().addSeparator();
+    			getMenu().add( scaleMenuItem );
+    			scaleMenuItem.setFont(FPopupMenu.theFont);
+    			getMenu().setEnabled(true);
+    			scaleMenuItem.addActionListener(this);   			
+     		}
+		}
+		
+	}
+
+	/**
+	 * Creates an LayerScaleDialog object and adds it to the MDIManager.
+	 */
+	public void actionPerformed(ActionEvent e) {
+		
+		if (scaleDialog != null) {
+			PluginServices.getMDIManager().closeWindow(scaleDialog);
+		}
+		lyr = getNodeLayer();
+		
+		IWindow v = PluginServices.getMDIManager().getActiveWindow();
+		View vista = null; if (v instanceof View) vista = (View) v;
+		// vista.get
+		scaleDialog = new LayerScaleDialog((FRasterLyrArcIMS) lyr, vista);
+		PluginServices.getMDIManager().addWindow(scaleDialog);
+	}
+
+}
+

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsLayerScaleTocMenuEntry.java
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsRasterPropsTocMenuEntry.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsRasterPropsTocMenuEntry.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsRasterPropsTocMenuEntry.java	(revision 8301)
@@ -0,0 +1,224 @@
+/**
+ * 
+ */
+package es.prodevelop.cit.gvsig.arcims.gui.toc;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+
+import javax.swing.JMenuItem;
+
+import org.cresques.io.GeoRasterFile;
+import org.cresques.filter.RasterFilter;
+import org.cresques.filter.RasterFilterStackManager;
+import org.cresques.px.PxRaster;
+import org.cresques.ui.BrightnessContrast.EnhancedBrightnessContrastPanel;
+import org.cresques.ui.raster.BandSetupPanel;
+import org.cresques.ui.raster.EnhancedPanel;
+import org.cresques.ui.raster.FilterRasterDialogPanel;
+import org.cresques.ui.raster.InfoPanel;
+import org.cresques.ui.raster.RasterTransparencyPanel;
+
+import com.iver.andami.PluginServices;
+import com.iver.cit.gvsig.fmap.layers.FLayer;
+import com.iver.cit.gvsig.fmap.layers.FLyrRaster;
+import com.iver.cit.gvsig.project.documents.view.toc.TocMenuEntry;
+import com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.dialogs.ArcImsRasterPropsDialog;
+
+/**
+ * This class implements the raster properties menu item that is
+ * added to the ArcIMS layer's popup menu.
+ *   
+ * @author jldominguez
+ * @author Nacho Brodin (brodin_ign@gva.es)
+ */
+public class ArcImsRasterPropsTocMenuEntry extends TocMenuEntry {
+	private JMenuItem propsMenuItem;
+	FLayer lyr = null;
+	private ArcImsRasterPropsDialog	propsDialog = null;
+	private BandSetupPanel bandSetup = null;
+
+	public void initialize(FPopupMenu m) {
+		super.initialize(m);
+		
+		if (isTocItemBranch()) {
+			lyr = getNodeLayer();
+    		// ArcIMS layer
+    		if ((lyr instanceof FRasterLyrArcIMS)) {
+    			propsMenuItem = new JMenuItem(PluginServices.getText(this, "propiedades_raster"));
+    			getMenu().add( propsMenuItem );
+    			propsMenuItem.setFont(FPopupMenu.theFont);
+    			getMenu().setEnabled(true);
+    			propsMenuItem.addActionListener(this);   			
+     		}
+		}
+	}
+
+	/**
+	 * Creates an ArcImsRasterPropsDialog object and adds it to the MDIManager.
+	 */
+	public void actionPerformed(ActionEvent e) {
+		lyr = getNodeLayer();
+        
+		if(lyr instanceof FRasterLyrArcIMS && ((FRasterLyrArcIMS) lyr).getPxRaster()!=null){
+			RasterFilterStackManager stackManager = null;
+			
+			FRasterLyrArcIMS layer = (FRasterLyrArcIMS) lyr;
+
+			stackManager = new RasterFilterStackManager(layer.getFilterStack());
+			
+			propsDialog = new ArcImsRasterPropsDialog(layer, stackManager.getTransparencyRGB());
+		       			
+			int alpha = layer.getPxRaster().getAlpha();
+			
+			bandSetup = (BandSetupPanel)((FilterRasterDialogPanel)propsDialog.getContentPane()).getPanelByClassName("BandSetupPanel");
+			GeoRasterFile[] files = layer.getPxRaster().getFiles();
+			bandSetup.addFiles(files);
+			for(int i=0; i< files.length;i++) 
+				propsDialog.addNumBands(files[i].getBandCount());
+				
+			PxRaster px = layer.getPxRaster();
+			int posR = 0, posG = 0, posB = 0;
+			
+			for(int i=0;i<px.getPosFile(GeoRasterFile.RED_BAND);i++)
+				posR += files[i].getBandCount();
+			posR += px.getBand(GeoRasterFile.RED_BAND);
+			
+			for(int i=0;i<px.getPosFile(GeoRasterFile.GREEN_BAND);i++)
+				posG += files[i].getBandCount();
+			posG += px.getBand(GeoRasterFile.GREEN_BAND);
+			
+			for(int i=0;i<px.getPosFile(GeoRasterFile.BLUE_BAND);i++)
+				posB += files[i].getBandCount();
+			posB += px.getBand(GeoRasterFile.BLUE_BAND);
+			
+					
+			bandSetup.assignBand(posR, GeoRasterFile.RED_BAND);
+			bandSetup.assignBand(posG, GeoRasterFile.GREEN_BAND);
+			bandSetup.assignBand(posB, GeoRasterFile.BLUE_BAND);	
+									
+			InfoPanel pInfo = (InfoPanel)this.propsDialog.getPanelByClassName("InfoPanel");
+			pInfo.setBands(posR, posG, posB);
+			pInfo.addFiles(files);
+									
+			//Asignación del alpha actual de la imagen al dialogo
+			RasterTransparencyPanel rasterTrans = (RasterTransparencyPanel)((FilterRasterDialogPanel)propsDialog.getContentPane()).getPanelByClassName("RasterTransparencyPanel");
+			rasterTrans.setOpacity(alpha);
+			
+			propsDialog.setRasterFilterStackManager(stackManager);
+			bandSelector(stackManager, posR, posG, posB);
+			propsDialog.readStat();
+			actionPerformed(stackManager, propsDialog, null);
+			
+			PluginServices.getMDIManager().addWindow(propsDialog);       	
+		}
+	}
+	
+	/**
+	 * Selects the active bands in the band panel
+	 * from the filters retrieved from the FilterStack
+	 *  
+	 * @param stackManager RasterFilterStackManager
+	 * @param posR R-band position
+	 * @param posG G-band position
+	 * @param posB B-band position
+	 */
+	private void bandSelector(RasterFilterStackManager stackManager, int posR, int posG, int posB){
+		ArrayList stackList = stackManager.getStringsFromStack();
+		String hideBands = null;
+		for(int i=0;i<stackList.size();i++){
+			if(((String)stackList.get(i)).startsWith("filter.removebands.bands"))
+				hideBands = stackManager.getValue((String)stackList.get(i));
+		}
+		
+		// 1, 2 or 3 bands to show
+		if(hideBands != null){
+			int pos = 2;
+			if(hideBands.length() == 1)
+				pos = 1;
+			else if(hideBands.length() == 2)
+				pos = 0;
+			bandSetup.getFileList().getJComboBox().setSelectedIndex(pos);
+			
+			// Reset table controls
+			
+			for(int i=0;i<bandSetup.getRGBTable().getModel().getRowCount();i++)
+				for(int j=0;j<3;j++)
+					bandSetup.getRGBTable().getModel().setValueAt(new Boolean(false), i, j);
+			
+			if(hideBands.equals("GB") || hideBands.equals("G") || hideBands.equals("B") )
+				bandSetup.getRGBTable().getModel().setValueAt(new Boolean(true), posR, 0);
+			
+			if(hideBands.equals("RB") || hideBands.equals("R") || hideBands.equals("B") )
+				bandSetup.getRGBTable().getModel().setValueAt(new Boolean(true), posG, 1);
+			
+			if(hideBands.equals("RG") || hideBands.equals("R") || hideBands.equals("G") )
+				bandSetup.getRGBTable().getModel().setValueAt(new Boolean(true), posB, 2);
+		}
+	}
+	
+	/**
+	 * Modificación del estado de los controles del panel de brillo y contraste
+	 */
+	public void actionPerformed(RasterFilterStackManager stackManager, ArcImsRasterPropsDialog propsDialog, FLyrRaster fLayer) {
+		EnhancedBrightnessContrastPanel bcPanel = (EnhancedBrightnessContrastPanel)((FilterRasterDialogPanel)propsDialog.getContentPane()).getPanelByClassName("EnhancedBrightnessContrastPanel"); 
+		//bcPanel.setPropertiesDialog(propsDialog);
+		
+		if(stackManager.isActive(stackManager.getTypeFilter("brightness"))){
+			bcPanel.getCBrightC().setSelected(true);
+			bcPanel.setBCControlEnabled(true);
+			
+			RasterFilter bright = stackManager.getFilter("brightness");
+			
+			if(bright.getParam("incrBrillo") != null){
+				int incr = ((Integer)bright.getParam("incrBrillo")).intValue();
+				bcPanel.getLabelSliderText().setSliderValue(incr);
+				bcPanel.getLabelSliderText().setTextValue(String.valueOf(incr));
+			}
+		}
+		
+		if(stackManager.isActive(stackManager.getTypeFilter("contrast"))){
+			bcPanel.getCBrightC().setSelected(true);
+			bcPanel.setBCControlEnabled(true);
+			
+			RasterFilter cont = stackManager.getFilter("contrast");
+			
+			if(cont.getParam("incrContraste") != null){
+				int incr = ((Integer)cont.getParam("incrContraste")).intValue();
+				bcPanel.getLabelSliderText1().setSliderValue(incr);
+				bcPanel.getLabelSliderText1().setTextValue(String.valueOf(incr));
+			}
+		}
+		
+		if(stackManager.isActive(stackManager.getTypeFilter("enhanced"))){
+			bcPanel.getCEnhanced().setSelected(true);
+			bcPanel.setEControlEnabled(true);
+			
+			RasterFilter enhan = stackManager.getFilter("enhanced");
+			RasterFilter tail = stackManager.getFilter("tail");
+			
+			
+				boolean rem = ((Boolean)enhan.getParam("remove")).booleanValue();
+				bcPanel.getJCheckBox().setSelected(rem);
+			
+			if(stackManager.isActive(stackManager.getTypeFilter("tail"))){
+				double percent = (stackManager.getStackStats().tailPercent)*100;
+				bcPanel.getCheckSliderText().setTextValue(String.valueOf(percent));
+				bcPanel.getCheckSliderText().setSliderValue((int)percent);
+				bcPanel.getCheckSliderText().setSelected(true);
+				bcPanel.getCheckSliderText().setControlEnabled(true);
+				boolean remove = ((Boolean)tail.getParam("remove")).booleanValue();
+				if((remove == true) || (rem == true))
+					bcPanel.getJCheckBox().setSelected(true);
+				else 
+					bcPanel.getJCheckBox().setSelected(false);
+				
+			}
+		}
+	}	
+	
+
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/gui/toc/ArcImsRasterPropsTocMenuEntry.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/extension/ArcimsClientModule.java
===================================================================
--- tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/extension/ArcimsClientModule.java	(revision 0)
+++ tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/extension/ArcimsClientModule.java	(revision 8301)
@@ -0,0 +1,91 @@
+package es.prodevelop.cit.gvsig.arcims.extension;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import com.iver.andami.PluginServices;
+import com.iver.andami.plugins.Extension;
+import com.iver.cit.gvsig.About;
+import com.iver.cit.gvsig.AddLayer;
+import com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu;
+import com.iver.utiles.extensionPoints.ExtensionPoints;
+import com.iver.utiles.extensionPoints.ExtensionPointsSingleton;
+
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FFeatureLyrArcIMSCollection;
+import es.prodevelop.cit.gvsig.arcims.fmap.layers.FRasterLyrArcIMS;
+import es.prodevelop.cit.gvsig.arcims.gui.toc.ArcImsLayerScaleTocMenuEntry;
+import es.prodevelop.cit.gvsig.arcims.gui.toc.ArcImsPropsTocMenuEntry;
+import es.prodevelop.cit.gvsig.arcims.gui.toc.ArcImsRasterPropsTocMenuEntry;
+import es.prodevelop.cit.gvsig.arcims.gui.wizards.ArcImsWizard;
+
+/**
+ * This class implements the extension to access ArcIMS servers.
+ * 
+ * @author jldominguez
+ *
+ */
+public class ArcimsClientModule extends Extension {
+	
+	/**
+     * This method initializes the extension. Adds the ArcIMS wizard
+     * and the right-click popup menus to the gvSIG resources.
+     */
+    public void initialize() {
+    	// must add menus and a new tab to the wizard
+    	// to create an arcims layer
+    	FPopupMenu.addEntry(new ArcImsPropsTocMenuEntry());
+    	FPopupMenu.addEntry(new ArcImsRasterPropsTocMenuEntry());
+    	FPopupMenu.addEntry(new ArcImsLayerScaleTocMenuEntry());
+    	AddLayer.addWizard(ArcImsWizard.class);
+    	
+    	// about
+        java.net.URL newurl = createResourceUrl("about/extarcims-about.html");
+    	About claseAbout = (About) PluginServices.getExtension(com.iver.cit.gvsig.About.class);
+        claseAbout.getAboutPanel().addAboutUrl("ArcIMS", newurl);
+        
+        // catalog
+    	ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
+    	extensionPoints.add("CatalogLayers", "arcims_raster", FRasterLyrArcIMS.class);
+    	extensionPoints.add("CatalogLayers", "arcims_vectorial", FFeatureLyrArcIMSCollection.class);
+    }
+
+    /**
+     * This method is called when the extension's controls are used.
+     * So far, the ArcIMS plugin does <i>not</i> add any controls.
+     * 
+     * @param actionCommand the control's string action commmad.
+     * 
+     */
+    public void execute(String actionCommand) {
+    }
+
+    /**
+     * This method is called to find out if the plugin's controls are
+     * enabled or not. So far, the ArcIMS plugin does <i>not</i>
+     * add any controls.
+     *
+     * @return <b>true</b> if controls must be enabled, <b>false</b> if not.
+     */
+    public boolean isEnabled() {
+    	return false;
+    }
+
+    /**
+     * This method is called to find out if the plugin's controls are
+     * visible or not. So far, the ArcIMS plugin does <i>not</i>
+     * add any controls.
+     *
+     * @return <b>true</b> if controls must be visible, <b>false</b> if not.
+     */
+    public boolean isVisible() {
+    	return false;
+    }
+    
+    private java.net.URL createResourceUrl(String path) {
+		return getClass().getClassLoader().getResource(path);
+	}
+
+    
+}

Property changes on: tags/BN68/extensions/extArcims/src/es/prodevelop/cit/gvsig/arcims/extension/ArcimsClientModule.java
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Index: tags/BN68/extensions/extArcims/about/Thumbs.db
===================================================================
--- tags/BN68/extensions/extArcims/about/Thumbs.db	(revision 0)
+++ tags/BN68/extensions/extArcims/about/Thumbs.db	(revision 8301)
@@ -0,0 +1,22 @@
+ÐÏà¡±á>þÿ	þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot EntryÿÿÿÿÿÿÿÿÐî‘Š‰ÒÆ€1ÿÿÿÿÿÿÿÿCatalogÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÿÿÿÿÿÿÿÿ	
+
+þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿØÿàJFIF``ÿÛC
+
+
+
+
+ÿÛC		
+
+ÿÀB`"ÿÄ	
+ÿÄµ}!1AQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ýS¤$
+	À&™_ç=úP”S%•aBîB¨êMqÚŸÄkh¯��˜\Äà8ý)¤Ø®v”W›iÿ./µmD%•‚¢I=:}zúWUsâËk
+E,çl;`n#Óqh.oÑLŽd•AV<ðiõ#
+(¢€
+(¢€!œäªâ5/J…¹ºO`MLzPœ|Uñcé¶ÂÎÚî9"¼ëÀqµïˆ|×Ëãg$þ_Ö¶~%„¿×Þ&.Q÷Iè}«;Â–²évz�Ä¨cpÏ|òöZèJÑ2z³ÊjÏŒú‡ÀÿøÏÁ#NÒu
+CSÍæ§«�:Ç#ÈŒ‡”«Ì	¯3±ý¼üqâÍ?N¹�ÂúÛÛè³ëÚÔ×m6ÑW~H’Û?¼EfMßÞ_˜�ó}%âÿÙ›Dø“ñÂž&ñSÇ©Yè6ò”Ñn!Y!žIc*�³÷ÈµÔøÇö~ðß�´mBÂÞÖßL{ÅŽ9n`�<Ï)d�8û€�»Ó­gÔ£â?†ßµ×ˆ¼KñGOñÖ‘ Íuo¥®©bº|ï!�®µ†ÖêRz�rX…–�î�¹¯¥¬?l�k&³ðåŸ‡´éuînb½»†I&¶òâçÌ�Hÿ�€­’v²7&™£|ðê¢Øi}¸žQ%ÃµœdM ?}ÔçÖ½)g«F½·v°ÐšX¤Kd}*&’T¦ÕÆlãäwªÑ|D´ßÂybþÚþ"Õo¬ìôÏ
+Ú«Ë¨K¦É4Þc�6�§dPA(@ÏYû¼öµeÙðÅ¥ÅŽ•§É«êZíÆ�f.nŒVÑ¬Lèf•¹#-€(ûÇbäg5Ù_|Óµ™í¿µ,ô‹Û[bæ;y4ØÊüÍ¹¸<NrØÉÉ5ZÙËF‹IžÐØhì÷S.i‘1NÆþðÜAËg ÷ÈåÂQŸsÌ¼9ûcø£Åž*Ñ<?£x6ÛW½{‰a¿’ÆId…Ñ.b‹Í‰ñ„]¯+'ÄW'­}e^m¥|6Ô|7;Í£O¦iÇÊXUmôäB¨¡p ƒ÷Avôù½«¥ÐtïÃsš¦«ñ—†+p7Ãg�œ�»ç5iì‹ŠkvnKòÜÄ{*ÅCuxò>ðäSá”KnýÇ¡¨,ñß‹ú‘Ý­ìjJž¤V/ƒnnu@±\æK;gWäòíü)ù€O°÷¯pÖ4ˆ5›7‚ew¯;>½ðÛ<1Ä'±f$eÏ^�˜ý+hËKÖ·7-õ�<‘pVdÄ@ oä1þÙ[˜­­¦‘@Ž(—æ=²2[üûW1g§Ìó"ÄæÞÀ|ƒ¹Æ1Ó§¿Ò·u-.[�1tÛUòÑÀF?ÝNÿ�C°ÎcÀZQ½Õd¿uÀÉ#ñ5éÕCEÒ"Ñì£‚1÷G'Ö´)7v4¬QEHÂŠ( ª²›i¨Ê¼?­Z¤##šEpê
+œƒJT0Á¨L	h›iî;Q3/‡>«@X#C� }<:
+h™O¯åJ=:Š( Š( Š( Š( Š( Å-PEPEPEPÿÙ``$zžHæ•Ælogo.png
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/about/Thumbs.db
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/about/extarcims-about.html
===================================================================
--- tags/BN68/extensions/extArcims/about/extarcims-about.html	(revision 0)
+++ tags/BN68/extensions/extArcims/about/extarcims-about.html	(revision 8301)
@@ -0,0 +1,24 @@
+<html>
+	<head>
+	<style type="text/css">
+	BODY { background-image: url(logo.png); background-repeat: no-repeat; background-position: 100% 0% }
+	</style>
+	</head>
+	<body>	
+		<h2>Cliente ArcIMS para gvSIG</h2>	
+		<p>Director del proyecto:</p>
+		<ul>
+			<li>Miguel Montesinos Lajara</li>
+		</ul>
+		<p>Equipo de desarrollo:</p>
+		<ul>
+			<li>Javier Carrasco Marimon,</li>
+			<li>Jorge Gaspar Sanz Salinas,</li>
+			<li>Juan Lucas Dom&iacute;nguez Rubio</li>
+		</ul>
+		<p>Build Number de la extensi&oacute;n: 68</p>
+		<center>
+			<p><b><a href="http://www.prodevelop.es" title="Prodevelop">http://www.prodevelop.es</a></b></p>
+		</center>
+	</body>
+</html>
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/about/extarcims-about.html
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision

Index: tags/BN68/extensions/extArcims/about/logo.png
===================================================================
--- tags/BN68/extensions/extArcims/about/logo.png	(revision 0)
+++ tags/BN68/extensions/extArcims/about/logo.png	(revision 8301)
@@ -0,0 +1,247 @@
+‰PNG
+
+
+IHDR½2áª™“óIDATxÚì½	˜$Gy&ÝÕuô}NwÏ¥ÑÒŒ$VÒH#È’¬Ãâ4æXã5^0öòvmïo/ö>ö{yÖ6—�ßþ1°ÁÏV¶#�Œe˜Y@:GÇ\ÝÓÓ÷Qg÷ÿF¼™_EE]ÕÓ=]3äÇÐÊÊŠŒŒŒ¬|óýÎhYYYQ‰$’H"‰Ô-­›=€DI$‘óLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiLÜL$‘DiL.(Ü\^^Þì!$’H"¾\8¸™€f"‰$rn¤m³°’ f"‰$r.å¼ç›	h&’H"çXÎoÜL@3‘D9÷r¾êé	b&’H"›%ç%ßL@3‘DÙD9ÿp3ÍDIdså<ÃÍxÐL 5‘D9r>Ù7c`1AÌDIäœÉyÃ7ëÍ••Íe"‰$òC çn& ™H"‰4�œzúª )ˆÙÒ²ÙcM$‘D~¤Ùq3
+4ƒ4 ÙÖÖì—“H"‰\ÒÔzz� ¹²²œ€f"‰$rÎ¤y±&4…f4[[[ÐL$‘DÎ™4)ß¬4[ZÐL$‘DÎ©4#â4šét3^ÂÆÉÊºÆ
+¬Ù¥Ö’øàù!–¦ã›õ€&“ ™J5Ýø7NVŒ¬oŸ‚~ÖÛ(ôÔ›}ñ‰$ÒLÒ\d­NÐäN€&d³‡¼±”õÙª¼P,›N[Tþ‹�<…l˜í–uîD9¥‰ž„†@³­­íBÍzîˆ4Yö'Ä5ûckK+àoUÔÃ—ì
+-[
+š²ù²¦öÞîlmm©=pE:c³§3‘DÖ_š7ÐT>b¶TjÅ�!oÔŠf…ÊRÛIíFÊg’>o;oñÐp¥ö¤^ŸÊ�Mû8”WVZ[SÜNŠ6è©¡ŸM‚ž‰\`Ò\zº#¡ ÙÚzaªç‚Dµ@š/Wª»ôDac…4Ûr”æ‰ÜYYÆ¿V��­6êÙè·‚#
+¼r?OQ)WRm)AÒ••‡lÖyi	t&r!ISàf(ÙÍ/ê(”ýÕZ­oŽY‹’•JMWþzÞ34V”ÆAGéVŸ¨µUC'uóå
+N¨UFÍ÷;Ô;ãõ}‡øZÛU(_u6�M¤Éeó1¨!Ð¼�¢ŽBÓÞöÕd^{K‹U,š¹â¡g¸•Ã°L|Õf7(åËÀÍt&�¿ä•Òm¾PÌ¤ÓVe(j±TÂGåÓÏR©¬©~ÕÔ2òÐQÊÐ(dKB�‰4³l2ÕšÊ8Ð7w´ë"A²&J±
+ò2ŸT*e¼1>šp�š•h±óU¡XÂ�žé¶ÖÖÏX,Šår¥«³'ªTÊú¤©VÀ7°²Œo‹%žÉ¤íÁ×wÕ¼(wBñ‘”6�ÎDšV6Ó/Ôh^¾ (‚i3>;huw„—E�&à¯ÎQµç²étºT*Í/,–Ê+{»»0ÕØÙÄ´ëá-/Ï/,U*ºÏT*ÕÕÕA®~™Ê¹L�`Òéä�?är‚Ó•@g"Í)›Æ7ÍÀôð(+ŠHl�4)šKö&„€H‹¤
+ŽicçÅ´,Ç"¦€�l8ß.³ÙŽ"h*ÃF5˜âEå“Í¥B1_(ð¤ºûZŒs_ùppêù²|ƒƒRµô3‘	ëL¤i¥‰Ì…Q y¾û‚VEL*Ýªw*
+Jâ`Y¹ü‘ûÛ|'�½“)"€üŠèÔÇ–*ííY`(aWÙLšo, &vâ_:p/B3Š‹(ÔP@ÏP»g�‰4§lEù1‚ 	9¯}AQ�D¶áÒnCŒÒþˆe�uû[¹„E¶µ¥ì=ÒhXÏ8Ñ¬\)ÏÍãßB[ª
+š8;Ô–Pÿè-Ÿ/¤»ÚZ|‡’{�Ö…Ø—FàÓöY)ôŒ!ž‰§(‘&”M€¤(
+=šØEîù(‘ˆ©ª3Ô±£‰^›÷‘\R#A�ÛÒU�{i©€�iM>SÔÄ	vDC¥á¯ ±5y»Ë:F©R2=çršÆ¢7@õ÷\6= ‰oAH[[Züëp9¦Ï�«_áêÈXÉ •o‚°ÑSëú«ÏÍ¾Ÿ‰$R•s�›1fMM£ƒž—fM'°Üæ˜*?$VKÑ²!ž!ÒÜ›3•�BeÙ+±?¯
+@FPt‚m6ƒäóE¥Šét*›É:]Qšh�Ëeel€Kœ=s`86gùçOÕÔP½öP‡ï&wØèi•\µ=ÁÊDšV6_vªÃy;WVR­©óÑ¬DLog€c:p©|’è˜#‰ŒÄ¸ªÂ^r7”�<4(õ6®½]ûv°Aó¥´/•s¹Œ
+³uM¤x%f*Ó:37¯·sY@'ðÇöõfqSªÁö+!®sˆ|
+H@I?‰ž+f¢`oEþ‡ÏOi9§À$›¡¾ jìç]´æª¦ÌxŽ©ú8]1Ê¨ä¤�¥ZceÑ¨´?2¸à¸>õúúºòvK4K[š>zæáøËý‹Kùéé¹®Î*û<uwW§²�Za&ÚÐW­¥‹„šjVz¶´°[AÏPµÝ. ²Ù7<‘^9w¸Y§/ˆ yÞièõ€¦�˜ŽãÛµ`VÊú_J+ÚtaƒuÎÎ.ì¬„K¥àGÚ…Ñê9Ð³³³ƒÄ“Üßûá±ø
+-1°é™Y¨¶ä‹8p÷®í€­’;×óJ°ÅÁPJUUÛY~)Æ_”xŠÙtÙLE8hÖ$h¶¶´œ�ºZ�fÆ ¦X0éŸá¶Ùðl‘téØ9Xéí´ �Œ’-y@ÃžžNOðÇÉ©N”ôšKÜÙÙ™XÏÍ/€`j²éƒ&¶ñO…‘MU‹˜A³ƒõi/€j„©“âÉéñ´¡Ó‘4ÙD9Gð£¡;QGJ�O+SÆÐÌ b*4ƒS	ÐXÊ8@†ííÙÌBÚ¶TRBicð+lkôÌ¤ûûºú{¡õCmPòŸ¦ŸØ(–ðÈ¦v–ªŒ7ICj±Ô5Ü‘ÍfªdÓ‡´¨@wûí¨O@Á=Cˆ'SLÈ½£°«ZÄLXg"›"ç¡â5ôj³óSCW�+æ6Ç"&©¢ ð0ºìÊ’E?ûûz‚„e3ì‡ÎôÀöÔôœ6}ú’Qât8).ašdsËP¿" É][	'›Ák¤µ!jöÂ¡Sy:;¡SE®OÌ�‰lŠlZÜ{¨Yó<ÒÐ£"�âóU“}z.š’§;Ó9ô±í’¥R8Ó„¢�)¥Cq“b|DzŽ¡¹ã ›~útÄh�´^2<4›Ñ•èpE¶Ã[²›j5tŠD�%ˆ¤‚žQÎ¢O‘ŠˆúL$‘
+’
+©(
+]@S�'zCºy(hÆ ¦ªµ]jïv_
+\ojfªnOOçÔôLÌØŠ�Þ¢š
+Ó$zîÙ½ƒ£Ê™´ô¥¥‚€æìÜüÐ`ÿð–^,ðkYièŒª9"WÊm§�uÊCmè4l=Rg�ÂÇDmOäÜÈÆâTCfÍTëy¦¡‡‚æªJ« I<bÚ_¥R­8ˆÖÝÕÉÚE¦q%ã-“(ºå;=){Ø¬H¸Äž¥3SPÕ�øÍe³Ó3³³³4w.,æS©6pRq£/¯„ÜÐàÅ:É�¡Iñ¶ˆã(:™Y¥°+ÉÏ:ÙhÙ~jÖ„†ÞüyèáLÓ<çš¡4ÓQÌÅóô�;T™J¥Ð¹Ž ,§¨M��O=;�-’Òiþ‚?�~
+¤‚*¦è…�HQ¯TÊh@TÅY^g&§è/bWh@²š�îuRûj¬ú»¬ÄMÆ3Ñ³š�*à)’!pÔÛ¡u@�=‘�–
+„ª†4ôóŽi†z�Ð¬‡fF!¦ò-˜To5†•*…BÐ™»hj;�E7U8àµ¤Í£‰‡e)KS\¦;rè
+äTûÐ+åÓSTÏA3•�ª;¶�Éf°Î¼X6©æÛ ©áú"Lpª~´Â•ì%:ýµ•ZBsŠÄS”ÏD6NÎuÜ»­¡WAó|pÙŽ xƒf”5³ÄõöÈ©IÊOÚaU7iƒ‰ugìëëÎå2Œ"RµÁðÊäI¢:Û. ›œByè+ËÂ’ë�KVß´cìk‰·½:%DI.ŸÐÉtL/ªE‰Îî@d¢³'²Ñ²Qh{d+yËÖ‡ó4••on#H”nC3WELëÛŠ©§¡;\ZR»na8Ä$Œa·5ýòDój'þ_‹˜ÊÔ�Ùlm„•[[[‚œœKVòª0ï	àri5'QÕa£6t†°NÜÄPC-#ë€$~öD6NÎuÜûyçrlšQ^ Ý¼Qš)Ù°_BèPóÍ)5qf*U[Ž�;M˜§`(¿"÷´ÏëÀ%µrë,å‘í#Cƒý6hÊ­FÙaüÁèý ÿ
+…NŠ@gÊÔ´'t*‹~.«OQLåã„x&²¾²!¸ÙÙ<_êw„‚f”A3T7¯1eC ô°šndºÅY´wèô¤vKù‚þh\:Ê‡Ñ´UÀTÎ%'’ÙÜ2Ôï­ÜŠ~¼öHÊ$&ðJå’Y‚D.\ª„¥&ÊŠ©Jè”ø¤ tZ+©Ö”WƒNÅ¢bB<YwYÜu…rWÍM6C¼ç 4huó h–Üz•¸�ÅR9ç±WêÚô˜K `Ow×¶­[À+ÇÆ't„&ÏFåè)Ò…ŒÃ*ãÛþ-ÙlFÜÌf—kzÒÜÈ™Je–Ó+h°¸”_ZòJ«Úh� Ø“ éó�ÒŒ�Ê¯…Œ€Ÿ¹dTT¼HB<YG9wqïAw�:OÖÀˆgš1Í:­™ñqB*bqJhØ$´¯·g>µ8©óÍãÔäTtáwt²‰®pÒ\g†;
+åÄ­¬(.wÁ�f�Þt[G{è97¿ n¨zÄ�Ne©öm5ƒŠ
+�Ê2èÌ¢rEã`+×õjÐñ¦ñ?¡þ"•ÏDÎNÖ¶ÐÐWVbžÞM—ïùª ïŠ§™Â•…nmm©:V)Û‹dP:MP‘©[\À)¾~ÁQý}½Ê¬�…ä¬9Òkæµ¦zÝ©Nœ})_˜Ÿ_t’èW~P¤ä¯Q¼LRCÏ†NY;¤bî‚·]ñ+É·,{°Ž�á±�J‰$²f9GùBA
+]��îü»FÐŒ×Íƒ”°R›ÍíðM°°ÐÄ2Ä‘á
+Tæ©é9ôì€¦
+£ÜV*û��9€¯	w×;«$NÖvW^4%¾*û!àˆ'þ
+ôÎÌÍOOÏÍGçÈ³pI0J	³gu†@§ò×±–ù”Py½ž]…k‡¬¨”jU­þ¨W¢ 3!ž‰¬AÖ¹¢Èfˆ†ÞÄd3d¡?Žz
+ ª›¯Š˜¶5hßäžZ5VÃßÈðPggG>_˜�]­èaƒ¦³Çifæ+[†úñV‹£e†lâŠ¦ffsÙ,àDo~a	|¸9<48Ð×àœž™•‚uN„N=ÚÎ–‘ÔKv&!8
+î”7£§Æ&¾üO_ø£�}úè÷cçî+®»çŽÿÇŸyÛömÃIx|"ë%ç4_ÈóÈ59ÙtÒ(+•êµ¬4¢™¶dÒ)®°æ÷£1…+¯)O§Ö¥ˆûúºš,0l÷$•ñ¯«~-¯üÐz›_rRLì¤‡2 wóùEðÊ\®�/rÏõ<HB{{u­Olìôæ¼‡žÔƒÎLÚážœX¼$œl÷`I:¾*09DLû+ ç¾wøÄ±ç>üÁ´·çì¯ìðx•ÏD‘u³õD¹Ñ£Èfsâ¦ÏAÌ¶oÖ$h:Áí
+š)/·RkÍW>ïR áøødOO'�‘y>Œ]W¦ž1G295ƒfL‘´;¯Ÿ×£Á[Ñÿ Ð®§ËŸ=µ}ÓZ·’èY*•9'\%óÐ×Ûƒc‰õlÌ–ø„á‘~²‚2§H&'�N3éSø¦¤®«ZŠíÈáÃ_ÿ»Ï}ŽÛßüþS¯å=‡^¹ã¢=�|ÿßÞû¾ß'ë„|ö³{Ûm?sÓU�‰Ô-ç(_ÈÍ¦%›5�G–/HmhªÕ ð%eÅi¥
+ý$hBfý0SÓ3¬Äa÷Ù¨1dl|ÐÙÕU­âPN!›ft0P¸²’58Þ§Ø0ë­CsÇ]&zR÷÷õÎÎÍ³ä­ŸiÏ“®…%ò�~ÿVex×òë}uôÉÇmpüí÷ýî�?vÚçrÙ›nºéý]�¿ø«¿ÅoïðkØ¤´*!ž‰4.ëƒ_«Z6«»LÌæf_uˆÔã@WkÍ§yP’HO±¿JeÕa237*ß¸ŸŸµÍ	•¿M»Ñ=Þ]ƒ!¢--˜‘©™YpLL@$æ‡‹_sÁ=�Œóó‹àÂÙ¬N…'�ëˆ}ÐÝµ¸´¤ég­ï(�2ç~7¦Çhî¾âºK/Ùg:6w'U9xÍµ÷Üñâ˜ŸÿÂWÞùŽ·�E]~‚ž‰Ô/ë€›1u�¼�µ¦€&LŠI?w|A¡uÒ‚ C3ƒ¸fï	¤NjÐ)‡U`VP1W�sL{_´}h°¿vfÜLg}&È©±	ªÕ\K0Ù^Ì.e5t?1ƒ�S`+ö Yo·¶ä²™ŽööþÞžyCQÅúIèÄ6Žb·ñKïÜµ÷ÞW¿ö3ý)l";º­õET©\ó†Æk&7)I”R"õÈFéËQdÓ,šÝt¸Y3LUS³#š’´. iKhÊ#Tãr
+°zXUt
+qšv
+c'^¥S£#CB6EXkÝÛöýB˜0Ór¹ƒ›J“Äß1x/¶ç²Ï>§W-æÒíå™ò™É)´âøÑæ ÕÛÓ¥ýZ½=¢¼s$.'+¼Ç,äù†×¿nÿ�Ë·�ïÚ}©Ý í›€­{QWL~ŸÈª²áy–ÙlæÒGU
+½¶ð�]'mÍ …˜ñ�A5S§åcº-NÍâ)OT´öÐÊìLößÕÙN=UàÂ	w× ÙÒR*â
+RÉfÒ™ö4 R™µÛ tƒÍsÙ,À ¹cûx%f¡Xn–LMåœÖÝ�™6Õ
+ô,•ô¨ÐI{n¨.:¡ƒÓ86>Ñé/>ì8°v|±ŽyÓM·ð#í¤´™fJiY
+t
+’¬ÒžHŒlŠE‘M“^Òtd³Æ‡áRµkæ¬�iÆ‹SQX<<âÇÐì)y�zD†7ÓIÔ)D˜RIÝ\; ZZpÉ²„$gD¿=²¹²rfr†‹\‚Nêh¤…Ezá1è¥¥Â™
+‘º¨©|—3Àº°�çµä:§ˆ¡TPÞ¥ôòÌÜ<:loÏ}æ¸òWßÔK×^ 7KO)b•kb#s–¢$ÍDBålqÓe—Ñd³RYÎf3›}½®8�G«ú‚D¢‚Û½oë`šj5‘2p‰ñDe
+�ÐqQ Ç[¥‹RØA ¶d3Ù®®ŽB¡H'¸½èPÆ]I-›É�ýóK8FbÈ�PÀ��x§
+é°ú	ÔÃ6GÛÑÞ®q½\—$’¢(é)÷W€›øVNüì�&6>*x^Õ‚fÉÏìÄð>ÿ…¯ÈþžžN;þ4‘DÖ,g…›õºÑ�¤ðô7³’^«¡Çû‚òž¯Y€§À5Œ§¬•î—iÅS~"¹n ‰�b™ô”±#“.Q¹f j°Ä2þNÏÌþÙG?zâØsÎÞòïæÆâ¶Dn‚0²°<°Ì,)¬S@(žÃ`ú–¡~pO®9Œ6`µ Ÿ€` %Æ€=��šlæóÅÓSœCã‹/âÒ¶ož›_˜83-+Ð§çð‚��·¥”×®§t®ÇÔ-MŸ9eKæ›H"g/˜giÇlâ‰Ídš—l£5U¬YS¤Î�£Fªú’9J«ìû&y¥”Y#¤Êªö
+Rä‚—& 	ìSVqåcÇÇ>ð¿þgp/{éK�"rÄµ6ß�®ŒŽ¿ÓþªÂÜàëîê4êE÷¼ÁMü=vB'ÿàØ÷¾mt˜u<Áv¡˜£·l&
+®ŠÌs=3©—ÛT‹KùÂÂb“l¯FçÍ•¡œ²Ì§2è	èÄÆ‰“§$JéšË÷pÀgi²´�f‰ÿC+kÇÍÆb6uÅÆæ²lºá&µz�fM¯MhÖƒ˜tàÄøÄÍb–z>uºa C1m©xÒµZÊòÃ¦T’'@ÓYÜü{ÿöÍÐ³ûx¬ÇÁ++g¦fg@Ù`Z×)AW&è]49æö3bŸmta:!#|õëà€œjæwê�l–ãÄu�P(¡Â«é@'ß%ÔÙý	¯2ÅÛôèOÊÇëÊùf¢³�NÛÛžx�~heÃò…j-›PÒ›Ð#¤j}èÞh4k®4)¡ˆ™64�?ö¢¸m:9µ÷åO=��´¬Ä~$!’<Qj_e÷×õ
+Ž
+¶ò]ÐT&‚]%�€àqøŠùé“EmôdP'×}ÃÇ¡Á¾Á�^ a¥KÛŠÓ%ôP(˜ØCë'ØeÁ2W*UÉðð@OO'Ôv 6ÐÝ°hž}G8ÿ6†-Î�±-—^²OOEË2‹$I�ÎP‰BÃ@)kþrÖ<77n´þp:æÐ…žV=jydÝp3¼Š‡?Am©&Ê
+¹÷µëÙºŠ5k–ê	¡™¡Þ!½No-¢•Qùí·¯‹ê9^¬.ÌEÒñ-€ðø©±ÐNÐàÄ©qhÊŽ¡Zp_¯p=(ÚÞFQ‡â�Me¦üÔôÌäÄÉbñ".dü”Æ²íÁ|¢Ðð¹gžœ›óÔ|R×àŠ#xg0d��±1???;¿87¯··�ŽlÝº•µHD ¤3^™wÎ¨çA¿=j,Þ–_OæÌß]e—Á�©À@&^±
+Ðö¾*]pN±*¦8Z¨Ý !Ž"�L¡ÃóW¨]qz³õ>öû*š­ôßq³~��&›©Öæô‘l:eâb4tá@_³M3TC/êÂiÖ¹Ð$Î_‚‚^uºÔ-UÒ© ‹ÉëòV`/dÉ_zQææ‚!ÊGÿ¿?þæ÷ŸâöÑïúpûšË÷ì?pùM7ÝÖyj|Œ|Ã›2©–€?œˆUHzèŸÿê³ŸwºÅáïz×{À"¡€èƒ¿'§€üâÛêŽ;ïT!Ë��=ûÔc�?qøÈ¶Ã¥2°¨L¾¼Rçý<`ŸqËP°�’�û¯Í-,#ßÂ²Çü�X¿Ïö-XiÝ²’òíª¶"IÔž¨¯BÁH$d§ovºJÕÇTZüÐ@S7ŒºüàÀðËZ\Ô¯d–ÅÂ+
+ƒ‘ž¥Cve.õ�«h±â£ÆyŽeCòÓ�X÷¦ÕÐUõ×P3`Û‡.6
+%›�:‚¢Ú³sü>(ózÙµ”@g\Ÿþ2€—�~
+TÊtÑ@‡U1õß¹9¹DL66)ª¸ñè«¿ÿ†×¿<N’0æL_/˜#îØùè¾ïtâMf©ôÔÑcòÇJHù¹wþ•_ýõù�ÛË£Ÿ¯~õ~àohW2ždDÞróÍÊÔF’×:dßPl?ô/ÿrä[ßîîêöÖÓÕÑÕÕ>{É�«þÝû†úä,Þ†~#é�ÙÙÙÿýÅ¯žœ‰¬ÓlËÖÞŽ—ÜzÃ¶­[ÑÉ—øÊC�“ýoxÅÝÝÝÝvQQJ¡PøÄßÞg÷ÿ£/¸æÚË÷áü_{è_¥‡Uå'îxÑ¾}û„ÏÎÍ}êïþQºÅÞüš—÷tWçÄÉ˜#^/û#Ä&¦ë¡¯~ø9ý»:~ò4þŽ;Êo^÷ü«v^wèš‹wí’ö¡]á¿ßüæ7¿ü÷×ˆ�ÉöÅ£7Þð¢Þ^maßDô\7ëÞd9BNÑ£ Ùõ¡¯»Y³›kMµÊO×ñŒCŠ?Ü_;×s
+1�ÜÄÅë‘hâ¿¶áò€Mïý/¿påUWO:¦bìôdfZ[0xèÔ¡Ú øâ¯>é€&å·þûÛÉÞ½ûpÂÑÉß}îs¡-ƒB¬g59P×÷ØƒT�Ð²YÏŽÍ@ºšvhg„|C½æE/ÌíÜ±CùˆÉç\›>ÌO¥\*���ß÷¥¾ûøs«u¨åy—ì¼åú«ù[ä}ü/?ÃýéLöòË¼àªËøÚ[¶pó[?xêw>òq»‡·Üs38îÝß<ð­/ßÿÕ:oÐvG^ÛµyŠ{ü™ÿõ§Ÿ.Òík_v'qÓ¦™s¡×Ž1üãƒßÀå?úÌ¸t%‚‹úîãŸù¤¶tÿù»Þúš—ß~è§Ì$~ŠvWøÐ”		t¸×gÿû/þì5×\sžáfdAb~ëx„RÍ˜�C6U„†N‰ÑÐ×š¡®!¯g3ÂÐê“$—ŽUÕ)ò2 Ùä:,@“VBÈì|],)T€Jo~ÓO~ðC¹áGnd\:qrÆ3eÊ)®}Ó/ïpÆ�¡­´$<sô±÷øÏ¢ZÆŒê·¾wøÏ?ö€NXt8<º³à?ÒL÷Œ2M‡ú¥‡Ÿ(¼å•wÝyû�â} çS—Õ³YÖ³ªoÓÉ±q †2Oµw–‚ØÒÑÙ‰Ãñ\€ˆ}Ü…öø·85^*í(¡ åÇþö¥s4»û¶›ÛÒé|¡ðÜÄ,i]=çE›•ÅiÏ*]*éB‹ÓlÏïØ�ËéJT¡4
+bÊµïû�p£†s^nú1“ï~çÏÞpÍóØþ.ÙÛâÂ¹jèåÈN¼Ÿ^óó¿ñûÿõg_r×]›•Å°>õ�B,¿þ®&Mo€�ì 'Ê]$&ðHd
+ Só�ý3YÈvè“r¶ÕQÈ£ºäº¹(�lZu‚•q­ào”*­„�p)1àhÛwé]�:Ž2×ÓmÈ,™l” fäo{Ók”ñ†?öø²ÜÅä½ïû}àæ½¯~-ÕvÆ(s'ÎL…,TczîÝïûc(¡ÿé�¯hÓ±úy>çe]ÄOûÄž>5éV(‚(€'ˆN€}CÛw³xèçµýçý6?6þà×¾.‡ƒ¾ðª€˜ÐÎcÎ»×pKG_~iIc835c·9t`W{.W“ý!b½-ŒwQ_øý_ÿ6Yöª¨ÍœÉÿù�?TïüÙƒöØ½éûR,NMO‹vï\ß+Ò¶á7ÿ°£øÖ^»)¬³aÜŒ"›¡!Õ”JºM6íì ‘xwÐºçùÓUõ1)ãí
+¯RfÆN|‡5.’Í’K6�Ÿ‹B"Nww7cãÄ©{€°¡ú2 íOþøCÿágÞ!¾&û«†&'Õ54ó³'NžŠMqRÅ=ï`Ï^ÿºŽîAÉå½[šŸtßsÇ‹»»º{º:Z6jOTê�?÷º{8òù|ð¼„6PÂ¨‘_<: L@X[¹<Ò“œzpà·cþÍ%ËÕýŠ ›6‚¼îùúpsê‰ãÏ�ç*e^÷ª{lk -Ã=í;‡zx`›	Õ 9Ò†ZþÐdò•�˜ø Iß†6£Ds„\®Î†<|üïþ�?ùŸ¿vÉŽá¼‰í�Ëa¥Açrn½rð}|vÉÆhN øà�ßhè7¶.²ÞëJm6'ß²©j³ƒbÜA1+ƒ¯MC—£¢²Ô™x®,ï¹Š]1ÂèïÙ´/dðð‘#QvC Òu‡uû.lìÇ¿Kö*cÖ¶ÇÎ—½ô¥Ý]�b6UuXÈgm2‹“²‡õØºmÇÎêç;^üù/|%´1GÅÜ!ÝY	7 `7ß|¿®öwâõòàƒ_(ÔOþÍçô×}šKæi/äóG~ðŒ²X%(!u^¥íÔ:ÞžA)ÉAceFggg{zz¤ñ©S§\²¹Ç’�×ðÝxÃõw=ÿòþ¾>žQ¯ECk¸avö¸A¥Xù<ñòË˜ø?#4qá=ü4y8ßx+´g3Ù\®Ý\>¦ëû�ü yx¼çÍ/W1e—ä5ãbûúúFGG¯0ÃÃQ_¾ÿ«r½h|âÄ‰ó7£”t’Í¦Í¨(¼²YOjÐÙø‚UÝŽèLwà——
+â¸Rø¦câäÇš%=„lZP‹×U»ºº_¸ô¤Î
+��>þä¡ƒWJcà2ƒ+C…ËL2îòºC'Ùƒ>±“Nƒ#ßúv= )Þð×¿òž¿Š žèê–Ís¼Êv�ŠûYÊ+‚,tÛèð+~ü^œâCŸúåïøÀ¿óµ:RjÉ¬„§7
+EÑ.	%ÛM]>A« ?ÀÙ�O}æŠËö³%Nñåï<Å>‰M r@¥‚Õ�èøø‹®ˆVeeÓüZJ6­#?Ú·, 	ÕžÄ�‡ŸÓN04o½å¦»Ÿ`ÐO$“öær·\õe»Fßÿ§Ÿ´¡ð‡ö{wï²§‘¯[€¤ò’ÀëêM¯¸Sm[ÆfóÏS› �áZýJº×{3á¦?T×²©¢É¦H|ÀæÚdÕ‚›Žá¦Í¬d)íÑŠJn”|'!›¢¤ÔbÂzlAË§Æi	å�5\Ï ¤XØ>Æ÷BÐ4+Ð€c"àoÎH”§ÛašæŒsDgtzˆt¥Ç6¿ÚÆîS¤ÿ•tðS&�¾í¶;€vc°?Ÿv<êø‡gÛé,)fJ—|†E0²Õj`RR0üƒÞ
+=W¾%ÙTbøO#%TC•_º]òáÏ6&BFz<‚LVMûÐ£ÇläR4_uóA‚¦Œ­À)Êka|÷;VÐŸrß7~`ƒ¦Ì€ÝsGG{Á?/ÆÐ(q1qü™MÉ³ZO\[ö
+‡üØœáîNV¥#u’M‘õ
+<²‘”y„ Ú"|“º¼f•æŸ²’y96Ù$®ACg;�H…¶@u%½§«ätÞ6Bc•…’Í(>‹Ó½ó]ïh*C`…ÒBCï1ëÁ¦£}ÿ�Ë£ÎŽý¡‚®bSŽuöØÐùÆ;¯·xl8šÜ¤s%¤’žñE¾ö´äcÊpO;û'^œœY”6‚P6Ù”ó¯Å™.‡ËyíñØV9{P)îèÔÄœz‘BÆ$‡”òoª‰44ûz{äÚ½S˜q
+t”_÷ª{ìQað'NŽIËàëG[0Ì·ÿ53Stšh`U›!g[G.‚¼ÕÆ7;¦ßÛ#³¹*ÙÜ w�5i5¹C==�*"K¤Ðô²*}²©®É‚<€ŒPt“´E´'t®zÒ¨À#[€È‡^�–6hŠà\�þàû¡j²9:TÅ˜>b'zÜ“'ORý—A:DÝZ]é)Âµ—^þ¨¯¯ïÆ®—P XÞ’á}|Ô�t�™šiéè3ŸªPµ²8�õ-ž|¦àÉ§kˆ_¡sQrm²‰SkËfÄˆ@ouÎÉ,ç©¿KÏ85àÞ&w©¡¡!‰:vj´+t1+4•9 GaãîÛnÞ:R�@4pÇ_Ûª€ñÜb”˜4Œ�ÀÇ+rè³X0äUñýGŸv‚d;ú‡ÕfÈ:ðA*éAmžu+ƒ–Í`Ì¦Z�leãÈ¦òý?‘öM}ê¬`ÊOÕ�.{˜Šn3e�M1/
+ëtytÆX-•E6ã{ëîî¥b­® ¤ÕÃÃ 3ê@ôIÔ$X«ÚT"Š.Ùi"èÚÂ?�ÎLª…°<ð J‹‹BÏ…€ƒ�~öïC¿Ä\½ÿbÁnYl×:_*ÄÎGž9ec„�5M›çr`÷}éüžýÿôËÃí"¸Æ”I0cÔQ‘š&^ÊÖ¦é£HP”xÀìë¢:íqÚª:^9�T¯È²ðŠø°ýàmô¿þôÓÊ2Åâ}sÙÅÛÔfH¸_ÚÝ¡š¯p\\6z”D‘ÍõMG€¡ííYB¼mÓ”Š™1^u©ˆ!‘ÞÙj4c°ß^nh¤ˆŽŠÇMåƒ&š…"2˜,ñ‹|¶ŠªŒvÎˆÆÔåi.pFÅ7yˆœÈ�lÈÖ{u
+f¿ì1E sIU½À¡csX’2�Ù¡-^·(þzr([ï¦v	D@ÑÁƒ6S‡çÆœ÷V£ð
+ö‘Úh›I6EC—ý´ä:&Ñƒ×=¿§ÇÓÐ3™ŒÓÞÙˆ¡ÉríÁ‰Å_ž”ùHöPñÚ²e‹ÚYû#•ôæ‰@Z•lÚ¦Àx²¹Aº#\+-›ÍS…%ãbÌ"ÁÅ0hÙ´÷€l_4£”âm[G¹!‰˜Ô…ë?q*J<Ë¦op´õPŽ·D”ñ;Ù¡¶Û1ý}Ýº˜^tÖsÉNcT³«v:ú21åÐ�]_¾_Ù~s¨Ã¶ïd3ˆ°Î¹bÎëø÷C�±ø*~ž¸2%!›ö©mäÚÚÛ²I7‹a‹Ø‡G.‡‡ÒgŠä�Ú©Êòà¿öewÖY¾dÝå¬p3jI-ÍdÜTµë€‡Æº‡JT±¸
+%›Êd¦ã½ƒ
+ÙètªÉKÈ°%›ÇºÏ4•R.B~çùm"¼äŽŸ=Ñ3PXÙÑ=ÈÚ"Á³D�JGÊÌ¢Î·ñ,Xâ¨T˜
+!“ö–ß(¦Ó¥¼’(T
+1.•
+ÆØo§
+¸vmßyuŸ½ï?p›âôÊŠ9~…S‡úÙ�aïÝí�­ÂLÊrÙ&�1’ko—*‘e³‘÷í\Ò¢ÕË‹„æ;ÙN9¶¹ñ†ëÿÛÛ¢¿¯¯žn„Ô‹›uå¤ÛJzÓ7EV¬š`¡áGÁ![Î
+Ù¤àIêÕÒüE)b„4S “—ã,å&@Ü�(Ž\³�R>0áohð&‘=•€°1AHC[�S‹ÊE(žýÑâ§¶ªŽÓ…*é÷¾úµÎçû\Î•Ž”Y:¸ä:eÞº»:œ¤i[l–Dðz×[_cÈ=aèÁ#=9;‚ÒÖ[Å5ÄØFût ›ôV;1OÎ¨%¯ºù`ÐO²²8vT¦ž•tåÇ¨Æ4î�ÎñŸ3ˆÙ–NçŒ¿+xF;;€—ŒÃíË	f©ÚU}ÈŽÝw?ÿÀ�7¼�%‘6KÖ³þ¦Ozó7­‘Gz„¸“´â¬¬ÌB¤?¡ÎtY0Ã�Ë`c|…~˜bècÃqD¸Þ<Š8K&Yi‡O2¦2&¨ž5�ÓµE‰‚?ì<qòTÐ4)uº¨hS‘ý—ìeÁP©¥ïˆNò³ØŸòãc¢X|„ÎK–�,„arò¡‡Øì¸õÊ=í$
+â5”ñÝ».Ây%MHy!¢9	B²M�N€˜))å0�hGG;®Ý6 €ßõcwp‘+®¾X£­cÀ…ÚãŒ’øä]uô4ÒãÄ|M’eNÑ`ïE]Ô×ßObqžÕC¢ÄD›6¯qÓ/ñ¯¤ÇWtß8%](mW 3Ý^SSg‘kÊ@ÙÐ¹°˜ý}?5åºQÖûCìƒŒú9ýHŽ%1(@ä]»/¿+N7ürzÿ‡ÿìßþS¡Ð•gIììtˆðªŽ©‡Ÿ;ãø[¨ªÛÁ $;¢°Í¯Ø¯SÎÍ
+åbŠ æÕ‹ìÓF�#Ž¢TÆËaïÝö°µ¸qv€‘ª}û!Ç:¦R@á©“'wïÞ�[ÖÑñ'˜FÇ«cO£
+Ø
+šxap›Y›�üt²Y¼d)„#êœËY¡[TR7©¤3Gˆ;EIz„‚rn•ô—±´¡P¢ÜOºÔÐ
+–ù*ª3¯s=ªnµdè’ðShß1Éìï|×»m8‹ñ‘GüÙÒaëÅ°TS§ã� ÌEQTe`ÚÙ,Ò<¼U?½Ìö€ö¢”<È¦‡@+ÛfÚ:2ì‘>sGð�·yËçµµ…]2˜#þ]7D¨ÞN”�åìqHk¼8�8;œíŠÛÒJ›ìG?ÿÀÂÂ‚xáù•ónxèÑcÁhy{ÀAúÌ×S@SÏjJ¯±Åå¦S©Í\²¬.¾¹\‡¥É�›�Ê9#›v¸;Ž‹dd³'©Éá›²‡pé�M)=—·’ñxPÄ¯e‚ü«Ï~^jž‡®KaË½¯~í¡ƒ^t�XN£‚�”¡Ò…0çãœâƒIY)™«t 1«ÅÁ³C>UD‘æ¡ÁþÐº'ÊxÞqù¢–JÒNM›@�÷P˜³ÅÖa/vÚdª7·öçðÜ¡í»%]D0•‡´Øò5¶ª³ÇòlU�€øÓ¯¸?	ù”öPÏ¡ËÛ[^ãÝ·Ýb.æÚ è_<:@¢-P;ÛÛ3f	µÙ«­gÝâf6n6ª¤Ÿ	Ea:Óí¥4ƒ:8ýEviÎr#Öå„�¿XžïU¼‰~é¿Ôl²Ë ­*Ðš1ìù®TÍû¤ÔSK8¸zG”¼íM¯©ÇnÀu8øwa1??3ÎQ=úÄ“4æ¦3ÕP$@ÆU;íl²+zhƒfÊ¼õÂÈ�hu{v‰í¬!!›NP¤-N¶ÏHOŽ-q©Dg»sÜ;vØX$nG¡P�š˜rRç(°¿·ÿä+á7ÿ�‡K…=ÌF”Ïû™õÀD°ZÖ‘s\jx°˜ž.ß	Þ´sUµ¯	ê9~Æ4…lžöÍøTú&4n:{$Ü�p³‰Jºíâ‰hó‚;‡J¿�°Îõ£â½‹Ú°×@SÃ"£ê|9z2m
+º”Õ²Ááš|Oð£„„3þŸûþ.8ì ¹€ªå[^y—Í’‚bgFF	¨åe»Få#©þ:&N›lÅá¹ãÇŽþåþ%ª±Dæ:°€ep"¢ýÍß
+]¤ˆâe€·“v”Y±ù]o}Íï|äã�ÊÄZâŸÖ¾}oNá¬œ!q—@XF)EM&K,}¦‰ÃM±Amtž�_(œµ5!Ù•êb³•ðš›­¤Û½QCçN½¬PkK|"“˜5õRþº�)mJk(>òe@ï<¥žŒÆzêù^ÿºt®Ã&G[U¸†=ÛNœ“ $Znaü£�5\ùÇâ@&Ùûqáº2^ ÎiÕU†¤¸$@s°¿×�I¬õf€[é•Óººì­¯~%ÙœÊÀ™*2Ëi¨€¹PÕ&)±°T‰
+�Ä~ºbž>å–mv"Ÿ‚n}ëk.öý]Pù¯Þñþ�oèT¾­SóåZï–À:ÄYËRA7ÚÉZ¯ÑÁëž¿s¨÷‹a f«a˜6hžzº-ÁÈÍ&q
+YKù‘›f`�*éçŒlÊž\N{<�ì[ªyè¥JÐ›!¸I›�2?;)x~ö`zý+ïyá¤³³cúÌ©y“TS§ž>2<$ƒçÄJ<¦MQéÏÁcSX3jlÍÐouM¼ú–²…QÖ,ùÃ§]XRP»´-¡QF&>„m¡O1q*C6¯úwº°d9B]ÛËyCGSµñ’Áas!ŠUgCòÍ	�²]ÔâBö¢oLÏ¶	uñãîCOo¥ÈGLe­¬š|=ËºÒÒmãfó9…V|pÇDãBVô­¬¶¹Ñ9B<E{.b�)5î &®¼%ÅCD¢;C%ŠêªiæAayö—½ô¥\lRúU�ºpÔ²B8¯ÁM©¾N±a ”®õ9:<|dOüGÊGsV¤§‘cn£ûž;^|åó®Ø¶u¤=,~0U1ÂêÂÁÜ	ì“èM¯¸ÓsÇ§ÓÅb1Ià«ó¼v3"uCÃà²Š»T9â~€àpÏ]4b†.f©ü·.ù…ûwÐú©|úlÃ%é³ô€W„Z¹
+¬¢¾é ©6"?½©ôô*öWÅÀÔC•-è\œ|�2
+�¢AoÀD…L>�éªÖÏ#Û&Ú¦2ÎŒ‡'¶†*é”¨› ¸Ð…
+íÜµ×îÓ^KCTcoŠÔI³ž®ŽK/ÙX—ºvvÿ¶èd[Fñï„¿B\pløvÿ¾½¡¡�NR&ãóWM´g(xëÈÖ‹z:MòuÞ+Å¦på|ãOÜ+GÅ,ìÃ
+zÏ™M”­u»3à"	-õ²‹·Ù«‰Èy�Z–Q§¦ØÆP�Ô³K2ìøeüäÚNê$öö÷ÞÚßL¤y4Xîª�ƒxëHB$(¤=“è�ópèÀ®CÞ(§»îÐ5:
+©.•…•›šjm¸y^8…"F®Ë �r›ìÈÍ˜CÎeä¦20—nk‹’¸°lðRU›l%måeK¥Œ±ÑV+ðSç
+øxËÍ7Ö0�\Ò�†¶ö÷uó�‘¬¤:»»”¬a‰†'OžÄ!‡nÅ!Ýƒøƒq‚fjÃk:•Ï×P*ø8êÑÇŸ´AœQPÁ�)+ÿ‡Ø'-	ší]e³W^³¡“aðU¬�(Û�+â¢x&uÝÛ)Žiñi(?ž‘Ô‰@P°£gœ¬!.xëœ‘G½óµw¢ýÀÀ/›ÕzÑIÞÇ—UÏ�»Ëj“…@Éƒc–…‰ØÒY`ƒÐ<vz1êæ/uy‰»T¾OÜ®<Oþ.g¿åú«Ó®§Ë¸€0gA¸TM€˜”5ûÓ­ˆ÷Í¨SßÀPkÓÒÅ¾‰›4_ªÂ‡Ã€Jç0IÕf
+á—¡Ùp Xœ¤W’HFømP‘BÙÌ+ÞÒ'°ÅÂHÀíË4h’õÍXÀMMÆUg:PÛhLdÇÃ.¥_QÑ¹ÿŽÑ šÂ.í–Dö²ÊZí=D&Ž
+H
+V<â•bä,ö�—P‹rgÒa^6‰‚�œ‚GN=våc=!™°,#iéœ·ºßâq¶H¦ÐŠJŽÈÂD^¬¾‰3who!z‘"
+³é«Áê~Hi›öaVd~d´NL;ãIœ0£Fá’¦¹�ÙõÑÓ›=r³vC\ÕííÙ¥%7³›x¤±Àú¹l„qÓYÆ’ðø	µ¦Z£øæ*ÔØ"¡‚ªx‹OM»¦Ì¨”èÈTÆù‘œ‘ ‚~ŽÓD Êg5N:Ñ€å04Z~ê¡��(æ6sÀ-�VIN¡jg{‰e–Íp°’bÓL‚¦=“CT N�Š&›³2¯."&ãZ[ô˜c ÂFLœfv8º°0²¹jÀ�™´VÓR§{û!8MÔîW=µ�P¶#[ŽµÑÖýñ†ÝÖ&�¨Ô²U¬ÄÓml�—ô*œ·5ÂW^ÆÄRÖFWÁÍº2…j‡¶^#;	Î`°æ¦wýi¼}½”�³ðäºHhŸ f­-:è½¢}w‚Ä“%Üu@»¯†OþäÔŒ£Ë«Õ*±k[áÖQ&eNNœÄ†(ÚÊ¼K€žØÃÙ:‘ÙôEó¦éîÖº<v4qàììµ<Åæ›öàƒ¡p©jáo%Õ™ò«¢(SE{Øº¨­‡Ú=y
+È£Ò~)96
+ØƒÛ¡ï‹_$MŒt�;X]þ×ƒƒDÔ:Û¬feÂ ­“f†kIo:äÛ:D4\ÀŸ“·ž«…¿¨©ÇÏm[›–Á(‹!bÚ¹°Z
+=ƒÁêÕk7½q&…ÆÚgÔÎsëÚ¬\\äï-Ü´²êêlx fggõK=â‘iHã›«Âhksà&Åv
+…6(yJ�æM^­âs^Éö;uv`,Y“Xâ:ŠqŽ{ÅGÂ “Ä“<Ñ»Òü,i—Tü�ò,‹iO©­‚&tÓç™ÜÉ±uéA›§´S©•…¤DŸP;¬²–¦prçÁ.ûG¥Ù\­Šmƒ iæŠ™CU«"ð�èlSÚ¢jîðk8Å_ø#ª.�Ë†fò'�{¡�Y©r|ZßðÀÇ¤ñØk—Û I&Õj¶‰ ¶þ+L“17ÕîŒIíËÉó>ôððÍ-££Áó*Ë �ÂNMOÿígþæ÷¾ª§§ÇApùådüÑÚxuùÁk—‹ª,/·
+€4³Y{�^K#ôC°±âþà®¸òª{î¾KEKz|¿ýíoé‹_|ûÏý\èb‘�RÑ†õô¸ZÅÍç²�›ª6xSÖ“PÀ¤ ØmÄz¿Q"™éxì—ŒÃÏm6“Žº÷
+­ÑÆÁE9!V¡i3"àz¤ŠºÎ[:=Ðßëa¢m¸ÏT-•PÀ	‘¢¹c{¶k “®E+ö((¢Û¢«Ø¥%õÀ-'¦L ¦M34ù*"t²e{W–
+‚yâØsû\îLerù½ÄS`Ÿeú´+¬_ÃzÆ§KL ª(Øg£•]ÈC@3Uûh±½¨ÈÜxôÑG¿ýèÓ/¹õýB5íXãÏÝpã�ätvŸr^g>eÀŽ¥òÄÉ±#GþïO¼á'‰¤B3ì¼ž�0çò‰›DójÙ'_Á—çÍµß™ýr¦ˆÑ \éˆp†/±ý•ï<¹{ß¥+&špUv)°K)
+'ÇÆo»ýö®ÎÎPåÝÞY†®Ý¾êjÜtç´v©ô Ð¥Ž[¥ë›•ÌÒ�µOà†ŽÖîx‘ÖÁ‚ÐL,”uÝÜÞ|§óÕœ_)]ö„!:x5©¢f^}˜�"ˆÒ1L‹ÊÁ� ;×eÂÿpºöö,Þ@„H4èéîÒ§^P¾S(2sFYLÓ.A�Æ¨€©é±`>öø‡�¹îÐ¡öK®H…qÌÚÉ©¹q†'™Èðü,ˆ6:Ï�ò«Ÿ8 ‰=_ýêW�|ëÛïxÛOK‰\>-6ÙIèÚhÜå¶ž|"RFÅ°µÄ|K**¨Q1!ÃöíÛµƒÅ(¼<ÅâÂžÿmÛ"×#­ºÄ±Ù6VŒs|v©sÇ~M6kB{9«>[šƒ¨ÞrÛ×¼Ú¦�ÊBL§ï¢üÙ`W‚nÎ{E^´¹qú´Žpâíò€°ªÚ§žO
+�]».}~Åå—qÁN~äyÅ¦,¸õé¹ó©ÎZÄ)¤š7m	¾—ìüE»\1žy<?@�yµ¸ÑKþª€;ˆ{úúºuX~AßoÍì¬`L9pÕ”sa—ôK.,x¦(Û™ô¾s×^Œ‹¢n§4kh›75›1
+f5«3šfg¨Xq�éô"�HŠ‡bJñOÊ?6 ƒÒe�Ë'[h~â¯>Éåäö\rE»Ába©i+ÐÊãë¯n³åä„~lÝº• ‰¹úçï¿ô’}x¯<úø“¯~Õ½íí=œíûï¿ÿ½ïû}l¼â¥w7ùTÏÎÎþå'>Ñ9¼óå·ß”k×ñ@„›ï<üð}ÿG—�.yýó¯#B}âoï»zÿÅ uÛ¶Ž\sð {~öÙg¿õð¿}â1°§[n¾‰õÒ•A–‡~ìÛ÷Þu+ÁzòÌ¥‹víb‡Àëï=ò(Ž}å½÷²b¦ÜÜÿóå¯ÝrýÕ÷ýÛÃ=í·ÿè-­>0g7î{ßäéS“÷}é�_¹ýéïà«èüMo~óÀ@MÝ�*Þ)uìØ1€æ_?ø.W*m¾þ�ÃßûÎÃ÷¼ô¥-ÛËõ>úøø
+pÙe—á«ù¹¹Ïüý—1Ú£Ï<‹a¼öewæ¬òÛ=ôÐ‘Ã‡q�xgT'N,{´¯¯O s½§Û¿¿­Ð|÷»ßÅ~nƒ•³&ÖìÜÜá#ß¼îÐ5;wxuðp+ÿí»ßÅlƒ¼£“Ë/¿X1¿°ð÷ÿðÌö8p T£§4Ì­‹øÄ;²�£6Úi‹Ê�¾þ¾sW‚ß.",
+'ée’�.°HôÌD¹AŸy”`Š¨ç¡AH»¯¸½u¸¤û[#¦!_­&Lûú[[—ñšÄ·´p´ÀSü[Z*LÏÌ£GG†ðoËP?þ…Ó�ËAÙwé²¨ÑgþúS‡Ýœ.‹‘Ÿ<y ‰�Í;n¿|6íW[U—+ unnîšË÷Œl½ˆ¦Ìù…Å?úØ§�Å³óÑ|ÿ¯ÿæ3ò“À´Ä¿�A]	 6=5EÐ<úÝ#ØT±¶&ð ¹ûy‡ óŽ��éú›ÆÅÚò×ý£¯=ø X¿Ñí?ÿó?ÿáG>ÌÌýÁï¡B®ôÏ?ý¿Ñ¨wñèà¸bbæzø÷éÊ0€&àæëÿò >¢Ë·þ=õä“¿ó‘�†p8ºÊ¤�®ÝjÄÓßÍ¤á¨þÁïÅ°
+$Âå˜	­» sFæìÏÿ||<¼æ@«pÏ»dç¡ë®Ëø–P.úÄ›àÏþôÿ}ö™g”šP0ÔÅÅ%|Å’ò¸(3óùÏ}N™e;?õwÿ¸lX6&áó÷ý&£ÂQcããK1,åó ÆûöíãÇøÂÿò�f8ÈoÅ—/þÓ—¹ÿ¾ûîÃ½æ~é£ŸýûES'‚Õ~ä#˜mL5Zâeƒ¸ç‡?øAL/®÷.¾lØˆ›A‘Uã›I*�NyêRÕzmÎ¿5Éö¤s›™BÚ
+à;…¤xGC–MåCj¶6_œ.~¥Ie V‘`jÅM/p´”ÇŸÒìœþ
+A�Ð,.å+1QÐÓñ�éôïÒžéŽöñw ¯Ã(­FÛÑÏÛÞôù¢÷«¿öÿüò/ÿòÏ¿ç—~é¿¼{þücñ’»_—i_¬I¨8
+T cjìä³ø{Ë�7<ïÊ«@L�¸(s‹SØ£¿ºùf(wüå<ôõÃxÆð¤�g}è3€¿’ÐáïþöÿÀž7Þ{ÏÝwßýÈ©ùK÷ïo5nñ'ŸÒž7�¬ç_=(:9zôèûÿô“w¿äž[o~1hé¡C×Šâ|äÈ hÎ]?vÇ‹oº`´l*£�Èlö¿õm´yÅ½¯ú™·½
+ýéO~RÑÑ”J=òÌ)ØßË_úàËÔô´²H¢-ÿø ®Øôš×½,-�³Ô‘A™�eø
+‡Ëüß_üªÿã4¿@ÿÙÁ�vìØqý‹n¼l´ëšk®áN ÀZ=–ñ@0Mªó¸(üÝº•ý<yôœ‹+áÅ5òtC{L&f¸¬³<´€âŒ­F³yâ‰'>üŸÅ4¾ù5/ÇQïùÍßCô|æÌÜŒ
+ûq/ðÏˆ8#À‰@«ñÚª‚Vc	t*¦_ùÎ“ø{ë­·^{íµñEãp³Ñ ¤fÞtœB¶ØÕ-Um”8Ñ“ÐÙÙ‘sL_JÆ‹ç27ü,BW¬n{£-•BÕvÛ]£ü2—]F¢†n¥ƒ+�Œ˜Ôáã+î*€]¯P,€Nööt�šõ÷öo4;\6veƒz:Çã›]|þ~ä�ïz7·�~ï0&ËËÿöû~÷-ÿþgÀ¥%Câ§´è–Ù·XÏÒñScH 7}ÇE{ðcÀW2É�iôºmë(ñ�4ö�©½úÆË zã1GxððNNMá/P@pÁ?<êø
+ˆÉ�ø@ÁÓÅ“Œ~
+8Û333ÀSHò�.‰6P$y£A<q8ÔÒàõzpxOw÷ä¤½÷—R„Ëf}Jet|=~ ÏÊ·BhgÀ¹ ¥ÐíJw˜:¹eâ�Ð¯
+1ÊÑ¿�~�c�\üøÙÏhþ~íÁ«åpïeðÄczÚwìÀ¬bÒ”±«b? ¶¯úwÏ#òà+þ¼ñ‘“P6
+z¦|é¥—.û�ƒY1»Ä{�Î�ãÚ‰ô¼Ce3rü�ÆLj§V©ôÔSOáÅðoøÉŽŽ´DWÊ·†ýéûÛ¿ó¾÷ÍAˆ]a¸h8–s“Ä±iÚ‘›ñÅÙl!tdô¯ja1¿¡E=*~@�¶ú/åƒ¦;°C^ˆ8&E†Kxh'i¬Ìe³àŒ­)­•ç²�N1|ÕÕÕQ1s`]XXä˜ñX¦<+{Éèò´¯·(ë7ÃÕ‰™ìT�Ž2^{¹Š×¾úuÛGG€_ty:xeYeÛsÙÎÎŽ`^i¨ÔãÐƒ¾OË&þRmWÆ–Š“bî´“{VOÑî½—pÂé‹ù©ŸþiöÃE¡áþÊ;Þò[úè;~å7�\àqËþjxÔsö-Cò´£}.—[¶Þ…Þ2«VR
+þ‚™rž|v811€¸áF
+Or8”Så—Ñêëí‘W¬€¦²êÑáã˜ÑÄ/ºè"é�÷ŸÞõ.þü_fÅ_e8;Péßú:¹¹¸RŒô
+Hä¨õ;oÌ (ÎuAp!˜t…wßv³þªRPÅ¦gt@¥}	@j6#†êµ3�¥è-¯¼ËKH§1ªßøõ_Çð0·/¹õ¶—3êŠô•
+¸§y@rUÞ¨ÿeÅµnÙ²å×þÛ{ã×ß…ýÝïyOŒ}³1ö´Š÷¿™‚7£Ä¦lQÉévhä@/°©é¹(è\He¦æ¯R©'6Šd;Óƒ!œ½k¸#›îi`G÷+ïq’»÷î;ÜêÍ/@;/€H*£ëi{q¡¨ÃïÛRm¾ß“ÚàœÆK´²Ü²l|—i41‘*^Ö‡mœåu�RWC8�agÒwþØ]â×|ä±£i?²²æÕ†‹y!±e§�¤@U€£,ž�ö�>ñ¤‰IJÑµß^Yxù±ÇŸÀÛåØñ±Ý�Ð„çóëÿò �wxêdH°$<“à/ôÞFð¨{¿4s³^ý–·AÑ¾í‰'€_ <ïøùÿDÊ¸Açà³‡¾ùÍ¾¾>ôÌûBh2Öø^ùõoñ.ìÝ³§hØñð}n¹M{rŽ?®ŒžÈeƒ>ðkdxÀ�ÃÑ'†M�â€¡þC§>|äÚàêúúûy£I~mÈÃ¨pà#ÏœÚ³w†ã¼íöÛq±ÿ÷[ßæ‚šz½IÓûa}ýðÞÝ»8cD"4&œ<£—9n Ä… =8#¦ŒRFŽ~Þþ“¯äG¼0ðñüíê²ýÞÂ‹¼ç¥/©Fhä—–hîàT\qÙ~`%Hë�7f¾ôÅ/âZ¶mÛ†Ÿ(ÔüÇ{lÏÞ½¸k¡?ˆÆÍÔ{ßûÞ¨ïâÆ�¼¹hÖfÕanñ‡ÍP$ý—„ÛúøXÕÄõ¥†øšåßžžNìY\* ƒ`À@L4k¼HWè!—MïÜ>ŠßÖÔÔ,3…86çŒy~aQT°Œ_þZA€yíí9ý°™_<ú1;©LÔÃîvïÚ548pùó®Þ½{ÏÞ}{·nÝvÙ�£#C@¬ÖÖTA/®@lkÑÔ±= O iGG;(ëJá(ø{KkÐsaqifvŽïÍB¡„�…R–ôâ·úŒÙLF?‡-TÞÍX[”]†Ößlõ$Õjøˆç¯Æáj¬E�—íK–�Â€‚d=—òÚ…zèÚk{ûhöúò—¾pÃ_02::;·pøÿŠí¡-Ãú‡±¼ÒÛ?´\Z|ò©'.Ý·'kBmFF†Ÿ>úô¿þëCccc€ÈÎÎN†Ñ<üðÃý‡#Ë3'·�àòðÏçO<x`Ï.Õ¥»wÎ�C[·ïxøéÓ÷Þ}Po4Ø¾mkyyåð×@çÛwìà›ìèÓÏÌ�?÷¢½¨½½mpøJkÛ?å~<Ø¯¼÷Þ“9ƒs;vìÔÑ¼è…/|äÑÇ:Tñú¼Ï¼�4
+¬2Ðcæ¼e÷îÝÓ¥Ö'ù7@Ïí?rýÁk®Òa€Ë|©ò¥/üÃ³Ï>»ëâ‹{ûúðÂ¬ð�1WÄK@oºÂ[ï0�hhhÎˆ÷'§³í€c öÀÐP_o/0»{z¶
+ö>öÈ÷qÉ}ƒC£#Ã´9rø–_4Ðß?~úôÄsOÜxÓM˜a\ èÞŽáþ?ùÔç.xã›Þ,Á@ÓÓÓÇÿî­·ÜÒn^`8ð’�#˜«………_xÛOé97Â{�ÒØØ)Üƒûqø·¾õÍ]w
+úWÚÜÔþ¼Kv=ô•/¥2¹éÉ3—\rÉµÆÁ…×ê³ÇŽ?ðOÿ„68ûððpL g\i°ò¦½Kðfí/X»æÖ"ë(>Pjû¦¾å•eñÙkXê'œUkËd„*Â|8'§fè!I¹‹J®…r¦¼Õ,ô±=Ý]¯<€rLÇ©7C/[XÈ³±�åâÆ¿cûm �ÉÇ+Ž�OLNœä·ÔÓYcxt'^	<W6“…ÞÖf‚]Ì,iÞçdí›ž�Þèé@çl6CëN7==G»ªSø§è2.)“«WÁé‚O%”#a%pùÉ£Ï¦ý€!`�î…[�·þTTÑ“ÉKó“t¦ûó¹¨­Ø&;7wdxÀv¦aœÐ3†»üÈ� $;:ÙAÆÇÇOŽ�ï;ƒ¡€û€6ÞróMÊàËää$kü8ãÄ~<ê˜
+–ÿ‘ýeãöÅ†ÄfbðžšF9qâÎ.�Êð)4Á\Í
+···Wøf
+nú‚aƒó‚±:á–BWy£mÒªj‹(s¶¹||lÌWB¦”¯_OOM�¢¢ON.4¨„‹ÂÎÎÎr›‡`<˜^ ôl"×‚KàÊÀÞ�æ^@W•{qã
+/d{|åô)«§ sL�D›âµ¾<48¿Âðzâ&¡f{Î$7½ì °µU­Š©ƒÒÓ©±ñÉ t®YU—õ‹/Ú~é¾‹Ñó™É)*ª‚›¶½	�±cé³¡û�ªØ³g·Rc�Q@ÃSOŸh©,ttj\1©�só€�‰yc©”~[í9²Ú‚1nj÷žU¿t)õÙ�¾^CL3~rü³Ï�èÃÓª[Gc†Ü
+öË�œÉ§0øœ ©X­j~ÑÆÍÕ}A�ÕMŠU³Fu]Oe½uìL!ïÚ~?ÖõPþãê,JþÁ?Ð1ž?÷ó¿€'ðÍ?ÿËÐ.éWþ«×>ì‡L+±{.×QŽËÎÒq2sÈs Ó~HíÄGY” 6GOM‘
+^Np®V½(»Ã˜ÆåêÚ®î½Ó›ßLüé·¾õÐ¡kßýžÿ¼êéœÙ³×áˆÁÍÍ‡¹�“U“±‚RNpÖˆ¹ó,}ëöát§Ð¨ßÛm©Tƒ ¶q“À¡
+²Æ/o¯ŸÞÙ7ê™D=|<er:5HXqö.?D‰cÀ+Ð‹o7øB°ëèËa�<Ýä´æ5–1èÝÔµ�š†—ë²ŽÁÔªº	î	¤ ÈCžòêŒy¥4Ò^®^�ýa•g½ù$‰ˆÞ¡(ÐôwÖ ¦}RÊr­/ÑNŽTÆ$wäðáÃG¾©ŒŸç¶Ûo÷ÔýDL41¶Ù§Í''²-:ËN~ZÉìÒm§q„ì›"ÁÂØàWÎØ‚g‘í¨+
+^Tp0¡{‚‡ýwîÅõ/ºdóÁ¯=4>»t÷Ýwë{Q›Æ†lŒë‰›Í–,Ô�Ô³î#ÙÜÐ`þŽ�ž´S}lm”~rm“üR×ÝË:¤. ç#~”þyyNð‚qBPöYQ˜¼
+ €ƒ]ò(æ™É™”	––\`²ËŒÉ�ç¯|pzfvzfÎÿÒ÷€›öC÷íŠ*TŽh·ä�ôÙÖïks, èf`Ã0®rä/Ö†N{¿=iÒ3	¾
+Må?`s‘ÇÕŸá¶Ë/¿üÊ«®òvúY:*hxlè“Â´Kq+Å°¹²)1g÷ã¼“ìí˜'<˜iÿ•÷x«=6{2òÐþõ·>/*êcÄ«¢v/ •ÓHbï�9©dÁÊk£~è¼�ùf�ÒP
+$>»ÐÙ™Û™ŸMÐ&�b¸¬³úiÀÖrÌF{¢Mi»ð£ìÀ�
+�ta™H ó0ƒ¢ž;¯ŒaÔ/1©ëe³Ú•N1äˆ=¦¡Oë§)¥Ñ…@`GSÓîIƒ&�¤ÀY4cí5eÜGè0í×îÖÇÖþâÀFÛ|´Uþ·­Í¨Nmmõƒfp™�Ît­)ÃM»–‡òy®#-šqzE1‚f('Ý&nk¢ˆ8‚/5üÎO²¬¹œX
+’©íÇA=ÈÍµ!OÕÂ\4¥Î…¤ÏÆ¯5kX‰ßJœSÆJýsHä¯ÅRí£ìr*«Þ‹ÐkwfÀ™@U÷âE?¼¸�ºÄPÆ…*Ö­Ø±}
+{°*°uŠU@S"7YÎƒiéÁf`šP¥™Åèèé™š™x+~OËËžž¥uE›þ¾nNœežÙŸWò£³ƒ¿üÜñ¸ž¸†À²É7çý4M�÷¶Th3	õŠQ±YÕVÐ½­Ð¾R±ƒÒh\¶ŠÁïŽõ5Ì¨Íí›à§:_þ1¯½jphÀž �”…;›×zÅ}ö¤p¤rÔd?)»â´
+ÜTM-^ØÕ�*µ¯%ªRÑHš
+(é6äI
+7÷(áªþáö
+âõÚýÄ�¡ž+âEµFÜV»™sˆòñ7HºÞåÔI‰8cÍé,›fèâAIôôµÓL&»ŽPè¬“l¦L	;m©ñT».ºrr™JÐÄ`'d[�¨Ût× àÂðð¾7T»­¡	·‘WŒÛ½`Ó.º‰0$EÐ¤SˆŽ5&#4;Mž5 ¿±üiÝÉ|Û¢pFôƒŸ�nO4»s*Ój£Ê²@z­ù´f‰bšRÉn[‹ò?=ëd°zPªq½/Ø¸þc�g^ Ïi VËøÃíKÓ‹q�EdaÔ¹ÖÐ‰ó*rÞd6bÚ%ET­[5~ª�ˆ—^¾iO¨è8áÌ¥¹Ðé˜;í´éì`µAåë¼Nú.¢DÆNêÅ�áÐ¢ƒ%+ËE¼˜�¬ü-,œÄµS�Ÿ_(J¡Le »Í@jG{»Žb¬x1¤Êl·.áÀ=h0qfÊœ§ÅØ@õFZ/¨àeÓk¬,(Æ)ÀdØæ’Q¯w&é÷A}ÅŸ"§×Ÿ›˜G�¦·òŸ"<œ2.7[…tžÒÍ
+^…<†zÁJ�ËÐž×=×Wôcë3ha *1c:‰™À�­¿y!‰Íkì@–t­«:ˆžÔÙÅÜÉòÃv�U)gÚ” %•JÈ
+ïÄÙß×ÛÞ£•ô– ^ªÆÕšQU¥UçBŠŽK%>ï˜—�_Nª¥•úò’©j€&µÜ¢+ú›zÁÞkCÈ#ÇÏuåCmlµYóÓô~Žvækð7*ÍÒº&äY=®AÐ”=mÕ{ä…©Òsåã“D©½Öôªh‡–¨¼ä:IM”E2Fœ¼ŽÒmC;tîE°Ÿµ‰]Bx
+s"ƒ·Ãclcˆ½S©+-%®\mõW}�ìñ|ÉFßPMû� uŒî¬“xVªëLdM@c9tmb´õÐ½²ÐÐÐ`_WWÇ²Ÿ¼DÏŒ)�™Òáè]ò©‚YÑP¿›
+!åN°Tý×˜Ø‚³3{²5Õ*•t•WSÊ_ïÅü‚¡•3‰ÛÊ7&
+ß£CÆ!e3é§ÆÇLuL”�pñmók¦91%‰Ö¬ñGÐ¬Ž�è™2M>OÔHbT¼³„›úwžvû#±&¾«(°ösö²†9qYÛ½8›9•„ojYÕˆ&Žì(è,Nkóâ¶­[�îàâ¡Í—ãœB¾žRIVgÓ%9Zý…0µÅQÿ·àSQºtˆÈPç³æ€kš¶›‘ÎgÐ9æq0G]Â=ë9Žh œš™•=Ö|¾Ø××M�¼>AÎèøm)ôÙªj,î,¿\iä5l,¦«`«‘ =¤M„w(()ö"žåì+1êjýž„�–P¶ØÐ�¢V‘ÜôK³³¡÷bø¦#$ý\µ.¤”„P>÷L§Ó1æNü€Rg_:�SH{`Hé–qÌØhêm‹3þj08·9�.²¼¸oXÔK jJÈh!?.oyzF§+eEÀÍ‘º}Á®d–�cÈ‘® ×Ý•òc<�ÝÇŽ�áÀÎŽvRWßú•�[œ%EãÄÿù¶Õñîèi©h:Š?•tÑÐ	š<Y5‰//$†ÅœÍJß$ë2Œ&¹eæß^cÓïÅ…Ì7W]¿)�öV¶í›Á%kô$tª0þBèÔD,—9qò432c:º6n./‹Ó9´*hZç½D–�ÃWý½•VÒÍãÎòì¤xPÞ¡5w¨œÎ›¬Tžyî¤2+”¡!cQq,NJE8ì³m”L”ÄNðYÙÞZÖ¡QY{žEÿ%îèÁ˜²,gø£�FÆÄ¹*�ÄU´ÕaßŒª®/¶’%ôw9Ä-f¯æA™OlÓm3Ü‹7m‘@ÜP	®œ¦WË‘E=¢À2�Î=»w€‚ÑïUÄŸgJÅR^“Óð…	îAmÔVÒ»j¹k§P‹®'b¸½g˜;u)£•º^¢½µ…ØÓÓ¹e¨¿ÄåÄŒoJÃ\W¬mÍ×Ðœ)JðÅ‡´îA+òe³²!	š^e¬\¦‘�™éÊ²z[ZuPg�f2ÃôptNGKÅ¹Ôíi±uöø|öHö°%àØ<Ò<÷â‡7×,N™wæ;G±NËŠ¥ññÉáá�}{.2>w|,ÔÜÉÈM@RÞ,Ä´×VaëŽ)î�}Ú#dbÝ=‡FKU‹™™�‡*
+°ƒ>
+µ'Ò!îº~p`××ÛÃ"²WYgœ�%D-ù§CW“Ó3Ì¡”`]�©P`‰bQü•·î ò†W?tZ•ë(ÍR“Èù+ë‰›ÎšÅ’ØÀgCgÌ!¦¨ZeÇöàÔ#�
+¦]2rS‰q3ÕV®fmº†Î ÿ²	ìS¶æk‚�èœA?§Æ&”_ŸMùº¿IêÑYç*«ŒåQ™�+¬Ã433§3/u,·GÒuÑOßãÕë-,‚SÓf*Ë‚zSú#c9)U�ØMÇÜiG)Õãò&!¬Ä\ÐYT¾fB'©G¾©¥ž¼”(ètTBIÇþÉâdh°ÿš«}æ¸­³£7€fow‹ûÎ²þÂBˆ„ldÑp9‘²i{«}û& �5ƒ¹bÒÂBô¶Ëx·ÙY˜ô¢T�ÃÙ©­3^ÿ5žñmµDI€¦”žc�ÎÉ©™íÛ†¡X›ºsf¿)¼ÆÎêÂ^Þ!Âe¾£Z©©X[0“®«�
+Ö	x&/ n:î mË«¬=úLjéÓ¢¡S…‘šŒÎ:×eƒú¯8°÷ñ'Ÿ=qj\:aä&°$HyYáµu‹Íj¨šÊkú$›M+42Å w€28/í­lŒn:;µÆ­s�L$†7>>igaH¬yÌñèå104£t“]*Ö!6ƒ§!RÇQ
+e@iF/fÙÞÛÃÒ�å±ÓgÈL¡õ£«x") )”³ž„èš—V1Ò{&Â×¯h#ì‰ü0H½¸ÙVVÄ‘fÓÓõj�ˆ\Ø+h tö(R´‚²¼e¨ÿ’½\žzúDÅ�£dÏ¼©€©,§�í¢S¨=—uŠªIBz¨m€\Û±}„U9Xb½JÍ
+
+"sY^éªb �¹·§XÖžóŠŸž˜BW5œÅ�B?ÈN§-¥3ipm`wýËá9— êHµlH$âÝÞÙT?ÚDÎYÏøÍ³È)h^‰O”…Î¢Wù±C‰5;·o…zþècGq í’bÜTµå¿%ý�túª1‹'1±ÝM¨ð
+òk§TèPª›yAŠ+-¯Ë¤~;‹×)³n„òP¯¬SŠZL™/À¨bÞD-YcPœU†â@±œúH+—^Z�ñðu[-«=k?þYUE²ëì…v•ò�¶üh…»'’H¤Äenž§±î~�WÇ™H ëHô2½,­å[`a`ÛyÔÐ‰b�zúáÖ8˜ðndËàþKw›ÜÇ®n¦È	}çBÄø.($·o¶·ðt[^³A­­·i�_B&më¡˜5©nccq)�QFu”{Z—22Áö:°Î�5@ àÛƒìéá2aËÊ£œºqYÇ+™<âµ¾TÏÞýmC§Ô|J$‘³‘õ´o®yeÇ�ÛÖÂiÇúÄK=Ð©j£¯:%W2Ÿ/ž85>8Ð¿ÿ½ð@Jˆ›ñÎuÆíNß³sóNÜôËÕÔË¨¢§/6\Ú¤ïø‰qŒ�54iÓT†Êí
+FáÑgžcº$­œøËõ‚„ ãºI¦Hë²òÜóÖI[ˆ@’aƒ¢êÂÉ�ýDƒqšÁR)‘DÖ&ëjßlEÝMÒ°²>êìŽ›ÈÛ¶�tær`Í©±	 ÏÐ@ßR¾€ÆdjbÓtÈ¦dX
+bbÇˆÉæ¬˜V¶í§–��¾^Ú=Y‘“;É¸O-L(n0¶¾Þž¹ù…i³$Û˜Ìô SJ{<ŽyñÖäW¯ÅÓÜëÕ‚EÍ_U‚eÞ�»ÀJ©«ëû�u¸’˜¤D¢d]ýéÍ�›¶ÔïŠ	EŠ)gGÅG'ÙÐ©|Ö£½%L@Ê¤Å¸É¿tq- RXÚ´õÑ‘!%¥°«õ"µýq¹²,%ßãÃzÀXyÆ¼ŽHòê$16ÿ¨Þ‚HvwuîØ>Šn¡Èã[Ö0FÏLZŸ2î"^ø½·½Âe0R)Öµ�!'Ö†*
+�©ºüé�¡e>2þR…Ž’.7U„”HƒrÆ!‰ˆj¸¶P¤ K=JD…�
+Nr™Ð	lÒ™¥=ŸŒèòY›7˜)4ÐßÛžË†Ò�zó‹Ð²ûûz•†ž8§V©T¦šßÑÞî%›C'è$‹Ã+c=˜Ö‹Æ/Ü»º:¼úÊš<à­¸:¼Ì"B)7•_û�õ»£ä,ðD-sC6¥æf"‰Ô/ë‰›•†j…m¤+zˆk¨zåaÅ‡B]C«Šm÷,Ö¬	žvÜD¶Ø3Ëj»ä!4}¢C{¥Ìžî®-CÆ¶X‹›²‚IsÄuiµzfº<1°0$Ú|Ñ¤Röç¬zïl&klÌ�é!ÑÚ„ÕIëfe`V€µƒ?Ú§T)ÇøaV­êXgõ9‡fz^ô¢Ð\µœ%ÓDbäBæ›A±×S$Ÿÿ@C«Z®*õOûy.�Âe{'§fœý ›à¡Þà«Kkµ¡G3´Ð(<v|Ìqh°ßA1w2‘ü©£Ç:;s½½ÝÒÌxÞ«h¥ªÛßÛã‘P“ D:¼eð×ÙÙÁø¤*Éç{N5T
+wÕ„.+ƒûe¥_ºœøM¯Lr„”H�ráGüÖO2!Õe­’¸L¨õ“Ä³dDY�´.rìÕ‹¬š;%]¤äg
+)ŸlÒ²©jW1Ò4�\Ðß¹Fà´t||òØñSlOœÒ6Ê…%s`ë4úclÓ¢F�*ßÕÙ¸Ô1ó “ÆLmðê¡¿?á½O£ÂMœiµü×ª )
+Ä]–Y­L\0'Ý9Ä1nÖ,ñ›	r&R‡¬3n6iÈg}ÅÃ×]�‚ž*:£âl£ÐÓ�âÇ#Ã@ÆR­êÝšj�œž939%ô“‰=KK:÷1Ÿ/ƒ€nèîÔØÄ³Ï�×«È™uÓé�Û·êÕÛ
+EKt…á¡+¿V$Tc!n²|@g
+4--:¢ž�cJ†pô5áhOpW
+ÒLiÌDë9¤FI�µlÚ
+%’HCr�ã¦Q½"Ð8Z›©Þ@Üx6�øÇ4p×g<éSÓsŽeÄÐ™aff*ùÂB~ìôà, ÉÈPt~j
+š·”Je`+HèžÝ;LHæñ|¾ ã-k}ÖÐôñíäÔŒ02³ÎO�CÜhúì*Sq.
+Yé]>®nÐ¬½:³|dEÕA6U $Rè!u7I$^Ö°€‘y„"ÞÒÍ†›µ#÷–1QÏ5å¾�S«ÖËYÃ¿Žt=…@Ù9‹"@.[CÇÙ·mÝ"Y³àx*67¿ÐÕÙ�ñOœ™�œ™�‡&~zbŠ	ìÐ©™)tâÔx6£Ë¶C¿Þsñ\2ÐöÔØ€™,ø‡)B{lÈZ•T2Ë|3sózÉu½Ê þ¸l¥<�W‚–‚ðj7ýjU÷ý£–ùã‘�“DOkFýd“ÓËµCø6Š7nV‰q3‘º¥1,X5é£IBßU­K}Õ¬!‘ ÿ¡Îh¤˜�xU[+^ù~veŠhH<¹PN’Í…Å¼ÝC?=<µkÃÑ€_À&–Ï@?:îÒxðÆ4¼e€Ñæ“ÓÊDi3¨”¶=ï4ƒur�utÂµÑ+••�¾^¹µÌ©Ã!´,,,næ*êØ65�Uu5¡Ú\Lˆq²÷àÛŠòVÄŒš=çu+í”å�¯úî¨çÁ·`¨qÓ^ˆMYÆÍDyO$^ÎNO÷5¸ª4
+n‡eâZ£Tõ(ÊêbV»½§X³vP©&ØÈÔÇ”o±Ó!›£ÃCDü”µbM�ÀÇrY×:Ú¾m˜øâ­72D5l±\ª@Çç2–…bIW˜_^÷Ä±8õØøÄÄ™)í)òï¦R¦sØ³Yf£KAe ;×õ�¤¶|-ÖûèZÃíâáv!%M!£µuañ!î ÿ®Ù†½ð¯JÈf"
+Jn®¡¾Vó„p*Ÿ5Ø&Ná¢ª·ùª\Œªž9‹J¡ÐYò&‘ŠÓÃ^Ç>jdË`‘PÂ¿Œ4‚"¬Ó%ÍÒ@ø�¢~
+2œíéîÒ¼¯\,*¸¡€N\;Ÿ:5ñÔÓÇpÕ.Ý
+H]}æ¹¸}ÐiíÕ¯°�ÉiÏeÑ3È&“ßArMæb›­žË+“mXfI/
+ßÈO‚n§àþ _ÈG!˜Á;èhå!Jz€Z&d3‘U¥d<¯Ëšà¼^E|5Üz\
+‰C<	�� z¾WÝß_âO(ér,1Ë3¶—ò¨ØP´ue[*k*fª´¶^*�
+½‚ÿ¡ÙÔô\¹RžœÖ¡ @%g¾PÀ±8Zb: ¿CUÇ·ZmŸ_L™Õ„¤bˆç:èè@ë²˜SüU³ÎSÊ”5 ~UÛ·ƒ˜ÆhPã²ôÙUŽ¼ç×r.ùk¯^iG IäæúÞñD.xY(lf×PýÒ¨ª%R�Ã†NvkjVÖxŠ(v$¥c�†z»»LáªAÊÔ4Š,1Ó3³Œ“ÒKT¥“$Ÿ×�zrì´2F*ÝíÜªƒ.Ë^±±sûV°ÈgŸ;I�Ý)¶DÚˆn™ÚÕY³Nº#hŒfzéàZƒlhã˜L©[r6¢'?æåD QIÀ3‘úeýÃ2Êår&“9û~ÖQLE$]àCÖ SÑk%†ç8×�«*NOÀ%¥S¸“�,÷ºèîuÕÚzfrÈµ{×v€&°XI,QÜc?@�e8€¤,ÞqzbŠ6(-Päu²¹o@ÒaííÙÌB‹»vnî�9Àb]>Ù/ñYcßô3…x.à¦¡¼ËñŸ¥¶‚ê9væó… ¯Œ‘L:²0F–‰¬I6€o6“kÈVÁUÕ×‹r�*VkkVÍ�Þ
+j,ŒäÅe3iÁ(›ÍB±Ð×Û`éb–/hÒ3Þß×Ë¸thÜhýZü–¡þ.ß2Àºjƒ½À*ãIn1FÌÖÙ¹y1`Z#o.sâÔ8�·Åª®†·óèûM¥zU»à0×â†ÁÖ\[[›Ï�SkÐB*7‹õ··á5JI÷/¤µÅ÷&µãYƒ¬7ãC8+kZLæÜ]p˜W�ðÜ®ÍØFEXgÐÜ)ÐÉÒîÜîïëð|Š‡Ÿ‰�Y?©0lÅÆÔôÌ@¯qéÃ§ffqQ²�$�-‡ûèj¼b?Ýñt£ƒož™œBÀY`Ç¶ÑaœåÔØÄäôLkÊWi[ZÀCÛL®€2 Yõñeé§ïÀIñíÚVjè(ÇAdÍvMá8ñ9¯ÌDIOd
+²†¸w÷sªŽ"‰Í v¬Ih¼½šML®úšEÑ)è)ÐIå]VÐ„*M½8BÔm®ÅFo5«¯“”�fj³f«¦Q {^ØP«^bA:A?ggu„<è¤‰àÔ™åf¥ÌeÜDš>‡·(ßÔÛÓ…™á®kDKšêšÙtâ•0ûfK�ª@p¾Aq¢øúÊQTTWñ*BÅÙ1ƒ«9¥½‘\	z„ü!Ÿå�Mä‡NV�<çç^§K½	]Cö³AöTÿ³g¯ª;3ï)™ì"#[ºº:È¼ˆïc§Ágðª:cƒ°Š3=ãÐÙµY\¯P„º­LidR*—[�ÿÝ+EœIƒ„ÒáCHE #ÀWW÷ðçÇ¸¿ueâl&;qfú©§�-.-�ŸvšÕ.5‡� éôÌlOOg›)¶¬óÔÈ¤U�™{wÂüé"vØ¦M6«!ßÑL†¥DÎÙªXg‘Ús#®‰3 ªK 'sÕ%�s](g0ú}Õ¯$öÈÞ	}™lØwj|Ÿ€J€B€¾…ª®�×•e|{ìø`«³3Çoñ:;4n/VÔD¹³H{Ú3À+z6K·úÉ*M^&ÎL•+å—îÎå2èl—dHm«�M­­ûHT(òzU÷•e’bú|ê•Š’ÎH¦P³‰ÜÏm¹ƒËfu;z©ô$M(‘FeCÊ4!ßTâU7n_ÉUÇÄ[ÓœJÆâX�Y<ãì…Ë	ÙäÝ€¤€-pI|<qò4ÀN?Ò@ï¶ÑaHêºëé �+»y+^½ ñ‘áº�ÇWåReËP¿†Ôñ‰Ñá¡¡Á~À8+r2Æè
+m@0wl™_XøâìØ¯1}ãŒ�d	°=5©¡t�¥Ê2ZÒÀZµ§Ø÷¢P,Tï‚•gÉí¨(NG‚9B’[©’4¡DÖ*kä›«¸†š)kHÕA9)õPN[Î¾ÒGP¤¢»€&6t2x_7±ú8à�èLB¢ÞMÕí|¡€ýDAl^²ôªãØc'N��O²&@“®sš>ñ-h)NÚÛÓÅXw@áž‹w€É>uôØsÇO
+ß”…1³¥R(L%�N§5×2W�/……jÆÄoÚ…<‚¡Ð_EB6Yƒ¬ÍŸî~º†š�rÖ<$Þv’‚å‘q¬œgï Š’jìQ¶;?¿˜Íde©t@'´àþ¾nŽ
+0
+DSD ¼sý^žËf¡qwuu@a2¢ýð–`Sƒ»&BpÄß2Ÿ})_€JN*ñFähh&ËóšK5ëýb&uíÎb©Ïà6Ë·-K}åÐK^¶’Gk§¢R4‘­¡iéò2 †áä9d3øóH$‘:¥žUd×âj6Ê)Âê7QßÆSÎõŠå=ÖËÚ%¸‡d3›Ñ!è`pDC &€`47¿À" @X®ô
+œ83­×�4Ë42ùšõÔô8&H(€†pŒ4tšìø¡Á¾=»w 
+ˆç™É©‰Éé|¾€£˜ÒÍŠPP¦OÁ;·oÕ#öKëÂq--:Á¹À——–Ð�yÚ¨àBìj{1E=ÄqO6Ýð£dUŒDÎB6*„¨²¦*8ç@¼2†wÄTätÄa4ëE9èìw†¤Ë³�O€2™ÒÓÔ(9;»05=ae9\ÂÌÜ<ñÈÈ£I‘Š¼2€ÂJHÄSL•YªhdË €ŽÉéÀbí‚×¤]mÃQÏ>w{æ–€M ¤LdëêîµNhô<qf
+càšq8*—ËžMAÀ®”ŒòŠžXJSƒ�ž ¬~ä®÷kY6–™ÈÚd£Ê_ëØ½ìf_\­ÔY‘ÓY‘Ï§˜ÒÖÑA$i—²
+öGý Ê	ÄÒúx:=vzÒ‹xïë6@¶ØÙÙÁJeòÍ�h»wm‡ž~ìøË¼çrqOœÞeÚµ]/ƒa¢;wíÜÚjâ�Ç¹�YðMOe,¡PêÑ
+àîZÐx](ð-F¨³3—kªCµÇYpjµ·§«)†Ñsý!Uëâà•¯’M™\
+ÙÞAJMBz’#”ÈÙÉÚq³E¯Ž°Œã²I°cÎ‰Ý€Th³/0bðJ;Ö1ºJe…ëKœŠSKBÖ˜u›µemÐé�MjèM|œ6¡BØÓi,› ˜d‚l†H³&WñÍfô;
+ÈˆcOœ<=95ÃÑ‚Qömï¢§5z‚ÌõÇR	= 1NGwS{.»mt€‹£ôÚëØ}gÈNµ—ÇêRr-­,©ÉºîŠnô	Í‹w\º»­­
+Ê>Ž²o}üÏ ªp\T{;ÐÝ.}dûH6�„tq&d3‘³”5ûÓWoÓTQœþ°«Œ¿o[9¹'4c}½´uúÐí€Í|A‡àtwuÄñ`ŽUâ‰†½Ý]lÉÄGVuÃQ8dÏî¬FŒÑ‚Ÿ‚À2Aˆ4ó©£Ç™dÎ«1š>tœhìôì¿hçV­†%–±5chÐ$(—ž=vX	•ß”)`â\C¦.Ä3nk˜¦hèÞÇ`Q÷Ëf0ÖÝùI$’HCRn^0YC¶8VÎÇúÙ8ˆ¤ŽœlË?î:Žp‰¿åR…^i¦üÿ·wŒm#×¾$EŠ*V/¶×ë]oêÏÌ¿|Éæe�uYYV¡ºH±åÌ`8D#ØÄ¢{âh)PútïÜÖdŒh¸kô±º\ì�xÄ&‹ÈŽÛå™s’�‘¸*¶e\~çðâY³zvábè.…Þ~p]N÷-Ù5Ö³óšXv¯¯­¹úa/Ú¹íf*ÜCÞ=Îáòêðâ™û{ªç;ì•û›õrÝû;ºÇ‡%¶Ú´¹ÖVª&£)úÑsR—~“3žË)òŸÊ%¢3£^È½
+:ìDBïhübÛFÓä®Köå¬°Ä»;ëDƒñÈÀ:åøŠýkW·pêA18ò¦°=œl/žÉLÀ.�
+€ÞÜÜsŽÛõõ-9qü‹Ëšüh¼ø–ééi—S«Gû¶ð'ðÍioâ—vP><Øµk©fVRþ¸
+…<ö�M�ŠÆ3F;Ó2ÃØtÝ�4Œ®_cÅ….q¶LZÌ|M^í‹IBù�XÊHz€(­‚H-tFžâÎ],š?‡K� xys…ðÂÛ¹ÔÎ–%š9[X	l‹¦uq8å­eÆ¢5ipñ+CF¯m%¾:]SN±T‚ƒo9Mä:cP÷6Ç“Ëš¸Od¥C'lô›Û;Vl(	'†Ç°‹Ó.Ó¦³µz�@Û5Ûš>.’=¾²)ž‡îªÑó›ê¤«FÓ8q¡Á
+`kÍ7#çOŒÚñ�½‹á/^Z€ÈÉ¡ÓW�ñfïN¬C
+™Ú¹+¦á›©"?3`Ø#Î„¹�m5$ø‚}5úó/ï?}>©ÙlsžÄ:g×ëO`ß®éÔY<¿¼
+Av3R�9pùü¢†=Í²æ»788ÉêL×©S¬�¿¶Våµ;hB�†Éô[ww¶�÷ë�§N²ü›�§HP—ƒ7blö�*=W]rxèjlª¦¤¼PcSî´oÓ4‡ÙH¾²+Ö#vS3˜åÛ39ÝSôÖsZ�>IAüi5Ûp–qdp¦\c˜oÿþÏç�u7g=%�À¨úÆÆúÝÝÜvìyúýôäª+P»³½žÒ–Äaaˆ1ñ;3éjµR¦5Š=ÁÍ½]>`ÏÂ­]ß·Ýû“€¿ÅR±Óö
+ßÏ®¹ž`
+çË+ðîqJnêzx‡S9•øóƒ;Ï?•”R×È·y=ô`�@ÃèªÉhêyBóU�÷��§Á»+ˆÒZÌeË_e–»³jáYommàÁÿÿö	î6\ã?}xœéßØ“µêb	œXÙ,€ÂC‡µcOÐ6Fj»Vðß¾Ÿ‚DííÝ}Ã®6mGN¾—XŸÝ68
+~`¢â­“n^ðÛ·óz½á‚ÁÐë›;ïˆ÷=ØÛÁ·06]1¨ä^ÊŒ¨nÚ)1W¿ÜKqcYÜ'ÃC¶äk}¤Nºjd�ÅMG\ƒ�¤BõÖŸA,ò…\N’?(Ø)�cD~Øz}dìGB�_«ØxlÖ?}9ùýó	|j
+Þ4þUWW	MNd£gŠ�NIÏ>2Ëuà)ƒ§b�÷Mk	Â´dwRÃÄÁ­ónÇµwì_“–trj2@a<Üxù©�S�~7$áh¶»‡�¿½7C�ÊðâÅ²Õ76s"É9é®‰‰�ÇÙ®ÄV–ƒÚ˜±»æ6ÓŒM•j"bñqÉ\õè2œMƒÇ
+ôÖé¤gI?:KÑ_ï0D¦Mh°éð˜è„5÷ÛÇ/03™�ÄL#Àÿžv¶™ÁÎ™énŒåáOš&‰}m_M­:ld{žØ�õ�w±1zBÿì¼ÔîïmÜ€#ku€u­`÷?ýHs×Žcò8ŒŒím½ÚdÇ¥”æ‘ÿ“ã—	¹ÄþhÞB¬:(â¡ûÍ‰ÝçûÄSŸR©†RéÿøGþ½#ëýá·ÝàÿIûˆ]›ÏÂ!/
+>0GìR§YëtÅNìkiÚMvƒ�ÙWM¬¹dKn‚>�`’O±Ý/;>ÜÛßß!¼i1�;ìb+¼uù)—Ö×ÖÎ.j8€ÉÎM3©” 3˜[³=Œ±7öÁX‘<XŸØRµ8eXú°(q’ŒËƒžû{;¸šûSoŽƒƒ¼ÿÛ¼ûÁÑ¾¹½¿º¾}¬7öwÞ¾>ÂÁU>4UðíÚÕ
+¥¬¤^þã»×fzÇ…YÙÜX_hlºŸ
+>èº¶ a›Q\>6Tn‡C.�-\
+B@¨m«\ŒxèE›�+ƒV6šªñ5�`÷àl¤9Žª÷®Âþ�Ð4œJ*¾ô½ÂHZ’¤X�1ñˆìü�ÿþÐ©Â¬£y€ÞÞÝ³íˆXð#–Ì1ªh~�¦‘»
+¡¸@ó'gàÌU6"º¿4ta	6Â!Ø¹«•UF(.o�÷e-¦k	ŒÝlŽA‡}9zÿÃ†-ÐtÑ'¾{‚¹8=XÅÝaÆM$:+¸ÀfFuP¹×Ñ=C�„ƒD[x¨¦©±Ì@ûW}ðnó<á²¯ò2VAÄ}r.tö=›T‚ÉÒ ø¶Î7»øÁû8¼—ëÇašh„‘À´Z­À…Cm[€_÷Öéfi�)¦¬”q8Ñ×·w¶³Ñ%{&š.ñ“|ûæpw{xÅ¼ïŸyïV8ªÈýññ	ìíüý¯vw¶9<Žµž¦éçÕí«Í�ÈýVyÝ¹ˆP˜¤é:ø÷¼÷ªþºß÷(ÒÂC=tÕd57Gv·›Í¹‹ª;E‹ÖÃt?W|ÉÝâEDÙáõ8:YÃÍ�½>:À–ÿçÓo¿pßNÏidLÌÖeÆûO$Ðyx°{l²Œ…ËøÌU \ƒIˆC}úrÒ´‘hÓV®Ýf¹õµ*…§Ä¬ì?Úaè4Nq™¦¼ípŒwét¢	˜ø™â¾±^eRîšcÿ<Æ¦¿OÄØÄ}¾²}êü©L>…˜±ÉrÏ)4U“ÒDüt|àªÃÔrÝ"æVLçô½u¿UR¼ˆ(#ŠÔ‰‡Î'3î,¡4ˆq!¶¿4Aì+Å¦		09hÂ¦Ã·4ÊØÃ”1…=™�£Ýh<‘Âï|³µµ‡]lž¼�ÂvÉNHp¥ÙÚ#À÷ðX·máÍL î6xŠíÇ–ÂÆ¹iš¸4œ!ŽfÛ†uo_IŽÞWqhº`:®0he»?EÎCÏ06³²ÜÕCWMSã²,oTÝŽ4œÏèPD®Å\ÇÎIXè
+�N©”þvn±=8j§¶K1^N’’ÔÌ‚�µ¿·ëN£fë)YÉI>››ëf–ºµLéçâ 
+;Ø5MýÎ”Q^ïÚ5SlßØ¨š¢õÍuÖ§3K/ôÇ�š·w÷®ëÛ'‹e7Ì^®½æÿdãƒ1Œ±ygšŠ–ËÑD÷Hê»36}Ý‡¦xÝ8þH¡©š††‹§K<}'%ªŽßènÒ�Ûè�·Æÿô3·“¶'¿µCmÝ·B{�1_a/Y¹¿(²ƒ]øõÞØX3µ7ßþ‚‘.Ö
+7©<»»¯`™š¦·æ*üèîÉ·‹ÇÇzµºŠgç—õúS½ÞÀ[ÀfäŒŽ;x¨ÃlÄvž`(N`gûþ
+€J&ÁèöŽü_þü®âì¢†ó|aëáÙã£ý£ƒ}¶h?bŠ}Ž?}>y´
+ØÙ/yscíû™)@:ØÛ¥m¿“iò#éÁ�
+Næ¼†s[³EƒF$� †î/ƒ0Œ^´(ÎCçrŠût¸ÒþGòŸ˜J•_Y$ª¯]ŸÛDÎðüaMè­›ßÉ^Fg;H3
+,c'†«l‰V§ô°3ÈnªÎíŠ$ÜmÎwG£áÉa¿ìŒyw÷À>Fl]lQX“ñ“]ëwÃ=Øß9Øß]_«â[&rÒ\
+Î­Õ‚�_­Và¼ã|p|8ûpí[íLHöXÂnpÞÁbã¼WÊÂõKÆiÀ.ßïî±…ïq#"uû~¼ƒsv¦Ë$�(ÒÂÃ›ñ�k�KÌrWhª&«¡íM‰™œ4ÈìÃ‰œ…¤‚¢ùQŸÝËè,Æf7h‚ôÊ²:ÅËë´�‹øBÁr\Y)Â<Œ„_ØÑ’Aa@ÐôÁ,­€•Ø´µµ	Çóþááæög´½õê—ïÄ¤¬_ÂË¶3KßNÏÿøv¾·³ËÆ¦±È,[íöÝÝ#Îê‡7Ç»;¦µ0p“'“óÑÚ­Û¯6MC¹›;°D'Ml@íäô×ÂnLG‡û­V>>È‚'R2MÆJï76qz87œ6ÎÁ-_º´Mçž‡É›ÅJ¹B/ô=t¢2­]¡©š¸Fá¦d&ÀªÚÿc½Ì±«NÅÒ’ÌµqÍÁG'×=ó£ÓwÛñû—÷þþL\ß¨Lzn;¹iæÙV&y¨`¬Q<†ÇMKþ,«>ÓÚ½Ù¬]]ÃæõÀÁJÅÌ^[__#‰pÃ¯onÿüíp÷ÍëX”8¸I-j·&‹YîpÞ±ñêúöûÙE«ÝÁ‘W+¦›§óÐwMã÷cøÆð©ñŽoŽGû™ñ�Mü„Ôë
+¸ü.³ÝÉYšÜNc3ÍC÷cA‘eM…¦jš7ƒf¦É‰oñ3¿?Ê~F§C'åêˆò ÓÑS<Û³ÝéâãN»khh¨`U´Æ8”€}°1�Ãnßº¼ïq¸ùàši³qkÓtTjÉ�?þp„cž]Ôð¦ë¦xÈD½áËƒ§x¼¶¶J3�–çýÂtýùý[|f8ÎÖ«
+˜Ã °‰ÒTLaRíê†gþîÝ1�gáSÃñ¯ÙÐDB7Åÿ‘ÀcœƒipWIhzä6Æ=t–•B÷ÜÞ½hŠrS5�hý�V«.Öý„)3ë«ÎÓø—À,ÕÆzû™Iü5ÎXë”¤Æ�.?‰Ë�ï~8ö;	‰-ÓæJåþÞ¶iû¶Z¹ººeÐOïßš‰’á<µFã‰Õ‡Í+cîloqFvÆ›nlTƒÞ�v>åÇß¿‚¹p±ñÚó‹Wx{Ä©–bcåÿëæáÿë×�\slÚ3Ü¶åž—¦:ª:ˆŠçlÂø%4ýbÿ‘#	›Ò?m->¥R-MÕ3hD{SR\u®uf¸êÝÎÂ˜œ’#¼>ÐêÌXî´ßšåNøìxëG¿Ø?
+\UWVŠœÙ/œâ‡{°õ¸P á2L¶Ï_Oß¾9RMŽg»½±'ÖâÍýý#^‹Wýòó»V«Å¸9lOØª¬jûîûŽëeÇsÛÝÙªV«ì0o–>·^½y}·ýäôìé©e:ÚY7;µ¸é~NJa�ÙßÎð.kÕ ŒNq·H,HÂ„Í´ŽG¢ºêUÁp â¦]øÇ/†ÙÞáa»Ýø”!üÌ¹ÉIyM(LU—×f™Õ	c-PÊ&™A@¬2…ì;S—G 1å[�ñÏã£v&æËß¾ŸÃZdº%#én¸ÞŽ¹»{øôå„¥–¬¤‰\›%Ö¡³
+�ØŒK¦ÄóLNÒŸÞÇÇðâ¢LÙÒS“¾ÿ/ÞíílßÞÝŸ�×p†°6y†ÎÉaN3íY€íLœÔËÝASÂzJ…¦j†=J“æ›ló1ç	IIWDºÐ‘N$3)â°÷®[\±�—Ÿ$!=]Ú�¨i÷Ô�?‹þ»ÙÞlo¬WíDÉêõí�ëd�wqd4½ÀS‘«¶4Ó6‘c9†×áÅW««lcÌLÌv¬Ÿãò.?éøhoÛ&“špð	M^¾ûôŽü�üœ`7¶KhÆ{„¦J5mM8+(çÏîÓÓÓ¬/<Ïµ¼µ³`K¼ñ›Ã»Â®†=±Œ]’š€8Á1ÿøûWÅ-›ìþéÃ{@óÆ¶êæh9‚§x_[t_ßr&ìP>àÔ��
+w‹¡´yœ¤4�›}¬VÊ\Håš,»¿·kêÐÏ.p-\âËÁøŸÌ«3òîÞ…óŽz÷ÇŽEÂ»Ð7�@3ØBS¼vGqKS�MÕ´5n?¤¬oÓ›ÀÏs›�4õ:Ã÷£Óõþˆ 3±ˆ#ÿIhx–­*åÒý½ñ»áPðÖñžòÛ×GŸ¿žþó×�`Œ>.€Ö®®�÷LÇ#[Ÿn†_Ú—56ïà�Kñüz36ýûùÞîöææú¹	»Ää¸·‡Ç:
+XÖÈ³½v}S¯? Ñ¿Ä§:¡Š=Þ™ŸÏ2'M‰˜™Ió)¶;R©žG“Ï¦tm>²wƒÉY©Tf}ùy.'¯KºÃndûÃûIˆ~�Ý»êfÐ!Íµ—{õ×AüÚŽöÝÝÀŽz½£ñý�o‚ùÀOÿ}ÿî
+¶ÿqr_HÅû²Ç;ßöæ©-6w‹¡Ò<eovÓss%X:tÆ&À€u‹°œüX7]Eè¡ãœKýƒ*[ÂÏûD¶FVBÁkIiáîî˜K9Š¬iŠW¤kšªYiÂ}=’M’¤UN›¡½Ü¯ W…L«0]lÝÝËørgxÉm—“äè™6^˜Í8öwØ¿4¼X.ù¿~¬ÖÄ‚@“»Æƒ?%%^¶Â
+‡Ê�xG`N’Ø^!LH3Î×ìÃ!á<“íÄ‰Áç×5¼©éÔÉLÒPþÂ(¡ÉÇñ¥LÿqÉtcë#ïz£! ñºGÚvøuA¢ÐTÍHÓªÞé‹¥hQLÎðŠ’Ø±Á%!ù�“$Ö<©ÿÚzºx‘¿�†ç}P‡þŠî6|v0¦ñµm[
+¾#Ã•J¼uà¼ÃTÜ\w†$#HßÍ¬àÛm¬é??á#øŒÂ³Ï±„qvøþ8ìÙy
+º_íîÞ4q‹£gâZ'›x^]ßDRe?4ý®š	
+âúÛv(4UÏ¬És“&g”–‹orö_Mà°w&)	¿Ïñ û°ò§Ý:z²£»Ø,%ÚŒpÿ�Žö83ý_ÿ6>ûáÁ®éöV1iätÞÙ¬Ó›b3�€Z Oqð§/'ÿýô¦1ZK%¦Ù‹mÞÁùÌ½‡³Ï˜’sÆãg^Ê‘‡ÄÉK[*‘ÁjIf¦$B3$¦èš¦j¦š7s%$¥ Xˆ\ÎðŠúÖ:YM$AŒ¾åÎDz,K+­v£ç.)ëžúì§Æõæ\2=sg{€ûíã˜��§Æ»·¯�¶�¿ÅÎûËÏnÒºX/±33L�&žz¬—mmû³Ç’Î°ß;ÞçÔšðÑÆz'ÄeÉë%™¸Œ4I2Ô³ÓƒÃÙè¥DSbÄ””þíjiªf«ÑóÞ}åÊ�—ä4øµµêBô3vê¯°¶_û³âyù.1^ÂTv–å¸ôøÞv7k¨?O>²qÓZ‚D§Kz‡Ih[›AoØóso›Í;Ü>}>Á>p·a´2Qß=Ëu±f¦K­__«^\^ÇÆÈM733Tôß¦@h¥Ôn™PÓ'¦23%©;œ–Ÿ«f®Éøéã˜œó_±»¨$«Óë×)ÒgÏ©ˆíÙ«×W?Íèó¯MÏá¸`ç³ß?ÔÍxa[ÏnÜê0¢rjŠŽX}h’×0Ey(–à®ËÎÔzl�y;&4Åµãìvk×7„f1ÅK6M%¦j†šV\(ÿ*',‘V©5çýåâŠ·ÿð"E©>{Z¨ÝÉÑÓÉ(�úíû9-A3OÍ‹`*¾gFûüìâ`—ƒ ðÔd¿÷
+44ñàêê¯
+²J7Ö·¶6Ýæ¼¶üÐL‹ÑCgwzÄ…äñÍEâÐTbªf®‰Ñj“³ÕZ<nö_£ý�‹…Ë�"Y+žÑöøº§„IKb‡5m)Ñº,ÁÜx¸áà�¡¾V]}¬7¾Û¹_D‘ž.ôdbè¯8™ýü¢fË„Œã?h6Ÿšà¦¿”)™Ä”A¾¹J5sM‘V“3sÚe§Ù\€�—q9Û'Áð,ìŠg?Sì%F2ä}%F�¤ BŸý©	·zw{‹�kk«@g¹\:µåçÄ(`3#„¦[Üdûa.”€&ø…ý±,VéÏÊÌV¼Œ2Ø^*âpl\¤Ì\úÛÁEW3EÍLÕ\k2q!§ˆÉé¸9°I’ØÐÄ¬ïÆèÊÙûtQ/í‡Œ¤?j$ƒGBóÓ¶íõ|,â8ìÜæâ)Nµ”þ5D•~ò9‚Ý®®oPÓ¼c|hZƒÑxè¶^ÞÓ?
+Éç˜GŽ¬RÍ\Ó5ñò›œ²h9Iù3—"†§ôÏw£²Ó<#5šnQÒ—;�ÈúVƒiêf …­CÿáíÌI;Y·Ä�îå4*Ý°r­$/¬Süé"4e{ÓÝ	.Ö"¯X|4Í?{ÐL#¦xŽ¹¤dh*4Us¥	Û›’dr
+[Xö›œbÝóÈkWW+½Ð)ý];ÅZ�½�6Q‰ßú¶§¿òèg,IŠù)ž*Öå$t®iÙ¬ó~^ÇS�=k{kº×=©ã½¸¬9�˜ñÕÌ84[Í«6e1%4NƒÒI�›«æ^S‡”‹
+,‹ ’þ8»Q7TÔµW�¶…Wœ±îì®~F,P`ôâ²F[¬åŽ¯››ë+e4?=?<Ø"�Nxâb3Ïñ’jµBP><ÖM.½èPÐŒ@ÍA@p‰S—2E4ÓHµXš¼½)9MNI^è,—W´ø2¢ÔÏðûˆí)±¥O‰­~JÌ�ìG›N·K6Â8àm3<Ã,Û™%F‡àÝƒb�§&WHh“f@3m)3|6„f·ÿÜuAæ³i6¦¨c®Z@M…›2^€há*ˆ2”Ÿžî¦Åé)1ÿ]<€ß†­VWãËÄ #k™D‰�aœ”¬>b=¥ÿ’´� —î9ó^š¾K.JLÕré™¸)ÃT^–JÅª�ÕµŠ£ÓÞ�Ž¿Éhú·.'@¥Ÿ¡`"ÑI,:»¯Ñxz|lp¸ð«6Ã	Æ&!YÁôŸp;‚MÈž›o`JŒ˜öi…¦j5-nÊx¢¥ñÖ�é±=Åh§¿Á¥{wá%	£+e3üŽ5?¾ËÌ¹ÁØÎÙ¿øÖA3-w�¢¸”>à‚„f²Kîí¯ÄT-ºž�›ò‚½u*699|�DOÿ¸*IF¨/’”è”X#‚Æ&`Z)—ýKäW|¾œ¯Ýé´9þÄŸiî¿Ðí?’BSµXš"7e�É)Ùã‚—Ë[wŠßpÎî{* [•~€R>FÝ83·…\Ö•“‡Ä¥9ãáw½oÙ?ØÄ¡ÚÌšè‹’ûû’ð¨ÄT-¢ž•›’nrJ’·¾(“ÖGS¢ù¨ô²>%	 ë¾Ç¨ØA•½ìŸR±ÝÂ‹:,låÁÜpIÅ¥3¹KÛvÍ“$³4­À\q©ZhM—›2¶·^1Ãa;£3[Î»Ä*!æ$C}Áä4w²Pãìx÷•„,ÚO<x …ø¾›Hå¿ÖO_%¦j5unÊxÞº,ãBg¢GTÒ½øøË;éó¸²‰oñç¨XÊº«þr¤·‘céÂ7êvÃ>¤}¬t;ûG›õ
+V©&¦pSÒLNyY�q%~‘m½ Rl�DS4C`Yi¥Øuº�È’eÊþÑ·å#n{âÍä~ªTSÒspSÆöÖ—{¡3¢´Od€*QÄúÖhšŠÅB±˜ZÙ™�»þ=·+1UK¨gâ¦Œí­/ýBg¢ò0TÒ0šãèæk¡x’o¾ž(×ö)cOe¥jé53nÊ�uëòb:Ó”ñIÅŸq$Íór±¹è‰™qe¥êEéù¸)c/tÊ‹G§ä°(Gø<»¦kSò8Šãï®ÄT½@=+7eüŒÎ#Ê¯É~‚†SªT/^sa»ù¿ŒÅBjIŸX’²¹¤Ê©j"GË °BS¥¢žÛÞ”I,t._×�çÔÀjt•J•­pS&±Ðù2Ãë*•j4?=Û±Í&Ìƒ‚m2ÖîÚ!nñ#<==µú›§©T*Õóh.Ö7�:­ÑÙh(:U*Õ43n&šœbÑYûÚú1¢4tvÒ;Y¨T*Õ44K{sXt&
+»¢S¥R=§fò50F$9’:+•ÊÏ‡W©TÏ¦Ù³f`Œ¨§‡$U«S¥R=›fÏÍäÓJ¯'î¯èT©TÏ¦¹àf¢‹=lfÑ9ëKQ©TË¯¹à¦d�íæ×¼èT“S¥RM[óÂMÉ¯KntÖë
+E§J¥šªfO�(‘zCUa
+…juUÃë*•jJš;nJŽÆÒ�N‰%'�•JyeEØU*Õä5�FÙùð’œœ„?OOM­ÂT©TÓÐ<Ú›T†Õ)I»X«Ó
+À¡´m’J¥š¸æ—›2:9ÄÑ¿(mÖ©R©&«yôÓ{'7d„Ýíæ·ãm6[š×©R©&¨¹¶7©<V§ôjØ{ûû—V*•à²k�]¥R�¯à¦…Întw�šŸ¤R©&¢Åà¦äGg§ßßGgÙH#E*•jt-7%=%^úS;%‰ž)R©T“Ò"qSò¡ÓA3þw±ºÜ©R©FÖ‚qS&‡NõÙU*ÕhZ<nJ&:#OùM¤§úì*•jX-$7%�ªûk�2(X¤>»J¥J‹ÊMÉ×9Irûì++%5<U*U-07e˜»äðÙÕðT©Ty´ØÜ”Aè”|>»„ôTÃS¥R
+ÔÂs“6+>ñ…jxªTª<ZnJîåNÉ\ñ
+µ«TªAZnÊ0>{¶á)žÛ®9ž*•*¢¥â¦¹Ü	z‹…´x‘„ôT·]¥RùzÜôŸhxJ
+=Ëf^ÑŠÒS¥R-7©4zfÄÙ%=Q‰Â�Òh»J¥’eå¦oxzÏ*=U*U–––›2:ó¸íö%Ý’•†ŒTª¨eæ&5šá90àN�
+j{ªT/JËÏMÉ�NÉm—LzjÔH¥z!zÜ¤rž2*=¡••’ÒS¥Zz½ nJ&:e�Û§§¤›Ÿè¬/W¥RME/‹›Ôhn»OOuÞUª¥ÔKä¦ä3<%wÈ(û°àfµº:ë+V©TÓå&5=%ÝüŒ¹R)«Û>‚ÜmT›]5WzÑÜ¤Æ¤§·g*@…‚˜:÷¢ºí9å(zÇTó&åf ¡è)Ã8ïÒ?½ÕuÏD¥­rÌú¼Tª¨”›=e£SrÐÓÛ³ï®¦ÝdX 6øþ¢]øŒÛ®ÐTÍ§”›Qå§§ä(×@³ï3ö)KÄè¬oÀshàM…¦jŽ¥ÜLVž_ìœægNÛ“¢_5ëÛ0Iå¹¥NKvíª%“r3K9ÕÔ¿Éñû�ö,:C‡¥¯E¼XÕ‹’rs°F¦§	P	ûÔ%~(ó�Ñ‘Aé4Ÿ×¥RE¤ÜÌ«üPˆ/€&úïñ;ŸýQ¸‘Gn0
+–bqóœÐñ¯qR9C
+MÕ¢H¹9´FèÀÜÏÄOa„O†P%[}¤RùÁ¹ÆDSÚøp�K‰©Z,)7GÔP>©GLeÔÛg*ŸK!B»Áûc[¢ûŒI=…¦já¤ÜKÃ.}R‘[ž£ýûçúÈ†EdÿkãRÔÆT½T)7'£ÑV?%9¼>nte4ÅYn�ny
+MÕBK¹9a
+ë¿ûß¦}S"i(e:¬œÔATª™K¹9��‘“ø|8@Ø°8›ÁÄ¸²z%¦J‘ró94ZbãÀWåÿèò/uNpŠKÕRêEw”˜s¥AÇñtŒÀÏ€·˜ÞÉ«TK µ7ŸUãWÔÌ¿”˜ª¥—rsfZ&†*+U/JÊÍ¹ÐÂ1TA©zÉRnÎ£æ£ŠK•J”›‹¢ç'©"R¥J“rsá¤‚qÚX¥z6)7U*•j8©Ý¡R©TÃI¹©R©TÃI¹©R©TÃI¹©R©TÃI¹©R©TÃéÌ
+ÿ.ÜÁ½	IEND®B`‚
\ No newline at end of file

Property changes on: tags/BN68/extensions/extArcims/about/logo.png
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native


Property changes on: tags/BN68/extensions/extArcims
___________________________________________________________________
Added: svn:ignore
   + bin
Thumbs.db


