home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume19 / xephem / part14 < prev    next >
Encoding:
Text File  |  1993-05-15  |  76.9 KB  |  2,091 lines

  1. Newsgroups: comp.sources.x
  2. From: ecdowney@pobox.cca.cr.rockwell.com (Elwood Downey)
  3. Subject: v19i102:  xephem - astronomical ephemeris program, Part14/21
  4. Message-ID: <1993May10.221148.9153@sparky.imd.sterling.com>
  5. X-Md4-Signature: 49d78b23303a19a5ac631e97fb2202df
  6. Date: Mon, 10 May 1993 22:11:48 GMT
  7. Approved: chris@sparky.imd.sterling.com
  8.  
  9. Submitted-by: ecdowney@pobox.cca.cr.rockwell.com (Elwood Downey)
  10. Posting-number: Volume 19, Issue 102
  11. Archive-name: xephem/part14
  12. Environment: X11r4, OSF/Motif
  13. Supersedes: xephem: Volume 16, Issue 112-134
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  comet.c ephem.db.Z.uu.8 map.h objmenu.c
  22. # Wrapped by chris@nova on Mon May 10 16:41:50 1993
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 14 (of 21)."'
  26. if test -f 'comet.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'comet.c'\"
  28. else
  29.   echo shar: Extracting \"'comet.c'\" \(2771 characters\)
  30.   sed "s/^X//" >'comet.c' <<'END_OF_FILE'
  31. X#include <math.h>
  32. X#include "astro.h"
  33. X
  34. X#if defined(__STDC__) || defined(__cplusplus)
  35. X#define P_(s) s
  36. X#else
  37. X#define P_(s) ()
  38. X#endif
  39. X
  40. Xextern void range P_((double *v, double r));
  41. Xextern void sunpos P_((double Mjd, double *lsn, double *rsn));
  42. X
  43. Xvoid comet P_((double mjd, double ep, double inc, double ap, double qp, double om, double *lpd, double *psi, double *rp, double *rho, double *lam, double *bet));
  44. X
  45. X#undef P_
  46. X
  47. X
  48. X/* given a modified Julian date, mjd, and a set of heliocentric parabolic
  49. X * orbital elements referred to the epoch of date (mjd):
  50. X *   ep:   epoch of perihelion,
  51. X *   inc:  inclination,
  52. X *   ap:   argument of perihelion (equals the longitude of perihelion minus the
  53. X *       longitude of ascending node)
  54. X *   qp:   perihelion distance,
  55. X *   om:   longitude of ascending node;
  56. X * find:
  57. X *   lpd:  heliocentric longitude, 
  58. X *   psi:  heliocentric latitude,
  59. X *   rp:   distance from the sun to the planet, 
  60. X *   rho:  distance from the Earth to the planet,
  61. X *   lam:  geocentric ecliptic longitude, 
  62. X *   bet:  geocentric ecliptic latitude,
  63. X *         none are corrected for light time, ie, they are the true values for
  64. X *       the given instant.
  65. X *
  66. X * all angles are in radians, all distances in AU.
  67. X * mutual perturbation corrections with other solar system objects are not
  68. X * applied. corrections for nutation and abberation must be made by the caller.
  69. X * The RA and DEC calculated from the fully-corrected ecliptic coordinates are
  70. X * then the apparent geocentric coordinates. Further corrections can be made,
  71. X * if required, for atmospheric refraction and geocentric parallax.
  72. X */
  73. Xvoid
  74. Xcomet (mjd, ep, inc, ap, qp, om, lpd, psi, rp, rho, lam, bet)
  75. Xdouble mjd;
  76. Xdouble ep, inc, ap, qp, om;
  77. Xdouble *lpd, *psi, *rp, *rho, *lam, *bet;
  78. X{
  79. X    double w, s, s2;
  80. X    double l, sl, cl, y;
  81. X    double spsi, cpsi;
  82. X    double rd, lsn, rsn;
  83. X    double lg, re, ll;
  84. X    double cll, sll;
  85. X    double nu;
  86. X
  87. X#define    ERRLMT    0.0001
  88. X        w = ((mjd-ep)*3.649116e-02)/(qp*sqrt(qp));
  89. X        s = w/3;
  90. X    for (;;) {
  91. X        double d;
  92. X        s2 = s*s;
  93. X        d = (s2+3)*s-w;
  94. X        if (fabs(d) <= ERRLMT)
  95. X        break;
  96. X        s = ((2*s*s2)+w)/(3*(s2+1));
  97. X    }
  98. X
  99. X        nu = 2*atan(s);
  100. X    *rp = qp*(1+s2);
  101. X    l = nu+ap;
  102. X        sl = sin(l);
  103. X    cl = cos(l);
  104. X    spsi = sl*sin(inc);
  105. X        *psi = asin(spsi);
  106. X    y = sl*cos(inc);
  107. X        *lpd = atan(y/cl)+om;
  108. X    cpsi = cos(*psi);
  109. X        if (cl<0) *lpd += PI;
  110. X    range (lpd, 2*PI);
  111. X        rd = *rp * cpsi;
  112. X    sunpos (mjd, &lsn, &rsn);
  113. X    lg = lsn+PI;
  114. X        re = rsn;
  115. X    ll = *lpd - lg;
  116. X        cll = cos(ll);
  117. X    sll = sin(ll);
  118. X        *rho = sqrt((re * re)+(*rp * *rp)-(2*re*rd*cll));
  119. X        if (rd<re) 
  120. X            *lam = atan((-1*rd*sll)/(re-(rd*cll)))+lg+PI;
  121. X    else
  122. X        *lam = atan((re*sll)/(rd-(re*cll)))+*lpd;
  123. X    range (lam, 2*PI);
  124. X        *bet = atan((rd*spsi*sin(*lam-*lpd))/(cpsi*re*sll));
  125. X}
  126. END_OF_FILE
  127.   if test 2771 -ne `wc -c <'comet.c'`; then
  128.     echo shar: \"'comet.c'\" unpacked with wrong size!
  129.   fi
  130.   # end of 'comet.c'
  131. fi
  132. if test -f 'ephem.db.Z.uu.8' -a "${1}" != "-c" ; then 
  133.   echo shar: Will not clobber existing file \"'ephem.db.Z.uu.8'\"
  134. else
  135.   echo shar: Extracting \"'ephem.db.Z.uu.8'\" \(34926 characters\)
  136.   sed "s/^X//" >'ephem.db.Z.uu.8' <<'END_OF_FILE'
  137. XM;:=* R2G($]_M.+7QKM* [J@%6FKQY'A/K-* V>@%6FXR'3;4:-* V>?XL/\
  138. XMC6&M?./].EW)$;PXJR3\2@/ML>+#_(UQF*NGBTN?FV5F!817Z!J\OSE=R39F
  139. XM*K]?T-^L2@/4G<F@DJ)^_(6C[!E=R8/E[K*BO'')#=C@M"3.4:,-_M*:7M2U
  140. XMA7NFAB$DI\F@RY]CV!6E'SY=R>.@/X1#LPBCT2-=R:#XG&0)MH8A9Y_)H)X/
  141. XM@W_HZ%&CAB$=G"!/LJ;9GZ/KAB%FG2!/LJ:XL"W)AB$LG"!/I]2.UES(AB'B
  142. XMG\F@OE9UO86CAB&1I\F@%M]9Q*NGAB&SH(6LL,^:[E&C>.:V5$'1/&H.I-4-
  143. XM)*<@3[^5Q>Z+H]4-NJ"%K*HE:?\5I-4-9Z"%K)>UZ],(H]4-9Y\5>!5_K?5H
  144. XMZ]4-,P#_I"!/NJ4A3QJKU0T=G!5X/-:.LGZUU0UFG15X!;OWH-^L)A)=R;*8
  145. XM-[W9Z-:BU0WBGR!/)]58MTJFU0W4G2!/ ^PZU>7\U0VSH*1<#-EYM]^L>A5#
  146. XM]:E>*F8PKWNP>A4DIR!/Q+=@Y!KR>A6ZH*1<^YYOD'JQ>A5GH*1<DX[5B$3R
  147. XM>A5GGR!/M<J!TCZS>A4=G"Q<(-)#P@BCZD)=R;OY<G+]V(6C>A4LG"!/I>16
  148. XMQA6E>A7BGRQ<,J<L^A6EIS)=R;S; 8WP\!6D>A6SH*%[3?,?SM*]T!5#]9Z1
  149. XMF-Q9\QE@T!7%OQ)/-]1-9@ZDT!6ZH/19NOH5_TJFT!5GH/19,M?>]Q6ET!7A
  150. XMJ(25>I0NF>&KT!5YKH25#)<NF>&KT!5FG825A.F$HPBCT!4LG(25;%C3LE>E
  151. XMT!7BGX25FI #TJ/K%AQ=R5[[WZVD^5&CT!5?K".=9I8EMPZDFP_2FJE>XE#_
  152. XM[(6CB $DIPB6=_VGM5S(B &ZH.:MO0F1\SSECRU=R8O385F'\Q6DB %GGR.=
  153. XM H 6[^&KB $=G,5\*9/:J%+HB %FG2.=FI!WK*NGY"1=R;_H<7;[R16EB 'B
  154. XMG\5\ZFU-;-C.B &1I\5\MYY_O>&KD$%=R5*S/'_U_R>A*^[.6<QR%N (HV<"
  155. XM)*>'=C+7A_VNRV<"NJ#/:26D8_X:\F<"9Z#/:1>.T[*PWE(\7<DHZ5R!"O%1
  156. XMHV<"'9R H<^/H>.%H\I%7<GV:K"\-<,\Y3D@7<E4_)NH^LUI2EW).M-%L.>\
  157. XM9P+4G8RQBI-?Q.&K9P*SH N7?M9[[@BC*\Z3;S-N($]NS5&C&B==R=:E>XY8
  158. XMW0BCG!ZZH-UJ)\2VW0BCG!YBH7Y6@5Q@A&/VX%??M8F/9E^DW5!Y#J2<'AV<
  159. XM9E],@0;Z";:<'NSKB8^+DSB:G[>KIYP>9IUF7Q5NQH3#ZU&CG!XLG&9?O5GD
  160. XM>#K+_;:<'N*?9E^]6=N+&?>)I)P>U)UF7[U9QH1[IIP>LZ#=:C#H>D3AJX$W
  161. XMZYM^>T5^";88,"2G9E_.9SR/V,X8,+J@W6K7[(7G?K48,&*A*.I]=URF&#!G
  162. XMGV9?<.D?M\.D&# =G&9?G_>%Z%S(&#!FG69?9:>!D!KR&##+IF9?^MH(S:NG
  163. XM&##BGXN3W_\ \H6C&##4G8N3"6#FM%CO&#"SH&.A7ACFM,SS-<[MHI1/8PQJ
  164. XMR0BCN!,DIXN39)3GHZ/KN!.ZH&.AK/5>QSZSN!-GH&.A,+F1]SZSN!,S /^D
  165. XMVX2XIOOQ=[^X$PC<7<EME@6D3[*X$RB07<EMEH=/Y/T5I+@3'9QF7[%FA&^K
  166. XMKAP[7<E_^']5N<M1H[@3+)QF7^+^!+[AJ[@3XI]F7W#*Y^VF[A6DN!.SE&9?
  167. XM8V V@0":4:.X$Y67X7R^QIH@QKN CBON'-5#>@'Z4:,9%\FB,M7NN#H#&\ 9
  168. XM%W2YF7A5G[^(#J09%V>@'VI+;<;\UJ(9%V>?QGD8J_F<8_;@5_\0GYN&QY)9
  169. XM0?>)I!D7[;&9>!>8\&H.I,1%GYM]WR"R5#ZKUAD7XI_X?X;[J<ZNRQD7U)WX
  170. XM?]?L&L+]MAD7LZ 39NU6GYD.I$FVZYMLBU9J+OVDI;0#)*?X?^&T.?97I: :
  171. XM%JN5<=?M6MI1H\!'#ZKLFVB<9_D(H[0#H,)I_ :TKLNT S[U#V->&+V%#J1"
  172. XM,0^JK+_2:R/5J]:T P:RZ,N&R)_IM /BG_A_*%TIN*NGM .<I]&OAISOS16D
  173. XMM /FK&KX.I7,Y!6DK>;KFRB8BOE[I@TT9K2L:>5AX=4(HPTTGZ4&PW7X3[(-
  174. XM-!BHN-Z?;PZD#32@PDOPS]8(HPTTQ>L$;$VL?/GSH@TTT+/KU;;#=?*+I0TT
  175. XM!K(RCI;T>Z8--%ZG:GE(7,OJ4:,--)RG'*$\:^'X"*,--.:L]X72:X[=J]8-
  176. XM"D/U1MT89(?]"*,-"F:TW]4V56_G4:/:*P^J-E78UE_5I*4-"E&BS6B"CW:!
  177. XM#J0-"O78K.T&B$_0BZ4O,P^JE[?:7D+PBZ5P&@^JE[=2N._E#0KE^9>W;U\.
  178. XMPPBC#0I>I^2V9;@C_J2E#0J<IZC@QY5[I@T*YJRHX,>5>Z:WYJV<U*'PY@FV
  179. XMB QQ>-59<,IWP0ZDB R?I=OFIOI[IH@,&*C:P&[QA:,[(1:K6I31H%ZXJZ>(
  180. XM#,7K7MGROM[C%:2(#(.ODO5DBKFIB P&LH_YF/KAJX@,7J=XMCYBVO*DI1H?
  181. XM#ZI9R#YB[^6(#/#8&[UT_&_U%:2\YJV<U*$,@>>\0#"MP;90@>R!T BC9+;M
  182. XMHDVGTFLQWPBC:K;MHIS5]W+8SG@,ZYMAI 7%2J9J_NVBR&XLU#WL%:2$SNVB
  183. XM!L-=9'NF(P+"U7CR#JG#I",""=QX\@ZIPZ32TO>8IE(>](FDU@0PI9S5ZWHH
  184. XM]/.B72GKFY^7,;-/LOI!ZYOQ^@K;A:.6MM%_&F7/EZNG_Q#KFQZA=\'<H\X7
  185. XMH:-[[-ZP:+OAJY$67YER8P61Z-:SOY_^[:+9IR-4\N<98!'GZYN9E5UDV,ZH
  186. XM_NVBCE04W)KE"*,G?-59Q.":Q(NCQ,[.\MG@)?:DI;?^T7^]LS;0%:4KYZV<
  187. XM@<YX8AW:%:3<MI-O;+;AF*NGQ_ZV5!F/,_(5I3SGK9QJ>=&'@.>%H]'^'?2*
  188. XMEQ?:%:76_NY2(JS6G%>E[\ZMG*SMX%B-\AE@Y?ZMG/C5OVZV_!E@ZOX=](*1
  189. XM3>E7I1>OM%UF>M"'#J2 #S"E-E45IO^_A:-FY^VBI^WT@NK;&6!KY[944705
  190. XM=KG+4:,AM[948I&[MURF(<^MG.S?TUQTV16D)\^MG.S?/G/?ZE&C$O^V5.+K
  191. XM&M"YJ3+/K9SLMU^3)/P;'>N;O9D]U[KX.:'MHN7)&M35]DFWR?*:4_K-*O_M
  192. XMHGJ_G_D5I2__ME0G_%!Q>K%=S^N;_]R%<0ZD./^V5&[;'JU7I4 4,*61E?^J
  193. XMSM\5I$'_[:+ER6B<T/7SHD?_ME0=9CRAJZY-_^VB&:C<I=RC4O^MG/*_M,4#
  194. XMWM:B5_^MG*]V_'K0JPBCA,]WR9I34*%*IID"8JG_[D%ID>-7I6;_K9S2O^!F
  195. XM3[)K_^VB\K^890'^I*7DY^N;+JUCQ%>E-1YTF1VIII'\I'K_[:(?V#RS";;Y
  196. XMYZV<R-6GW'NFB/\Z;\J9%U.:\/.B#AHPI7N7](+J_(NER#GKF]BK^I/\I"NJ
  197. XMU=B ?UD/"*-E!S"E^I/9]MC.,BMTF2KOR&2*G@BCJO^MG*!C_'H&YU&CK_\Z
  198. XM;\VHW)BKI]^W[:+ZD^"^3[(NZ.VB-/;N5M#U\Z(SZ*V<8;@5=KG+4:.4-SNF
  199. XMR>\W8#JZQ?^MG*[N7-@)MLK_[:+ZD[NEK+SQ2S"E\M:<U=RCW?^MG-.HG&_8
  200. XMSFX4ZYO[J[%>HKQDZ*V<NYO668_@&6!IZ'299ES]V;7AI*5P0'29'/2$Z_RD
  201. XM]_^MG%?.XK+>]Q6E-RYTF?#NQZ$)MK4D=)GP[A9R\N<98(+HBM"V];OBI*4Q
  202. XM!<+5=\EB:^_EN]H/JG?)8FOOY="LU=B ?[#^UJ+Y!#"E#<@IK4^R'!=TF36/
  203. XM6&KP_!E@*2YTF6Z>(X6BO  3,*406Y&18,P(HR46,*4RF*"*Y[PK$G29@%(:
  204. XMY>K;&6!>C#IOOY7NH%RFZB8[IOWPU:.SOU?0[:+"J5M:_[^%HUS0-93Y\>[>
  205. XM<%^KUC>OM%T,4];*B+C+Z'29EIVR5OPR"*,/G.VB_5@8A![]A:,\G>VB,I@B
  206. XM7]"K"*/*/W293F3/WH;V&6!J&3NFUN)\E\[X%:1%H>VB_,A]^'NF@]#MHK'7
  207. XMHJ;8S@0V,*5PN;)6FK<5I,<>=)F*V/F?/_ZDI?GH[:+\YTZHB+@8M+1=5ZJV
  208. XMF:NGGM!TF7"Y=7@M_@BCH)[MHD5U.)$O316E#NGMHAWR9F1/LH\6=)DOH91_
  209. XMD:D(HVPW1IB.4+'OO5I7I?$0.Z:*S_NG&O_AJ]PW.Z:EX_.4+=/AJ[9+=)FN
  210. XMN.3>N<M1HQH=%JOTAQJTM>&DI?*A[:*;N0#_.[[GN+1=5ZHNEJNG.>GMHEW_
  211. XMFLQ*IOT-,*5FL51;^.*%HRXA=)F+\EIN&JOR#729;:ICJERFP#4[ID'CG<,Z
  212. XMNE7I[:+<N9W#)?:DI5KI!(Z@]!W9K/=1HX0V=)E&L7[+&<.V-729CVR\C [K
  213. XM"*,BN>VB.Y*FY/RDYJRC>HRQV,[=Q+1=0Y^!T BC=^FMG"W"U^<<TAG1@V\D
  214. XM;H9LHKR"Z:V<BN.AE6OR4:.'Z8-O,HY;BAG#C.D:;O?']*Q1HY'IK9QFL85N
  215. XML[\UT8-OL68#9G2Q.M'MHEIN;U^:[E&C/]'MHM7SOH41O0BC1=%TF1%\M\Z[
  216. XM\X6C9*6T76K9O.B%H[3IK9S\A+R,D>&%H[KI[:(CV01N>Z; Z:V<(]F??([F
  217. XM8=&MG"/9!,8.I,OIK9PK]?RA'*91H]'I[:)SQ/5V'O2)I-;IK9PCV?5V\/P9
  218. XM8-OI@V\[H=)P7*;GZ>VB9<'0C]C.[>ETF:V/R=XG^8NEI+E!XZE30+^KIXO1
  219. XM=)FY@=E51_NDI9#1[:(#P1^U>Z8Q.729MO3)S&#M4:.[N>VB"?8$;MC."^KM
  220. XMHB%9#%FTWQ6D$>I0=FAS#L1\^?.B> YTF8*QXK**YPBC<CHPI5C8HJO8SK71
  221. XM[:)IY/5V0O"+I2SJ=)E2V7=I\/P98%JO"%@7CN6:PZ3$T>VB>5_3A%/)%:7K
  222. XMN729KM3YU8WR&6#RN8-O*,?PD*NG%9SMHM:IFVSOY3@E=)D)]GBE0O"+I0"B
  223. XMK9R'Y*ZX>Z98ZJV<:>3*7#Z?%:1=ZH-O[*F+GX6CH!%TF4?V\65[IF(V=)FQ
  224. XMGL);R?A1HV"O"%B%KDCJA:/, 6*I3&1KTESP"*, TNVB1_8CGX_@&6"(#G29
  225. XMMN2&G(WR&6# /'29MN2&G(WR&6!*G7296-C37-7R5R%TF<W(F'DE]J2EC^KM
  226. XMHIZ[YH;8SOPC,*7-R#J-0>^)I%&=[:(NX9AYU?+O)@2C08JXJPFV+=*.4&[M
  227. XM(^>%HZGJK9S6J2ND=B@(HV"Z[:)0_19RK=*@(3NF2Y=B90SZ4:/X0@2C9<BD
  228. XMZ!6E4: PI5#]^W6SOZ(V!*,LX[KC6M%'0$:8N?>_5;T#YO\98( >1I@>RG.;
  229. XM;8S2O5L',*6CN^ZRHM$5I.]+!*,]SC7#>K%ITHY0#C#3@PBC;M+MHAFRYN3<
  230. XMHYJZ"ETL_5%T#J1YTO:B+,)9]]RC,"D$HRSCJ5*SOT &!*-=VDJ\JZ?[Z@2C
  231. XM3H2[6(WR&6 G!#"EY]FSBWNF!NOMHB71KJ53K%&C*T@$HRZ<>-'<HX--!*,N
  232. XMG!YS;LU1HW*O"%CI[^G(A:,:ZP2CE5_^8*NNND $HY5?M,E<IDNA!*-6@ER!
  233. XMW^E1HY,5!*,FT*'S;:>XT@2C7MQMW5>E-.OVHAKPKO%7I<+2[:)1K .%6M%$
  234. XMZP2C#NW(^TJFS ..I=5A8PM4U0BCS ,$J]5A8PLR_0BCKP0$HRKE%7:;O[RV
  235. XM+X2*?M9S#J3;T@2CQZ>2NDJFX-+MHF+:1NGZS16[[:(DRBC_=+$O!A:KM/>4
  236. XM[,V>X:MI1@2CX(5$O,.DQP@$HS"S'N$(HRR[!*,8@M%5KOF)I%<*CJ4#G#9B
  237. XMKO3AJ[(6,*5!=-1?/>P5I/\;!*,?I?^H?K67)@2C4,J*Q86C[LG[V%ETD<\(
  238. XMH] ,,*6Y6\KRC?(98 <0!*-EJP&-B*T" DVCBI?CTFVG"@DPI8^L[E*P_M:B
  239. XMQ1X[IF>TME2SORG3!*,(G^VI3[(C.02CO9E.]]C.M.OVHF?Q ?8(H\8'3:,O
  240. XM\W[-%:6V!02C1WY2Q<ZI4  D3BL * Y,H9F8I+2KY:-[)$XK ,L'K9_MDC/5
  241. XM)N;.?"1.*P!U'ZV?M_8FR6B[NHY0 "1.*P"O!ZV?M_8SU<GX-7LD3H]68O2P
  242. XM46C;@9!_W%  )$Z/5BJ@L%&ZI1!:GYU.>R1.QU)5 JV?^/QW@>3])GLD3L=2
  243. XM=@6MG[)2&5G1:T\'/7LD3L=2*P.MG^2N=+0PK]-[)$['4H8&K9]O41FO4.ZZ
  244. XMCE  )$['4B\$K9_DKG2TL^0]>R1.QU(>#*V?H=0\?T"E-7LD3C]#50*MG[-D
  245. XM&X$$ZRU\)$X_0W8%K9\&WUK(XSHM?"1./T,K ZV?R=16M7^HLH=0 "1./T.&
  246. XM!JV?P%L961"BP^U6!"1./T,O!*V?<.LYQX6=/7LD3C]#'@RMGT[?')]CG;*'
  247. XM4  D3L<$50(=H(Y4LJL0U):,4  D3L<$50(=H*3-ZW6JUA1[)$['!%4"':"D
  248. XMS>MUQM:6C%  )$ZI4W8%':"^Y1R? JH]>R1.S%-5 AV@FJA#4-SD-7LD3FE0
  249. XM50(=H*'Q7U=?]SU[)$YI4'8%':#J\6%J[L@]>^$3*P!#2JV?/[TSU6_<NHY0
  250. XM .$3*P!O-:V?4,59DY_V7WOA$RL -1"MGQCG^N&C\E  X1,K +.-K9^RL=[0
  251. XMB 33>^$3*P"W&:V?_;'>T"JQ/7OA$X]6*J"O5&C_(]\M?.$3CU8N4M:?*]13
  252. XM?Y3K-7OA$\=250*MG^2NW%[-J=-[X1/'4G8%K9_8ZE9J_#(]>^$3QU(K ZV?
  253. XMLV3[DUZP4 #A$S]#50*MG_?4U8(\]29[X1/'!%4"': XBW>![;50 .$3QP1V
  254. XM!1V@G-4 :^;[5GOA$ZE350(=H+/Q&X%:VC5[X1.I4W8%': MA%:U%?^ >^$3
  255. XM\%!5 AV@,ICK=<[+/7OA$_!0=@4=H'V(ZW7*'^^;4 #A$S  *P!E!6+T-YH_
  256. XMT @[%,=?>^$3,  K &4%*J WFC?C^>^"C%  X1,P "L RP>MGP?'1(W-X[*'
  257. XM4 #A$S  *P!U'ZV?&=1LJU>Y4 #A$S  QP15 AV@%7@CKG*\4 #A$S  \%!V
  258. XM!1V@-F8[9$RW=:90 .$39 &>4%4"8*#(<$*I"I"ZCE  X1-3 2L G -@H"'D
  259. XM9P5QX;;S4 #A$P.2-1!@H/N;9\? P;K()GOA$P.2LXU@H-5A\2<8WL#F4 #A
  260. XM$\4!*P!#2F"@;6D+B;FY5GOA$\4!*P <0F"@F_+NWG3;-7OA$^X!*P!#2F"@
  261. XM2HK@5**U3GOA$^X!QU)5 F"@38B/\*[?NHY0 .$3[@'5:E4"8*"%K$?7?]M.
  262. XM>^$3[@'P4%4"8* *G"55%(DLE5  X1.U RL =2:)CFW@J550OX_K4 #A$[4#
  263. XM5U-5 F"@'8E?WP+$NHY0 .$3M0,_0U4"8*"S>&?'>/Z >^$33@+,4U4"8*!B
  264. XM;U>,K>]6>^$3,0 K ,:4K9\C7%:08L*C>^$3,0 K #40':"43U#>(M>@A%  
  265. XMX1,Q "L =1^MG\[4V-:3H#U[X1,Q "L <)>MGS#&H94 \M-[X1,Q (]68O0H
  266. XMU>V,@9 4>^$3,0#,4U4"':#6J:%X]\%0 .$3,0#P4%4"': U^4A8,<U0 .$3
  267. XM,0"QD54"-Z!\JVQP+)50 .$3V ,/654"8*#(?][T'0K3>^$3; (_0U4"8*#&
  268. XM55I>G[8]>^$3# $#754"8*#/:6U]:?QDV%  X1,: ?!050)@H ">TG7[I&;9
  269. XM4 #A$S("*P#+!V"@A:R,G*S8NHY0 .$31)%U'V"@H7W2=?3>3])0 .$35 $K
  270. XM )P#8*!LBC&3R^Z@A%  X1.V 2L -1 EG+90P>UOW+J.4 #A$[8!*P"< V"@
  271. XM466DY1CZNHY0 .$3M@$K #J4)9SDU-?*0J&MVU8$X1.V 9Y050(EG '8\2?<
  272. XMO8BD4 #A$Q$!*P!#2B6<+]@I!K%V+)50 .$3$0$K '"7)9R,;8*/"=ZIT5  
  273. XMX1,1 ?!050(EG+V2X3;5B'_<4 #A$S( /T-5 AV@UYN(RW>84 #A$S( :5!5
  274. XM C>@A),:9H&I-7OA$S( L9%5 AV@O_S78:+1)GOA$RH!*P!#2B6<!%E[&PB8
  275. XM+)50 .$3*@$_0U4"#I9*MWH<&*Q:D5  X1-' :E350(EG-.4)54'Z&384 #A
  276. XM$S, *P#=-4RAJL"FF OV[YM0 .$3,P K '4?K9]]WURL9/]6!.$3,P#'!%4"
  277. XM':#+JE/24:U0 .$3,P"I4U4"':!8VA)2[^\]>^$3,P!I4%4"-Z#[FK2&INXF
  278. XM>^$3;Y+&E"6<3I#9R(7HLH=0 .$3%P(K #40)9S.[W.A  \[SU  X1,7 LQ3
  279. XM50(EG$2)SO<CU:"$4 #A$X$!GE!5 B6<<F_2=4-M+)50 .$3&P,K '4?)9SY
  280. XM;: GS:R8V%  X1,T "L <)>MG\C>F=W8ZSU[X1,3DW4?': 1O >4&;=0 .$3
  281. XM$Y->+#>@2_ !Z*"$4 #A$Y$!:5!5 B6</*;9R'?2/7OA$XT!YW)5 B6<@V!R
  282. XM=H>MK=M6!.$3[P$K %XL)9P(A@&>^VL4*3U[X1,Q 2L =1\EG$5S9\?GU^7O
  283. XM4 #A$S$!/T-5 D2="LN8B CFTWOA$S8!QU)5 A"<SU48:+FY5GOA$S4 *P#+
  284. XM!QV@<\>PBE*N4 #A$S^3RP<=H"S18Z!-MU  X1,_DW4?':#*M6RKW/,U>^$3
  285. XM'@(K #409IZ*S^3%:\Q6>^$3O ,K '4UUY[JP>ZXJ*:ZCE  X1-, 2L * [7
  286. XMGDMW]>96WJ"$4 #A$TP!*P!@/D/*\KT$S.3OP(50 .$3-@ K $^;K9_T8-ZD
  287. XMLNO3>^$319)O-1V@6[E<K"VETWOA$T62=1\=H /YKJ4CZSU[X1-%DJ\'':!@
  288. XM^:ZE2,P4>^$350$K !E(UYZLQN3%&^DU>^$3)@+P4%4")9RX5[[_:NH]>^$3
  289. XM3@&/5F+T4+8SZ@O,@HQ0 .$3-P #754"1* /8X"NX\L4>^$3-P _0U4"':!1
  290. XMK/18[JG'?.$3-P!74E4"1* ADCWB"J'.?.$3-P"I4U4"-Z#W@9UB7!*C>^$3
  291. XM=@+Q<E4"1)U,K^N$XSI6>^$3BP$K $-*%KRVY _A6I%0 .$3.@$K ,L')9RM
  292. XM@Q7FIO-6>^$3^9&SC1:\.+;1AVA+/7OA$_8#U5)5 B6<I[)KR!WD@HQ0 .$3
  293. XM.  K &@C3*%;@MZ_X_>HE%  X1,X "L RP<=H&&XAIQRO%  X1,X "L =1\=
  294. XMH,C5/81WF%  X1.PD6\U': LT8^IJ!X]>^$3L)$U$!V@MI.=6 SZ-7OA$[ !
  295. XM/T-5 A:\/K[SE>'4TWOA$^4!*P!>+"6<EGF\Z;C./7OA$SD *P!#2AV@)O0K
  296. XMI&(-=:90 .$3.0 K ,L'':#.^:B*W^DU>^$3\9%/FT2@_KA$C4S*TWOA$_&1
  297. XM<A5B]-]H$X&CLI[O4 #A$_&1-1 =H)W:]/]WF%  X1/QD? +8O3&4=B,"UQ]
  298. XM^\ 7X1/QD74?-Z!OY3[4LH=0 .$3\9&SC3>@"NZ8PXBD4 #A$S8%%UU5 A:\
  299. XMD7J26:WK7WOA$QL"L9%5 A:\Y[*D6V.W4 #A$\P!*P U$"6<+8)5G_>F'_%0
  300. XM .$3P@&/5LB95G(IH=9S+)50 .$3?P''4E4"(\$UC]E1Z+Y0 .$3?P$/654"
  301. XM%KM$TUK<1LA0 .$3>@'54E4"%KP.KP%?:M@]>^$3>@$_0U4")9RF58/+==P]
  302. XM>^$3>@''!%4")9QEOPG@!N<U>^$3 0'P4%4")9RM@SK>9<RZCE  "@HK &\U
  303. XMK9\=TY"!FMU6>PH**P!U'ZV?K-K>T'S0@'L*"BL G .MG\[RQJVRZTY["@K'
  304. XM4E4"K9_WU)5NIDFRAU  "@H_0U4"K9\RU?N33[I0  H*/T-V!:V?9%&IDT#@
  305. XMLH=0  H*/T,K QV@U*%>JO*S4  *"C]#A@8=H Q^?M_H^C5["@K'!%4"':!6
  306. XMD7[?[;50  H*QP1V!1V@5I'5@@5&P(50  H*QP0K QV@<K=J:G7</7L*"L<$
  307. XMA@8=H$11*9)\S%9["@K'!"\$':!$42F2X\^ZCE  "@K'!!X,': XMG[?7K!0
  308. XM  H*J5-5 AV@ON4;@>G6@'L*"JE3=@4=H,A2*9(FJ+*'4  *"LQ350(=H!!;
  309. XM&5D^]L"%4  *"O!050(=H W(I>97N5  "@KP4'8%':#PI!R?1/8]>PH*:5!5
  310. XM AV@9K'K=6_/QWP*"K&150(=H-:I0U#RZ%9["@HP (]68O2[6*3=*[3*VU  
  311. XM"@ID 2L G ,EG"]I/=9E44Y["@KN 2L =1\EG.AKR/#$MCU["@KN 9Y050(E
  312. XMG(.^8_Q4)+*'4  *"OH"*P#8G26<U<0)IE"ASGP*"DX"*P"H V+TK6ZR4'[/
  313. XMTWL*"C$ CU9B] 21-^/'K>^;4  *"C$ CU8JH(EBCYD5K[J.4  *"C$ QU)5
  314. XM AV@FW,4T$CB/7L*"C$ S%-5 AV@Z/R8LK;S4  *"M@#*P!O-26<Q5YFEL?1
  315. XMP(50  H*; +'!%4")9S3@LRQW8Y:D5  "@H, 2L =1\EG#*6C*J'_<"%4  *
  316. XM"C("*P!>+"6<)9KF;P7M-7L*"LH!*P#&E"6<3W5+EA2>;OY6! H*R@'_3U4"
  317. XM%KPYPURL(!* >PH*5 &/5F+T 5\ >L7NF 04>PH*E@(K -B=)9P%:3+7(^N"
  318. XMC%  "@H1 2L ;S4EG'##[[HTVR9["@H1 2L &4A#RJ=HIH8AG(!["@HR #]#
  319. XM50(WH,J98I5/U5  "@HR ,<$50(WH [M$\D?\5  "@HJ 2L =#C7GA_4":9+
  320. XMI%  "@HJ 2L LXTEG(G$ HN5YS5["@HJ :E350(EG(O"BJB)Y<=\"@I( 3]#
  321. XM50(.EM?#D-,.PLY\"@I! 2L BN EG#M4YJ7*>BWK7WL*"CX!*P"SC26<UXP 
  322. XM_GO8/7L*"CX!QP15 B6<1,/VS[OB7WL*"EX!*P"H V+TV\Y;XZS8NHY0  H*
  323. XM!@$K +.-)9SHQ;70J^Y6>PH*7I$U$"6<P,-6D%2X6I%0  H*,P#'4E4"-Z#*
  324. XMF;7!=YA0  H*,P#'4G8%-Z"=PBME+)50  H*,P _0U4"-Z"UP'FJ'_%0  H*
  325. XM%P(K '4?)9R"9^JFW>QDV%  "@JR <=250(EG /%6,"W[SU["@JR :E350(E
  326. XMG)]VD^!IM!1["@J! 5A850(EG'><_</F-;*'4  *"CL!CU9B]$7%(([3LJ-[
  327. XM"@H[ ?!050(EG)]9BI,H[L"%4  *"CL!\%!5 AV@+U=Q=GMZP(50  H*.P'P
  328. XM4%4"': O5W%V>WKOFU  "@J& 2L ;S4EG(YV6,"5OU9["@J& <=250(EG.[$
  329. XMRI-RO%  "@J& <<$50(EG,Z/,;!A^E9["@H; RL RP<EG&S&C-7V^J-["@J_
  330. XM 2L &!77GAK2\>X+YSU["@HT "L RP<=H'?)C^<YU%  "@HT "L LXT=H/S#
  331. XM^\_5VU  "@H3DS40K9\*Z8)Y\K-0  H*$Y/+!S>@,ZII]Y:,4  *"A.3LXT=
  332. XMH'6UAL,/;%  "@HH 6E050(EG'.6,L)!R&V&4  *"I$!*P U$"6<@<8+@?_5
  333. XMHWL*"I$!:5!5 JO"/X:\@E*N4  *"I21QI0EG$3#1,$O3:"$4  *"HT!*P"@
  334. XM,26<,8K'7L#JLH=0  H*0@$K &\U)9S\Q^_;[JF >PH*DP4K -4'8O0"7)RR
  335. XM,OJZCE  "@J3!2L G /VT&R3'7(LE5  "@J3!9Y050(EG$#$QFSDK#U["@HV
  336. XM <Q350(EG+W%3)=#\I:,4  *"C^30THWH+6DA6$(##U["@H_D\:41*#@J9;(
  337. XM1^BHE%  "@H_DS40-Z ^U1/>K]]0  H*/Y-U'QV@=;6 IG>84  *"A8!*P!#
  338. XM2B6<>Y(67X9NM[@F>PH*PP$K '4?)9SK8!BKTH$LE5  "@J\ RL NY=#RG#K
  339. XM:FI4)+*'4  *"C !*P"SC26<!<N?83F=SGP*"DP!CU9B]"!2]LH0_*B44  *
  340. XM"C,!*P!#2B6<Q\EHVFW"%'L*"C8 *P!O-0J@8K+IS(+W6I%0  H*19)O-3>@
  341. XM9:N=?BR54  *"D6222PWH$VRZ%\LE5  "@I%DL:41* NE(I=QZVRAU  "@I%
  342. XMDC40-Z#3H;_>HWL*"D62.0PWH-NE+_%:D5  "@I%DNL%-Z!8NEY:+)50  H*
  343. XM$@(K #40)9SMRZ699'!_<%  "@I\ LQ350(EG -H<5O09(6=/7L*"E4!#UE5
  344. XM B6<OVNUFHM=+)50  H*50&>4%4")9PTAZS+"N&C>PH*59,U$"6</<MYW\WC
  345. XM/7L*"B8"*P!#2B6<K)D4L?[9/7L*"B8"*P!O->&<'*$,VJON5GL*"B8"*P U
  346. XM$.&<KNYX:UZP4  *"B8"*P Y#.&<-VD,VD;U/7L*"B8"QU)5 B6<V:&*ED;U
  347. XM/7L*"N0!*P U$.&<?8@X=+FY5GL*"H0$QP15 B6<-9N[NV+YTWL*"C< *P!#
  348. XM2AV@-*UR<AOVSGP*"C< *P!U'QV@6-@XJW*\4  *"C< /T-5 C>@GK2^735M
  349. XM4  *"C< QP15 AV@N-10^+P7/7L*"C< QP1V!1V@,/Y7[ZB44  *"OF1RP?A
  350. XMG!FHW7ZRZRU\"@KV RL -1#AG&3Z_) 1^, 7"@KV RL .0SAG'^__)"5OU9[
  351. XM"@KV RL RP?AG.3[J5/=SCU["@HR 2L D"),H?R'KD9@A(!["@HR <=250+A
  352. XMG*>5W7X<IC5["@HR 3]#50+AG C/2G#WH*-["@HR 3]#=@7AG-/(2G +W2U\
  353. XM"@HR <<$50+AG'"Y+-.:W59["@HR :E350+AG)WVSZ.UG59["@HR :E3=@7A
  354. XMG/2XOI_RLU  "@HC BL LXTZGSQ\L=+_\R9["@HC JE350+AG*>5R=4TCQ_Q
  355. XM4  *"B,"\%!5 N&<KKAI6_;A5@0*"I,"QP15 N&<*=S)U8FEA_=0  H*.  K
  356. XM &\U':#AGMF,S>/ A5  "@HX "L -1 =H)W:#7'RLU  "@HX "L LXT=H"]7
  357. XM<79[>L"%4  *"K"1RP<=H+#K HL'!]-["@JPD74?':!^ZY1_P.X]>PH*L)&O
  358. XM!QV@NK0LLL*J4  *"IP%/T-5 N&<@/Z58%*N4  *"D8!*P#+!SJ?*ZQ=;)VR
  359. XMZ.@U>PH*F0(K #40.I]GVKQF L.RAU  "@J9 BL U1%,H2'D2:0^J"+O4  *
  360. XM"ID"*P#+!SJ?B:\RBK)MR?M?>PH*F0+'4E4".I_"B\ZPPN?$R%  "@J9 JE3
  361. XM50(ZG^O5PYD:J:G74  *"C$%*P!O-3J?2K?.L,689<M0  H*,04K $DL.I^E
  362. XMN<ZP[]XQWE  "@HQ!2L -1 ZG\"_,HJ2EH#I/7L*"C$%QU)5 CJ?O9*?Q)>C
  363. XM+)50  H*,04_0U4".I^=E^B68,!6>PH*30&I4U4".I\U6KV?[]Q/TE  "@I-
  364. XM ?!050(ZG[90<Y7/\"R54  *"I $*P!#2CJ?W=X/9->&'_%0  H*D 0K +.-
  365. XMZ.D\5#EN][JZCE  "@KEDT-*.I\4<+'9?^ U>PH*Y9,U$#J?25IYFE+%@.D]
  366. XM>PH*Y9.SC3J?)UYTO;;/@'L*"N4!*P!>+.CIT[-5A^VU4  *"N4!CU;(F4YC
  367. XM 'KT8V7J-7L*"N4!QU)5 CJ?[=[AEJI0+)50  H*.0 K $-*-Z#-I 'ES\E0
  368. XM  H*\9$U$!V@;99U>%,\TWL*"C8%*P!>+.CIS<A5AW2DHWL*"C8%CU9B].^(
  369. XM&>(TC\SB4  *"A,!*P#+!^CI!9WS:'R>SGP*"G@!*P!)+.CI4/T%ET'W5@0*
  370. XM"G@!*P!U'^CI$;S)U<S*[YM0  H*&P(K &\UZ.D0NRQ;"_8]>PH*S &/5F+T
  371. XM^&YKOA/;6I%0  H*S &I4U4"Z.G^NZZSE;]6>PH*P@&QD54"Z.F*V,F'0/P 
  372. XM <(!L9%5 NCI, (J@+)$1@X;+6:XB,'"#!\H+&+$T$$#AXX9-EBTL%%#!PP<
  373. XM+'+D<)&#A8R , 86/+AQ8<.'$2?.R*$CA@R--BS6N"F2I$F4*@W>6*&0H4.(
  374. XM-CW2M*FQAD4:,T*.+'E2($&#.%K <.G024092CWBG%$SH\2?5E=FC<$59M(8
  375. XM'6. W$AVIE2?55->S;'6Q<VC7SU:E$$#)XV:-VVZ*)PWJ,@5,MHB!2N#;$6<
  376. XM,&H65GP#K=Z5.;1*#BP#[ P88VN"[$D5Z-[0;(VZI4P6]<;#,!(KS-B8X S(
  377. XMHV/<H#BQ1N$6A"GJ]JSR=]&72(?3R)P1^6$99AF[7N+<+_2(THL?3WZ6-7/?
  378. XM*VH$'S[C^GBP-:+"/<]]Q8WU.I)?1BZSL/G>W+40VW=R>311==CEQ]-4],T@
  379. XM( W!Z=011AK- %8,9FW56EH."A<<33!,6-T,9#&EV(:?.1B9;$A9!(-E-R%G
  380. XM T6;0<C;=BIZ!UB!+R*F48).1:002  Z""&+$5D40V;[R3!<D$P5V0*$?[FE
  381. XM9&:G_>CB:@Q*"6%4.RHIDVU.4I2="U%YN1B!2E(VWI.)05A#@U.ZD%&8-4U$
  382. XMID4D?D4GA)WA*=%%" Z6&$-J@B2H:0@^"5(,SZE9TJ(4S27#8*A%B6-+2!8H
  383. XMG'(_@OAHFCC"0%2$%W5$& L!U135?Z6N<"2;%Y4(4JM,P<JAJ3B@BN%%J,%0
  384. XMW*M=EFKJ5IU2]E2,-H %@UF1H=A<0*(EF]]3<]E@V69L=58DM0/N:%IF3-&E
  385. XM0WQ"ND"DL<@%-VY^Q]EPV$YW2>M;;M42"!8-'1F7FK#U-OBBK,CJ>VY=",*7
  386. XMV$W?TI!><+5U1$.,-;!7DJXIAKA"N&[51A.%&TUT4L#?UI#OCB52EUIYQ>Z*
  387. XM4,$H*PAL:C(P!.F:W]X@(,37$II:#9E"N.ZN.L\:\TPS;S1<95_A5:K.(W5J
  388. XMF:K'W2#RQ2UGO-:*!!X&5](W>"T?PZ7FL +,'2OG<\CY$>OTKJ$9G?9.\.(T
  389. XM(],8NE1D#!NC"I4.U>':&<;-\:U>IX,-EY&P-<T9@XT-QB @VDC15&;@,\[@
  390. XM>&3:<;ADNYWB-J%M\A*7KKW<202<U.>VV92$$5$9.=_/Q5Q#1[8YE5]&A/MF
  391. XMT\ZAJP:JN3!TAF'D,H#>M68^FHL=R3C"]7#P)U7:E*JCVAEY#2M$O?R@_K90
  392. XM@\B\9UVXR93'7JMJF)V;*:F>FWQSIQ,.5Z[5Y\[9>^HVK-!K\)ZBV(5L5K"]
  393. XMX4!6'$.*9;!4G1C0!%V0BEQ6N+8CW!VF.C;(# 0'9,!V50DIN)L1Z426F*W<
  394. XMR'-FLT%P#C.=I-%-<[%S@;>B%QKO59 B]F/6W4HRGR+)8'JTFH&>6$49QT'.
  395. XMA_9!567JUJ,9#,Y\OOGA?3Z8)'B!*C<SVY^%E(<GW:U**WK:#/Q2E+S(4-&!
  396. XM!EH;XQP(/0XEKW9N 1$#-8+%7$&1.V_441P]<J$8,8X&6'L;&3E%H*74AHYU
  397. XM24RO9NC&%OROD/D1#QW%UD8RP@ YC]S1QRPSE[#5JFED<^,E;<B'(T2D7R*T
  398. XM6TW>AZ8&U:QO]$.,6,0GL:!YQX=\,R.!0CC+&H@0-5JLF8!4V*GAK+&3F2E>
  399. XM)9M3FI.Y154P:HHQ XDZ"Y4Q.!/R&L5 Q,/(S,F'R2/F+L]UH6R9QF;>=.5O
  400. XM*/A,F<FE*;CAX>'4R<5VSL!%KZ.($;7G0X>Q$X1M6UM\R+G,*-( >..D@23%
  401. XMESGCJ;!S9.0>' $J Q$U!3X,"2;WY$;1CE1G?/D!YATMM%$]4I2%<P$IT J*
  402. XM1_G],R(S,L[:2O<XEI*T3K&L 4T^.IC-<,Z5"$G@*<^%TNME<:38F5QP9D2#
  403. XMPX"L61=YHB"9B1!Q[FA&7YM84Q[H'Z0.97[C?%;S_@:P8.I,J+]BW$=#>$J<
  404. XMX<A).SMCORRR5E"9M9Y(^64O46E3N'(4ILS+G3%%.M4HZLRJ;KE;77*G)&JZ
  405. XM4F?WZ=0.!<K-T[ER+9%]B2D_10/%&>8B7"HL'B>XU%4.3Z85BV$HR6BVEWX-
  406. XMI%H5GTQLMAM7AL:U6-4F/*T7S-N:%+"/<^&\C,>6:AKI0V'Y(N-@X-@B.6B>
  407. XMFC1MEK1"&9NI!Z+-.8VLL'FNB;QS2D_1WTA/@U?@YK IB8PAHG!$WHD"ECPI
  408. XM=:I9%&)<OJ4OK2!JBIX6)%H220ZM6#VO;,_%PR$U2(CE_55IFC=0A=H4P;J\
  409. XMJA5!-E"\*821*4*P>Q7\I./(-#</EIQ"SIBY9.YV2>G"<'8E!]W$@G:O^GQP
  410. XM\O)6S.Y:;R.9P=LWV9M'R>:'J^AM6XH/G+R__DIS=1,?65:J11+!DD!8C<M<
  411. XM *F9(3O78?>]V[R.4Q$:/5A^I6T/^Z9D.9O=![N^P<B3);S$\-& J8D1IW,1
  412. XMTN*\$EB@$]'JS<:8W:KB1ZS?I9N3FG;"#'\US%BRS9L]XC;CGC635A)>N2KF
  413. XMHR;KK,[@26-L@5:W)A\0P"_^(K^$[.F'D3B28Z7-@\V69>(D;=0U;3*K?_NK
  414. XMOY5KT0&QJ</0BBWV_;'1#?*GWZA&1 /I>@6(;=%%\GPKT9TRV D&T999E>.,
  415. XMCG0Z&\,MHY.,$6,?KT@*=::=*\SE>0$;W)(S"'ZZ?6O+E:^_$SM;:0<ZW8E=
  416. XMI,#P_J&'8KG@[R[QGGX"]P^=Q-U^6ZHNCV)+H9L3;TP?6<L5>B!_JSFQ!Z&J
  417. XM>$D&Z8MBDN\$&Q/B4Z)D! 6.4P+9[V.*[M?8@AU._)3)S3%]-\5_(Y'20BII
  418. XM8J903<'=H3];=$I+EGFP'939';%'8E,>K'J#C>5Y+XW+,GF4>OCLFZ:N#LKN
  419. XM&UX+-_XX=3']5#ZF\G21-K*NJ[CJ#C,RG-=VS_P%'$=-1:C1/6),C=C;P5W?
  420. XM,8?B#NGHN+HZG66TKKD'E](R]\:G(>JSP2W1>>?X.$C[2 P77O7&GUJFY6H[
  421. XMOP:_W;##N4)\RA[EN<,O9(<9Y17*G./TGB)^.=,KGSI\O64B=,;+W2WV2[3=
  422. XMAS7XDL\]0=]M:J6OW3_%^'B)WQ5BC'L(]_[U';!B'A'NQ MO/]<8:<'W&F$I
  423. XM?N@:AZAY3CQ8#(?6^J%L.*;LL4WXE?EMN _%X4S5">0E)E6*9P5ML+=?3R->
  424. XMD^;"/2M&QA[[,F4:%%KVUP*DY'>^M#9D17T49S8!F$8CPD+;%VRAL6$"J'@)
  425. XM(7&Z%C?K)C$QTD(F0G7<P3T.QR?3]GTPT%7]A3YM 7LZ05>L(A,.)4,-8C*N
  426. XM)6T^PSA,HT4FXW!+P4(W@2OGAB- TWDFYQ'R52%+QD-H5H*7Y%H9F'Q/4G\W
  427. XM>$D82"@X9SEQ<H7B@Q_V%CY(HW,C=H.T\V=/5R'.YH-\$X$]LA\D,C,WLUK-
  428. XM,3Y -'=U-!=QB&(C9X1\4W0N1F\CDF?6UH)\DX" Q6G)1RX&:(:^AWOZ!'Y*
  429. XMTHA%,CY?6&.C!C)M9Q=L2$ASQVFQA7U2=X,_=%]+ W)(!F+,QR$[L3&@IE"@
  430. XM4B:=95.MF(5O$2,6 EJT^$-E.'?!%8ID45$Q1(*:\T,.9TRC4R&F$2<V6(G)
  431. XM8XH],W:X,XK.^(A^-VHCXB+X1H>^L1,M (C*ABNXJ!.9PA9/J#F_D6R9]GV9
  432. XMAR7,>([Q87IG9$Q>HX<:)!^ <H._\7R_<CL::! $U8>L>%R82!-P:$P3IX^7
  433. XMF(2@J(=IN(HI8AQ7]WOP 7D7(D;-:(0.8XO84B$RX81ZHY%(Z(L7Y)$AM7@B
  434. XM*3N^*&4FV1ZT>%#@6$4KJ('A!W!Y=X/<(X56I'[[E2[<6((Y26M/-SR)1R]=
  435. XMMUZL&)1@ HG)\47*UU3IPGIUV'@UAD;JIT$L6$VW<RKSB&IC5VT1@1J5V'A+
  436. XMZ7=HE'S>15NM-)8>1R-C)F;L)Y7=B(-"Z9:9YS56R):149:9MF@3J(2T2)>%
  437. XM,7>C%HI.58A::3)9&'APB!N4:(2*69==)H;7D9!LJ1!\R5E+@8O7481):8V9
  438. XM!E)WZ78[!YEUTI4#I7Y.Y7^?J8X\,BZI=V^T6'SK9F()@27& X^TV97*QY/&
  439. XMYH/]HY,5]99,8C.Z"79).)P(8I#SE9&LV#\16#T@ Y  LV<W")UU63. $RJ"
  440. XM!YS;E9E+<R#<61JQ<YUW"(F?XF\Z@6]R68(OLV[2H8<74GM&&%2\EA_Q62'V
  441. XM8Q;MJ3D(H9.!YY3P48&5^)^2&7],*!BSF1!@:)!ZB!O&R4_UR:"HR6P)>AG 
  442. XMR:#@>3!O&70+&H$RI8F="4K7>9H,J7]JN$I+5Z +B2>X\J#7$D-GYYY?>$8N
  443. XMXBPI>BDR6J*N>:,X%Q?XV()^9J-*B'/S(G5K.:$QR2/2@8LB1)_/^8VTIHV(
  444. XM)S$U<H/=EX2Y"(?)1*!&.!3"*7_<J4P^"*;9N5/<&6LC53' L:$ N9Q>=C/]
  445. XMR:8_]7L&&2, V2=E"AQS\GL=>9L**AQ8"AQW HG*-R+D@IB#&AF!8JA,8H\U
  446. XMD9N#FH7),9V6LQGJ\9.:8W[9F4K(P86TR*ENFGYC>J65R*F#R91U]ZEE$:JG
  447. XMTJ>JFF0 29ZER8I#$9W!.![K&1$C 8]#L:2Y-SQEPEQ-HY4ZDX6P)9]N5Z84
  448. XMRI",HHQF4IZGJJ$,:2O0BG>^RJ"IJH ( ZTZ%:J@^2F4YI3=VG7$6#$F^HE\
  449. XMHG[!N(U86B<;JCN9QTG@>H)I1*[L(Z?OVJ-%^I<&T59:^6D?V#S4Z9D1*;"\
  450. XM68_CB6^CISD"NZ%(]D4 N7GMQXH"NZV9MG[<.1TP=8,'I)/*IYZ=MJ8?6Y>)
  451. XM)[%+$30>VZ9:"INL&B+I H\'1*G+HB7XF2X-ZQ1<J:7L42@789E&.+.MY*?"
  452. XMFCC2&K2G@K&?DGAD\B2L>;"OFISK:K-VH1@Y*[2%ZG>)%UN7 IA=1WYU*+2-
  453. XMZG<3BZ=/X:46>RJ*8JC>9;:-8V5(&YW3ADD>D1TKJY),&5-O$J>R4XD'=(RH
  454. XM5BYE8B+W<:Y_FYUN\B/31(L'!*RR-)U6BI)IBXBQAW0_0FP^>']@6$X5DF/9
  455. XM8[BBT96XUKD^<C-@VXU]@8F>VIN;<;5M"5NX2'LPY0)S2EJH69$F67:,ZK$,
  456. XM6F/R&KL48;!AVZR?B%7*:I.U&ZY.NYT)01E :[$M&FE_A(LEXCB@FZFTTB,"
  457. XM:E<D^X69Z2)+9I&@<I-^^X5*ZR)SFXO^ I'#RZ^')X8ETDTW:#9HQ1XU2[=0
  458. XM<;2L2+\F>ZDV>QDW,Z.:0[_P5REKHYW5J4*G6X*MM6[T2K?L%RE&V,"\62)N
  459. XM6S.TV, 0:[G((1WR05_S"QQ*>W1CUK41['65:#996)3C$5/XII4J;+*/JKAU
  460. XM"[?[>RH0"Q:-XA$.&,+1"8(_$E/9 X]F [C)02:_E,&FEIQ +".E.Z<IA!]G
  461. XMB:=Q83SWL< #+&Y]V6&DFVLUA\4Z=7L*R(BD"T/ZFL)QQ9#>!:FK4K$1"1M#
  462. XM"XET@Z@\W+%HK),#U8[YFK.^=;N(IT&9HAY0W"[Q^G.)YY*F.[_M,L+YP[PA
  463. XM^[QOW+L,B8IZTL-HW(MR[#H)H2>/ B%$K+QW)H:25'B?C+?A&+XF^4Y=IZEA
  464. XM_"79.X#0RH>>K,BS[*(EN<D4@;:1S*\WEWR4H<MU&!I+JB3I:QJ26B3%Y[B"
  465. XM&)91-7D-TC_\&H?^\GWHHD5!A5Q8%"S.XJ[([(E[M&!90H0V=:M^(X2L(D)Y
  466. XMB2._BBJYR!08IZ;]I3,Y*%V+,Z#C+,G1E13UK(M:=*RT9DC;B440]%-%XL^9
  467. XM"=#AS+G]'*Y+P9)8I*<C=6G(Y2FWDF>YZ9PI<EC_'% 4TBH IT6?YEI*TK/,
  468. XM3*QGC",EBSA$93UBI8I]B](C&6G"Y\Y,E<X<,D&8)IVRJQ7(.(P-DA4;!M"K
  469. XMHKV6C-+$NT<W-\T(I[\I M1Q7#G,\TY-9+T2>M,,':DLO2]/VQP-K-(+*-7&
  470. XMU,DHC".^U2D(O3A.-2KTL6M@R"<(@I=M-7K"5I"SM$3YR[X$D7;K-K7(L<WI
  471. XM0H(.XYKI=\ B\YAI$=@FVZW\$:UXO00'57,J/897:3I@!2"/S19$.M.0RD:U
  472. XM^AD')=)U6]<EQE*?/<^YZ*]9N=;X++V?Y\2WX\R6':YM(JM+(T^J;<I5]"O^
  473. XMUM,!K-KVJMMX:C]&Y-M36A9US<5G$=M31RN<Y;:"NC\'=5W,_:<F;#P+'-VT
  474. XM.]T'O"5,K1+3H<56B:!BU<8JA#K?'=3&'<Y 2MIMB"JPRRH/5-2'K6_8W*T?
  475. XMX670;8Q^X];,#$/Y+<:\ZBHS@W&#!MTTA\VZM20J:N"NJ$3Y&5S_>C/FW1U>
  476. XMG3D9$I"S8MD=@MY>5!@]PG7+K>&K#=4(S"KL83SM:75HQ4W6,R@P"]T.8Z^I
  477. XM&1C' ^/^XS<J$UQV)%IQMR3()7:+$Q=;G=?8;=8_NX-+8].>?5"4:Y _]WUF
  478. XM'.+;47HKGEP^]9MW5'J$L;DSHYV#5GA(Z=DN:.3!E24*/CZD#69&#LZ9PB20
  479. XM[-UTN>;N =^*QQEKC1#H+8N/\GBD3<Y&CD5Z=AV&[=FWJFUEDB4OYU,\[L]&
  480. XM?K+<0FI97C3(M8=[WLP"Z=D"2^;E.B\@"=@("TE?8^:XD=J6G=*@KL-#1:S0
  481. XM?4!&!B+TJF!0BNG;=48ZN+Z6N^K@76:EBQM*[MVDM>:N\Q8@F>*S1N;\_36Y
  482. XM!MU=#>IDP9\X!!YK;38XP(_PX;^'_BBC%Y28*(-]_>S[0Y5)F(D(4AN*1!\E
  483. XMA8EDW.V<+<CF/NOAOM/]1NK;88+K!G+:*40L1>^\"62+#<^HPSV"G2JRJD''
  484. XM/.\)YB)<C!S$=NDJ$9DJ?7B"*T+"2Q"12:1)(;&9,_%+8#)&IB31Y,0FG>$&
  485. XM_]O^Z\11;NXU2BLE[L2 E.^.Q,XNV[5W_81'B-Z#8N8QE1CL#B!'"(1%:N:.
  486. XM,KOM"30 CD:)I\HLU.L4CX63[EDWYV#?CH6(94KWKC+4U>+JD>VY!+BC)I8G
  487. XM)[F?88<VCQL9:UWFSC>NZ>H^@T88[,8-?XA^XZ _X3X<I_4C'N"P:"+#9<-A
  488. XM+SFMKC;OTUWY/G 3G5]6J?&M.,QW=B.6+C3F?DV-OA38'DF#[T&0A#3.[DL<
  489. XMM\#>^/?VILJXTTVB%8];[KMS;L*9\I/Q:/,U:_2;,47FWG.-SI+IB?@.@MZ?
  490. XMGQB\3?.WO]&PN+Y,)=]A_]D_/B9]*?P-?U"X/]JQIZ@\3WC1O,8F$7-Q;>[:
  491. XM#DG_)I:<W%9#'Y2T'E"7@<!*O_%*B?V?A\!#3OZF]^<UNV#?NF_6G^M::.9W
  492. XM:EG/7_0&R><%TO+?#F;?WT+K*[SDN^+3\?[.]"--(B\M^)*)],WR4]4;@#$-
  493. XMJAD]WF :D!_%>T^1SV=4#S;R[:S/=Z@>#\TLD+1OEZ6B2QRB@ 0FWYFI1C='
  494. XMEL@*4H'X+Q*M"B\'S"B>//MQ8@H$#KJ&Q^@@B6AZ% ]D!U*\3'?YC)=)6"#Y
  495. XM+J2YMVC2M2Q$$EQ_H,ZS#"<G,KNRW;(S@?2J4B$^"G;Y^@5CF!<6<.-!(.22
  496. XM''B#D)M=,RJ,W1>#5)*62(&[(V&LRG491.?7OAUL>#[5@]/,EXN D198<&IK
  497. XM!^Q"7+2?] <K5%W[92SE#\:KQ+78C%(^ A!_D)$MLT:8_OX@K%) ^P)/.2\A
  498. XM01_ZQV(B:8MM%C4V3RB90.&">1;0#A)&P+ZT6'Z$=ZF!2P [B:YDA!P*4 QI
  499. XM3_W#<8F9<F&5*N&-JS'422.<);L%"0]>6)@NY"'.=,*[%T .V+R A7BNN)4Y
  500. XM,L%":D1V*X:8B;E9*X4GA\I0,2R  >1RZ:)1^/(BV]P:5@ZE$QZ+'X?J*A4T
  501. XM-!55KNU$B;@0ZU1"!I%_BR9*> WGMQWNX3P;*+RA1,B[M' /_PH()!<,(\_(
  502. XM!Q4R>NYA3-J DF0#\I"&F$LF7?U+$/AN?]B ,]3H<!>06(A5[3-LQ%\(ZIR*
  503. XM6'H*$8H$-0OYQVD07;_8)X1PQB 7S,,PCE0B_ UKD)SXB,%5"3O$2Y%.,X+Q
  504. XMH1B-V/N0! C$'29!5=1#@J MCAI$ ('G#W?P0X+8=(P<IYF!KD,C[AH99V+V
  505. XM$%53B7,-DA0FAA%Z$F&,FW1%Y9!EE)!H#XF?44PFN<HD*!VWQQ29W&BH'ETK
  506. XM2F"41(B#'N*8$ MOP;I<PW[X@^XBN4!1PXE6/2$;\ >MXA#I31J/,4:OIT@N
  507. XM/@9OF(NU!1+JC/2Q 2T8"SAD;XXI$L'HLH"R1"XB3QKQTY%&R?<9B\-7[(1"
  508. XMRS$JGCB4[.Y(3M!B(# M%C8[U@]_W0<D%Z@L3PU$D5CL?B/=$0OM;/S9@"NX
  509. XM1S[,9PQ&H3$6QC"KV!4MPYE0B1?(,*(:?\&T;,GH*8%RS*.XPN43YE3"H4%-
  510. XM*"H41L<5Z*R$E7<)@WXNW!G!6N@J=A2 & H!+_Q\D?UWT=H3?C19FLSH98\%
  511. XMMLZN3UR($04"D3VA'B@HTF.;<4+T0=*IM.KQUM[6_M!H$Q(I<D,]HQ#\8TL@
  512. XM4B8LB-&==%$>"<(-@(<O:.Y-K^?XLUB*U2@O>%$\G<9A%R%+D79,"I=!S(R,
  513. XM"SEC_*)Q"W_:AT3=1[;V%M,;:E@_2W$)W ") KB>'DB@,L>#?&V');D*<V/=
  514. XM&$..XSY\1WIG%3T+TF R=V1)@J;J 8M6A9B!2A>2-A5)-,(=]T_>\(]?Y>]-
  515. XM,1:0#ZU7A)1H15+C?,8) 1^+F'8\/*CA;T EQ4"";D 4*Y)BQ5_,M# HM%"3
  516. XM[A$0#^2#8325<+A45_/8?^^#/AR0_"BF!,0DB@F:LNAM"5DE".W?=G!J*JU 
  517. XM2*Q@--P ! !2(CC*.N0)EO(J0>2SDI5\*!NZ2F^F;&2>I7 JT3$K*#[E$S[T
  518. XMPR#4E)=$'2$PSM5M..1@3 LX@",:Q^'$%/Y&-;LCT=+B&$69D(R>$C,B03C 
  519. XM0>!!$L(^VDY<FI0$ 0<X#$0$ E$9E)0GZ'()X(!S9QQ/8V$(4(+Q)^$ A# N
  520. XMUT=&&$./8G>YRDVI'9$,A0 I?2)O+# <$!HXHW<A>XQIGRS,LO8!O0N:RH<\
  521. XM9('1+V@4# 7$>I-P]($Y*B!/Q?9 DL9<A>**ST%*P7/2TL(8-(3?A3_&D"<$
  522. XM&^Y+KQ%<J@)" @B**2AHX;T+@[>%8VR6C\$(9Q5&:D\>*$,R+W"V>D(F BIG
  523. XMPDI5J*R=Z??N8M2Q'K@FD-V2[9 #?D-.TQ.Z)T1IO*Z)&V?+=N(T7@Q"H ZR
  524. XM^1-ID%B83,WI)^4 ?Z+XM)._*!V*<6NZ3.[A,(\<:G@AF&JL[<TDDB='V[@R
  525. XM"RH$:<:YBAF\V,=5!)IJDG%&K,+08,;?06" 3_$O_LWK8#DYU;8\<DS!'T$0
  526. XM[+4S;^#GI#1:Y;V9G9!IZ@##O=M,+, ?O1F Q3JKI,@@592F:LFE,, &0(!L
  527. XM& *LHBYX1D.9*G#6>>"=OA,U. 3@>9:"'0KR2<>S=YZ%Y8GW6))6N%$<QUX@
  528. XM3Z9 /;73HD&&#[-814_?N92 IPO\/#BR.9VN[9FJF"=6$4_!);5\K?$Y'ZAG
  529. XM/^)W'HT9<2/D626 YTSR2ZU1R# \*( \RV=)2T:MX@6NSMZ /-MG3/@Q[*-K
  530. XM08F79A60)ZQBGO20>250XB(X]0+R+%3,TX,)*ZPB*2D/\EQ;S!,E)@TTTO)J
  531. XMSO[LG9."#Z301I8P[(K>U MI8 ZT@1SJ.U_"$V 5(PWQ\+:M<'9RZ Z= \G3
  532. XMA]*Y$&AWEEKO,*(\E'OR@1\*\?A=UUL-Z!**(M$(XA"H*!<:,QIGS]W0@:!%
  533. XM?6>A\J(VYJ.4"(9PNLJHH.JB#U2M;!6*<#'<BE5PHVOKA]Z<;O-4ZF 6U:%1
  534. XM-(;J49,X/#)("GRB@!2)C@PX^C6^QA?1*8#IBIV',KHJ&.G2L)XZ<BU2GC*:
  535. XMJJ@H"GHU7B,CJ =[449AE2>-*ELHEX6$PE)&SR@0O3=C)A]&!=C7&\IH'GVE
  536. XML*C>!)A5*I6DP!"X LFS2L"> '-C5 KR\Z7 =$DLI6&*U3Z*GNAUR#1YIBIF
  537. XM>L3TR[)9)M%T210J:CK#Q(<&.::_U'<^CZZ0:?H1Y+D;4S$E1--91$X5'#NB
  538. XM&#H!FH;3E=).<PS(H32JSGQ$TR#13O7$?.0(?!";SM,8"GO<IF#Q",!,"KR!
  539. XM.< &ZH ;( ,@H).JR&D#D"((BFD,"I6A.E2(:DKGGCMED;.3<$B!.M!#X:A8
  540. XMZ3;[<1]B4Y*Z)#IJ4H@^.*$_K-3DV:CT:#":([?A7 R.23E2D^<MW:-]))_\
  541. XMJ_O02UFJ;*"BQB0-T4<,I4^-JO*<HNICO,4+]C <%4!/E0A+28_V"P$#2764
  542. XM2#6JKE3!*#:Z41NGRE5])XQ4R^"9UK%*P=99%:3OY5,.&'S7*]PJ2V4:EC2@
  543. XM.*4G40^OJC#*JV7+[NB>KRI.:VK&:E*QZ7C45>9P5?%=7J4R9,*0S%1(X5(=
  544. XMQ:4D1).58S'2P6"A$D+URJQ'M8J$K+D@[#*K2R5'*]1%'%.6RDZAZC <'KH-
  545. XMFK+66_H_1YOP09//4IVR5#1G4L/#F-%MJ]5WIA:3.ACDWLI$A83U>/36@,(+
  546. XM+8=L-:.AU9WB$[:QXZ3%5>4(2O3BW:\%Y%6;JAD-J\$H*-(,Q[$5[*H9-:PZ
  547. XM3I/ICB"17&] 5IU[L"A'3@CA=567I!(EDP=R3QX5L\I2:>M0:A(D=)5BEYY:
  548. XM):@H4QDBK JB\5<0L$BA*H%K;1+T5>16JTI2,=ARO1RI+)U26 8K43$.L3P.
  549. XM.#*X#IKE6I.0F,\@K.]5K-@;./4&%VR66*ZY+W?MP)[J6!ULDR)*?'*F.D$8
  550. XMJR&G(!NUH[H5!+@D'ON/<HR$+:I"UI5BG#EH8M_)2%@X/35_+5?=P;5@!V&%
  551. XM2E,VO] M&$)+@4*4[:@8!Y*"#-TV8TGJ["2N?(1YL3TL6AZCK&&];WG()"%7
  552. XMMAAEX2J<;78B<A8]6<9*4M$%FE5P3<*8:-B>^MK^+.=J7CY#DF+4/JMD9QO(
  553. XM:"'==<%^JS^+IA("YPP)?!8$- LE>M]RT70Q>ENMI\H+3LLGE.K6Z:LD%;NB
  554. XM6<QG=W##FQ.U;U:%[H>_T8-"DD#HJ5:#U-+15X.@".L-4+*7BL'DF<U07C/M
  555. XM#7BSSI5Y^2/VLQ4&+$DUE)S6("'8@<)DQFA/Q0%/%8U^OBGC:F<J#BBP=$[<
  556. XM!9EO]4@6+0@(E]%VU^8.I^(?.NB&59?I%DHR"WKH;<-J,MEI7;7,GEOT2BYH
  557. XM(2BBKR0U!V3;_C9MB=E,S0'1E4D@5O%1VPXNN#USJ(QM0*5> 64#[GMU<7..
  558. XM;9"G^Z!B>NK<S*Y_\8MHBYM%6', >BT.Z1&J<");&V3Y LAM';,$;Y8$%3,%
  559. XMF(#OE U+8*C@4_UD/0SE5*FYOK-1Y=Q^=$B 3O'TN=("Z(Y3/C!TJ>I8R3%S
  560. XM NDR!Z6[MIJNP$L^08@%2-W& '135<Z];Y/P\\U2\]%UJ\3035EO*:QI7;)K
  561. XM<X4N8/DC4Z8XW(2M"Q2 ;M4%+KHEY$12LAL&A&NA&KK5CGD=6Q5%=P7"%.B[
  562. XMPL'L#I5>QBSV!4,HO"EA"HR!.L &X  => -R  00@3L0!N2 &= LU":409YH
  563. XMXN.DTA1  S/F)<">N?*/1,A6.[TS!F"0TX.('*O8,H&]DV.:>M3\U"RK*NZ5
  564. XM",)T[DFS>SDA7B_J%1#UDP]X!>ED$NEDSKN]Q]<F$%23D):L!R1-+83C]R[3
  565. XM3/.F6I+PTK[!U^" B@4D>;)O]"VTRM<DP <$I7)[W>\=KND7^8A70PIBS.^,
  566. XMV:9]R<*EJ1WX>Z>=ZIU!P,)G>)$WAWM/ JSR"CUB 8E2SVA_^]KV94?G)<8V
  567. XMX-*@>[_/X'J2U0[ZEI$:BX"+[Y7D*Q,8AI#3[P.+_F6_(,#'ES \U0X,2WF#
  568. XMBP!F!=C!C& 14I*.'O*+P8T* 8N0J77OW&\*WHC_MZ6)J:QB?,N(M@C"4I.)
  569. XM[)\)/&I',)\$C%U* W<P_$N"\<ER@<$I^-L&X<QAA6>+%#8(%7@_J1%W(X6W
  570. XM;WHZM&WG7S7@TR ;$/ TN3&JL@C?IN#K87=:/^*_Q_<TY& 3)_ ^[5.HA[A7
  571. XMB-!A.2+:$&H9/L"YS0O^B'XKA<]L^N41XO5!+#BR>WP1<7KB;PEA,-S@2FR&
  572. XM-?&E+!'?MQ);8CX15)%OM&K 3?@1\XF=QCA>6P.^ <'W\&6U_B.%M7 [13GY
  573. XM2DD XN,+;V^QNJTBJZ(!^U]?/+H2(Q9.'M-7P8@G;NC?*#$R7L%XCS4""12,
  574. XMC-MP@#.8O.%C^. RD'FC*]B,N3GF)BQ6KDL'R@ <0 ,EU;7JA%;8;5Z;@2''
  575. XM;V ,K(%TK$<_AN6BEE%!RAG>RRN/DZA)]<!'DJ_>7GX\CZ<G5/TWN,L?J6&R
  576. XM2Y#%Z7VM"^=%T #BALQ%7:MWP;/B W;07(HL40>%\"$=L$F%\)DI0)%=JK/0
  577. XM6W,T2V1?B@Q>^P_S4KF^ER+;V60RY\@O 6[(X+:.($5(>CQF&3SNQWC5P98(
  578. XM(TA_;W(\GL>5U,%BB?JW$74J"QC'=;<AI]BVQ3Z@RHYDR$<YHG):N6M]Z=% 
  579. XMSLI@UEDT7[PYD;.RDJ4-H&+DTHN5G)5IJZH@:3H2^5$!;IR.0ZC XU(QBG#,
  580. XMY6[\5&=H$T$0(D0NTV6#/$-?:@W=/'J9+O=/[DNJ !53G2I[6<B^!/?9,T*1
  581. XMJGASD=F!+BV<2BP%<^:]H'V)VQG+J,0<(C,(#4UN+I7UNLC<J)CG4EBX9Q*8
  582. XM1684BO?R#&<RQ(DY\\90O]Q9I_$RH0)OH V(@3!0!\X .@:SEB$_0=*-TRNP
  583. XM"W!V PQV,F<L_;N! )->[L9;^2[?A*8LJ,HM4* "?%G7,J8I0QE*PA'YSMTX
  584. XMX?*PF$N#PI*[!<\.F9$F$Y!C2#G;5I!*\+DBZU$C>V/HK^-@"WPF/W=D)A%Q
  585. XMQ2SEG+#YV:4RB:(B/D"5BLG/]C82?12#E(]+<S?FM^<"JVR3^MB<+;3O_*G5
  586. XM5^0R"=10WCPT&V&D#Q.,'IU5NG#@<TXV9HZS7Y2$4>JA&ZP>-0WU#\>LO0*"
  587. XMGAEL=$TDS0.JS"*.6Z,?[F$*TJ]0ZT+FS!N4]:A>F2[TQF9@MAK=D='/+&DA
  588. XM'(OBUNBPNC3XVJRJH_B92:/7G@5^VA4+4"$/FDG_5#(-AW"TDD[3#!:N<I:=
  589. XM=FJ5=)B6S"9UC5J/D3L?X/2+=:U\]4?18J@L$.!SC=6CRZM8BHFVZJ'[Q&:U
  590. XM(ON!A?Y8L&6H.S*?,*[W30T#605@J$^KV@@?,ZG\CE%#;5A?IUC(G7^3Y7+J
  591. XMS\QI+=P5(<,^3EK 9R5[BI:FPKJH/?K-)KD2UFWO@ZS6S9SV25C/X:3Y%@ES
  592. XMJ )'8 @DS]SP5#>+Q+C'6(*J225DK:R7Q J2#<[Z%[,CM20MJ/6R]A<.(5M_
  593. XMY*=<'%@)V/+6UGI?@M[7LH0>CD]K#.B:63?KMPO$RJ1:6CCQ^E*LK<V26Y*,
  594. XM..MM\#I9!U.!NZ[[=3AC$B_L6 ML98IBPC5P,8*!A^M(,($0KP$)MH8^G_+W
  595. XM-2<5$Z]A,>CE09CZ/7:WCDTA'';LD4'+,4:!S(!=K3\"S#+9)Z?.S3ESI;!;
  596. XM-K8M5)M%_R@>*F.4.F3-]JF;%F;W#'=VBDCDSY8(*&%=2P?_U6TDS\H&"NAZ
  597. XM250)4\(X/"U:*YY/FV(O["41-I3VXN/#(2]):>UJO22ZYKIV$9(D46:/;KVU
  598. XM6^K9_GG:;QRZ,I9]<['JVX9R8FDHPS:HW;:3\F9!>#/#8$I*.A2U'\?%]A06
  599. XM*BG K*-TM"4"O3#9CC93'+L$F!*B]IN!54/3U:1.+!$PITK4OAV-BNH]'K%0
  600. XMGW7#A(W:'.%BYT'$.%=6%-\FVR<R=%-?YH'HF(HU)-Q;^P;8XE(RN^7A$-I5
  601. XMG4T!1.U]J;J+ \1QKV]K#C5NAJFZG44K%)2OD6Y+!($;0ZG>268?@6<^5+;7
  602. XM?7-S .8&P/:FC2V9[(&[R;;)_=BV60Y]2O:%KD]"!@&];"YP6P:05+[%Z;-(
  603. XM5=9[V91+4*6\I;?[KM[J-P!?AE\KA\[SV+;?7=MA@S,\"V?W27ELWQ]A:@?P
  604. XM70@2U)>DQ"[M6SCLZP".C<[9[HA91YL\.6PBE*\04@QAV]6Z-%A8WKU@>'9A
  605. XM^+8R6U6W[TO1O._,",+::C.$:XYY[0)I7TR)4/7;)DR,I43U0'% @SC!NWU7
  606. XMC WN!C/N!AT_(=PI,/%<!2K*)"L)XMBA(A?Q:)0=E@\6UQ82//N]3; )POUW
  607. XM3@CC=6':> I3Q;UMPHD$X/^&5+4*8=1U,/C"=A(-FX5#9/5MB*7D 7?C6OP(
  608. XMOABFL+6"%)]IW^X5C><R#9A;Q*?_-I2JFY-8#^!C#5&X.(V6Z'O74@A/NSG8
  609. XM8OM6ET1<D/LCG2.06V;EON/S$F>+<@35CUB))8<4\S*3HY;"T(ZIFAVOUL9!
  610. XME6>SN)@@Q=JT7MC&07;O\KIQ"O7GT;X=%WN84X@CAI$..3#7Y>2"E5>7D?W,
  611. XMD[E8WD[)\!8>;83[L7,,0F1F$.26,]C<$,H?FK6*0V9N8I]R97T2ABSO-N=5
  612. XMW!T9;;IM@,NY:6B^$VN?X&N!?1)V-]5F%!%4*1*:GUTS7O8[A]%:14<VIU_.
  613. XMSJ?WQX;1H+HXJ"6&SF K"@ '=%RL)IEN<5X:[.L('T!B(0%?<()^&B0XH(.=
  614. XMV8Q\$_0W4\YKPQP1053-DF.'!DNU;VK=P+;)FX*N<P8;-C:X]N)B#PTC[7-V
  615. XM/B^_]QO:/R<R4$6+GWT:<( P=RJ>T0*K)8XML 6Q3Z= .RC!@3"Z+42HX AG
  616. XM(4:0@#^/5<;4'P?^9A5)K^>"P;U]P"V$>_W856S\"D]JKJS;@T=_YR4F<%L.
  617. XM^LW4@<995[$J@_XJ.F=>UW>"28\IBEA=(D!/7M4KQE^/*7B6TIP%J]77L>W'
  618. XM1NPS(V6;,:[!U9V",(?L+8XUW@QQ/L!\>LS)[$M9FW-U>2',Z9'B*8W,:*@G
  619. XMV5@^PM\PB99=BJ%^8P1N7ML% V","U><J2_'UIXGZ@;^6"G;NZV[UWG]SA06
  620. XM\HYPNI)[WQ/)T]NUDQE4"JI=NG];73Z4LD13=I8/O*HC7)/N=-T9L#25;7UN
  621. XM<O<7$RRL%5GGZ@?AKTN'=%>U]PE%GPEOO;?;FRQ!95HH81>R)E>^NQK@U^*B
  622. XM>WJ_ZU1;.A056%S@/;? G@Z!?,F2*D.J^1B>MU8HR3?!ZU3 .*)H-MU6*/G]
  623. XMG;N(SX/3V8\!W^E#W*>+B9DAUJ&%@U?6$^-]C_ 57RWO1O:@ZC#^-!CU2:1X
  624. XMDOI=*[8?WBZ,\.+DKQ4B] SR!'O&XZ>>6Q> ^,^&"F9;R2>(C#!JH,1_;RJ3
  625. XM5L3SP>W$&%54'7_R@.2BEUH!_)&.//?F%]1=RX<?4*TLWO69'Q]__5(+X&!D
  626. XM/#+CFY>R6M[6/,G(E;51_.T0\W;I)C"MBW;E<X(PCT&*I\OK*%,NO!_\B8SS
  627. XM=^9(PDX_CN+#QD7705D"8=9YL5WIA3F3T- !+L+YY#-_;(4YB/@\.>>B6?+.
  628. XMXM0_-H@@57OH3(1W&&\H3;UO#W(9VLT?\(K@U=_Y9MI.!C-"B?.*((-]/?,8
  629. XMX%X#(\WZB)H#1+BQ3Y!4'DZ8^0,.-'34"$^VER$GY >J=JX%]O@0\L:^A60)
  630. XM_#'9ESK=AO.ZW#)>2;&LZW?Z^."MX5[W=)FRX[//?>)U]0/^7IXMU?*S#?M?
  631. XM=W**1Z")-4N^$P#.M3<3 5_W>'CNO1-:WL$?S\6&"B:R<^\D3/H#(6/*1]2?
  632. XM;F_?'IC[ SE_Y*C=-WIE'1\<OK'7'?\21?7YD0\"XD,JIMH/A&DSB4XNV^-#
  633. XMB-\L72JD2TV.(\[C V_GW>[4-G_&_>2ZJ?U,".5!'U301K&V[(U#FL?YV\9?
  634. XM=%59W^^'^+I.)LDHJ>=-@C\QOK<[G=D0V7B>>WX!P*7KV8P899SAOYEY;?9%
  635. XM:;F>]NZ^L[#]9.(F.5?-^>_!?(.[4]3#M&CDN3?L5U_ 33-!2YK_/KB'^NRZ
  636. XMV& K3L_R;\<P!OK>7/$D1M--\#>B!%=PU32I0Q"\KRV0_N@.=,N'<C?^G*#W
  637. XM$XUQI\F.G.''[L _6NED;;CQ_?Y$EG[];=Y_#'IW][!X[A^Y3 _VQZBW=NRZ
  638. XM_TR"!%"DSV/_R^]OJ%XF!"F*7C%^+>O')S2%ZI_[;UOVW9S/T)&;OGX[!4<-
  639. XM^1LGXZ/CCF_Z.V*H+WQ6A2'-FTU?7<[^\D\Y[\8^P?MS4W:?.87_,4 2CF_Y
  640. XMWMOSVYAW(GP0F;EG^"97]:<340@V@-.2W5%[(L'LE\?<!(H(H?>S91#_BLGV
  641. XM3;U-;-#MQ_)E$")8]S?*90IJ5]=AR6U$4M1FL5_((;9;NM#M*6L;$?PE H8V
  642. XMJ@RI\MYQ;QL1$&:R^5-8T[90^,& &,+E1P->!J*)Z7;_;42YU@QX')D(S]/\
  643. XM1+<U"_#>"GASK K+3-<AVR&!2-]%UN5<".7(QH<"6@ALWQI3NN@$]]H#Z,Y1
  644. XM;7J"R.#AG#ALW4ZG+6P>0N &-(0L(S?@ :<MB 3KFL@0%W$:KPWC=@0V%:K<
  645. XMH( 1+6!QRO_G!C85>A_YL*<Y)D6?&<@OY(&%C5B@NZ5 E-X%:+'%@1"4F30O
  646. XM1"@4'4= TSU0GA:)!IM8)T=@?'"XR02P3.1A#?UW',$7B EZ1GS:IK?L<03%
  647. XMW@J(S@5*6=?$!P/&@) @V4$YZ6)IGQO8+ 2"BQR5]Q*E?KI@K[<"0EJ,P6!@
  648. XMR#V '('71XA@/6S5PJ<+%H"08/A&.>%VXAQC=")%@XF+IX!OG(":5DZ0!39.
  649. XMF4+]Q_T@@^>;$"@H 4%.F3-H!EH-GZ!;XMU5@  ;#&@U1('N8* 4\KV ;J#5
  650. XM4/8-6[%(,G'1/(&PF#(HH<T]8YV<\ #J;O.:#C!+9#,^X ,8+2&"64?J=#<<
  651. XM2T=@M"3_E6O60]O1L_E^ EM.@%8!?1CA95"8K&T.H68%$NI$HM1)E@N:@0+7
  652. XM-SC*_4N@8!EX 0I<]*#L-(2(;)P@##C>08)?S?"WJ.&#+.$;=1*61G\3U#70
  653. XM'8%=DTN(HD!)+MX/Z+T)A!W.9X2^P'TS(;HE!/)D#& F! SN="<2L6*R.0L6
  654. XMBE5F2_QW)](EJ+@]*W@3,[+LR7YEG[.@B)$5 ]+/Q@YF<O>-5E&UZ4S<F]7P
  655. XM5P%]SD+-TBS!?G2;U7 -?H7T3!710N5P@:%PX/51@;.1DW/"R84U@][71[QV
  656. XM\XE]E!=6!FUA5#.$2 ?-B24'BYE\F\5%LO; ,AX@9*@"TCA($9(A/XE^WAHL
  657. XM!@T2AH[4-*@@S$R081#(%S8.,P.MM4^(<XG<X28(38$MTLK7&I((EU\Y$=+9
  658. XM4X4@R^=>H8&WX9R4@*5$<N%T(!D&+GL>'<7W*(> !-OG)K /6E_J\^*! $N2
  659. XM*7CQ@'KR2B<C%X)NZQIE<%Z\,U1-_;8D97FAX9*7\@4J"@%OV/REATL>A4!K
  660. XM%1CG(1Q( ! 5E]U BVAAG$8EB9"7H20Y#B&680TZ',<Q/8&I+26FCYX8?=
  661. XM%Z 3I$B(AQ]I &0$'OB.+'C _5I)WFUH+]%)6F%RQQ4N1].A^D++Q82CG5RX
  662. XM'&6&6TH%1P:>"'*A>P4CFC. AECC'AY;9YUAAKU%8>J@<HAP^8;U8.@%W;E;
  663. XMK>'<1"0"4*4#(K/5Y85S$]*W+WP>U Q@R+UA6ZU@8."/N#/^8-,@SF%;?M9M
  664. XM*#LU&]X&:RBP@8G3X5?# #Y?-X-LAVW=?%HBJ=*U1#AL 47W)O:(\ %B!>B\
  665. XM(S\;MM6+B8F?$J!C'M)MV-;/%Q]267&"@&@0$HJ/0QY([IQ-K<^3>,!%2V'B
  666. XM9E$;,'"XP=1T)9X$AUMM0)0A5G8.H4@8.(JFQ9&D4@&%+-^W1=L!?1;,@&,_
  667. XM1"B6'/7']K6*RYP],R">B:<!TF?$O1/LQN#6)W9UZYH1)Q(&54[@KV@6"D1U
  668. XM0Y5'\QF+NN*Q1R28&S*AMQ8NU5B6(F[(W[F B^*5B!%X?;9"%6>\\7N$XCW!
  669. XM+884K]JS(QR>B=-!V1>,'!+(AUCS)385G>*V5S>@3OC&N\@P!8L0E%8Q:K0Q
  670. XMB.&5"#3(?TT>8.1<68#2(M"@]RT6UM=:=RLJ:_/2XU<M(ADB(5\1)!:,Y2"K
  671. XMJ(7P?P'6Q'@F@H#X8CMV+ZEQV>*DN!'UB'O<4&,Q_#5]XAO8,>87($5!: 6>
  672. XM6ZD;OKAUT$DS7W(H+7($!^,BESI=!ZS$EY@3-(O[W;^4_XA\-^-!(#.:,Z*3
  673. XMI!0KNE= (W]#:PEU?6*X!#"N-#P@*F,BIHKADKK8R+0QTL&F]R4R3)??DH%8
  674. XMX5.V1/W&O&5RVHF)4$00C6>B2.#UC3H!WU, DBQ[ M=IJ.-\<U>/DX@D"FP"
  675. XMEU4(].U#\R)P!,71;>.=WN<U*&(NT#%(.&((99_7(/<<'K3*A?&S-7L&V691
  676. XMF>2&EQG;J*PU>R:AY0BI/8C-5__&O7&.E]]UP)*,(5T(X4@8-(Y+7K" $@V.
  677. XMHZ-!<+@).M>?'$$5>FM=4Q[G.3(MP9.B^!UV37Z;^@"0*$J7EL:X.4YWZQJ[
  678. XME=6U*L8C"- U&8KJ0\XA2I49M"'A"!64CBU8L;$:;FJXHR_!]CU#LU&.M3 Z
  679. XMC[X$]M@#ZE<)DZ2XTQT$!M_?"'.%3CH!,T+1'01'F,DF%?D(+\1U-#G^6FS?
  680. XM@13285;%(N'X:_6(P)W/4#JL+W/;Z&@HE7T9E%U(^-&(A*/4N*Y!$]87^"+V
  681. XMC8X-XP2Y._@,XAY&4K_Q!5$>T#<AX"Z+QI?3+QYP(D$(.%0@&8C3)X$JXHY*
  682. XMH@:9AETYVZ-L)Q(<6QJDO1$LI&9)'-\H$EQ^$D-82/0%D%#;$C %,!>5@?C 
  683. XM'/I/P1:%P4((+U6 $:D8IAO%GET6HE!#V!WA4 6X 6- &$ '\$YOP!E0!I !
  684. XM+\'05=/ 86[AVN6YP0%G@!Q0!D!GT54%A!P905JD'# ']%U-0!K@!F!>FA?G
  685. XMY7EID'4A2%  EB[I1&-@!60!(, 0T 0$ 4'8TE!T#2>/F;1P!7B1W!@;\ :\
  686. XM 9J6>*8RX1HE08?6&%P!9< <0 <P:=D5?Q8^H$[DU81U!:0!;  9< (@4:-D
  687. XM&@ 'L %E !T0#>9='XZDQ&>LDFZ &U &R&-E@%;F$! !I($DH3L@5\R!%G '
  688. XMI 'R6![P2H( L>0L64L6; 9,H&1!5(] @1U !@@!Z1@"EJB<:G_8,J%-<I-<
  689. XMV_^E8,!.3DR+)2V,DW6;.1FS!0N!F3BY38I3G5@ %LZD)?(D.;ETP1[)%@J4
  690. XMOQ .[*1-L+8L7S39]7<A(#\!Y9_V0VU B!7V44?Q&0GE]B6=I&;M6#T44%9@
  691. XM[0K^^$#T.A<E-)8VXD[\#4 Y3SX.X9?;)$HU7"(E.8GG+5\FY9F6%9D/%R4B
  692. XMYCU%$Y,)0CE2(F)-A,JP7E55 24]%7\M&>(1 4<%I93"5?AU(70K29V3!5..
  693. XME%18,/(I32S""SO98"%@VX+DQ^O4/<R!5/F )6==#FY@%A076>4\F911E9K<
  694. XMO[2K$)7[)%HGX.@<@B-:.7W]3_O'Q,)1SI,<F%II$WY&6$)425?N8>Q(L!,7
  695. XM$97M(POF/?UN)-=2R4V:?"P8]C&$!$E$Y4"I/<HN@^1:9E@ZCU18S#:=C&_Y
  696. XMI//(5V8@8Q9*1E2Z7",8F2:Q['PI90N !"!>&X=\9I=D"SQC/FE:(E[HETVU
  697. XMX4%I]IAK>5J:41U9-?2201REY6W9I+U2$,XY-;),%>/D:RED=5BK6"QU'6PU
  698. XMQ>5MV5J=4D&CW8'PV)9]E^:#9DEV4P8H1ETZCP.7@@,^>!BJE7L&46Z3QJ5_
  699. XMZ%KA)AH(5IA/(@&:EAG&0I0\ )6_$U8* >PE1Q &F)/W(P91(LR5].6Y98W%
  700. X('F3/@/'BF ]/
  701. Xend
  702. END_OF_FILE
  703.   if test 34926 -ne `wc -c <'ephem.db.Z.uu.8'`; then
  704.     echo shar: \"'ephem.db.Z.uu.8'\" unpacked with wrong size!
  705.   fi
  706.   # end of 'ephem.db.Z.uu.8'
  707. fi
  708. if test -f 'map.h' -a "${1}" != "-c" ; then 
  709.   echo shar: Will not clobber existing file \"'map.h'\"
  710. else
  711.   echo shar: Extracting \"'map.h'\" \(352 characters\)
  712.   sed "s/^X//" >'map.h' <<'END_OF_FILE'
  713. X/* these two structs are used to form lists of polygon vertices and lists
  714. X *   of such lists. they are used to form maps.
  715. X */
  716. X
  717. Xtypedef struct {
  718. X    short lg, lt;    /* longitude and latitude */
  719. X} MCoord;
  720. X
  721. Xtypedef struct {
  722. X    char *rname;    /* region name */
  723. X    MCoord *mcp;    /* list of MCoords */
  724. X    int nmcp;        /* number of entries in mcp[] */
  725. X} MRegion;
  726. END_OF_FILE
  727.   if test 352 -ne `wc -c <'map.h'`; then
  728.     echo shar: \"'map.h'\" unpacked with wrong size!
  729.   fi
  730.   # end of 'map.h'
  731. fi
  732. if test -f 'objmenu.c' -a "${1}" != "-c" ; then 
  733.   echo shar: Will not clobber existing file \"'objmenu.c'\"
  734. else
  735.   echo shar: Extracting \"'objmenu.c'\" \(35048 characters\)
  736.   sed "s/^X//" >'objmenu.c' <<'END_OF_FILE'
  737. X/* code to manage the stuff on the "objx/y" menu.
  738. X */
  739. X
  740. X#include <stdio.h>
  741. X#include <ctype.h>
  742. X#include <math.h>
  743. X#if defined(__STDC__)
  744. X#include <stdlib.h>
  745. X#endif
  746. X#include <X11/Xlib.h>
  747. X#include <Xm/Xm.h>
  748. X#include <Xm/Form.h>
  749. X#include <Xm/Frame.h>
  750. X#include <Xm/Label.h>
  751. X#include <Xm/PushB.h>
  752. X#include <Xm/ToggleB.h>
  753. X#include <Xm/RowColumn.h>
  754. X#include <Xm/ScrollBar.h>
  755. X#include <Xm/SelectioB.h>
  756. X#include "astro.h"
  757. X#include "circum.h"
  758. X#include "preferences.h"
  759. X
  760. Xextern Widget toplevel_w;
  761. X
  762. X/* info about each field for a given type of object.
  763. X * N.B. the prompt field is used to decide whether a button should be created
  764. X *   to let this field be changed. Some prompts are determined at runtime
  765. X *   though based on preference. For these, we need at least a dummy.
  766. X *   the runtime setting is done in obj_change_cb().
  767. X * N.B. the altp entries must match the values of the PREF_XX enums.
  768. X */
  769. Xtypedef struct {
  770. X    int id;        /* field id */
  771. X    char *label;    /* label */
  772. X    char *prompt;    /* prompt if changeable, or 0 if it can't be */
  773. X    char *altp[3];    /* alternate prompts for fields effected by prefs */
  774. X    Widget pb_w;    /* PushButton if it can be changed, else Label */
  775. X} Field;
  776. X
  777. X#if defined(__STDC__) || defined(__cplusplus)
  778. X#define P_(s) s
  779. X#define    Const const
  780. X#else
  781. X#define P_(s) ()
  782. X#define    Const
  783. X#endif
  784. X
  785. Xextern Now *mm_get_now P_((void));
  786. Xextern Obj *db_basic P_((int id));
  787. Xextern Obj *db_next P_((Obj *op, HowNext how));
  788. Xextern char *obj_description P_((Obj *op));
  789. Xextern int db_n P_((void));
  790. Xextern int db_set_field P_((char bp[], int id, PrefDateFormat pref, Obj *op));
  791. Xextern int obj_cir P_((Now *np, Obj *op));
  792. Xextern int sv_id P_((Obj *op));
  793. Xextern void all_newobj P_((int dbidx));
  794. Xextern void db_setuserobj P_((int id, Obj *op));
  795. Xextern void f_double P_((Widget w, char *fmt, double f));
  796. Xextern void f_gangle P_((Widget w, double a));
  797. Xextern void f_ra P_((Widget w, double ra));
  798. Xextern void f_string P_((Widget w, char *s));
  799. Xextern void fs_date P_((char out[], double jd));
  800. Xextern void get_something P_((Widget w, char *resource, char *value));
  801. Xextern void get_xmstring P_((Widget w, char *resource, char **txtp));
  802. Xextern void hlp_dialog P_((char *tag, char *deflt[], int ndeflt));
  803. Xextern void mjd_year P_((double Mjd, double *yr));
  804. Xextern void prompt_map_cb P_((Widget w, XtPointer client, XtPointer call));
  805. Xextern void sv_point P_((Obj *op));
  806. Xextern void watch_cursor P_((int want));
  807. Xextern void xe_msg P_((char *msg, int app_modal));
  808. Xextern void zero_mem P_((char *loc, unsigned len));
  809. X
  810. Xvoid obj_manage P_((void));
  811. Xvoid obj_update P_((Now *np, int howmuch));
  812. Xvoid obj_set P_((Obj *op));
  813. Xvoid obj_newdb P_((int appended));
  814. Xvoid obj_cursor P_((Cursor c));
  815. Xstatic void init_working_obj P_((void));
  816. Xstatic void obj_unsetmenu P_((void));
  817. Xstatic void obj_set_from_db P_((Obj *op));
  818. Xstatic void obj_set_db P_((void));
  819. Xstatic void obj_setmenu P_((void));
  820. Xstatic void obj_setobjinfo P_((Field *fp, int nf));
  821. Xstatic void obj_create_form P_((void));
  822. Xstatic void obj_create_type_rc_form P_((Widget fw, Field *fp));
  823. Xstatic void obj_change_cb P_((Widget w, XtPointer client, XtPointer call));
  824. Xstatic void obj_ctl_cb P_((Widget w, XtPointer client, XtPointer call));
  825. Xstatic void do_help P_((void));
  826. Xstatic void obj_xy_cb P_((Widget w, XtPointer client, XtPointer call));
  827. Xstatic void obj_type_cb P_((Widget w, XtPointer client, XtPointer call));
  828. Xstatic void obj_select_cb P_((Widget w, XtPointer client, XtPointer call));
  829. Xstatic void obj_scroll_cb P_((Widget w, XtPointer client, XtPointer call));
  830. Xstatic int nl_cmp P_((Const void *nl1, Const void *nl2));
  831. Xstatic void new_namelist P_((void));
  832. Xstatic void load_namelist P_((void));
  833. Xstatic void obj_setnames P_((int nli));
  834. Xstatic void obj_set_a_button P_((Widget pbw, int whether));
  835. Xstatic void prompt_ok_cb P_((Widget w, XtPointer client, XtPointer call));
  836. Xstatic void prompt P_((Field *fp));
  837. Xstatic void obj_set_button P_((Widget w, int id));
  838. Xstatic void epoch_as_decimal P_((Widget w, double e));
  839. Xstatic void epoch_as_mdy P_((Widget w, double e));
  840. X
  841. X#undef P_
  842. X
  843. Xstatic Widget objform_w;    /* overall form Dialog */
  844. Xstatic Widget fldrc_w;        /* overall field info rc */
  845. Xstatic Widget scroll_w;        /* name scroll widget */
  846. X
  847. Xstatic Field fixed_fields[] = {
  848. X    {O_NAME,  "Name:",  "Object name:"},
  849. X    {F_CLASS, "Class:",    NULL},
  850. X    {F_RA,    "RA:",    "RA (h:m:s):"},
  851. X    {F_DEC,   "Dec:",    "Dec (d:m:s):"},
  852. X    {F_MAG,   "Mag:",    "Magnitude:"},
  853. X    {F_EPOCH, "Epoch:", "dummy", {
  854. X    "Reference epoch (UT Date as m/d.d/y or year.d):",
  855. X    "Reference epoch (UT Date as y/m/d.d or year.d):",
  856. X    "Reference epoch (UT Date as d.d/m/y or year.d):"
  857. X    }
  858. X    },
  859. X    {F_SIZE,  "Size:",  "Angular Size (arc secs):"},
  860. X};
  861. X
  862. Xstatic Field ellip_fields[] = {
  863. X    {O_NAME, "Name:", "Object name:"},
  864. X    {E_INC, "Inclination:", "Inclination (degs):"},
  865. X    {E_LAN, "Long of Asc Nod:", "Longitude of ascending node (degs):"},
  866. X    {E_AOP, "Arg of Peri:", "Argument of Perihelion (degs):"},
  867. X    {E_A, "Mean Dist:", "Mean distance (AU):"},
  868. X    {E_N, "Daily Motion:", "Daily motion (degs/day):"},
  869. X    {E_E, "Eccentricity:", "Eccentricty (<1):"},
  870. X    {E_M, "Mean Anomaly:", "Mean Anomaly (degs):"},
  871. X    {E_CEPOCH, "C Epoch:", "dummy", {
  872. X    "Epoch date (UT Date as m/d.d/y or year.d):",
  873. X    "Epoch date (UT Date as y/m/d.d or year.d):",
  874. X    "Epoch date (UT Date as d.d/m/y or year.d):"
  875. X    }
  876. X    },
  877. X    {E_EPOCH, "Epoch:", "dummy", {
  878. X    "Equinox year (UT Date as m/d.d/y or year.d):",
  879. X    "Equinox year (UT Date as y/m/d.d or year.d):",
  880. X    "Equinox year (UT Date as d.d/m/y or year.d):"
  881. X    }
  882. X    },
  883. X    {E_M1, "Mag coeff 1:", "Magnitude coefficient 1 (g#, H# or just #):"},
  884. X    {E_M2, "Mag coeff 2:", "Magnitude coefficient 2 (k#, G# or just #):"},
  885. X    {E_SIZE, "Size:", "Angular Size @ 1 AU (arc secs):"},
  886. X};
  887. X
  888. Xstatic Field hyper_fields[] = {
  889. X    {O_NAME, "Name:", "Object name:"},
  890. X    {H_EP, "Ep of Peri:", "dummy", {
  891. X    "Epoch of perihelion (UT Date as m/d.d/y or year.d):",
  892. X    "Epoch of perihelion (UT Date as y/m/d.d or year.d):",
  893. X    "Epoch of perihelion (UT Date as d.d/m/y or year.d):"
  894. X    }
  895. X    },
  896. X    {H_INC, "Inclination:", "Inclination (degs):"},
  897. X    {H_LAN, "Long of Asc Nod:", "Longitude of ascending node (degs):"},
  898. X    {H_AOP, "Arg of Peri:", "Argument of perihelion (degs):"},
  899. X    {H_E, "Eccentricity:", "Eccentricity (>1):"},
  900. X    {H_QP, "Peri Dist:", "Perihelion distance (AU):"},
  901. X    {H_EPOCH, "Epoch:", "dummy", {
  902. X    "Reference epoch (UT Date as m/d.d/y or year.d):",
  903. X    "Reference epoch (UT Date as y/m/d.d or year.d):",
  904. X    "Reference epoch (UT Date as d.d/m/y or year.d):"
  905. X    }
  906. X    },
  907. X    {H_G, "g:", "g, as in m = g + 5*log(delta) + 2.5*k*log(r):"},
  908. X    {H_K, "k:", "k, as in m = g + 5*log(delta) + 2.5*k*log(r):"},
  909. X    {H_SIZE, "Size:", "Angular Size @ 1 AU (arc secs):"},
  910. X};
  911. X
  912. Xstatic Field para_fields[] = {
  913. X    {O_NAME, "Name:", "Object name:"},
  914. X    {P_EP, "Ep of Peri:", "dummy", {
  915. X    "Epoch of perihelion (UT Date as m/d.d/y or year.d):",
  916. X    "Epoch of perihelion (UT Date as y/m/d.d or year.d):",
  917. X    "Epoch of perihelion (UT Date as d.d/m/y or year.d):"
  918. X    }
  919. X    },
  920. X    {P_INC, "Inclination:", "Inclination (degs):"},
  921. X    {P_AOP, "Arg of Peri:", "Argument of perihelion (degs):"},
  922. X    {P_QP, "Peri Dist:", "Perihelion distance (AU):"},
  923. X    {P_LAN, "Long of Asc Nod:", "Longitude of ascending node (degs):"},
  924. X    {P_EPOCH, "Epoch:", "dummy", {
  925. X    "Reference epoch (UT Date as m/d.d/y or year.d):",
  926. X    "Reference epoch (UT Date as y/m/d.d or year.d):",
  927. X    "Reference epoch (UT Date as d.d/m/y or year.d):"
  928. X    }
  929. X    },
  930. X    {P_G, "g:", "g, as in m = g + 5*log(delta) + 2.5*k*log(r):"},
  931. X    {P_K, "k:", "k, as in m = g + 5*log(delta) + 2.5*k*log(r):"},
  932. X    {P_SIZE, "Size:", "Angular Size @ 1 AU (arc secs):"},
  933. X};
  934. X
  935. Xtypedef struct {
  936. X    char *name;        /* name of type toggle button */
  937. X    Field *fp;        /* ptr to Fields array defining the info, if any */
  938. X    int nfields;    /* number of Fields in fp[] */
  939. X    Widget tb_w;    /* type toggle button widget */
  940. X    Widget frc_w;    /* Field rc widget */
  941. X} TypeInfo;
  942. X/* names of each type.
  943. X * N.B. must match order of enum in circum.h.
  944. X */
  945. Xstatic TypeInfo typeinfo[NOBJTYPES-1 /*No PLANET*/] = {
  946. X    {"Undefined",  NULL,       0},
  947. X    {"Fixed",       fixed_fields,  XtNumber(fixed_fields)},
  948. X    {"Elliptical", ellip_fields,  XtNumber(ellip_fields)},
  949. X    {"Hyperbolic", hyper_fields,  XtNumber(hyper_fields)},
  950. X    {"Parabolic",  para_fields,   XtNumber(para_fields)},
  951. X};
  952. X
  953. X/* working storage - set when Reset, made permanent in database with Apply
  954. X */
  955. Xstatic Obj objx;
  956. Xstatic Obj objy;
  957. Xstatic int objidx = OBJX;        /* which one is on-screen now */
  958. X#define    objp    (objidx == OBJY ? &objy : &objx)
  959. X
  960. X/* used to maintain mapping between object selection buttons and database
  961. X * objects. the userData of each object selection button is set to the index of
  962. X * a namelist[].
  963. X */
  964. Xtypedef struct {
  965. X    char *name;
  966. X    Obj *op;
  967. X} NameList;
  968. X
  969. X#define    NBTNS    20        /* number of buttons in name list */
  970. Xstatic NameList *namelist;    /* malloced array of (db_n()-NOBJ) NameLists*/
  971. Xstatic int nnamelist;        /* number of entries in namelist actually used*/
  972. Xstatic Widget namepb_w[NBTNS];    /* each name selection button */
  973. X
  974. X#define    SCROLLBAR_WIDTH        20
  975. X
  976. X/* bottom control panel buttons */
  977. Xenum {
  978. X    OK, APPLY, RESET, POINT, IDENT, CANCEL, HELP
  979. X};
  980. X
  981. X/* called by the main menu pick.
  982. X * create the main form, if this is the first time we've been called.
  983. X * then we toggle each time.
  984. X */
  985. Xvoid
  986. Xobj_manage()
  987. X{
  988. X    if (!objform_w) {
  989. X        obj_create_form();
  990. X        init_working_obj();
  991. X        new_namelist();
  992. X        obj_setmenu();
  993. X    }
  994. X    
  995. X    if (XtIsManaged(objform_w))
  996. X        XtUnmanageChild (objform_w);
  997. X    else
  998. X        XtManageChild (objform_w);
  999. X}
  1000. X
  1001. X/* all this is really good for is if the date format changes.
  1002. X */
  1003. X/* ARGSUSED */
  1004. Xvoid
  1005. Xobj_update (np, howmuch)
  1006. XNow *np;
  1007. Xint howmuch;
  1008. X{
  1009. X    obj_setmenu();
  1010. X}
  1011. X
  1012. X/* make the given arbitrary db object the current objectX/Y:
  1013. X * update our working copy, the real db object, all the stuff in the menu (if
  1014. X * we've been managed!) and inform all others.
  1015. X */
  1016. Xvoid
  1017. Xobj_set (op)
  1018. XObj *op;
  1019. X{
  1020. X    static char me[] = "obj_set()";
  1021. X
  1022. X    /* TODO: we don't support planets */
  1023. X    if (op->type == PLANET) {
  1024. X        printf ("%s: planets not supported\n", me);
  1025. X        exit (1);
  1026. X    }
  1027. X
  1028. X    obj_unsetmenu();
  1029. X    obj_set_from_db(op);    /* *objp <- *op */
  1030. X    obj_setmenu();
  1031. X    obj_set_db();        /* db_setuserobj(objp) */
  1032. X    all_newobj (objidx);
  1033. X}
  1034. X
  1035. X/* called when the db has changed (beyond NOBJ that is).
  1036. X * we don't care if it was appended or replaced because we need to resort and
  1037. X * rebuild the whole list either way.
  1038. X */
  1039. X/* ARGSUSED */
  1040. Xvoid
  1041. Xobj_newdb(appended)
  1042. Xint appended;
  1043. X{
  1044. X    if (!objform_w)
  1045. X        return;
  1046. X    new_namelist();
  1047. X}
  1048. X
  1049. X/* called to put up or remove the watch cursor.  */
  1050. Xvoid
  1051. Xobj_cursor (c)
  1052. XCursor c;
  1053. X{
  1054. X    Window win;
  1055. X
  1056. X    if (objform_w && (win = XtWindow(objform_w))) {
  1057. X        Display *dsp = XtDisplay(objform_w);
  1058. X        if (c)
  1059. X        XDefineCursor (dsp, win, c);
  1060. X        else
  1061. X        XUndefineCursor (dsp, win);
  1062. X    }
  1063. X}
  1064. X
  1065. X/* this was added to support backward compatability with the ability to
  1066. X * set OBJX and OBJY from the ephem.cfg file.
  1067. X */
  1068. Xstatic void
  1069. Xinit_working_obj()
  1070. X{
  1071. X    Obj *op;
  1072. X
  1073. X    op = db_basic(OBJX);
  1074. X    objx = *op;
  1075. X    op = db_basic(OBJY);
  1076. X    objy = *op;
  1077. X}
  1078. X
  1079. X/* turn off menu info about the current object.
  1080. X */
  1081. Xstatic void
  1082. Xobj_unsetmenu()
  1083. X{
  1084. X    if (!objform_w)
  1085. X        return;
  1086. X
  1087. X    XtUnmanageChild (typeinfo[objp->type].frc_w);
  1088. X    XmToggleButtonSetState (typeinfo[objp->type].tb_w, False, False);
  1089. X}
  1090. X
  1091. X/* copy the arbitrary database object, op, into the working copy of the
  1092. X * current object.
  1093. X * TODO: N.B. don't allow planets -- YET!
  1094. X */
  1095. Xstatic void
  1096. Xobj_set_from_db (op)
  1097. XObj *op;
  1098. X{
  1099. X    static char me[] = "obj_set_from_db()";
  1100. X
  1101. X    if (op->type == PLANET) {
  1102. X        printf ("%s: PLANET not supported\n", me);
  1103. X        exit (1);
  1104. X    }
  1105. X
  1106. X    /* *objp = *op; */
  1107. X    (void) memcpy ((char *)objp, (char *)op, sizeof(Obj));
  1108. X}
  1109. X
  1110. X/* make the current working object officially in the database.
  1111. X */
  1112. Xstatic void
  1113. Xobj_set_db ()
  1114. X{
  1115. X    db_setuserobj(objidx, objp);
  1116. X}
  1117. X
  1118. X/* set up the menu according to the current working object
  1119. X */
  1120. Xstatic void
  1121. Xobj_setmenu()
  1122. X{
  1123. X    TypeInfo *tp;
  1124. X    int type;
  1125. X
  1126. X    if (!objform_w)
  1127. X        return;
  1128. X
  1129. X    type = objp->type;
  1130. X    tp = &typeinfo[type];
  1131. X    XmToggleButtonSetState (tp->tb_w, True, False);
  1132. X    obj_setobjinfo(tp->fp, tp->nfields);
  1133. X    XtManageChild (tp->frc_w);
  1134. X}
  1135. X
  1136. X/* set each field in the rc for the current object.
  1137. X */
  1138. Xstatic void
  1139. Xobj_setobjinfo(fp, nf)
  1140. XField *fp;
  1141. Xint nf;
  1142. X{
  1143. X    while (--nf >= 0) {
  1144. X        obj_set_button (fp->pb_w, fp->id);
  1145. X        fp++;
  1146. X    }
  1147. X}
  1148. X
  1149. X/* called once to build the basic form.
  1150. X * N.B. we could not manage to connect the right side of NameF to the left
  1151. X * side of ScrollB without complaints from the Obj form. So, to make it look
  1152. X * attached, both NameF and ScrollB are attach to the right side of the form
  1153. X * but the NameF has an offset equal to the width of ScrollB. hey -- it works!
  1154. X */
  1155. Xstatic void
  1156. Xobj_create_form ()
  1157. X{
  1158. X    struct Btns {    /* to streamline creation of control buttons */
  1159. X        int id;
  1160. X        char *name;
  1161. X    };
  1162. X    static struct Btns ctlbtns[] = {
  1163. X        {OK, "Ok"},
  1164. X        {APPLY, "Apply"},
  1165. X        {RESET, "Reset"},
  1166. X        {CANCEL, "Close"},
  1167. X        {HELP, "Help"}
  1168. X    };
  1169. X    static struct Btns skybtns[] = {
  1170. X        {POINT, "Sky Point"},
  1171. X        {IDENT, "Sky Mark"},
  1172. X    };
  1173. X    Widget typrbf_w, typrb_w;
  1174. X    Widget fldrcf_w;
  1175. X    Widget xyrbf_w, xyrb_w;
  1176. X    Widget namerc_w, namercf_w;
  1177. X    Widget ctlfr_w, ctlf_w;
  1178. X    Widget skyfr_w, skyf_w;
  1179. X    Widget w;
  1180. X    Arg args[20];
  1181. X    int n;
  1182. X    int i;
  1183. X
  1184. X    /* create form */
  1185. X    n = 0;
  1186. X    XtSetArg (args[n], XmNautoUnmanage, False); n++;
  1187. X    XtSetArg (args[n], XmNdefaultPosition, False); n++;
  1188. X    XtSetArg (args[n], XmNallowOverlap, False); n++;
  1189. X    XtSetArg (args[n], XmNresizePolicy, XmRESIZE_NONE); n++;
  1190. X    objform_w = XmCreateFormDialog (toplevel_w, "Obj", args, n);
  1191. X
  1192. X    /* set some stuff in the parent DialogShell.
  1193. X     * setting XmNdialogTitle in the Form didn't work..
  1194. X     */
  1195. X    n = 0;
  1196. X    XtSetArg (args[n], XmNtitle, "xephem ObjX/Y Menu"); n++;
  1197. X    XtSetValues (XtParent(objform_w), args, n);
  1198. X
  1199. X    /* make the type control radio box in a frame.
  1200. X     * we save the widget ids so we can force the type to be what
  1201. X     * was selected from the database.
  1202. X     */
  1203. X
  1204. X    n = 0;
  1205. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1206. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1207. X    typrbf_w = XmCreateFrame (objform_w, "TypeRBFrame", args, n);
  1208. X    XtManageChild (typrbf_w);
  1209. X
  1210. X    n = 0;
  1211. X    XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
  1212. X    XtSetArg (args[n], XmNnumColumns, 2); n++;
  1213. X    typrb_w = XmCreateRadioBox (typrbf_w, "TypeRB", args, n);
  1214. X    XtManageChild (typrb_w);
  1215. X
  1216. X        /* N.B. we assume the enum ObjType form indeces into typeinfo[] */
  1217. X        for (i = UNDEFOBJ; i < PLANET; i++) {
  1218. X        TypeInfo *tp = &typeinfo[i];
  1219. X        n = 0;
  1220. X        w= tp->tb_w = XmCreateToggleButton (typrb_w, tp->name, args, n);
  1221. X        XtAddCallback (w, XmNvalueChangedCallback, obj_type_cb,
  1222. X                                (XtPointer)i);
  1223. X        XtManageChild (w);
  1224. X        }
  1225. X
  1226. X    /* make the overall field id rc in a frame.
  1227. X     * the field id rc is just used as a manager to hold the several
  1228. X     *   various type rcs; only one is ever on at once.
  1229. X     */
  1230. X    n = 0;
  1231. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
  1232. X    XtSetArg (args[n], XmNtopWidget, typrbf_w); n++;
  1233. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1234. X    fldrcf_w = XmCreateFrame (objform_w, "FldFrame", args, n);
  1235. X    XtManageChild (fldrcf_w);
  1236. X
  1237. X    n = 0;
  1238. X    fldrc_w = XmCreateRowColumn (fldrcf_w, "FldInfoRC", args, n);
  1239. X    XtManageChild (fldrc_w);
  1240. X
  1241. X        /* make one row/col for each possible Obj type.
  1242. X         * they are managed later according to which type is displayed.
  1243. X         * N.B. we assume the enum ObjType form indeces into typeinfo[]
  1244. X         */
  1245. X        for (i = UNDEFOBJ; i < PLANET; i++) {
  1246. X        TypeInfo *tp = &typeinfo[i];
  1247. X        Field *fp;
  1248. X
  1249. X        n = 0;
  1250. X        tp->frc_w = XmCreateRowColumn (fldrc_w, "TypeRC", args, n);
  1251. X
  1252. X        for (fp = tp->fp; fp < tp->fp + tp->nfields; fp++) {
  1253. X            Widget fw;
  1254. X            n = 0;
  1255. X            fw = XmCreateForm (tp->frc_w, "ObjFldForm", args, n);
  1256. X            obj_create_type_rc_form (fw, fp);
  1257. X            XtManageChild (fw);
  1258. X        }
  1259. X        }
  1260. X
  1261. X    /* make the x/y selection radio box in a frame */
  1262. X
  1263. X    n = 0;
  1264. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1265. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  1266. X    XtSetArg (args[n], XmNleftWidget, typrbf_w); n++;
  1267. X    XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
  1268. X    xyrbf_w = XmCreateFrame (objform_w, "XYRBF", args, n);
  1269. X    XtManageChild (xyrbf_w);
  1270. X
  1271. X    n = 0;
  1272. X    xyrb_w = XmCreateRadioBox (xyrbf_w, "XYRBox", args, n);
  1273. X    XtManageChild (xyrb_w);
  1274. X
  1275. X        n = 0;
  1276. X        XtSetArg (args[n], XmNset, True); n++; /* must match objidx init */
  1277. X        w = XmCreateToggleButton (xyrb_w, "ObjX", args, n);
  1278. X        XtAddCallback (w, XmNvalueChangedCallback, obj_xy_cb,
  1279. X                                (XtPointer)OBJX);
  1280. X        XtManageChild (w);
  1281. X
  1282. X        n = 0;
  1283. X        w = XmCreateToggleButton (xyrb_w, "ObjY", args, n);
  1284. X        XtAddCallback (w, XmNvalueChangedCallback, obj_xy_cb,
  1285. X                                (XtPointer)OBJY);
  1286. X        XtManageChild (w);
  1287. X
  1288. X    /* make a rc in a frame to hold the name buttons */
  1289. X
  1290. X    n = 0;
  1291. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1292. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  1293. X    XtSetArg (args[n], XmNleftWidget, xyrbf_w); n++;
  1294. X    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1295. X    XtSetArg (args[n], XmNrightOffset, SCROLLBAR_WIDTH); n++;
  1296. X    namercf_w = XmCreateFrame (objform_w, "NameF", args, n);
  1297. X    XtManageChild (namercf_w);
  1298. X
  1299. X    n = 0;
  1300. X    namerc_w = XmCreateRowColumn (namercf_w, "NameRC", args, n);
  1301. X    XtManageChild (namerc_w);
  1302. X
  1303. X        for (i = 0; i < NBTNS; i++) {
  1304. X        n = 0;
  1305. X        w = XmCreatePushButton (namerc_w, "NamePB", args, n);
  1306. X        XtAddCallback (w, XmNactivateCallback, obj_select_cb,
  1307. X                                (XtPointer)i);
  1308. X        XtManageChild (w);
  1309. X        namepb_w[i] = w;
  1310. X        }
  1311. X
  1312. X    /* make the scrollbar attached to the right edge */
  1313. X
  1314. X    n = 0;
  1315. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1316. X    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1317. X    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
  1318. X    XtSetArg (args[n], XmNbottomWidget, namercf_w); n++;
  1319. X    XtSetArg (args[n], XmNpageIncrement, NBTNS-1); n++;
  1320. X    XtSetArg (args[n], XmNwidth, SCROLLBAR_WIDTH); n++;
  1321. X    scroll_w = XmCreateScrollBar (objform_w, "ScrollB", args, n);
  1322. X    XtAddCallback (scroll_w, XmNdragCallback, obj_scroll_cb, 0);
  1323. X    XtAddCallback (scroll_w, XmNvalueChangedCallback, obj_scroll_cb, 0);
  1324. X    XtManageChild (scroll_w);
  1325. X
  1326. X    /* make a form in a frame to hold the bottom control buttons */
  1327. X
  1328. X    n = 0;
  1329. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
  1330. X    XtSetArg (args[n], XmNtopWidget, namercf_w); n++;
  1331. X    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1332. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1333. X    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1334. X    ctlfr_w = XmCreateFrame (objform_w, "CtlFrame", args, n);
  1335. X    XtManageChild (ctlfr_w);
  1336. X
  1337. X    n = 0;
  1338. X    XtSetArg (args[n], XmNfractionBase, 21); n++;
  1339. X    ctlf_w = XmCreateForm (ctlfr_w, "CtlForm", args, n);
  1340. X    XtManageChild (ctlf_w);
  1341. X
  1342. X        /* make the control buttons */
  1343. X
  1344. X        for (i = 0; i < XtNumber(ctlbtns); i++) {
  1345. X        n = 0;
  1346. X        XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1347. X        XtSetArg (args[n], XmNtopOffset, 10); n++;
  1348. X        XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1349. X        XtSetArg (args[n], XmNbottomOffset, 10); n++;
  1350. X        XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  1351. X        XtSetArg (args[n], XmNleftPosition, 1 + i*4); n++;
  1352. X        XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  1353. X        XtSetArg (args[n], XmNrightPosition, 4 + i*4); n++;
  1354. X        w = XmCreatePushButton (ctlf_w, ctlbtns[i].name, args, n);
  1355. X        XtAddCallback (w, XmNactivateCallback, obj_ctl_cb,
  1356. X                            (XtPointer)ctlbtns[i].id);
  1357. X        XtManageChild (w);
  1358. X        }
  1359. X
  1360. X    /* make a form in a frame for the sky point/id buttons */
  1361. X
  1362. X    n = 0;
  1363. X    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
  1364. X    XtSetArg (args[n], XmNbottomWidget, namercf_w); n++;
  1365. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1366. X    XtSetArg (args[n], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
  1367. X    XtSetArg (args[n], XmNrightWidget, xyrbf_w); n++;
  1368. X    skyfr_w = XmCreateFrame (objform_w, "SkyFr", args, n);
  1369. X    XtManageChild (skyfr_w);
  1370. X
  1371. X    n = 0;
  1372. X    XtSetArg (args[n], XmNfractionBase, 14); n++;
  1373. X    skyf_w = XmCreateForm (skyfr_w, "SkyF", args, n);
  1374. X    XtManageChild (skyf_w);
  1375. X
  1376. X        for (i = 0; i < XtNumber(skybtns); i++) {
  1377. X        n = 0;
  1378. X        XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1379. X        XtSetArg (args[n], XmNtopOffset, 10); n++;
  1380. X        XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1381. X        XtSetArg (args[n], XmNbottomOffset, 10); n++;
  1382. X        XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  1383. X        XtSetArg (args[n], XmNleftPosition, 2 + i*6); n++;
  1384. X        XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  1385. X        XtSetArg (args[n], XmNrightPosition, 6 + i*6); n++;
  1386. X        w = XmCreatePushButton (skyf_w, skybtns[i].name, args, n);
  1387. X        XtAddCallback (w, XmNactivateCallback, obj_ctl_cb,
  1388. X                            (XtPointer)skybtns[i].id);
  1389. X        XtManageChild (w);
  1390. X        }
  1391. X}
  1392. X
  1393. X/* given a Form widget and a Field, fill in the widgets in the Form.
  1394. X */
  1395. Xstatic void
  1396. Xobj_create_type_rc_form (fw, fp)
  1397. XWidget fw;
  1398. XField *fp;
  1399. X{
  1400. X    XmString str;
  1401. X    Widget w;
  1402. X    Arg args[20];
  1403. X    int n;
  1404. X
  1405. X    /* create a pushbutton if this field can be changed, else a label */
  1406. X
  1407. X    n = 0;
  1408. X    XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
  1409. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1410. X    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1411. X    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1412. X    if (fp->prompt) {
  1413. X        w = XmCreatePushButton (fw, "ObjFldPB", args, n);
  1414. X        XtAddCallback (w, XmNactivateCallback, obj_change_cb,
  1415. X                                (XtPointer)fp);
  1416. X    } else
  1417. X        w = XmCreateLabel (fw, "ObjFldInfo", args, n);
  1418. X    XtManageChild (w);
  1419. X    fp->pb_w = w;
  1420. X
  1421. X    /* make the label to the left of w */
  1422. X
  1423. X    str = XmStringCreate (fp->label, XmSTRING_DEFAULT_CHARSET);
  1424. X    n = 0;
  1425. X    XtSetArg (args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
  1426. X    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1427. X    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1428. X    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1429. X    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
  1430. X    XtSetArg (args[n], XmNrightWidget, w); n++;
  1431. X    XtSetArg (args[n], XmNlabelString, str); n++;
  1432. X    w = XmCreateLabel (fw, "ObjFldLabel", args, n);
  1433. X    XtManageChild (w);
  1434. X    XmStringFree(str);
  1435. X}
  1436. X
  1437. X/* callback from any of the obj field info buttons being activated.
  1438. X * client is the Field pointer for this item.
  1439. X * N.B. some fields' prompts are set from preferences.
  1440. X */
  1441. X/* ARGSUSED */
  1442. Xstatic void
  1443. Xobj_change_cb (w, client, call)
  1444. XWidget w;
  1445. XXtPointer client;
  1446. XXtPointer call;
  1447. X{
  1448. X    Field *fp = (Field *)client;
  1449. X
  1450. X    switch (fp->id) {
  1451. X    case F_EPOCH: 
  1452. X    case E_CEPOCH:
  1453. X    case E_EPOCH:
  1454. X    case H_EP:
  1455. X    case H_EPOCH:
  1456. X    case P_EP:
  1457. X    case P_EPOCH:
  1458. X        fp->prompt = fp->altp[pref_get(PREF_DATE_FORMAT)];
  1459. X        break;
  1460. X    }
  1461. X
  1462. X    prompt (fp);
  1463. X}
  1464. X
  1465. X/* callback from any of the botton control buttons.
  1466. X * id is in client.
  1467. X */
  1468. X/* ARGSUSED */
  1469. Xstatic void
  1470. Xobj_ctl_cb (w, client, call)
  1471. XWidget w;
  1472. XXtPointer client;
  1473. XXtPointer call;
  1474. X{
  1475. X    int id = (int) client;
  1476. X
  1477. X    switch (id) {
  1478. X    case OK:
  1479. X        obj_set_db();
  1480. X        all_newobj(objidx);
  1481. X        XtUnmanageChild (objform_w);
  1482. X        break;
  1483. X    case APPLY:
  1484. X        obj_set_db();
  1485. X        all_newobj(objidx);
  1486. X        break;
  1487. X    case RESET:
  1488. X        obj_unsetmenu();
  1489. X        obj_set_from_db(db_basic(objidx));
  1490. X        obj_setmenu();
  1491. X        break;
  1492. X    case POINT:
  1493. X        if (objp->type != UNDEFOBJ) {
  1494. X        if (obj_cir (mm_get_now(), objp) < 0) {
  1495. X            printf ("obj_ctl_cb: can't get obj_cir for POINT\n");
  1496. X            exit (1);
  1497. X        }
  1498. X        sv_point (objp);
  1499. X        }
  1500. X        break;
  1501. X    case IDENT:
  1502. X        if (objp->type != UNDEFOBJ) {
  1503. X        if (obj_cir (mm_get_now(), objp) < 0) {
  1504. X            printf ("obj_ctl_cb: can't get obj_cir for IDENT\n");
  1505. X            exit (1);
  1506. X        }
  1507. X        switch (sv_id (objp)) {
  1508. X        case 0:
  1509. X            break;
  1510. X        case -1: xe_msg ("Object is below the horizon", 1);
  1511. X            break;
  1512. X        case -2: xe_msg ("Object is outside the fiew of view", 1);
  1513. X            break;
  1514. X        default:
  1515. X            printf ("bogus return from sv_id\n");
  1516. X            exit(1);
  1517. X        }
  1518. X        }
  1519. X        break;
  1520. X    case CANCEL:
  1521. X        XtUnmanageChild (objform_w);
  1522. X        break;
  1523. X    case HELP:
  1524. X        do_help();
  1525. X        break;
  1526. X    }
  1527. X}
  1528. X
  1529. Xstatic void
  1530. Xdo_help()
  1531. X{
  1532. X    static char *msg[] = {
  1533. X"Object X and Object Y may be set to any of four types of objects: fixed or in",
  1534. X"heliocentric elliptical, hyperbolic or parabolic orbits. Give the location or",
  1535. X"orbital elements as necessary.",
  1536. X"",
  1537. X"The object may also be loaded from the in-memory database. This database may",
  1538. X"be loaded from a file using the Database pulldown on the main menu.",
  1539. X};
  1540. X
  1541. X    switch (objp->type) {
  1542. X    case FIXED:
  1543. X        hlp_dialog ("Fixed Object", msg, sizeof(msg)/sizeof(msg[0]));
  1544. X        break;
  1545. X    case ELLIPTICAL:
  1546. X        hlp_dialog ("Elliptical Object", msg, sizeof(msg)/sizeof(msg[0]));
  1547. X        break;
  1548. X    case HYPERBOLIC:
  1549. X        hlp_dialog ("Hyperbolic Object", msg, sizeof(msg)/sizeof(msg[0]));
  1550. X        break;
  1551. X    case PARABOLIC:
  1552. X        hlp_dialog ("Parabolic Object", msg, sizeof(msg)/sizeof(msg[0]));
  1553. X        break;
  1554. X    default:
  1555. X        hlp_dialog ("Object", msg, sizeof(msg)/sizeof(msg[0]));
  1556. X        break;
  1557. X    }
  1558. X}
  1559. X
  1560. X/* callback for which object (x or y) toggle.
  1561. X * client is either OBJX or OBJY.
  1562. X */
  1563. X/* ARGSUSED */
  1564. Xstatic void
  1565. Xobj_xy_cb (w, client, call)
  1566. XWidget w;
  1567. XXtPointer client;
  1568. XXtPointer call;
  1569. X{
  1570. X    XmToggleButtonCallbackStruct *t = (XmToggleButtonCallbackStruct *) call;
  1571. X    int xy = (int)client;
  1572. X
  1573. X    if (t->set && xy != objidx) {
  1574. X        obj_unsetmenu();
  1575. X        objidx = xy;
  1576. X        obj_setmenu();
  1577. X    }
  1578. X}
  1579. X
  1580. X/* callback for what type of object toggles.
  1581. X * client data is the Obj.type code.
  1582. X */
  1583. X/* ARGSUSED */
  1584. Xstatic void
  1585. Xobj_type_cb (w, client, call)
  1586. XWidget w;
  1587. XXtPointer client;
  1588. XXtPointer call;
  1589. X{
  1590. X    XmToggleButtonCallbackStruct *t = (XmToggleButtonCallbackStruct *) call;
  1591. X    int type = (int)client;
  1592. X
  1593. X    if (t->set && objp->type != type) {
  1594. X        obj_unsetmenu();
  1595. X        zero_mem ((char *)objp, sizeof(Obj));
  1596. X        objp->type = (Objtype_t) type;
  1597. X        obj_setmenu();
  1598. X    }
  1599. X}
  1600. X
  1601. X/* callback when an item is selected from the list.
  1602. X * client is the button number, userData is the namelist index.
  1603. X */
  1604. X/* ARGSUSED */
  1605. Xstatic void
  1606. Xobj_select_cb (w, client, call)
  1607. XWidget w;
  1608. XXtPointer client;
  1609. XXtPointer call;
  1610. X{
  1611. X    static char me[] = "obj_select_cb()";
  1612. X    int nameidx;
  1613. X    Obj *op;
  1614. X
  1615. X    get_something (w, XmNuserData, (char *)&nameidx);
  1616. X    if (nameidx < 0)
  1617. X        return;    /* marked as unused */
  1618. X    if (nameidx >= nnamelist) {
  1619. X        printf ("%s: nameidx=%d but nnamelist=%d\n", me, nameidx,
  1620. X                                nnamelist);
  1621. X        exit (1);
  1622. X    }
  1623. X
  1624. X    op = namelist[nameidx].op;
  1625. X    obj_unsetmenu();
  1626. X    obj_set_from_db(op);
  1627. X    obj_setmenu();
  1628. X}
  1629. X
  1630. X/* callback when the scroll bar is moved.
  1631. X * fill name buttons with next NB names starting with namelist[sp->value].
  1632. X */
  1633. X/* ARGSUSED */
  1634. Xstatic void
  1635. Xobj_scroll_cb (w, client, call)
  1636. XWidget w;
  1637. XXtPointer client;
  1638. XXtPointer call;
  1639. X{
  1640. X    XmScrollBarCallbackStruct *sp = (XmScrollBarCallbackStruct *)call;
  1641. X    obj_setnames (sp->value);
  1642. X}
  1643. X
  1644. X/* compare two NameList entries as required qsort(3).
  1645. X * take care to sort numerics by value.
  1646. X */
  1647. Xstatic int
  1648. Xnl_cmp (nl1, nl2)
  1649. XConst void *nl1, *nl2;
  1650. X{
  1651. X    char *s1 = ((NameList *)nl1)->name;
  1652. X    char *s2 = ((NameList *)nl2)->name;
  1653. X    int p;
  1654. X    int q;
  1655. X
  1656. X    for (;;) {
  1657. X        p = *s1++;
  1658. X        q = *s2++;
  1659. X        if (isdigit(p) && isdigit(q)) {
  1660. X        int np = 0, nq = 0;
  1661. X        do {
  1662. X            np = np*10 + p - '0';
  1663. X            p = *s1;
  1664. X        } while (isdigit(p) && s1++);
  1665. X        do {
  1666. X            nq = nq*10 + q - '0';
  1667. X            q = *s2;
  1668. X        } while (isdigit(q) && s2++);
  1669. X        if (np != nq)
  1670. X            return (np - nq);
  1671. X        }
  1672. X        if (!p || !q || p != q)
  1673. X        return (p - q);
  1674. X    }
  1675. X}
  1676. X
  1677. X/* set up namelist for a new list of db objects.
  1678. X */
  1679. Xstatic void
  1680. Xnew_namelist()
  1681. X{
  1682. X    Arg args[20];
  1683. X    int n;
  1684. X
  1685. X    watch_cursor(1);
  1686. X
  1687. X    load_namelist();
  1688. X
  1689. X    if (nnamelist > 0) {
  1690. X        int slider = nnamelist < NBTNS ? nnamelist : NBTNS;
  1691. X        n = 0;
  1692. X        XtSetArg (args[n], XmNmaximum, nnamelist); n++;
  1693. X        XtSetArg (args[n], XmNsliderSize, slider); n++;
  1694. X        XtSetArg (args[n], XmNvalue, 0); n++;
  1695. X        XtSetValues (scroll_w, args, n);
  1696. X        XtManageChild(scroll_w);
  1697. X    } else
  1698. X        XtUnmanageChild(scroll_w);
  1699. X
  1700. X    obj_setnames(0);
  1701. X
  1702. X    watch_cursor(0);
  1703. X}
  1704. X
  1705. X/* make the master list of db name objects in sorted order.
  1706. X */
  1707. Xstatic void
  1708. Xload_namelist ()
  1709. X{
  1710. X    NameList *nlp;
  1711. X    Obj *op;
  1712. X    int nobj;
  1713. X
  1714. X    if (namelist) {
  1715. X        XtFree ((char *)namelist);
  1716. X        namelist = NULL;
  1717. X        nnamelist = 0;
  1718. X    }
  1719. X
  1720. X    nobj = db_n() - NOBJ;
  1721. X    if (nobj <= 0)
  1722. X        return;
  1723. X
  1724. X    nlp = namelist = (NameList *) XtMalloc (nobj*sizeof(NameList));
  1725. X
  1726. X    /* don't put any of the basic objects on the list */
  1727. X    for (op= db_next(NULL, OBJS_ALLBUT_BASIC); op;
  1728. X                    op= db_next(op, OBJS_ALLBUT_BASIC)) {
  1729. X        nlp->name = op->o_name;
  1730. X        nlp->op = op;
  1731. X        nlp++;
  1732. X    }
  1733. X
  1734. X    nnamelist = nlp - namelist;
  1735. X
  1736. X    qsort ((char *)namelist, nnamelist, sizeof(NameList), nl_cmp);
  1737. X}
  1738. X
  1739. X/* fill the name buttons with the next NBTNS names starting at index nli 
  1740. X * within namelist[];
  1741. X */
  1742. Xstatic void
  1743. Xobj_setnames(nli)
  1744. Xint nli;
  1745. X{
  1746. X    XmString str;
  1747. X    Arg args[20];
  1748. X    char *namep;
  1749. X    int bi;        /* namepb_w[] index */
  1750. X    int nb;        /* number of good buttons to set */
  1751. X
  1752. X    nb = (nnamelist - nli < NBTNS) ? nnamelist - nli : NBTNS;
  1753. X    for (bi = 0; bi < NBTNS; bi++) {
  1754. X        int n = 0;
  1755. X        if (bi < nb) {
  1756. X        namep = namelist[nli].name;
  1757. X        XtSetArg (args[n], XmNuserData, nli); n++;
  1758. X        obj_set_a_button(namepb_w[bi], 1);
  1759. X        nli++;
  1760. X        } else {
  1761. X        namep = " ";
  1762. X        XtSetArg (args[n], XmNuserData, -1); n++;
  1763. X        obj_set_a_button(namepb_w[bi], 0);
  1764. X        }
  1765. X        str = XmStringCreate (namep, XmSTRING_DEFAULT_CHARSET);
  1766. X        XtSetArg (args[n], XmNlabelString, str); n++;
  1767. X        XtSetValues (namepb_w[bi], args, n);
  1768. X        XmStringFree (str);
  1769. X    }
  1770. X}
  1771. X
  1772. X/* set whether the given button looks like a label.
  1773. X */
  1774. Xstatic void
  1775. Xobj_set_a_button(pbw, whether)
  1776. XWidget pbw;
  1777. Xint whether;
  1778. X{
  1779. X    static Arg look_like_button[] = {
  1780. X        {XmNtopShadowColor, (XtArgVal) 0},
  1781. X        {XmNbottomShadowColor, (XtArgVal) 0},
  1782. X        {XmNfillOnArm, (XtArgVal) True},
  1783. X    };
  1784. X    static Arg look_like_label[] = {
  1785. X        {XmNtopShadowColor, (XtArgVal) 0},
  1786. X        {XmNbottomShadowColor, (XtArgVal) 0},
  1787. X        {XmNfillOnArm, (XtArgVal) False},
  1788. X    };
  1789. X    static int called;
  1790. X    Arg *ap;
  1791. X    int na;
  1792. X
  1793. X    if (!called) {
  1794. X        /* get baseline label and shadow appearances.
  1795. X         */
  1796. X        Pixel topshad, botshad, bgcol;
  1797. X        Arg args[20];
  1798. X        Widget tmpw;
  1799. X        int n;
  1800. X
  1801. X        n = 0;
  1802. X        tmpw = XmCreatePushButton (objform_w, "tmp", args, n);
  1803. X
  1804. X        n = 0;
  1805. X        XtSetArg (args[n], XmNtopShadowColor, &topshad); n++;
  1806. X        XtSetArg (args[n], XmNbottomShadowColor, &botshad); n++;
  1807. X        XtSetArg (args[n], XmNbackground, &bgcol); n++;
  1808. X        XtGetValues (tmpw, args, n);
  1809. X
  1810. X        look_like_button[0].value = topshad;
  1811. X        look_like_button[1].value = botshad;
  1812. X        look_like_label[0].value = bgcol;
  1813. X        look_like_label[1].value = bgcol;
  1814. X
  1815. X        XtDestroyWidget (tmpw);
  1816. X         
  1817. X        called = 1;
  1818. X    }
  1819. X
  1820. X    if (whether) {
  1821. X        ap = look_like_button;
  1822. X        na = XtNumber(look_like_button);
  1823. X    } else {
  1824. X        ap = look_like_label;
  1825. X        na = XtNumber(look_like_label);
  1826. X    }
  1827. X
  1828. X    XtSetValues (pbw, ap, na);
  1829. X}
  1830. X
  1831. X/* user typed OK to a prompt for fp. get his new value and use it */
  1832. X/* ARGSUSED */
  1833. Xstatic void
  1834. Xprompt_ok_cb (w, client, call)
  1835. XWidget w;
  1836. XXtPointer client;
  1837. XXtPointer call;
  1838. X{
  1839. X    Field *fp = (Field *)client;
  1840. X    char *text;
  1841. X    
  1842. X    get_xmstring(w, XmNtextString, &text);
  1843. X    (void) db_set_field (text, fp->id,
  1844. X                (PrefDateFormat) pref_get(PREF_DATE_FORMAT), objp);
  1845. X    obj_set_button (fp->pb_w, fp->id);
  1846. X    XtDestroyWidget (w);
  1847. X    XtFree (text);
  1848. X}
  1849. X
  1850. X/* put up a prompt dialog near the cursor to ask about fp.
  1851. X * make it app modal since we don't want the object type to change under us.
  1852. X */
  1853. Xstatic void
  1854. Xprompt (fp)
  1855. XField *fp;
  1856. X{
  1857. X    Widget w, dw;
  1858. X    XmString str, title;
  1859. X    Arg args[20];
  1860. X    int n;
  1861. X    
  1862. X    str = XmStringCreate (fp->prompt, XmSTRING_DEFAULT_CHARSET);
  1863. X    title = XmStringCreate("xephem Object Prompt",XmSTRING_DEFAULT_CHARSET);
  1864. X    n = 0;
  1865. X    XtSetArg(args[n], XmNselectionLabelString, str);  n++;
  1866. X    XtSetArg(args[n], XmNdefaultPosition, False);  n++;
  1867. X    XtSetArg(args[n], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL);  n++;
  1868. X    XtSetArg(args[n], XmNdialogTitle, title);  n++;
  1869. X    dw = XmCreatePromptDialog(toplevel_w, "ObjPrompt", args, n);
  1870. X    XtAddCallback (dw, XmNmapCallback, prompt_map_cb, NULL);
  1871. X    XmStringFree (str);
  1872. X    XmStringFree (title);
  1873. X
  1874. X    w = XmSelectionBoxGetChild (dw, XmDIALOG_HELP_BUTTON);
  1875. X    XtUnmanageChild (w);
  1876. X
  1877. X    XtAddCallback (dw, XmNokCallback, prompt_ok_cb, (XtPointer)fp);
  1878. X    XtManageChild (dw);
  1879. X
  1880. X#if XmVersion >= 1001
  1881. X    w = XmSelectionBoxGetChild (dw, XmDIALOG_TEXT);
  1882. X    XmProcessTraversal (w, XmTRAVERSE_CURRENT);
  1883. X    XmProcessTraversal (w, XmTRAVERSE_CURRENT); /* yes, twice!! */
  1884. X#endif
  1885. X}
  1886. X
  1887. X/* set the label for the given label widget according to the info in the
  1888. X * given field of the current working object.
  1889. X */
  1890. Xstatic void
  1891. Xobj_set_button (w, id)
  1892. XWidget w;
  1893. Xint id;
  1894. X{
  1895. X    static char me[] = "obj_set_button";
  1896. X
  1897. X    switch (id) {
  1898. X    case O_NAME:
  1899. X        f_string (w, objp->o_name);
  1900. X        break;
  1901. X    case F_CLASS:
  1902. X        f_string (w, obj_description(objp));
  1903. X        break;
  1904. X    case F_RA:
  1905. X        f_ra (w, objp->f_RA);
  1906. X        break;
  1907. X    case F_DEC:
  1908. X        f_gangle (w, objp->f_dec);
  1909. X        break;
  1910. X    case F_MAG:
  1911. X        f_double (w, "%g", objp->f_mag/MAGSCALE);
  1912. X        break;
  1913. X    case F_EPOCH:
  1914. X        epoch_as_decimal (w, objp->f_epoch);
  1915. X        break;
  1916. X    case F_SIZE:
  1917. X        f_double (w, "%g", (double)objp->f_size);
  1918. X        break;
  1919. X
  1920. X    case E_INC:
  1921. X        f_double (w, "%g", objp->e_inc);
  1922. X        break;
  1923. X    case E_LAN:
  1924. X        f_double (w, "%g", objp->e_Om);
  1925. X        break;
  1926. X    case E_AOP:
  1927. X        f_double (w, "%g", objp->e_om);
  1928. X        break;
  1929. X    case E_A:
  1930. X        f_double (w, "%g", objp->e_a);
  1931. X        break;
  1932. X    case E_N:
  1933. X        f_double (w, "%g", objp->e_n);
  1934. X        break;
  1935. X    case E_E:
  1936. X        f_double (w, "%g", objp->e_e);
  1937. X        break;
  1938. X    case E_M:
  1939. X        f_double (w, "%g", objp->e_M);
  1940. X        break;
  1941. X    case E_CEPOCH:
  1942. X        epoch_as_mdy (w, objp->e_cepoch);
  1943. X        break;
  1944. X    case E_EPOCH:
  1945. X        epoch_as_decimal (w, objp->e_epoch);
  1946. X        break;
  1947. X    case E_M1: {
  1948. X        char buf[64];
  1949. X        (void) sprintf (buf, "%c%g",
  1950. X                objp->e_mag.whichm == MAG_HG ? 'H' : 'g',
  1951. X                objp->e_mag.m1);
  1952. X        f_string (w, buf);
  1953. X        break;
  1954. X    }
  1955. X    case E_M2: {
  1956. X        char buf[64];
  1957. X        (void) sprintf (buf, "%c%g",
  1958. X                objp->e_mag.whichm == MAG_HG ? 'G' : 'k',
  1959. X                objp->e_mag.m2);
  1960. X        f_string (w, buf);
  1961. X        break;
  1962. X    }
  1963. X    case E_SIZE:
  1964. X        f_double (w, "%g", objp->e_size);
  1965. X        break;
  1966. X
  1967. X    case H_EP:
  1968. X        epoch_as_mdy (w, objp->h_ep);
  1969. X        break;
  1970. X    case H_INC:
  1971. X        f_double (w, "%g", objp->h_inc);
  1972. X        break;
  1973. X    case H_LAN:
  1974. X        f_double (w, "%g", objp->h_Om);
  1975. X        break;
  1976. X    case H_AOP:
  1977. X        f_double (w, "%g", objp->h_om);
  1978. X        break;
  1979. X    case H_E:
  1980. X        f_double (w, "%g", objp->h_e);
  1981. X        break;
  1982. X    case H_QP:
  1983. X        f_double (w, "%g", objp->h_qp);
  1984. X        break;
  1985. X    case H_EPOCH:
  1986. X        epoch_as_decimal (w, objp->h_epoch);
  1987. X        break;
  1988. X    case H_G:
  1989. X        f_double (w, "%g", objp->h_g);
  1990. X        break;
  1991. X    case H_K:
  1992. X        f_double (w, "%g", objp->h_k);
  1993. X        break;
  1994. X    case H_SIZE:
  1995. X        f_double (w, "%g", objp->h_size);
  1996. X        break;
  1997. X
  1998. X    case P_EP:
  1999. X        epoch_as_mdy (w, objp->p_ep);
  2000. X        break;
  2001. X    case P_INC:
  2002. X        f_double (w, "%g", objp->p_inc);
  2003. X        break;
  2004. X    case P_AOP:
  2005. X        f_double (w, "%g", objp->p_om);
  2006. X        break;
  2007. X    case P_QP:
  2008. X        f_double (w, "%g", objp->p_qp);
  2009. X        break;
  2010. X    case P_LAN:
  2011. X        f_double (w, "%g", objp->p_Om);
  2012. X        break;
  2013. X    case P_EPOCH:
  2014. X        epoch_as_decimal (w, objp->p_epoch);
  2015. X        break;
  2016. X    case P_G:
  2017. X        f_double (w, "%g", objp->p_g);
  2018. X        break;
  2019. X    case P_K:
  2020. X        f_double (w, "%g", objp->p_k);
  2021. X        break;
  2022. X    case P_SIZE:
  2023. X        f_double (w, "%g", objp->p_size);
  2024. X        break;
  2025. X    default:
  2026. X        printf ("%s: bad parabolic id: %d\n", me, id);
  2027. X        exit (1);
  2028. X    }
  2029. X}
  2030. X
  2031. Xstatic void
  2032. Xepoch_as_decimal (w, e)
  2033. XWidget w;
  2034. Xdouble e;
  2035. X{
  2036. X    double y;
  2037. X    mjd_year (e, &y);
  2038. X    f_double (w, "%g", y);
  2039. X}
  2040. X
  2041. Xstatic void
  2042. Xepoch_as_mdy (w, e)
  2043. XWidget w;
  2044. Xdouble e;
  2045. X{
  2046. X    char buf[100];
  2047. X
  2048. X    fs_date (buf, e);
  2049. X    f_string (w, buf);
  2050. X}
  2051. END_OF_FILE
  2052.   if test 35048 -ne `wc -c <'objmenu.c'`; then
  2053.     echo shar: \"'objmenu.c'\" unpacked with wrong size!
  2054.   fi
  2055.   # end of 'objmenu.c'
  2056. fi
  2057. echo shar: End of archive 14 \(of 21\).
  2058. cp /dev/null ark14isdone
  2059. MISSING=""
  2060. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; do
  2061.     if test ! -f ark${I}isdone ; then
  2062.     MISSING="${MISSING} ${I}"
  2063.     fi
  2064. done
  2065. if test "${MISSING}" = "" ; then
  2066.     echo You have unpacked all 21 archives.
  2067.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2068.     echo Building ephem.db
  2069.     cat > ephem.db.Z.uu ephem.db.Z.uu.?
  2070.     uudecode ephem.db.Z.uu
  2071.     rm ephem.db.Z.uu ephem.db.Z.uu.?
  2072.     uncompress ephem.db.Z
  2073.     echo Building skyviewmenu.c
  2074.     cat > skyviewmenu.c skyviewmenu.c.?
  2075.     rm skyviewmenu.c.?
  2076.     echo Building smallfm.xbm
  2077.     cat > smallfm.xbm smallfm.xbm.?
  2078.     rm smallfm.xbm.?
  2079. else
  2080.     echo You still must unpack the following archives:
  2081.     echo "        " ${MISSING}
  2082. fi
  2083. exit 0
  2084. exit 0 # Just in case...
  2085. -- 
  2086.   // chris@IMD.Sterling.COM            | Send comp.sources.x submissions to:
  2087. \X/  Amiga - The only way to fly!      |
  2088.  "It's intuitively obvious to the most |    sources-x@imd.sterling.com
  2089.   casual observer..."                  |
  2090.