Astro-FITS-CFITSIO-1.10/0000755000115400000360000000000012154152345013162 5ustar rpeteheadAstro-FITS-CFITSIO-1.10/ChangeLog0000644000115400000360000003520112154150257014735 0ustar rpetehead2013-06-06 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.10'; * CFITSIO.pm: sync with cfitsio 3.34, added fits_make_key/ffmky 2012-08-06 Pete Ratzlaff * CFITSIO.xs: added fits_parse_input_filename/ffifile 2012-07-27 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.09'; * CFITSIO.xs: sync with cfitsio 3.31 2012-01-19 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.08'; * CFITSIO.xs: sync with cfitsio 3.29, added fits_calculator, fits_calculator_rng and fits_read_img_coord_version/ffgicsa 2011-10-21 Diab Jerius * Makefile.PL: pkg-config support 2011-07-21 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.07'; * CFITSIO.xs: update to cfitsio 3.28, removal of fits_compress_img. Removal of LICENSE file and inclusion of copyright and license in README. 2011-07-21 Pete Ratzlaff * CFITSIO.xs: update to cfitsio 3.27, added fits_free_memory, fits_read_str, fits_delete_str 2011-01-26 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.06'; * CFITSIO.xs: update to cfitsio 3.26, added routines fits_copy_rows, fits_get_inttype, fits_convert_hdr2str, added short name ffhdr2str => 'fits_hdr2str', added constants CFITSIO_MAJOR and CFITSIO_MINOR 2010-07-28 Pete Ratzlaff * util.c (column_width): fixed incorrect determination of ASCII string widths for values in binary tables columns 2009-08-21 Pete Ratzlaff * CFITSIO.xs: fixed bug in fits_update_key when called with datatype TLOGICAL, whereby the input value was not converted to int properly. 2008-08-26 Pete Ratzlaff * testprog/testprog_pdl.pl: get testprog_pdl.pl work properly on 64-bit archs 2007-02-14 Pete Ratzlaff * CFITSIO.xs: added fits_write_hdu/ffwrhdu, fits_write_exthdr/ffphext 2006-06-27 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.0.5'; * util.c: fixed order_reverse, which was called by fits_read_pix[null], so that it now actually does something 2006-05-20 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.0.4'; 2006-05-19 Pete Ratzlaff * CFITSIO.xs: added fits_translate_keyword(s), fits_copy_cell2image, fits_copy_image2cell 2006-05-18 Pete Ratzlaff * CFITSIO.xs: added fits_parse_rangell, fits_binary_tformll, ffmbyt (aka fits_seek - this function does not have a longname in cfitsio, and should typically not be used by applications), fits_write_tdimll, ffpknjj (aka fits_write_keys_lnglng - no longname in cfitsio), fits_write_imghdrll, fits_write_grphdrll, fits_read_key_lnglng, fits_read_tdimll, fits_decode_tdimll, ffgknjj (aka fits_read_keys_lnglng - no longname in cfitsio), fits_read_imghdrll, fits_read_atblhdrll, fits_read_btblhdrll, fits_get_hduaddrll, fits_get_img_parmall, fits_create_imgll, fits_insert_imgll, fits_resize_imgll, fits_get_coltypell, fits_get_eqcoltypell, fits_get_num_rowsll, fits_get_bcol_parmsll, fits_read_pixll, fits_read_pixnullll, fits_read_img_sbyt, fits_read_img_lnglng, fits_read_imgnull_sbyt, fits_read_imgnull_lnglng, fits_read_2d_sbyt, fits_read_2d_lnglng, fits_read_3d_sbyt, fits_read_3d_lnglng, fits_read_subset_lnglng, fits_read_subsetnull_sbyt, fits_read_subsetnull_lnglng, fits_read_grppar_lnglng, fits_read_col_sbyt, fits_read_col_lnglng, fits_read_colnull_sbyt, fits_read_colnull_lnglng, fits_read_descriptll, fits_read_descriptsll, fits_write_pixll, fits_write_pixnullll, fits_write_img_sbyt, fits_write_img_lnglng, fits_write_imgnull_sbyt, fits_write_imgnull_lnglng, fits_write_2d_sbyt, fits_write_2d_lnglng, fits_write_3d_sbyt, fits_write_3d_lnglng, fits_write_subset_sbyt, fits_write_subset_lnglng, fits_write_grppar_sbyt, fits_write_grppar_lnglng, fits_write_col_sbyt, fits_write_col_lnglng, fits_write_nullrows, fits_write_colnull_sbyt, fits_write_colnull_lnglng, fits_delete_rowlistll, fits_read_grppar_sbyt, fits_read_subset_sbyt * CFITSIO.xs: added upackNDll * typemap: added mapping for signed char (cfitsio TSBYTE) 2005-01-04 Pete Ratzlaff * CFITSIO.xs: added cfitsio 2510 routines ffdkopn/fits_open_diskfile and ffdkinit/fits_create_diskfile 2004-08-16 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.0.3'; 2004-08-02 Pete Ratzlaff * CFITSIO.xs: add fits_file_exists() from cfitsio 2500. fits_read_colnull_cmp() and fits_read_colnull_dblcmp() null arrays should contain nelem as per cfitsio 2500 changes. * Makefile.PL: add -I$ENV{CFITSIO}/include, -L$ENV{CFITSIO}/lib 2004-04-08 Pete Ratzlaff * CFITSIO.xs: added AbortFitsFile macro to complement NewFitsFile in cases where create/open of a file fails. FitsFile* output typemap changed accordingly. The AbortFitsFile macro frees the memory that NewFitsFile allocated, sets the argument to NULL, and the output typemap will not bless the scalar - undef is returned instead of an invalid FitsFile object (which DESTROY would croak at). 2004-04-07 Diab Jerius * CFITSIO.xs: LONGLONG_IMG constant added 2004-03-25 Pete Ratzlaff * CFITSIO.pm: $VERSION = '1.02'; * CFITSIO.xs: Added fits_hdr2str, but without the "exclude" and "nexc" parameters. Added TSBYTE support. 2004-02-26 Pete Ratzlaff * CFITSIO.xs: Added fits_get_img_equivtype, fits_get_eqcoltype 2003-06-04 Diab Jerius * CFITSIO.xs: open_file() wasn't handling the possible magic of status correctly (it's in a PPCODE block which doesn't automatically do that for you). 2003-01-06 Diab Jerius * CFITSIO.xs: forgot to initialize status to 0 in DESTROY. sometimes it worked; sometimes it didn't. 2002-11-26 Diab Jerius * CFITSIO.xs: the underlying structure representing a filehandle has been changed from a pointer (the returned CFITSIO filehandle of type fitsfile*) to a structure of type FitsFile. * the way that data are unpacked may now be specified on a per-filehandle basis via the perlyunpacking method. * ffclos is automatically called (when necessary) on a filehandle when it goes out of scope. 2002-10-28 Pete Ratzlaff * README: Whoops, already released 1.01 with 1.00 references in readme. * CFITSIO.pm: $VERSION = '1.01'; 2002-09-04 Pete Ratzlaff * CFITSIO.xs: added cfitsio 2.420 routine fits_flush_buffer. 2002-07-30 Pete Ratzlaff * CFITSIO.xs: added fits_find_first_row/ffffrw 2002-06-27 Pete Ratzlaff * util.c: unpackND() bug fixed. * CFITSIO.xs: Added cfitsio 2.410 routines fits_open_data, fits_open_image, fits_open_table, fits_write_errmark, fits_clear_errmark, fits_delete_rowrange, fits_copy_file, fits_parse_range, and fits_insert_key. 2002-04-05 Pete Ratzlaff * $VERSION = '1.00'; * Name changed to Astro::FITS::CFISIO 2002-02-21 Pete Ratzlaff * CFITSIO.xs: Added fits_[gs]et_{compression_type,noise_bits,tile_dim} and fits_write_subset, all from cfitsio 2.400 * util.c: beginning of TLONGLONG support 2001-11-05 Pete Ratzlaff * Added cfitsio 2.300 constants GZIP_1, PLIO_1, RICE_1. * Added cfitsio 2.300 routines fits_compress_heap/ffcmph, fits_test_heap/fftheap, fits_compress_img/fits_comp_img, fits_decompress_img/fits_decomp_img * Updated test programs for cfitsio 2.300. 2000-11-17 Pete Ratzlaff * $VERSION = '0.95'; * fits_read_pix/fits_read_pixnull should now unpack correctly. Tested on both 2d and 3d datasets. 2000-11-15 Pete Ratzlaff * Fixed large memory leak reading into perl arrays. 2000-11-14 Pete Ratzlaff * unsigned type cleanups in util.c * Added, tested fits_read_subset()/ffgsv(). * Added fits_write_pix()/ffppx() and fits_write_pixnull()/ffppxn(). The latter does not have a longname alias in cfitsio 2.100, but it is listed in the user manual. 2000-11-12 Pete Ratzlaff * added fits_get_keyname()/ffgknm(), thanks to Tim Conrow. * fits_get_img_size() bug causing sigsegv and/or out of memory condition fixed when called on a non-image HDU - thanks to Tim Conrow Function now determines the output array size needed, and always unpacks to a perl array. * bug fixed in fits_test_expr(), output variables setting * Updated testprogs and test.pl * fits_get_hduoff() added. * Fixed bug in fits_get_hduaddr(), causing all output fields to be set to value of headstart. 2000-08-23 Pete Ratzlaff * Fixed TBIT column write in fits_write_col(), when PerlyUnpacking(1). Minor documentation updates. 2000-07-24 Pete Ratzlaff * Fixed TBIT column reads in fits_read_col() and fits_read_colnull(). 2000-02-25 Pete Ratzlaff * $VERSION = '0.94'; * Minor pod changes. 2000-02-23 Pete Ratzlaff * Reformat of util.c, minor cleanups in example scripts. 2000-02-22 Pete Ratzlaff * Updated examples. * Added cfitsio2036 routines fits_read_imgnull(), fits_read_colnull(). * Removed maxdim argument from fits_read_atblhdr(), fits_read_btblhdr(), fits_read_imghdr(), fits_decode_tdim(), fits_read_tdim(), fits_test_expr(), fits_get_img_parm(). Updated calls to these routines in testprogs and test.pl. * Added cfitsio2035 routines fits_update_key_longstr(), fits_insert_key_longstr(), fits_modify_key_longstr(), fits_get_img_par() and fits_get_keyclass(). Added cfitsio2035 constants TYP_x_KEY. 2000-01-10 Pete Ratzlaff * fits_read_header() makes an array of comments if there is more than one for a given header keyword (e.g., HISTORY keywords, because they end up in the COMMENTS portion of the output hash). 1999-12-11 Pete Ratzlaff * Disabled prototypes. 1999-12-11 Pete Ratzlaff * Added examples/check_status.pl and examples/match_datatype.pl to MANIFEST. 1999-12-11 Pete Ratzlaff * Attempt at making example scripts portable to 64-bit architectures, in a generalized manner. 1999-12-09 Pete Ratzlaff * Allow undef for timeref argument in fits_get_system_date(). 1999-12-08 Pete Ratzlaff * Added sizeof_datatype(). 1999-12-02 Pete Ratzlaff * $VERSION = '0.93'; * Added cfitsio version section to README. * Some common problems and solutions explained in INSTALL. * Explicitly enabled prototypes in CFITSIO.xs. 1999-11-26 Pete Ratzlaff * Updated fits_get_img_size/ffgisz() for new prototype in CFITSIO 2.034. 1999-11-12 Pete Ratzlaff * Added WCS routines fits_get_image_wcs_keys()/ffgiwcs() and fits_get_table_wcs_keys()/ffgtwcs(). Another routine - fits_get_imagecell_wcs_keys() - is documented in the manual but not found in the cfitsio library. 1999-11-01 Pete Ratzlaff * unpack3D() - fixed bug in inner loop. 1999-10-06 Pete Ratzlaff * read_tblbytes(): Fixed compiler warning of incompatible pointers. 1999-09-28 Pete Ratzlaff * fits_get_hdu_num() now accepts undef argument. Useful since its return value is the current HDU number, and setting the variable inplace was redundant. 1999-09-21 Pete Ratzlaff * Added fits_null_check/ffnchk(), fits_get_img_type/ffgidt(), fits_get_img_dim/ffgidm() and fits_get_img_size/ffgisz(). These are all new in CFITSIO v2.033 1999-09-14 Pete Ratzlaff * $VERSION = '0.92'; 1999-09-13 Pete Ratzlaff * CFITSIO.xs: find_rows(), read_3d_TYP(), read_colnull_str(), read_descripts(), read_grppar_TYP(), read_imgnull_TYP(), read_subset_TYP(), read_subsetnull_TYP(), read_tblbytes(): Created fastpaths for case of PerlyUnpacking(0). 1999-09-13 Pete Ratzlaff * CFITSIO.xs: read_2d_TYP(), read_img_TYP(), fastpaths for PerlyUnpacking(0). 1999-09-13 Pete Ratzlaff * CFITSIO.xs: read_colnull_TYP() fastpaths for PerlyUnpacking(0). 1999-09-09 Pete Ratzlaff * examples/: Updated examples somewhat. Nothing big, though. 1999-08-31 Pete Ratzlaff * CFITSIO.xs: read_col_TYPE(), read_col_bit_TYPE(): Fast path created for case of PerlyUnpacking(0). Was doing an extra allocation and memcpy, no more. This needs to be done for a number of the other routines as well. 1999-08-30 Pete Ratzlaff * examples/bintable_read.pl: Was not actually die()ing if get_colnum() failed. Fixed. 1999-08-24 Pete Ratzlaff * CFITSIO.pm: Fixed example function call in pod. 1999-04-08 Pete Ratzlaff * CFITSIO.pm: $VERSION = '0.91'; * CFITSIO.pm: Removed duplicate 'my' declaration. * CFITSIO.pm, CFITSIO.xs: Synched up with cfitsio2031. Added fits_get_col_display/ffgcdw, fits_read_col_bit_{usht,uint}/ffgcxu{ik}, fits_url_type/ffurlt * examples/bintable_read.pl: Use get_num_rows() to find number of rows instead of read_btblhdr(). * CFITSIO.pm: fits_read_header() was griping with -w, $status now predeclared. 1999-03-23 Pete Ratzlaff * CFITSIO.xs: ffopen() was segfaulting if filename was undef, now assumes empty string (which will fail, of course). * CFITSIO.xs: fits_get_colnum() accepts undef for output variable now. 1998-12-15 Pete Ratzlaff * CFITSIO.pm: fits_read_header() no longer calls fits_close_file() if passed a fitsfilePtr. 1998-12-08 Pete Ratzlaff * CFITSIO.xs, testprog/*: Bug squashed...fits_read_colnull_{,dbl}cmp were not allocating enough memory for null-flags array. Turns out you need 2*nelem elements. 1998-12-07 Pete Ratzlaff * Makefile.PL: Minor fix to clean testprog/testprog.{fit,lis}. * testprog/runtests: First hack at auto testprogs 1998-12-04 Pete Ratzlaff * test.pl: More tests added. * CFITSIO.pm: Updated pod. * CFITSIO.xs: More compatibility fixes and squashed bugs. Astro-FITS-CFITSIO-1.10/NOTES0000644000115400000360000000034410565117562014004 0ustar rpeteheadUnimplemented: * fits_iterate_data * fits_open_memfile * fits_split_names * fits_read_wcstab * fits_write_ext * fits_read_ext Other: * fits_hdr2str - exclude, nexc parameters unimplemented, they are Astro-FITS-CFITSIO-1.10/CFITSIO.xs0000644000115400000360000106145012154150330014635 0ustar rpetehead#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifdef __cplusplus } #endif #include "fitsio.h" #include "util.h" /* use the C std lib malloc/free */ #ifdef malloc #undef malloc #endif #ifdef free #undef free #endif static int not_here(s) char *s; { croak("%s not implemented on this architecture", s); return -1; } static double constant(name, arg) char *name; int arg; { errno = 0; switch (*name) { case 'A': if (strEQ(name, "ANGLE_TOO_BIG")) #ifdef ANGLE_TOO_BIG return ANGLE_TOO_BIG; #else goto not_there; #endif if (strEQ(name, "ANY_HDU")) #ifdef ANY_HDU return ANY_HDU; #else goto not_there; #endif if (strEQ(name, "ARRAY_TOO_BIG")) #ifdef ARRAY_TOO_BIG return ARRAY_TOO_BIG; #else goto not_there; #endif if (strEQ(name, "ASCII_TBL")) #ifdef ASCII_TBL return ASCII_TBL; #else goto not_there; #endif break; case 'B': if (strEQ(name, "BAD_ATABLE_FORMAT")) #ifdef BAD_ATABLE_FORMAT return BAD_ATABLE_FORMAT; #else goto not_there; #endif if (strEQ(name, "BAD_BITPIX")) #ifdef BAD_BITPIX return BAD_BITPIX; #else goto not_there; #endif if (strEQ(name, "BAD_BTABLE_FORMAT")) #ifdef BAD_BTABLE_FORMAT return BAD_BTABLE_FORMAT; #else goto not_there; #endif if (strEQ(name, "BAD_C2D")) #ifdef BAD_C2D return BAD_C2D; #else goto not_there; #endif if (strEQ(name, "BAD_C2F")) #ifdef BAD_C2F return BAD_C2F; #else goto not_there; #endif if (strEQ(name, "BAD_C2I")) #ifdef BAD_C2I return BAD_C2I; #else goto not_there; #endif if (strEQ(name, "BAD_COL_NUM")) #ifdef BAD_COL_NUM return BAD_COL_NUM; #else goto not_there; #endif if (strEQ(name, "BAD_DATATYPE")) #ifdef BAD_DATATYPE return BAD_DATATYPE; #else goto not_there; #endif if (strEQ(name, "BAD_DATA_FILL")) #ifdef BAD_DATA_FILL return BAD_DATA_FILL; #else goto not_there; #endif if (strEQ(name, "BAD_DATE")) #ifdef BAD_DATE return BAD_DATE; #else goto not_there; #endif if (strEQ(name, "BAD_DECIM")) #ifdef BAD_DECIM return BAD_DECIM; #else goto not_there; #endif if (strEQ(name, "BAD_DIMEN")) #ifdef BAD_DIMEN return BAD_DIMEN; #else goto not_there; #endif if (strEQ(name, "BAD_DOUBLEKEY")) #ifdef BAD_DOUBLEKEY return BAD_DOUBLEKEY; #else goto not_there; #endif if (strEQ(name, "BAD_ELEM_NUM")) #ifdef BAD_ELEM_NUM return BAD_ELEM_NUM; #else goto not_there; #endif if (strEQ(name, "BAD_F2C")) #ifdef BAD_F2C return BAD_F2C; #else goto not_there; #endif if (strEQ(name, "BAD_FILEPTR")) #ifdef BAD_FILEPTR return BAD_FILEPTR; #else goto not_there; #endif if (strEQ(name, "BAD_FLOATKEY")) #ifdef BAD_FLOATKEY return BAD_FLOATKEY; #else goto not_there; #endif if (strEQ(name, "BAD_GCOUNT")) #ifdef BAD_GCOUNT return BAD_GCOUNT; #else goto not_there; #endif if (strEQ(name, "BAD_GROUP_ID")) #ifdef BAD_GROUP_ID return BAD_GROUP_ID; #else goto not_there; #endif if (strEQ(name, "BAD_HDU_NUM")) #ifdef BAD_HDU_NUM return BAD_HDU_NUM; #else goto not_there; #endif if (strEQ(name, "BAD_HEADER_FILL")) #ifdef BAD_HEADER_FILL return BAD_HEADER_FILL; #else goto not_there; #endif if (strEQ(name, "BAD_I2C")) #ifdef BAD_I2C return BAD_I2C; #else goto not_there; #endif if (strEQ(name, "BAD_INTKEY")) #ifdef BAD_INTKEY return BAD_INTKEY; #else goto not_there; #endif if (strEQ(name, "BAD_KEYCHAR")) #ifdef BAD_KEYCHAR return BAD_KEYCHAR; #else goto not_there; #endif if (strEQ(name, "BAD_LOGICALKEY")) #ifdef BAD_LOGICALKEY return BAD_LOGICALKEY; #else goto not_there; #endif if (strEQ(name, "BAD_NAXES")) #ifdef BAD_NAXES return BAD_NAXES; #else goto not_there; #endif if (strEQ(name, "BAD_NAXIS")) #ifdef BAD_NAXIS return BAD_NAXIS; #else goto not_there; #endif if (strEQ(name, "BAD_OPTION")) #ifdef BAD_OPTION return BAD_OPTION; #else goto not_there; #endif if (strEQ(name, "BAD_ORDER")) #ifdef BAD_ORDER return BAD_ORDER; #else goto not_there; #endif if (strEQ(name, "BAD_PCOUNT")) #ifdef BAD_PCOUNT return BAD_PCOUNT; #else goto not_there; #endif if (strEQ(name, "BAD_PIX_NUM")) #ifdef BAD_PIX_NUM return BAD_PIX_NUM; #else goto not_there; #endif if (strEQ(name, "BAD_ROW_NUM")) #ifdef BAD_ROW_NUM return BAD_ROW_NUM; #else goto not_there; #endif if (strEQ(name, "BAD_ROW_WIDTH")) #ifdef BAD_ROW_WIDTH return BAD_ROW_WIDTH; #else goto not_there; #endif if (strEQ(name, "BAD_SIMPLE")) #ifdef BAD_SIMPLE return BAD_SIMPLE; #else goto not_there; #endif if (strEQ(name, "BAD_TBCOL")) #ifdef BAD_TBCOL return BAD_TBCOL; #else goto not_there; #endif if (strEQ(name, "BAD_TDIM")) #ifdef BAD_TDIM return BAD_TDIM; #else goto not_there; #endif if (strEQ(name, "BAD_TFIELDS")) #ifdef BAD_TFIELDS return BAD_TFIELDS; #else goto not_there; #endif if (strEQ(name, "BAD_TFORM")) #ifdef BAD_TFORM return BAD_TFORM; #else goto not_there; #endif if (strEQ(name, "BAD_TFORM_DTYPE")) #ifdef BAD_TFORM_DTYPE return BAD_TFORM_DTYPE; #else goto not_there; #endif if (strEQ(name, "BAD_URL_PREFIX")) #ifdef BAD_URL_PREFIX return BAD_URL_PREFIX; #else goto not_there; #endif if (strEQ(name, "BAD_WCS_PROJ")) #ifdef BAD_WCS_PROJ return BAD_WCS_PROJ; #else goto not_there; #endif if (strEQ(name, "BAD_WCS_VAL")) #ifdef BAD_WCS_VAL return BAD_WCS_VAL; #else goto not_there; #endif if (strEQ(name, "BINARY_TBL")) #ifdef BINARY_TBL return BINARY_TBL; #else goto not_there; #endif if (strEQ(name, "BYTE_IMG")) #ifdef BYTE_IMG return BYTE_IMG; #else goto not_there; #endif break; case 'C': if (strEQ(name, "CASEINSEN")) #ifdef CASEINSEN return CASEINSEN; #else goto not_there; #endif if (strEQ(name, "CASESEN")) #ifdef CASESEN return CASESEN; #else goto not_there; #endif if (strEQ(name, "CFITSIO_MAJOR")) #ifdef CFITSIO_MAJOR return CFITSIO_MAJOR; #else goto not_there; #endif if (strEQ(name, "CFITSIO_MINOR")) #ifdef CFITSIO_MINOR return CFITSIO_MINOR; #else goto not_there; #endif if (strEQ(name, "COL_NOT_FOUND")) #ifdef COL_NOT_FOUND return COL_NOT_FOUND; #else goto not_there; #endif if (strEQ(name, "COL_NOT_UNIQUE")) #ifdef COL_NOT_UNIQUE return COL_NOT_UNIQUE; #else goto not_there; #endif if (strEQ(name, "COL_TOO_WIDE")) #ifdef COL_TOO_WIDE return COL_TOO_WIDE; #else goto not_there; #endif break; case 'D': if (strEQ(name, "DOUBLENULLVALUE")) #ifdef DOUBLENULLVALUE return DOUBLENULLVALUE; #else goto not_there; #endif if (strEQ(name, "DOUBLE_IMG")) #ifdef DOUBLE_IMG return DOUBLE_IMG; #else goto not_there; #endif if (strEQ(name, "DRIVER_INIT_FAILED")) #ifdef DRIVER_INIT_FAILED return DRIVER_INIT_FAILED; #else goto not_there; #endif break; case 'E': if (strEQ(name, "END_JUNK")) #ifdef END_JUNK return END_JUNK; #else goto not_there; #endif if (strEQ(name, "END_OF_FILE")) #ifdef END_OF_FILE return END_OF_FILE; #else goto not_there; #endif break; case 'F': if (strEQ(name, "FALSE")) #ifdef FALSE return FALSE; #else goto not_there; #endif if (strEQ(name, "FILE_NOT_CLOSED")) #ifdef FILE_NOT_CLOSED return FILE_NOT_CLOSED; #else goto not_there; #endif if (strEQ(name, "FILE_NOT_CREATED")) #ifdef FILE_NOT_CREATED return FILE_NOT_CREATED; #else goto not_there; #endif if (strEQ(name, "FILE_NOT_OPENED")) #ifdef FILE_NOT_OPENED return FILE_NOT_OPENED; #else goto not_there; #endif if (strEQ(name, "FLEN_CARD")) #ifdef FLEN_CARD return FLEN_CARD; #else goto not_there; #endif if (strEQ(name, "FLEN_COMMENT")) #ifdef FLEN_COMMENT return FLEN_COMMENT; #else goto not_there; #endif if (strEQ(name, "FLEN_ERRMSG")) #ifdef FLEN_ERRMSG return FLEN_ERRMSG; #else goto not_there; #endif if (strEQ(name, "FLEN_FILENAME")) #ifdef FLEN_FILENAME return FLEN_FILENAME; #else goto not_there; #endif if (strEQ(name, "FLEN_KEYWORD")) #ifdef FLEN_KEYWORD return FLEN_KEYWORD; #else goto not_there; #endif if (strEQ(name, "FLEN_STATUS")) #ifdef FLEN_STATUS return FLEN_STATUS; #else goto not_there; #endif if (strEQ(name, "FLEN_VALUE")) #ifdef FLEN_VALUE return FLEN_VALUE; #else goto not_there; #endif if (strEQ(name, "FLOATNULLVALUE")) #ifdef FLOATNULLVALUE return FLOATNULLVALUE; #else goto not_there; #endif if (strEQ(name, "FLOAT_IMG")) #ifdef FLOAT_IMG return FLOAT_IMG; #else goto not_there; #endif break; case 'G': if (strEQ(name, "GROUP_NOT_FOUND")) #ifdef GROUP_NOT_FOUND return GROUP_NOT_FOUND; #else goto not_there; #endif if (strEQ(name, "GT_ID_ALL")) #ifdef GT_ID_ALL return GT_ID_ALL; #else goto not_there; #endif if (strEQ(name, "GT_ID_ALL_URI")) #ifdef GT_ID_ALL_URI return GT_ID_ALL_URI; #else goto not_there; #endif if (strEQ(name, "GT_ID_POS")) #ifdef GT_ID_POS return GT_ID_POS; #else goto not_there; #endif if (strEQ(name, "GT_ID_POS_URI")) #ifdef GT_ID_POS_URI return GT_ID_POS_URI; #else goto not_there; #endif if (strEQ(name, "GT_ID_REF")) #ifdef GT_ID_REF return GT_ID_REF; #else goto not_there; #endif if (strEQ(name, "GT_ID_REF_URI")) #ifdef GT_ID_REF_URI return GT_ID_REF_URI; #else goto not_there; #endif if (strEQ(name, "GZIP_1")) #ifdef GZIP_1 return GZIP_1; #else goto not_there; #endif break; case 'H': if (strEQ(name, "HDU_ALREADY_MEMBER")) #ifdef HDU_ALREADY_MEMBER return HDU_ALREADY_MEMBER; #else goto not_there; #endif if (strEQ(name, "HDU_ALREADY_TRACKED")) #ifdef HDU_ALREADY_TRACKED return HDU_ALREADY_TRACKED; #else goto not_there; #endif if (strEQ(name, "HEADER_NOT_EMPTY")) #ifdef HEADER_NOT_EMPTY return HEADER_NOT_EMPTY; #else goto not_there; #endif break; case 'I': if (strEQ(name, "IDENTICAL_POINTERS")) #ifdef IDENTICAL_POINTERS return IDENTICAL_POINTERS; #else goto not_there; #endif if (strEQ(name, "IMAGE_HDU")) #ifdef IMAGE_HDU return IMAGE_HDU; #else goto not_there; #endif if (strEQ(name, "InputCol")) #ifdef InputCol return InputCol; #else goto not_there; #endif if (strEQ(name, "InputOutputCol")) #ifdef InputOutputCol return InputOutputCol; #else goto not_there; #endif break; case 'J': break; case 'K': if (strEQ(name, "KEY_NO_EXIST")) #ifdef KEY_NO_EXIST return KEY_NO_EXIST; #else goto not_there; #endif if (strEQ(name, "KEY_OUT_BOUNDS")) #ifdef KEY_OUT_BOUNDS return KEY_OUT_BOUNDS; #else goto not_there; #endif break; case 'L': if (strEQ(name, "LONG_IMG")) #ifdef LONG_IMG return LONG_IMG; #else goto not_there; #endif if (strEQ(name, "LONGLONG_IMG")) #ifdef LONGLONG_IMG return LONGLONG_IMG; #else goto not_there; #endif break; case 'M': if (strEQ(name, "MAXHDU")) #ifdef MAXHDU return MAXHDU; #else goto not_there; #endif if (strEQ(name, "MEMBER_NOT_FOUND")) #ifdef MEMBER_NOT_FOUND return MEMBER_NOT_FOUND; #else goto not_there; #endif if (strEQ(name, "MEMORY_ALLOCATION")) #ifdef MEMORY_ALLOCATION return MEMORY_ALLOCATION; #else goto not_there; #endif break; case 'N': if (strEQ(name, "NEG_AXIS")) #ifdef NEG_AXIS return NEG_AXIS; #else goto not_there; #endif if (strEQ(name, "NEG_BYTES")) #ifdef NEG_BYTES return NEG_BYTES; #else goto not_there; #endif if (strEQ(name, "NEG_FILE_POS")) #ifdef NEG_FILE_POS return NEG_FILE_POS; #else goto not_there; #endif if (strEQ(name, "NEG_ROWS")) #ifdef NEG_ROWS return NEG_ROWS; #else goto not_there; #endif if (strEQ(name, "NEG_WIDTH")) #ifdef NEG_WIDTH return NEG_WIDTH; #else goto not_there; #endif if (strEQ(name, "NOT_ASCII_COL")) #ifdef NOT_ASCII_COL return NOT_ASCII_COL; #else goto not_there; #endif if (strEQ(name, "NOT_ATABLE")) #ifdef NOT_ATABLE return NOT_ATABLE; #else goto not_there; #endif if (strEQ(name, "NOT_BTABLE")) #ifdef NOT_BTABLE return NOT_BTABLE; #else goto not_there; #endif if (strEQ(name, "NOT_GROUP_TABLE")) #ifdef NOT_GROUP_TABLE return NOT_GROUP_TABLE; #else goto not_there; #endif if (strEQ(name, "NOT_IMAGE")) #ifdef NOT_IMAGE return NOT_IMAGE; #else goto not_there; #endif if (strEQ(name, "NOT_LOGICAL_COL")) #ifdef NOT_LOGICAL_COL return NOT_LOGICAL_COL; #else goto not_there; #endif if (strEQ(name, "NOT_POS_INT")) #ifdef NOT_POS_INT return NOT_POS_INT; #else goto not_there; #endif if (strEQ(name, "NOT_TABLE")) #ifdef NOT_TABLE return NOT_TABLE; #else goto not_there; #endif if (strEQ(name, "NOT_VARI_LEN")) #ifdef NOT_VARI_LEN return NOT_VARI_LEN; #else goto not_there; #endif if (strEQ(name, "NO_BITPIX")) #ifdef NO_BITPIX return NO_BITPIX; #else goto not_there; #endif if (strEQ(name, "NO_END")) #ifdef NO_END return NO_END; #else goto not_there; #endif if (strEQ(name, "NO_GCOUNT")) #ifdef NO_GCOUNT return NO_GCOUNT; #else goto not_there; #endif if (strEQ(name, "NO_MATCHING_DRIVER")) #ifdef NO_MATCHING_DRIVER return NO_MATCHING_DRIVER; #else goto not_there; #endif if (strEQ(name, "NO_NAXES")) #ifdef NO_NAXES return NO_NAXES; #else goto not_there; #endif if (strEQ(name, "NO_NAXIS")) #ifdef NO_NAXIS return NO_NAXIS; #else goto not_there; #endif if (strEQ(name, "NO_NULL")) #ifdef NO_NULL return NO_NULL; #else goto not_there; #endif if (strEQ(name, "NO_PCOUNT")) #ifdef NO_PCOUNT return NO_PCOUNT; #else goto not_there; #endif if (strEQ(name, "NO_QUOTE")) #ifdef NO_QUOTE return NO_QUOTE; #else goto not_there; #endif if (strEQ(name, "NO_SIMPLE")) #ifdef NO_SIMPLE return NO_SIMPLE; #else goto not_there; #endif if (strEQ(name, "NO_TBCOL")) #ifdef NO_TBCOL return NO_TBCOL; #else goto not_there; #endif if (strEQ(name, "NO_TFIELDS")) #ifdef NO_TFIELDS return NO_TFIELDS; #else goto not_there; #endif if (strEQ(name, "NO_TFORM")) #ifdef NO_TFORM return NO_TFORM; #else goto not_there; #endif if (strEQ(name, "NO_WCS_KEY")) #ifdef NO_WCS_KEY return NO_WCS_KEY; #else goto not_there; #endif if (strEQ(name, "NO_XTENSION")) #ifdef NO_XTENSION return NO_XTENSION; #else goto not_there; #endif if (strEQ(name, "NULL_INPUT_PTR")) #ifdef NULL_INPUT_PTR return NULL_INPUT_PTR; #else goto not_there; #endif if (strEQ(name, "NUM_OVERFLOW")) #ifdef NUM_OVERFLOW return NUM_OVERFLOW; #else goto not_there; #endif break; case 'O': if (strEQ(name, "OPT_CMT_MBR")) #ifdef OPT_CMT_MBR return OPT_CMT_MBR; #else goto not_there; #endif if (strEQ(name, "OPT_CMT_MBR_DEL")) #ifdef OPT_CMT_MBR_DEL return OPT_CMT_MBR_DEL; #else goto not_there; #endif if (strEQ(name, "OPT_GCP_ALL")) #ifdef OPT_GCP_ALL return OPT_GCP_ALL; #else goto not_there; #endif if (strEQ(name, "OPT_GCP_GPT")) #ifdef OPT_GCP_GPT return OPT_GCP_GPT; #else goto not_there; #endif if (strEQ(name, "OPT_GCP_MBR")) #ifdef OPT_GCP_MBR return OPT_GCP_MBR; #else goto not_there; #endif if (strEQ(name, "OPT_MCP_ADD")) #ifdef OPT_MCP_ADD return OPT_MCP_ADD; #else goto not_there; #endif if (strEQ(name, "OPT_MCP_MOV")) #ifdef OPT_MCP_MOV return OPT_MCP_MOV; #else goto not_there; #endif if (strEQ(name, "OPT_MCP_NADD")) #ifdef OPT_MCP_NADD return OPT_MCP_NADD; #else goto not_there; #endif if (strEQ(name, "OPT_MCP_REPL")) #ifdef OPT_MCP_REPL return OPT_MCP_REPL; #else goto not_there; #endif if (strEQ(name, "OPT_MRG_COPY")) #ifdef OPT_MRG_COPY return OPT_MRG_COPY; #else goto not_there; #endif if (strEQ(name, "OPT_MRG_MOV")) #ifdef OPT_MRG_MOV return OPT_MRG_MOV; #else goto not_there; #endif if (strEQ(name, "OPT_RM_ALL")) #ifdef OPT_RM_ALL return OPT_RM_ALL; #else goto not_there; #endif if (strEQ(name, "OPT_RM_ENTRY")) #ifdef OPT_RM_ENTRY return OPT_RM_ENTRY; #else goto not_there; #endif if (strEQ(name, "OPT_RM_GPT")) #ifdef OPT_RM_GPT return OPT_RM_GPT; #else goto not_there; #endif if (strEQ(name, "OPT_RM_MBR")) #ifdef OPT_RM_MBR return OPT_RM_MBR; #else goto not_there; #endif if (strEQ(name, "OVERFLOW_ERR")) #ifdef OVERFLOW_ERR return OVERFLOW_ERR; #else goto not_there; #endif if (strEQ(name, "OutputCol")) #ifdef OutputCol return OutputCol; #else goto not_there; #endif break; case 'P': if (strEQ(name, "PARSE_BAD_COL")) #ifdef PARSE_BAD_COL return PARSE_BAD_COL; #else goto not_there; #endif if (strEQ(name, "PARSE_BAD_OUTPUT")) #ifdef PARSE_BAD_OUTPUT return PARSE_BAD_OUTPUT; #else goto not_there; #endif if (strEQ(name, "PARSE_BAD_TYPE")) #ifdef PARSE_BAD_TYPE return PARSE_BAD_TYPE; #else goto not_there; #endif if (strEQ(name, "PARSE_LRG_VECTOR")) #ifdef PARSE_LRG_VECTOR return PARSE_LRG_VECTOR; #else goto not_there; #endif if (strEQ(name, "PARSE_NO_OUTPUT")) #ifdef PARSE_NO_OUTPUT return PARSE_NO_OUTPUT; #else goto not_there; #endif if (strEQ(name, "PARSE_SYNTAX_ERR")) #ifdef PARSE_SYNTAX_ERR return PARSE_SYNTAX_ERR; #else goto not_there; #endif if (strEQ(name, "PLIO_1")) #ifdef PLIO_1 return PLIO_1; #else goto not_there; #endif break; case 'Q': break; case 'R': if (strEQ(name, "READONLY")) #ifdef READONLY return READONLY; #else goto not_there; #endif if (strEQ(name, "READONLY_FILE")) #ifdef READONLY_FILE return READONLY_FILE; #else goto not_there; #endif if (strEQ(name, "READWRITE")) #ifdef READWRITE return READWRITE; #else goto not_there; #endif if (strEQ(name, "READ_ERROR")) #ifdef READ_ERROR return READ_ERROR; #else goto not_there; #endif if (strEQ(name, "RICE_1")) #ifdef RICE_1 return RICE_1; #else goto not_there; #endif break; case 'S': if (strEQ(name, "SAME_FILE")) #ifdef SAME_FILE return SAME_FILE; #else goto not_there; #endif if (strEQ(name, "SEEK_ERROR")) #ifdef SEEK_ERROR return SEEK_ERROR; #else goto not_there; #endif if (strEQ(name, "SHORT_IMG")) #ifdef SHORT_IMG return SHORT_IMG; #else goto not_there; #endif break; case 'T': if (strEQ(name, "TBIT")) #ifdef TBIT return TBIT; #else goto not_there; #endif if (strEQ(name, "TBYTE")) #ifdef TBYTE return TBYTE; #else goto not_there; #endif if (strEQ(name, "TSBYTE")) #ifdef TSBYTE return TSBYTE; #else goto not_there; #endif if (strEQ(name, "TCOMPLEX")) #ifdef TCOMPLEX return TCOMPLEX; #else goto not_there; #endif if (strEQ(name, "TDBLCOMPLEX")) #ifdef TDBLCOMPLEX return TDBLCOMPLEX; #else goto not_there; #endif if (strEQ(name, "TDOUBLE")) #ifdef TDOUBLE return TDOUBLE; #else goto not_there; #endif if (strEQ(name, "TFLOAT")) #ifdef TFLOAT return TFLOAT; #else goto not_there; #endif if (strEQ(name, "TINT")) #ifdef TINT return TINT; #else goto not_there; #endif if (strEQ(name, "TLOGICAL")) #ifdef TLOGICAL return TLOGICAL; #else goto not_there; #endif if (strEQ(name, "TLONG")) #ifdef TLONG return TLONG; #else goto not_there; #endif if (strEQ(name, "TLONGLONG")) #ifdef TLONGLONG return TLONGLONG; #else goto not_there; #endif if (strEQ(name, "TOO_MANY_DRIVERS")) #ifdef TOO_MANY_DRIVERS return TOO_MANY_DRIVERS; #else goto not_there; #endif if (strEQ(name, "TOO_MANY_FILES")) #ifdef TOO_MANY_FILES return TOO_MANY_FILES; #else goto not_there; #endif if (strEQ(name, "TOO_MANY_HDUS_TRACKED")) #ifdef TOO_MANY_HDUS_TRACKED return TOO_MANY_HDUS_TRACKED; #else goto not_there; #endif if (strEQ(name, "TRUE")) #ifdef TRUE return TRUE; #else goto not_there; #endif if (strEQ(name, "TSHORT")) #ifdef TSHORT return TSHORT; #else goto not_there; #endif if (strEQ(name, "TSTRING")) #ifdef TSTRING return TSTRING; #else goto not_there; #endif if (strEQ(name, "TUINT")) #ifdef TUINT return TUINT; #else goto not_there; #endif if (strEQ(name, "TULONG")) #ifdef TULONG return TULONG; #else goto not_there; #endif if (strEQ(name, "TUSHORT")) #ifdef TUSHORT return TUSHORT; #else goto not_there; #endif if (strEQ(name, "TYP_STRUC_KEY")) #ifdef TYP_STRUC_KEY return TYP_STRUC_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_CMPRS_KEY")) #ifdef TYP_CMPRS_KEY return TYP_CMPRS_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_SCAL_KEY")) #ifdef TYP_SCAL_KEY return TYP_SCAL_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_NULL_KEY")) #ifdef TYP_NULL_KEY return TYP_NULL_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_DIM_KEY")) #ifdef TYP_DIM_KEY return TYP_DIM_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_RANG_KEY")) #ifdef TYP_RANG_KEY return TYP_RANG_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_UNIT_KEY")) #ifdef TYP_UNIT_KEY return TYP_UNIT_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_DISP_KEY")) #ifdef TYP_DISP_KEY return TYP_DISP_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_HDUID_KEY")) #ifdef TYP_HDUID_KEY return TYP_HDUID_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_CKSUM_KEY")) #ifdef TYP_CKSUM_KEY return TYP_CKSUM_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_WCS_KEY")) #ifdef TYP_WCS_KEY return TYP_WCS_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_REFSYS_KEY")) #ifdef TYP_REFSYS_KEY return TYP_REFSYS_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_COMM_KEY")) #ifdef TYP_COMM_KEY return TYP_COMM_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_CONT_KEY")) #ifdef TYP_CONT_KEY return TYP_CONT_KEY; #else goto not_there; #endif if (strEQ(name, "TYP_USER_KEY")) #ifdef TYP_USER_KEY return TYP_USER_KEY; #else goto not_there; #endif break; case 'U': if (strEQ(name, "ULONG_IMG")) #ifdef ULONG_IMG return ULONG_IMG; #else goto not_there; #endif if (strEQ(name, "UNKNOWN_EXT")) #ifdef UNKNOWN_EXT return UNKNOWN_EXT; #else goto not_there; #endif if (strEQ(name, "UNKNOWN_REC")) #ifdef UNKNOWN_REC return UNKNOWN_REC; #else goto not_there; #endif if (strEQ(name, "URL_PARSE_ERROR")) #ifdef URL_PARSE_ERROR return URL_PARSE_ERROR; #else goto not_there; #endif if (strEQ(name, "USE_MEM_BUFF")) #ifdef USE_MEM_BUFF return USE_MEM_BUFF; #else goto not_there; #endif if (strEQ(name, "USHORT_IMG")) #ifdef USHORT_IMG return USHORT_IMG; #else goto not_there; #endif break; case 'V': if (strEQ(name, "VALIDSTRUC")) #ifdef VALIDSTRUC return VALIDSTRUC; #else goto not_there; #endif if (strEQ(name, "VALUE_UNDEFINED")) #ifdef VALUE_UNDEFINED return VALUE_UNDEFINED; #else goto not_there; #endif break; case 'W': if (strEQ(name, "WCS_ERROR")) #ifdef WCS_ERROR return WCS_ERROR; #else goto not_there; #endif if (strEQ(name, "WRITE_ERROR")) #ifdef WRITE_ERROR return WRITE_ERROR; #else goto not_there; #endif break; case 'X': break; case 'Y': break; case 'Z': if (strEQ(name, "ZERO_SCALE")) #ifdef ZERO_SCALE return ZERO_SCALE; #else goto not_there; #endif break; } errno = EINVAL; return 0; not_there: errno = ENOENT; return 0; } #define NewFitsFile(fptr) \ do \ { New(0, fptr, 1, FitsFile);\ fptr->perlyunpacking = -1;\ fptr->is_open = 1;\ } while(0) #define AbortFitsFile(fptr) \ do \ { Safefree(fptr);\ fptr = 0;\ } while(0) MODULE = Astro::FITS::CFITSIO PACKAGE = Astro::FITS::CFITSIO PROTOTYPES: DISABLE double constant(name,arg) char * name int arg int sizeof_datatype(type) int type int PerlyUnpacking(...) CODE: RETVAL = PerlyUnpacking( items > 0 ? SvIV((ST(0))) : -1 ); OUTPUT: RETVAL int perlyunpacking(fptr, ...) FitsFile * fptr ALIAS: fitsfilePtr::perlyunpacking = 1 CODE: if( items > 1 ) fptr->perlyunpacking = SvIV((ST(1))); RETVAL = fptr->perlyunpacking; OUTPUT: RETVAL int _is_open(fptr, ...) FitsFile * fptr ALIAS: fitsfilePtr::_is_open = 1 CODE: if( items > 1 ) fptr->is_open = SvIV((ST(1))); RETVAL = fptr->is_open; OUTPUT: RETVAL int PERLYUNPACKING(fptr) FitsFile * fptr ALIAS: fitsfilePtr::PERLYUNPACKING = 1 CODE: RETVAL = PERLYUNPACKING(fptr->perlyunpacking); OUTPUT: RETVAL void DESTROY(fptr) FitsFile * fptr ALIAS: fitsfilePtr::DESTROY = 1 PREINIT: int status = 0; CODE: if ( fptr->is_open ) { ffclos( fptr->fptr, &status ); if ( status ) { char * err_text = get_mortalspace(FLEN_ERRMSG,TBYTE); ffgerr(status,err_text); Safefree(fptr); croak( "fitsfilePtr::DESTROY: error closing FITS file: %s", err_text ); } } Safefree(fptr); int ffgtam(gfptr,mfptr,hdupos,status) fitsfile * gfptr fitsfile * mfptr = NO_INIT int hdupos int status ALIAS: Astro::FITS::CFITSIO::fits_add_group_member = 1 fitsfilePtr::add_group_member = 2 CODE: /* * (mfptr == NULL) => member HDU is identified by hdupos */ if (ST(1)==&PL_sv_undef) mfptr = NULL; else if (sv_derived_from(ST(1),"fitsfilePtr")) mfptr = fitsfileSV(ST(1)); else croak("mfptr is not of type fitsfilePtr"); RETVAL = ffgtam(gfptr,mfptr,hdupos,&status); OUTPUT: status RETVAL int ffasfm(tform,typecode,width,decimals,status) char * tform int typecode = NO_INIT long width = NO_INIT int decimals = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_ascii_tform = 1 CODE: RETVAL = ffasfm(tform,&typecode,&width,&decimals,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),typecode); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),width); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),decimals); OUTPUT: status RETVAL int ffbnfm(tform,typecode,repeat,width,status) char * tform int typecode = NO_INIT long repeat = NO_INIT long width = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_binary_tform = 1 CODE: RETVAL = ffbnfm(tform,&typecode,&repeat,&width,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),typecode); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),repeat); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),width); OUTPUT: status RETVAL int ffbnfmll(tform,typecode,repeat,width,status) char * tform int typecode = NO_INIT LONGLONG repeat = NO_INIT long width = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_binary_tformll = 1 CODE: RETVAL = ffbnfmll(tform,&typecode,&repeat,&width,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),typecode); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),repeat); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),width); OUTPUT: status RETVAL int ffcrow(fptr,datatype,expr,firstrow,nelements,nulval,array,anynul,status) FitsFile * fptr int datatype char * expr long firstrow long nelements SV * nulval void * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_calc_rows = 1 fitsfilePtr::calc_rows = 2 CODE: array = get_mortalspace(nelements,datatype); RETVAL=ffcrow( fptr->fptr,datatype,expr,firstrow,nelements, (nulval!=&PL_sv_undef) ? pack1D(nulval,datatype):NULL, array,&anynul,&status ); FIXME("ffcrow: I should be calling fftexp (no harm done, however)"); unpack1D(ST(6),array,nelements,datatype,fptr->perlyunpacking); OUTPUT: anynul status RETVAL int ffcalc(infptr, expr, outfptr, parName, parInfo, status) fitsfile * infptr char * expr fitsfile * outfptr char * parName char * parInfo int &status ALIAS: Astro::FITS::CFITSIO::fits_calculator = 1 fitsfilePtr::calculator = 2 OUTPUT: status int ffcalc_rng(infptr, expr, outfptr, parName, parInfo, nranges, firstrow, lastrow, status) fitsfile * infptr char * expr fitsfile * outfptr char * parName char * parInfo int nranges long * firstrow long * lastrow int &status ALIAS: Astro::FITS::CFITSIO::fits_calculator_rng = 1 fitsfilePtr::calculator_rng = 2 OUTPUT: status int ffgtch(gfptr,grouptype,status) fitsfile * gfptr int grouptype int &status ALIAS: Astro::FITS::CFITSIO::fits_change_group = 1 fitsfilePtr::change_group = 2 OUTPUT: status void ffpmrk() ALIAS: Astro::FITS::CFITSIO::fits_write_errmark = 1 void ffcmrk() ALIAS: Astro::FITS::CFITSIO::fits_clear_errmark = 1 void ffcmsg() ALIAS: Astro::FITS::CFITSIO::fits_clear_errmsg = 1 int ffclos(fptr, status) FitsFile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_close_file = 1 fitsfilePtr::close_file = 2 CODE: RETVAL = ffclos(fptr->fptr, &status); fptr->is_open = 0; OUTPUT: RETVAL status int ffgtcm(gfptr,cmopt,status) fitsfile * gfptr int cmopt int &status ALIAS: Astro::FITS::CFITSIO::fits_compact_group = 1 fitsfilePtr::compact_group = 2 OUTPUT: status void ffcmps(templt,string,casesen,match,exact) char * templt char * string int casesen int &match int &exact ALIAS: Astro::FITS::CFITSIO::fits_compare_str = 1 OUTPUT: match exact int ffcmph(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_compress_heap = 1 fitsfilePtr::compress_heap = 2 OUTPUT: status int ffcpcl(infptr,outfptr,incolnum,outcolnum,create_col,status) fitsfile * infptr fitsfile * outfptr int incolnum int outcolnum int create_col int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_col = 1 fitsfilePtr::copy_col = 2 OUTPUT: status int ffcprw(infptr,outfptr,firstrow,nrows,status) fitsfile * infptr fitsfile * outfptr LONGLONG firstrow LONGLONG nrows int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_rows = 1 fitsfilePtr::copy_rows = 2 OUTPUT: status int ffcpdt(infptr,outfptr,status) fitsfile * infptr fitsfile * outfptr int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_data = 1 fitsfilePtr::copy_data = 2 OUTPUT: status int ffwrhdu(infptr, stream, status) fitsfile * infptr FILE * stream int &status ALIAS: Astro::FITS::CFITSIO::fits_write_hdu = 1 fitsfilePtr::write_hdu = 2 OUTPUT: status int ffgtcp(infptr,outfptr,cpopt,status) fitsfile * infptr fitsfile * outfptr int cpopt int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_group = 1 fitsfilePtr::copy_group = 2 OUTPUT: status int ffcpfl(infptr,outfptr,previous,current,following,status) fitsfile * infptr fitsfile * outfptr int previous int current int following int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_file = 1 fitsfilePtr::copy_file = 2 OUTPUT: status int ffcopy(infptr,outfptr,morekeys,status) fitsfile * infptr fitsfile * outfptr int morekeys int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_hdu = 1 fitsfilePtr::copy_hdu = 2 OUTPUT: status int ffcphd(infptr,outfptr,status) fitsfile * infptr fitsfile * outfptr int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_header = 1 fitsfilePtr::copy_header = 2 OUTPUT: status int ffcpky(infptr,outfptr,innum,outnum,keyroot,status) fitsfile * infptr fitsfile * outfptr int innum int outnum char * keyroot int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_key = 1 fitsfilePtr::copy_key = 2 OUTPUT: status int ffgmcp(gfptr,mfptr,member,cpopt,status) fitsfile * gfptr fitsfile * mfptr long member int cpopt int &status ALIAS: Astro::FITS::CFITSIO::fits_copy_member = 1 fitsfilePtr::copy_member = 2 OUTPUT: status FitsFile * create_file(name,status) char * name int status PREINIT: FitsFile* fptr; CODE: NewFitsFile(fptr); if (ffinit(&(fptr->fptr),name,&status)) AbortFitsFile(fptr); RETVAL = fptr; OUTPUT: RETVAL status int ffinit(fptr,name,status) FitsFile * fptr = NO_INIT char * name int status ALIAS: Astro::FITS::CFITSIO::fits_create_file = 1 CODE: NewFitsFile(fptr); RETVAL = ffinit(&(fptr->fptr),name,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffdkinit(fptr,name,status) FitsFile * fptr = NO_INIT char * name int status ALIAS: Astro::FITS::CFITSIO::fits_create_diskfile = 1 CODE: NewFitsFile(fptr); RETVAL = ffdkinit(&(fptr->fptr),name,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffgtcr(fptr,grpname,grouptype,status) fitsfile * fptr char * grpname int grouptype int &status ALIAS: Astro::FITS::CFITSIO::fits_create_group = 1 fitsfilePtr::create_group = 2 OUTPUT: status int ffcrhd(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_create_hdu = 1 fitsfilePtr::create_hdu = 2 OUTPUT: status int ffcrim(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis long * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_create_img = 1 fitsfilePtr::create_img = 2 OUTPUT: status int ffcrimll(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis LONGLONG * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_create_imgll = 1 fitsfilePtr::create_imgll = 2 OUTPUT: status int ffcrtb(fptr,tbltype,naxis2,tfields,ttype,tform,tunit,extname,status) fitsfile * fptr int tbltype LONGLONG naxis2 int tfields char ** ttype char ** tform char ** tunit char * extname int &status ALIAS: Astro::FITS::CFITSIO::fits_create_tbl = 1 fitsfilePtr::create_tbl = 2 OUTPUT: status FitsFile * create_template(filename,tpltfile,status) char * filename char * tpltfile int status PREINIT: FitsFile * fptr; CODE: NewFitsFile(fptr); if (fftplt(&(fptr->fptr),filename,tpltfile,&status)) AbortFitsFile(fptr); RETVAL = fptr; OUTPUT: RETVAL status int fftplt(fptr,filename,tpltfile,status) FitsFile * &fptr = NO_INIT char * filename char * tpltfile int &status ALIAS: Astro::FITS::CFITSIO::fits_create_template = 1 CODE: NewFitsFile(fptr); RETVAL = fftplt(&(fptr->fptr),filename,tpltfile,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffdt2s(year,month,day,datestr,status) int year int month int day char * datestr = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_date2str = 1 CODE: datestr = get_mortalspace(11,TBYTE); /* YYYY-MM-DD or dd/mm/yy */ RETVAL=ffdt2s(year,month,day,datestr,&status); OUTPUT: datestr status RETVAL unsigned long ffdsum(ascii,complm,sum) char * ascii int complm unsigned long &sum ALIAS: Astro::FITS::CFITSIO::fits_decode_chksum = 1 OUTPUT: sum int ffdtdm(fptr,tdimstr,colnum,naxis,naxes,status) FitsFile * fptr char * tdimstr int colnum int naxis = NO_INIT long * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_decode_tdim = 1 fitsfilePtr::decode_tdim = 2 CODE: if (ST(4)!=&PL_sv_undef) { /* caller wants naxes set */ ffdtdm(fptr->fptr,tdimstr,colnum,0,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONG); } else { naxes = NULL; naxis = 0; } RETVAL=ffdtdm(fptr->fptr,tdimstr,colnum,naxis,&naxis,naxes,&status); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int ffdtdmll(fptr,tdimstr,colnum,naxis,naxes,status) FitsFile * fptr char * tdimstr int colnum int naxis = NO_INIT LONGLONG * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_decode_tdimll = 1 fitsfilePtr::decode_tdimll = 2 CODE: if (ST(4)!=&PL_sv_undef) { /* caller wants naxes set */ ffdtdmll(fptr->fptr,tdimstr,colnum,0,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONGLONG); } else { naxes = NULL; naxis = 0; } RETVAL=ffdtdmll(fptr->fptr,tdimstr,colnum,naxis,&naxis,naxes,&status); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONGLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int fits_decomp_img(infptr,outfptr,status) fitsfile * infptr fitsfile * outfptr int &status ALIAS: Astro::FITS::CFITSIO::fits_decompress_img = 1 fitsfilePtr::decompress_img = 2 OUTPUT: status int ffdcol(fptr,colnum,status) fitsfile * fptr int colnum int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_col = 1 fitsfilePtr::delete_col = 2 OUTPUT: status int ffdelt(fptr,status) FitsFile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_file = 1 fitsfilePtr::delete_file = 2 CODE: RETVAL = ffdelt(fptr->fptr, &status ); fptr->is_open = 0; OUTPUT: RETVAL status int ffdhdu(fptr,hdutype,status) fitsfile * fptr int hdutype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_delete_hdu = 1 fitsfilePtr::delete_hdu = 2 CODE: RETVAL = ffdhdu(fptr,&hdutype,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),hdutype); OUTPUT: status RETVAL int ffdkey(fptr,keyname,status) fitsfile * fptr char * keyname int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_key = 1 fitsfilePtr::delete_key = 2 OUTPUT: status int ffdrec(fptr,keynum,status) fitsfile * fptr int keynum int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_record = 1 fitsfilePtr::delete_record = 2 OUTPUT: status int ffdrrg(fptr,rangelist,status) fitsfile * fptr char * rangelist int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_rowrange = 1 fitsfilePtr::delete_rowrange = 2 OUTPUT: status int ffdrws(fptr,rowlist,nrows,status) fitsfile * fptr long * rowlist long nrows int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_rowlist = 1 fitsfilePtr::delete_rowlist = 2 OUTPUT: status int ffdrwsll(fptr,rowlist,nrows,status) fitsfile * fptr LONGLONG* rowlist LONGLONG nrows int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_rowlistll = 1 fitsfilePtr::delete_rowlistll = 2 OUTPUT: status int ffdrow(fptr,firstrow,nrows,status) fitsfile * fptr LONGLONG firstrow LONGLONG nrows int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_rows = 1 fitsfilePtr::delete_rows = 2 OUTPUT: status void ffesum(sum,complm,ascii) unsigned long sum int complm char * ascii = NO_INIT ALIAS: Astro::FITS::CFITSIO::fits_encode_chksum = 1 CODE: ascii = get_mortalspace(17,TBYTE); ffesum(sum,complm,ascii); OUTPUT: ascii int ffexist(filename, exists, status) char* filename int &exists = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_file_exists = 1 OUTPUT: exists status int ffflmd(fptr,iomode,status) fitsfile * fptr int &iomode = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_file_mode = 1 fitsfilePtr::file_mode = 2 OUTPUT: iomode status int ffflnm(fptr,filename,status) fitsfile * fptr char * filename = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_file_name = 1 fitsfilePtr::file_name = 2 CODE: filename = get_mortalspace(FLEN_FILENAME,TBYTE); RETVAL=ffflnm(fptr,filename,&status); OUTPUT: filename status RETVAL int ffgnxk(fptr,inclist,ninc,exclist,nexc,card,status) fitsfile * fptr char ** inclist int ninc char ** exclist int nexc char * card = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_find_nextkey = 1 fitsfilePtr::find_nextkey = 2 CODE: card = get_mortalspace(FLEN_CARD,TBYTE); RETVAL=ffgnxk(fptr,inclist,ninc,exclist,nexc,card,&status); OUTPUT: card status RETVAL int ffffrw(fptr, expr, rownum, status) fitsfile * fptr char * expr long &rownum = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_find_first_row = 1 fitsfilePtr::find_first_row = 2 OUTPUT: rownum status int fffrow(fptr,expr,firstrow,nrows,n_good_rows,row_status,status) FitsFile * fptr char * expr long firstrow long nrows long n_good_rows = NO_INIT logical * row_status = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_find_rows = 1 fitsfilePtr::find_rows = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nrows*sizeof_datatype(TLOGICAL)); RETVAL=fffrow(fptr->fptr,expr,firstrow,nrows,&n_good_rows,(logical*)SvPV(ST(5),PL_na),&status); } else { row_status = get_mortalspace(nrows,TLOGICAL); RETVAL=fffrow(fptr->fptr,expr,firstrow,nrows,&n_good_rows,row_status,&status); unpack1D(ST(5),row_status,nrows,TLOGICAL,fptr->perlyunpacking); } if (ST(4) != &PL_sv_undef) sv_setiv(ST(4), n_good_rows); /* value-added */ OUTPUT: status RETVAL int ffflus(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_flush_file = 1 fitsfilePtr::flush_file = 2 OUTPUT: status int ffflsh(fptr, clearbuf, status) fitsfile * fptr int clearbuf int &status ALIAS: Astro::FITS::CFITSIO::fits_flush_buffer = 1 fitsfilePtr::flush_buffer = 2 OUTPUT: status int ffgacl(fptr,colnum,ttype,tbcol,tunit,tform,scale,zero,nulstr,tdisp,status) fitsfile * fptr int colnum char * ttype = NO_INIT long tbcol = NO_INIT char * tunit = NO_INIT char * tform = NO_INIT double scale = NO_INIT double zero = NO_INIT char * nulstr = NO_INIT char * tdisp = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_acolparms = 1 fitsfilePtr::get_acolparms = 2 CODE: ttype = (ST(2) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tunit = (ST(4) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tform = (ST(5) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; nulstr= (ST(8) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tdisp = (ST(9) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; RETVAL=ffgacl(fptr,colnum,ttype,&tbcol,tunit,tform,&scale,&zero,nulstr,tdisp,&status); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),tbcol); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),scale); if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),zero); OUTPUT: ttype tunit tform nulstr tdisp status RETVAL int ffgbcl(fptr,colnum,ttype,tunit,dtype,repeat,scale,zero,nulval,tdisp,status) fitsfile * fptr int colnum char * ttype = NO_INIT char * tunit = NO_INIT char * dtype = NO_INIT long repeat = NO_INIT double scale = NO_INIT double zero = NO_INIT long nulval = NO_INIT char * tdisp = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_bcolparms = 1 fitsfilePtr::get_bcolparms = 2 CODE: ttype = (ST(2) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tunit = (ST(3) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; dtype = (ST(4) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tdisp = (ST(9) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; RETVAL=ffgbcl(fptr,colnum,ttype,tunit,dtype,&repeat,&scale,&zero,&nulval,tdisp,&status); if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),repeat); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),scale); if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),zero); if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),nulval); OUTPUT: ttype tunit dtype tdisp status RETVAL int ffgbclll(fptr,colnum,ttype,tunit,dtype,repeat,scale,zero,nulval,tdisp,status) fitsfile * fptr int colnum char * ttype = NO_INIT char * tunit = NO_INIT char * dtype = NO_INIT LONGLONG repeat = NO_INIT double scale = NO_INIT double zero = NO_INIT LONGLONG nulval = NO_INIT char * tdisp = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_bcolparmsll = 1 fitsfilePtr::get_bcolparmsll = 2 CODE: ttype = (ST(2) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tunit = (ST(3) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; dtype = (ST(4) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; tdisp = (ST(9) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; RETVAL=ffgbclll(fptr,colnum,ttype,tunit,dtype,&repeat,&scale,&zero,&nulval,tdisp,&status); if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),repeat); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),scale); if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),zero); if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),nulval); OUTPUT: ttype tunit dtype tdisp status RETVAL int ffgcks(fptr,datasum,hdusum,status) fitsfile * fptr unsigned long datasum = NO_INIT unsigned long hdusum = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_chksum = 1 fitsfilePtr::get_chksum = 2 CODE: RETVAL = ffgcks(fptr,&datasum,&hdusum,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1), datasum); /* value-added */ if (ST(2) != &PL_sv_undef) sv_setiv(ST(2), hdusum); /* value-added */ OUTPUT: status RETVAL int ffgcnn(fptr,casesen,templt,colname,colnum,status) fitsfile * fptr int casesen char * templt char * colname = NO_INIT int colnum = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_colname = 1 fitsfilePtr::get_colname = 2 CODE: colname = get_mortalspace(FLEN_KEYWORD,TBYTE); RETVAL=ffgcnn(fptr,casesen,templt,colname,&colnum,&status); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),colnum); /* value-added */ OUTPUT: colname status RETVAL int ffgcno(fptr,casesen,templt,colnum,status) fitsfile * fptr int casesen char * templt int colnum = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_colnum = 1 fitsfilePtr::get_colnum = 2 CODE: RETVAL = fits_get_colnum(fptr,casesen,templt,&colnum,&status); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),colnum); OUTPUT: status RETVAL int ffgtcl(fptr,colnum,typecode,repeat,width,status) fitsfile * fptr int colnum int typecode = NO_INIT long repeat = NO_INIT long width = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_coltype = 1 fitsfilePtr::get_coltype = 2 CODE: RETVAL = ffgtcl(fptr,colnum,&typecode,&repeat,&width,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width); OUTPUT: status RETVAL int ffgtclll(fptr,colnum,typecode,repeat,width,status) fitsfile * fptr int colnum int typecode = NO_INIT LONGLONG repeat = NO_INIT LONGLONG width = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_coltypell = 1 fitsfilePtr::get_coltypell = 2 CODE: RETVAL = ffgtclll(fptr,colnum,&typecode,&repeat,&width,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width); OUTPUT: status RETVAL int ffeqty(fptr,colnum,typecode,repeat,width,status) fitsfile * fptr int colnum int typecode = NO_INIT long repeat = NO_INIT long width = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_eqcoltype = 1 fitsfilePtr::get_eqcoltype = 2 CODE: RETVAL = ffeqty(fptr,colnum,&typecode,&repeat,&width,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width); OUTPUT: status RETVAL int ffeqtyll(fptr,colnum,typecode,repeat,width,status) fitsfile * fptr int colnum int typecode = NO_INIT LONGLONG repeat = NO_INIT LONGLONG width = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_eqcoltypell = 1 fitsfilePtr::get_eqcoltypell = 2 CODE: RETVAL = ffeqtyll(fptr,colnum,&typecode,&repeat,&width,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width); OUTPUT: status RETVAL int fits_get_compression_type(fptr, comptype, status) fitsfile *fptr int &comptype = NO_INIT int &status ALIAS: fitsfilePtr::get_compression_type = 1 OUTPUT: comptype status void ffgerr(status,err_text) int status char * err_text = NO_INIT ALIAS: Astro::FITS::CFITSIO::fits_get_errstatus = 1 CODE: err_text = get_mortalspace(FLEN_ERRMSG,TBYTE); ffgerr(status,err_text); OUTPUT: err_text int ffghps(fptr,keysexist,keynum,status) fitsfile * fptr int keysexist = NO_INIT int keynum = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_hdrpos = 1 fitsfilePtr::get_hdrpos = 2 CODE: RETVAL = ffghps(fptr,&keysexist,&keynum,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),keysexist); /* value-added */ if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),keynum); /* value-added */ OUTPUT: status RETVAL int ffghsp(fptr,keysexist,morekeys,status) fitsfile * fptr int keysexist = NO_INIT int morekeys = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_hdrspace = 1 fitsfilePtr::get_hdrspace = 2 CODE: RETVAL = ffghsp(fptr,&keysexist,&morekeys,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),keysexist); /* value-added */ if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),morekeys); /* value-added */ OUTPUT: status RETVAL int ffghdn(fptr,hdunum) fitsfile * fptr int hdunum = NO_INIT ALIAS: Astro::FITS::CFITSIO::fits_get_hdu_num = 1 fitsfilePtr::get_hdu_num = 2 CODE: RETVAL = ffghdn(fptr,&hdunum); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),hdunum); OUTPUT: RETVAL int ffghdt(fptr,hdutype,status) fitsfile * fptr int &hdutype = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_hdu_type = 1 fitsfilePtr::get_hdu_type = 2 OUTPUT: hdutype status int ffghad(fptr,headstart,datastart,dataend,status) fitsfile * fptr long headstart = NO_INIT long datastart = NO_INIT long dataend = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_hduaddr = 1 fitsfilePtr::get_hduaddr = 2 CODE: RETVAL = ffghad(fptr,&headstart,&datastart,&dataend,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),headstart); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),datastart); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),dataend); OUTPUT: status RETVAL int ffghadll(fptr,headstart,datastart,dataend,status) fitsfile * fptr LONGLONG headstart = NO_INIT LONGLONG datastart = NO_INIT LONGLONG dataend = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_hduaddrll = 1 fitsfilePtr::get_hduaddrll = 2 CODE: RETVAL = ffghadll(fptr,&headstart,&datastart,&dataend,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),headstart); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),datastart); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),dataend); OUTPUT: status RETVAL int ffghof(fptr, headstart, datastart, dataend, status) fitsfile * fptr OFF_T headstart = NO_INIT OFF_T datastart = NO_INIT OFF_T dataend = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_hduoff = 1 fitsfilePtr::get_hduoff = 2 CODE: RETVAL = ffghof(fptr,&headstart,&datastart,&dataend,&status); if (ST(1) != &PL_sv_undef) sv_setuv(ST(1),headstart); if (ST(2) != &PL_sv_undef) sv_setuv(ST(2),datastart); if (ST(3) != &PL_sv_undef) sv_setuv(ST(3),dataend); OUTPUT: status RETVAL int ffgknm(card,name,len,status) char * card char * name = NO_INIT int len = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_keyname = 1 CODE: name = get_mortalspace(FLEN_KEYWORD,TBYTE); RETVAL = ffgknm(card,name,&len,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2), len); OUTPUT: name status RETVAL int ffdtyp(value,dtype,status) char * value char &dtype = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_keytype = 1 OUTPUT: dtype status int ffgidt(fptr,bitpix,status) fitsfile * fptr int &bitpix = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_img_type = 1 fitsfilePtr::get_img_type = 2 OUTPUT: bitpix status int ffinttyp(value,inttype,neg,status) char * value int &inttype = NO_INIT int &neg = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_inttype = 1 OUTPUT: inttype neg status int ffgiet(fptr,bitpix,status) fitsfile * fptr int &bitpix = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_img_equivtype = 1 fitsfilePtr::get_img_equivtype = 2 OUTPUT: bitpix status int ffgidm(fptr,naxis,status) fitsfile * fptr int &naxis = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_img_dim = 1 fitsfilePtr::get_img_dim = 2 OUTPUT: naxis status int ffgisz(fptr,naxes,status) FitsFile * fptr long *naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_img_size = 1 fitsfilePtr::get_img_size = 2 PREINIT: int nlen; CODE: RETVAL = ffgidm(fptr->fptr,&nlen,&status); if (RETVAL <= 0) { naxes = get_mortalspace(nlen,TLONG); RETVAL = ffgisz(fptr->fptr,nlen,naxes,&status); /* unpack as Perl array */ unpack1D(ST(1),naxes,nlen,TLONG,1); } OUTPUT: status RETVAL int ffgiszll(fptr,naxes,status) FitsFile * fptr LONGLONG *naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_img_sizell = 1 fitsfilePtr::get_img_sizell = 2 PREINIT: int nlen; CODE: RETVAL = ffgidm(fptr->fptr,&nlen,&status); if (RETVAL <= 0) { naxes = get_mortalspace(nlen,TLONGLONG); RETVAL = ffgiszll(fptr->fptr,nlen,naxes,&status); /* unpack as Perl array */ unpack1D(ST(1),naxes,nlen,TLONGLONG,1); } OUTPUT: status RETVAL int fits_get_noise_bits(fptr, noisebits, status) fitsfile *fptr int &noisebits = NO_INIT int &status ALIAS: fitsfilePtr::get_noise_bits = 1 OUTPUT: noisebits status int ffgncl(fptr,ncols,status) fitsfile * fptr int &ncols = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_num_cols = 1 fitsfilePtr::get_num_cols = 2 OUTPUT: ncols status int ffgmng(mfptr,nmembers,status) fitsfile * mfptr long &nmembers = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_num_groups = 1 fitsfilePtr::get_num_groups = 2 OUTPUT: nmembers status int ffthdu(fptr,hdunum,status) fitsfile * fptr int &hdunum = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_num_hdus = 1 fitsfilePtr::get_num_hdus = 2 OUTPUT: hdunum status int ffgtnm(gfptr,nmembers,status) fitsfile * gfptr long &nmembers = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_num_members = 1 fitsfilePtr::get_num_members = 2 OUTPUT: nmembers status int ffgnrw(fptr,nrows,status) fitsfile * fptr long &nrows = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_num_rows = 1 fitsfilePtr::get_num_rows = 2 OUTPUT: nrows status int ffgnrwll(fptr,nrows,status) fitsfile * fptr LONGLONG &nrows = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_num_rowsll = 1 fitsfilePtr::get_num_rowsll = 2 OUTPUT: nrows status int ffgrsz(fptr,nrows,status) fitsfile * fptr long &nrows = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_rowsize = 1 fitsfilePtr::get_rowsize = 2 OUTPUT: nrows status int ffgstm(timestr,timeref,status) char * timestr = NO_INIT int timeref = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_system_time = 1 CODE: timestr = get_mortalspace(20,TBYTE); /* YYYY-MM-DDThh:mm:ss */ RETVAL=ffgstm(timestr,&timeref,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),timeref); OUTPUT: timestr status RETVAL int ffgabc(tfields,tform,space,rowlen,tbcol,status) int tfields char ** tform int space long rowlen = NO_INIT long * tbcol = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_tbcol = 1 CODE: tbcol = get_mortalspace(tfields,TLONG); RETVAL=ffgabc(tfields,tform,space,&rowlen,tbcol,&status); unpack1D(ST(4),tbcol,tfields,TLONG,-1); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),rowlen); /* value-added */ OUTPUT: status RETVAL int fits_get_tile_dim(fptr, ndim, tilesize, status) FitsFile *fptr int ndim long *naxes = NO_INIT int status ALIAS: fitsfilePtr::get_tile_dim = 1 CODE: naxes = get_mortalspace(ndim,TLONG); RETVAL=fits_get_tile_dim(fptr->fptr,ndim,naxes,&status); if (ST(2)!=&PL_sv_undef) unpack1D(ST(2),naxes,ndim,TLONG,fptr->perlyunpacking); OUTPUT: status RETVAL float ffvers(version) float version = NO_INIT ALIAS: Astro::FITS::CFITSIO::fits_get_version = 1 CODE: RETVAL = ffvers(&version); if (ST(0) != &PL_sv_undef) sv_setnv(ST(0),version); /* value-added */ OUTPUT: RETVAL int ffhdr2str(fptr, nocomments, header, nkeys, status) FitsFile *fptr int nocomments char *header = NO_INIT int nkeys = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_hdr2str = 1 fitsfilePtr::hdr2str = 2 CODE: RETVAL=fits_hdr2str(fptr->fptr,nocomments,NULL,0,&header,&nkeys,&status); if (ST(2)!=&PL_sv_undef) unpackScalar(ST(2), header, TSTRING); if (ST(3)!=&PL_sv_undef) unpackScalar(ST(3), &nkeys, TINT); free(header); OUTPUT: status RETVAL int ffcnvthdr2str(fptr, nocomments, header, nkeys, status) FitsFile *fptr int nocomments char *header = NO_INIT int nkeys = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_convert_hdr2str = 1 fitsfilePtr::convert_hdr2str = 2 CODE: RETVAL=fits_hdr2str(fptr->fptr,nocomments,NULL,0,&header,&nkeys,&status); if (ST(2)!=&PL_sv_undef) unpackScalar(ST(2), header, TSTRING); if (ST(3)!=&PL_sv_undef) unpackScalar(ST(3), &nkeys, TINT); free(header); OUTPUT: status RETVAL int ffitab(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status) fitsfile * fptr LONGLONG rowlen LONGLONG nrows int tfields char ** ttype long * tbcol char ** tform char ** tunit char * extname int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_atbl = 1 fitsfilePtr::insert_atbl = 2 OUTPUT: status int ffibin(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status) fitsfile * fptr LONGLONG nrows int tfields char ** ttype char ** tform char ** tunit char * extname LONGLONG pcount int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_btbl = 1 fitsfilePtr::insert_btbl = 2 OUTPUT: status int fficol(fptr,colnum,ttype,tform,status) fitsfile * fptr int colnum char * ttype char * tform int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_col = 1 fitsfilePtr::insert_col = 2 OUTPUT: status int fficls(fptr,colnum,ncols,ttype,tform,status) fitsfile * fptr int colnum int ncols char ** ttype char ** tform int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_cols = 1 fitsfilePtr::insert_cols = 2 OUTPUT: status int ffgtis(fptr,grpname,grouptype,status) fitsfile * fptr char * grpname int grouptype int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_group = 1 fitsfilePtr::insert_group = 2 OUTPUT: status int ffiimg(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis long * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_img = 1 fitsfilePtr::insert_img = 2 OUTPUT: status int ffiimgll(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis LONGLONG * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_imgll = 1 fitsfilePtr::insert_imgll = 2 OUTPUT: status int ffikyu(fptr,keyname,comment,status) fitsfile * fptr char * keyname char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_null = 1 fitsfilePtr::insert_key_null = 2 OUTPUT: status int ffikys(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname char * value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_str = 1 fitsfilePtr::insert_key_str = 2 OUTPUT: status int ffikyl(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname int value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_log = 1 fitsfilePtr::insert_key_log = 2 OUTPUT: status int ffikyj(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname LONGLONG value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_lng = 1 fitsfilePtr::insert_key_lng = 2 OUTPUT: status int ffikye(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_flt = 1 fitsfilePtr::insert_key_flt = 2 OUTPUT: status int ffikyf(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_fixflt = 1 fitsfilePtr::insert_key_fixflt = 2 OUTPUT: status int ffikyd(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_dbl = 1 fitsfilePtr::insert_key_dbl = 2 OUTPUT: status int ffikyg(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_fixdbl = 1 fitsfilePtr::insert_key_fixdbl = 2 OUTPUT: status int ffikyc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_cmp = 1 fitsfilePtr::insert_key_cmp = 2 OUTPUT: status int ffikfc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_fixcmp = 1 fitsfilePtr::insert_key_fixcmp = 2 OUTPUT: status int ffikym(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_dblcmp = 1 fitsfilePtr::insert_key_dblcmp = 2 OUTPUT: status int ffikfm(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_fixdblcmp = 1 fitsfilePtr::insert_key_fixdblcmp = 2 OUTPUT: status int ffirec(fptr,keynum,card,status) fitsfile * fptr int keynum char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_record = 1 fitsfilePtr::insert_record = 2 OUTPUT: status int ffikey(fptr,card,status) fitsfile * fptr char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_card = 1 fitsfilePtr::insert_card = 2 OUTPUT: status int ffirow(fptr,firstrow,nrows,status) fitsfile * fptr LONGLONG firstrow LONGLONG nrows int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_rows = 1 fitsfilePtr::insert_rows = 2 OUTPUT: status int ffkeyn(keyroot,value,keyname,status) char * keyroot int value char * keyname = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_make_keyn = 1 CODE: keyname = get_mortalspace(FLEN_KEYWORD,TBYTE); RETVAL=ffkeyn(keyroot,value,keyname,&status); OUTPUT: keyname status RETVAL int ffnkey(value,keyroot,keyname,status) int value char * keyroot char * keyname = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_make_nkey = 1 CODE: keyname = get_mortalspace(FLEN_KEYWORD,TBYTE); RETVAL=ffnkey(value,keyroot,keyname,&status); OUTPUT: keyname status RETVAL int ffmkky(keyname, value, comm, card, status) const char * keyname char * value const char * comm char * card = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_make_key = 1 CODE: card = get_mortalspace(FLEN_CARD, TBYTE); RETVAL=ffmkky(keyname, value, comm, card, &status); OUTPUT: card status RETVAL int ffgtmg(infptr,outfptr,mgopt,status) fitsfile * infptr fitsfile * outfptr int mgopt int &status ALIAS: Astro::FITS::CFITSIO::fits_merge_groups = 1 fitsfilePtr::merge_groups = 2 OUTPUT: status int ffmbyt(fptr, bytepos, err_mode, status) fitsfile * fptr LONGLONG bytepos int err_mode int &status ALIAS: Astro::FITS::CFITSIO::fits_seek = 1 fitsfilePtr::seek = 2 OUTPUT: status int ffmcrd(fptr,keyname,card,status) fitsfile * fptr char * keyname char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_card = 1 fitsfilePtr::modify_card = 2 OUTPUT: status int ffmcom(fptr,keyname,comment,status) fitsfile * fptr char * keyname char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_comment = 1 fitsfilePtr::modify_comment = 2 OUTPUT: status int ffmkyu(fptr,keyname,comment,status) fitsfile * fptr char * keyname char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_null = 1 fitsfilePtr::modify_key_null = 2 OUTPUT: status int ffmkys(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname char * value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_str = 1 fitsfilePtr::modify_key_str = 2 OUTPUT: status int ffmkyl(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname int value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_log = 1 fitsfilePtr::modify_key_log = 2 OUTPUT: status int ffmkyj(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname LONGLONG value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_lng = 1 fitsfilePtr::modify_key_lng = 2 OUTPUT: status int ffmkye(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_flt = 1 fitsfilePtr::modify_key_flt = 2 OUTPUT: status int ffmkyf(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_fixflt = 1 fitsfilePtr::modify_key_fixflt = 2 OUTPUT: status int ffmkyd(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_dbl = 1 fitsfilePtr::modify_key_dbl = 2 OUTPUT: status int ffmkyg(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_fixdbl = 1 fitsfilePtr::modify_key_fixdbl = 2 OUTPUT: status int ffmkyc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_cmp = 1 fitsfilePtr::modify_key_cmp = 2 OUTPUT: status int ffmkfc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_fixcmp = 1 fitsfilePtr::modify_key_fixcmp = 2 OUTPUT: status int ffmkym(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_dblcmp = 1 fitsfilePtr::modify_key_dblcmp = 2 OUTPUT: status int ffmkfm(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_fixdblcmp = 1 fitsfilePtr::modify_key_fixdblcmp = 2 OUTPUT: status int ffmnam(fptr,oldname,newname,status) fitsfile * fptr char * oldname char * newname int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_name = 1 fitsfilePtr::modify_name = 2 OUTPUT: status int ffmrec(fptr,keynum,card,status) fitsfile * fptr int keynum char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_record = 1 fitsfilePtr::modify_record = 2 OUTPUT: status int ffmvec(fptr,colnum,newveclen,status) fitsfile * fptr int colnum LONGLONG newveclen int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_vector_len = 1 fitsfilePtr::modify_vector_len = 2 OUTPUT: status int ffmahd(fptr,hdunum,hdutype,status) fitsfile * fptr int hdunum int hdutype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_movabs_hdu = 1 fitsfilePtr::movabs_hdu = 2 CODE: RETVAL = ffmahd(fptr,hdunum,&hdutype,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),hdutype); OUTPUT: status RETVAL int ffmnhd(fptr,hdutype,extname,extvers,status) fitsfile * fptr int hdutype char * extname int extvers int &status ALIAS: Astro::FITS::CFITSIO::fits_movnam_hdu = 1 fitsfilePtr::movnam_hdu = 2 OUTPUT: status int ffmrhd(fptr,nmove,hdutype,status) fitsfile * fptr int nmove int hdutype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_movrel_hdu = 1 fitsfilePtr::movrel_hdu = 2 CODE: RETVAL = ffmrhd(fptr,nmove,&hdutype,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),hdutype); OUTPUT: status RETVAL int ffnchk(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_null_check = 1 fitsfilePtr::null_check = 2 OUTPUT: status FitsFile* open_file(filename,iomode,status) char * filename int iomode int status PREINIT: FitsFile * fptr; CODE: if (!filename) /* undef passed */ filename = ""; NewFitsFile(fptr); if (ffopen(&(fptr->fptr),filename,iomode,&status)) AbortFitsFile(fptr); RETVAL = fptr; OUTPUT: RETVAL status int ffopen(fptr,filename,iomode,status) FitsFile * fptr = NO_INIT char * filename int iomode int status ALIAS: Astro::FITS::CFITSIO::fits_open_file = 1 CODE: if (!filename) /* undef passed */ filename = ""; NewFitsFile(fptr); RETVAL = ffopen(&(fptr->fptr),filename,iomode,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffdkopn(fptr,filename,iomode,status) FitsFile * fptr = NO_INIT char * filename int iomode int status ALIAS: Astro::FITS::CFITSIO::fits_open_diskfile = 1 CODE: if (!filename) /* undef passed */ filename = ""; NewFitsFile(fptr); RETVAL = ffdkopn(&(fptr->fptr),filename,iomode,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffdopn(fptr,filename,iomode,status) FitsFile * fptr = NO_INIT char * filename int iomode int status ALIAS: Astro::FITS::CFITSIO::fits_open_data = 1 CODE: if (!filename) /* undef passed */ filename = ""; NewFitsFile(fptr); RETVAL = ffdopn(&(fptr->fptr),filename,iomode,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffiopn(fptr,filename,iomode,status) FitsFile * fptr = NO_INIT char * filename int iomode int status ALIAS: Astro::FITS::CFITSIO::fits_open_image = 1 CODE: if (!filename) /* undef passed */ filename = ""; NewFitsFile(fptr); RETVAL = ffiopn(&(fptr->fptr),filename,iomode,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int fftopn(fptr,filename,iomode,status) FitsFile * fptr = NO_INIT char * filename int iomode int status ALIAS: Astro::FITS::CFITSIO::fits_open_table = 1 CODE: if (!filename) /* undef passed */ filename = ""; NewFitsFile(fptr); RETVAL = fftopn(&(fptr->fptr),filename,iomode,&status); if (RETVAL) AbortFitsFile(fptr); OUTPUT: RETVAL fptr status int ffgtop(mfptr,group,gfptr,status) fitsfile * mfptr int group FitsFile * gfptr = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_open_group = 1 fitsfilePtr::open_group = 2 CODE: NewFitsFile(gfptr); RETVAL = ffgtop(mfptr,group,&(gfptr->fptr),&status); if (RETVAL) AbortFitsFile(gfptr); OUTPUT: RETVAL gfptr status int ffgmop(gfptr,member,mfptr,status) fitsfile * gfptr long member FitsFile * mfptr = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_open_member = 1 fitsfilePtr::open_member = 2 CODE: NewFitsFile(mfptr); RETVAL = ffgmop(gfptr,member,&(mfptr->fptr),&status); if (RETVAL) AbortFitsFile(mfptr); OUTPUT: status mfptr RETVAL int ffextn(filename,hdunum,status) char * filename int &hdunum = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_parse_extnum = 1 OUTPUT: hdunum status int ffiurl(filename,urltype,infile,outfile,extspec,filter,binspec,colspec,status) char * filename char * urltype = NO_INIT char * infile = NO_INIT char * outfile = NO_INIT char * extspec = NO_INIT char * filter = NO_INIT char * binspec = NO_INIT char * colspec = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_input_url = 1 CODE: urltype = get_mortalspace(FLEN_FILENAME,TBYTE); infile = get_mortalspace(FLEN_FILENAME,TBYTE); outfile = get_mortalspace(FLEN_FILENAME,TBYTE); extspec = get_mortalspace(FLEN_FILENAME,TBYTE); filter = get_mortalspace(FLEN_FILENAME,TBYTE); binspec = get_mortalspace(FLEN_FILENAME,TBYTE); colspec = get_mortalspace(FLEN_FILENAME,TBYTE); RETVAL = ffiurl(filename,urltype,infile,outfile,extspec,filter,binspec,colspec,&status); OUTPUT: urltype infile outfile extspec filter binspec colspec status RETVAL int ffifile(filename,filetype,infile,outfile,extspec,filter,binspec,colspec,pixspec,status) char * filename char * filetype = NO_INIT char * infile = NO_INIT char * outfile = NO_INIT char * extspec = NO_INIT char * filter = NO_INIT char * binspec = NO_INIT char * colspec = NO_INIT char * pixspec = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_input_filename = 1 CODE: filetype = get_mortalspace(FLEN_FILENAME,TBYTE); infile = get_mortalspace(FLEN_FILENAME,TBYTE); outfile = get_mortalspace(FLEN_FILENAME,TBYTE); extspec = get_mortalspace(FLEN_FILENAME,TBYTE); filter = get_mortalspace(FLEN_FILENAME,TBYTE); binspec = get_mortalspace(FLEN_FILENAME,TBYTE); colspec = get_mortalspace(FLEN_FILENAME,TBYTE); pixspec = get_mortalspace(FLEN_FILENAME,TBYTE); RETVAL = ffifile(filename,filetype,infile,outfile,extspec,filter,binspec,colspec,pixspec,&status); OUTPUT: filetype infile outfile extspec filter binspec colspec pixspec status RETVAL int fits_copy_cell2image(infptr, outfptr, colname, rownum, status) fitsfile* infptr fitsfile* outfptr char* colname long rownum int &status ALIAS: fitsfilePtr::copy_cell2image = 1 OUTPUT: status int fits_copy_image2cell(infptr, outfptr, colname, rownum, copykeyflag, status) fitsfile* infptr fitsfile* outfptr char* colname long rownum int copykeyflag int &status ALIAS: fitsfilePtr::copy_image2cell = 1 OUTPUT: status int ffrwrg(rowlist, maxrows, maxranges, numranges, rangemin, rangemax, status) char * rowlist LONGLONG maxrows int maxranges int numranges = NO_INIT long * rangemin = NO_INIT long * rangemax = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_range = 1 CODE: if (ST(4)!=&PL_sv_undef || ST(5)!=&PL_sv_undef) { rangemin = get_mortalspace(maxranges,TLONG); rangemax = get_mortalspace(maxranges,TLONG); } else { rangemin = rangemax = 0; maxranges = 0; } RETVAL=ffrwrg(rowlist, maxrows, maxranges, &numranges, rangemin, rangemax, &status); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),numranges); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),rangemin,numranges,TLONG,-1); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),rangemax,numranges,TLONG,-1); OUTPUT: status RETVAL int ffrwrgll(rowlist, maxrows, maxranges, numranges, rangemin, rangemax, status) char * rowlist LONGLONG maxrows int maxranges int numranges = NO_INIT LONGLONG * rangemin = NO_INIT LONGLONG * rangemax = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_rangell = 1 CODE: if (ST(4)!=&PL_sv_undef || ST(5)!=&PL_sv_undef) { rangemin = get_mortalspace(maxranges,TLONG); rangemax = get_mortalspace(maxranges,TLONG); } else { rangemin = rangemax = 0; maxranges = 0; } RETVAL=ffrwrgll(rowlist, maxrows, maxranges, &numranges, rangemin, rangemax, &status); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),numranges); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),rangemin,numranges,TLONGLONG,-1); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),rangemax,numranges,TLONGLONG,-1); OUTPUT: status RETVAL int ffrtnm(url,rootname,status) char * url char * rootname = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_rootname = 1 CODE: rootname = get_mortalspace(FLEN_FILENAME,TBYTE); RETVAL = ffrtnm(url,rootname,&status); OUTPUT: rootname status RETVAL int ffgthd(templt,card,keytype,status) char * templt char * card = NO_INIT int keytype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_template = 1 CODE: card = get_mortalspace(FLEN_CARD,TBYTE); RETVAL = ffgthd(templt,card,&keytype,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),keytype); OUTPUT: card status RETVAL int fits_translate_keyword(inrec, outrec, inpatterns, outpatterns, npat, n_value, n_offset, n_range, pat_num, i, j, m, n, status) char* inrec char* outrec = NO_INIT char** inpatterns char** outpatterns int npat int n_value int n_offset int n_range int pat_num = NO_INIT int i = NO_INIT int j = NO_INIT int m = NO_INIT int n = NO_INIT int status PREINIT: char* (*patterns)[2]; int ii; CODE: patterns = malloc(npat * sizeof(*patterns)); for (ii=0; iifptr, outfptr->fptr, firstkey, patterns, npat, n_value, n_offset, n_range, &status); free(patterns); OUTPUT: status RETVAL int ffpsvc(card,value,comment,status) char * card char * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_parse_value = 1 CODE: value = get_mortalspace(FLEN_VALUE,TBYTE); comment = get_mortalspace(FLEN_COMMENT,TBYTE); RETVAL = ffpsvc(card,value,comment,&status); OUTPUT: value comment status RETVAL int ffwldp(xpix,ypix,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,xpos,ypos,status) double xpix double ypix double xrefval double yrefval double xrefpix double yrefpix double xinc double yinc double rot char * coordtype double &xpos = NO_INIT double &ypos = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_pix_to_world = 1 OUTPUT: xpos ypos status int ffg2db(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group byte nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 byte * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_byt = 1 fitsfilePtr::read_2d_byt = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TBYTE)); RETVAL=ffg2db(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(byte*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TBYTE); RETVAL=ffg2db(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TBYTE,fptr->perlyunpacking); } if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2dsb(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group byte nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 signed char* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_sbyt = 1 fitsfilePtr::read_2d_sbyt = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TSBYTE)); RETVAL=ffg2dsb(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(signed char*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TSBYTE); RETVAL=ffg2dsb(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TSBYTE,fptr->perlyunpacking); } if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2dui(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group unsigned short nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 unsigned short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_usht = 1 fitsfilePtr::read_2d_usht = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TUSHORT)); RETVAL=ffg2dui(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(unsigned short*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TUSHORT); RETVAL=ffg2dui(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TUSHORT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2di(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group short nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_sht = 1 fitsfilePtr::read_2d_sht = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TSHORT)); RETVAL=ffg2di(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(short*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TSHORT); RETVAL=ffg2di(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TSHORT,fptr->perlyunpacking); } if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2duk(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group unsigned int nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 unsigned int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_uint = 1 fitsfilePtr::read_2d_uint = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TUINT)); RETVAL=ffg2duk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(unsigned int*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TUINT); RETVAL=ffg2duk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TUINT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2dk(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group int nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_int = 1 fitsfilePtr::read_2d_int = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TINT)); RETVAL=ffg2dk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(int*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TINT); RETVAL=ffg2dk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TINT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2duj(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group unsigned long nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 unsigned long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_ulng = 1 fitsfilePtr::read_2d_ulng = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TULONG)); RETVAL=ffg2duj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(unsigned long*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TULONG); RETVAL=ffg2duj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TULONG,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2dj(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group long nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_lng = 1 fitsfilePtr::read_2d_lng = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TLONG)); RETVAL=ffg2dj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(long*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TLONG); RETVAL=ffg2dj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TLONG,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2djj(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group long nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 LONGLONG* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_lnglng = 1 fitsfilePtr::read_2d_lnglng = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TLONGLONG)); RETVAL=ffg2djj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(LONGLONG*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TLONGLONG); RETVAL=ffg2djj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TLONGLONG,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2de(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group float nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 float * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_flt = 1 fitsfilePtr::read_2d_flt = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TFLOAT)); RETVAL=ffg2de(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(float*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TFLOAT); RETVAL=ffg2de(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TFLOAT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg2dd(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status) FitsFile * fptr long group double nulval LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 double * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_2d_dbl = 1 fitsfilePtr::read_2d_dbl = 2 PREINIT: LONGLONG dims[2]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TDOUBLE)); RETVAL=ffg2dd(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(double*)SvPV(ST(6),PL_na),&anynul,&status); } else { dims[0]=naxis2; dims[1] = dim1; array = get_mortalspace(naxis2*dim1,TDOUBLE); RETVAL=ffg2dd(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status); unpack2D(ST(6),array,dims,TDOUBLE,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffg3db(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group byte nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 byte * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_byt = 1 fitsfilePtr::read_3d_byt = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TBYTE)); RETVAL=ffg3db(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(byte*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TBYTE); RETVAL=ffg3db(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TBYTE,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3dsb(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group signed char nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 signed char* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_sbyt = 1 fitsfilePtr::read_3d_sbyt = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TSBYTE)); RETVAL=ffg3dsb(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(signed char*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TSBYTE); RETVAL=ffg3dsb(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TSBYTE,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3dui(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group unsigned short nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 unsigned short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_usht = 1 fitsfilePtr::read_3d_usht = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TUSHORT)); RETVAL=ffg3dui(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(unsigned short*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TUSHORT); RETVAL=ffg3dui(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TUSHORT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3di(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group short nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_sht = 1 fitsfilePtr::read_3d_sht = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TSHORT)); RETVAL=ffg3di(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(short*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TSHORT); RETVAL=ffg3di(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TSHORT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3duk(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group unsigned int nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 unsigned int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_uint = 1 fitsfilePtr::read_3d_uint = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TUINT)); RETVAL=ffg3duk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(unsigned int*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TUINT); RETVAL=ffg3duk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TUINT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3dk(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group int nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_int = 1 fitsfilePtr::read_3d_int = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TINT)); RETVAL=ffg3dk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(int*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TINT); RETVAL=ffg3dk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TINT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3duj(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group unsigned long nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 unsigned long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_ulng = 1 fitsfilePtr::read_3d_ulng = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TULONG)); RETVAL=ffg3duj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(unsigned long*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TULONG); RETVAL=ffg3duj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TULONG,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3dj(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group long nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_lng = 1 fitsfilePtr::read_3d_lng = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TLONG)); RETVAL=ffg3dj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(long*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TLONG); RETVAL=ffg3dj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TLONG,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3djj(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group LONGLONG nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 LONGLONG* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_lnglng = 1 fitsfilePtr::read_3d_lnglng = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TLONGLONG)); RETVAL=ffg3djj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(LONGLONG*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TLONGLONG); RETVAL=ffg3djj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TLONGLONG,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3de(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group float nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 float * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_flt = 1 fitsfilePtr::read_3d_flt = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TFLOAT)); RETVAL=ffg3de(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(float*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TFLOAT); RETVAL=ffg3de(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TFLOAT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffg3dd(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status) FitsFile * fptr long group double nulval LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 double * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_3d_dbl = 1 fitsfilePtr::read_3d_dbl = 2 PREINIT: LONGLONG dims[3]; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TDOUBLE)); RETVAL=ffg3dd(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(double*)SvPV(ST(8),PL_na),&anynul,&status); } else { dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1; array = get_mortalspace(dim1*dim2*naxis3,TDOUBLE); RETVAL=ffg3dd(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status); unpack3D(ST(8),array,dims,TDOUBLE,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgcdw(fptr, colnum, dispwidth, status) fitsfile *fptr int colnum int &dispwidth = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_get_col_display_width = 1 fitsfilePtr::get_col_display_width = 2 OUTPUT: dispwidth status int ffghtb(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status) FitsFile * fptr long rowlen = NO_INIT long nrows = NO_INIT int tfields = NO_INIT char ** ttype = NO_INIT long * tbcol = NO_INIT char ** tform = NO_INIT char ** tunit = NO_INIT char * extname = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_atblhdr = 1 fitsfilePtr::read_atblhdr = 2 PREINIT: int i; CODE: ffghtb(fptr->fptr,0,&rowlen,&nrows,&tfields,NULL,NULL,NULL,NULL,NULL,&status); tbcol = (ST(5)!=&PL_sv_undef) ? get_mortalspace(tfields,TLONG) : NULL; extname = (ST(8)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; if (ST(4)!=&PL_sv_undef) { ttype = get_mortalspace(tfields,TSTRING); for (i=0; ifptr,tfields,&rowlen,&nrows,&tfields,ttype,tbcol,tform,tunit,extname,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),rowlen); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),nrows); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),tfields); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),ttype,tfields,TSTRING,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tbcol,tfields,TLONG,fptr->perlyunpacking); if (ST(6)!=&PL_sv_undef) unpack1D(ST(6),tform,tfields,TSTRING,fptr->perlyunpacking); if (ST(7)!=&PL_sv_undef) unpack1D(ST(7),tunit,tfields,TSTRING,fptr->perlyunpacking); if (ST(8)!=&PL_sv_undef) sv_setpv(ST(8),extname); OUTPUT: status RETVAL int ffghtbll(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status) FitsFile * fptr LONGLONG rowlen = NO_INIT LONGLONG nrows = NO_INIT int tfields = NO_INIT char ** ttype = NO_INIT LONGLONG * tbcol = NO_INIT char ** tform = NO_INIT char ** tunit = NO_INIT char * extname = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_atblhdrll = 1 fitsfilePtr::read_atblhdrll = 2 PREINIT: int i; CODE: ffghtbll(fptr->fptr,0,&rowlen,&nrows,&tfields,NULL,NULL,NULL,NULL,NULL,&status); tbcol = (ST(5)!=&PL_sv_undef) ? get_mortalspace(tfields,TLONGLONG) : NULL; extname = (ST(8)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; if (ST(4)!=&PL_sv_undef) { ttype = get_mortalspace(tfields,TSTRING); for (i=0; ifptr,tfields,&rowlen,&nrows,&tfields,ttype,tbcol,tform,tunit,extname,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),rowlen); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),nrows); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),tfields); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),ttype,tfields,TSTRING,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tbcol,tfields,TLONGLONG,fptr->perlyunpacking); if (ST(6)!=&PL_sv_undef) unpack1D(ST(6),tform,tfields,TSTRING,fptr->perlyunpacking); if (ST(7)!=&PL_sv_undef) unpack1D(ST(7),tunit,tfields,TSTRING,fptr->perlyunpacking); if (ST(8)!=&PL_sv_undef) sv_setpv(ST(8),extname); OUTPUT: status RETVAL int ffghbn(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status) FitsFile * fptr long nrows = NO_INIT int tfields = NO_INIT char ** ttype = NO_INIT char ** tform = NO_INIT char ** tunit = NO_INIT char * extname = NO_INIT long pcount = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_btblhdr = 1 fitsfilePtr::read_btblhdr = 2 PREINIT: int i; CODE: ffghbn(fptr->fptr,0,&nrows,&tfields,NULL,NULL,NULL,NULL,&pcount,&status); extname = (ST(7)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; if (ST(4) != &PL_sv_undef) { ttype = get_mortalspace(tfields,TSTRING); for (i=0; ifptr,tfields,&nrows,&tfields,ttype,tform,tunit,extname,&pcount,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),nrows); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),tfields); if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),ttype,tfields,TSTRING,fptr->perlyunpacking); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),tform,tfields,TSTRING,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tunit,tfields,TSTRING,fptr->perlyunpacking); if (ST(6)!=&PL_sv_undef) sv_setpv(ST(6),extname); if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),pcount); OUTPUT: status RETVAL int ffghbnll(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status) FitsFile * fptr LONGLONG nrows = NO_INIT int tfields = NO_INIT char ** ttype = NO_INIT char ** tform = NO_INIT char ** tunit = NO_INIT char * extname = NO_INIT LONGLONG pcount = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_btblhdrll = 1 fitsfilePtr::read_btblhdrll = 2 PREINIT: int i; CODE: ffghbnll(fptr->fptr,0,&nrows,&tfields,NULL,NULL,NULL,NULL,&pcount,&status); extname = (ST(7)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL; if (ST(4) != &PL_sv_undef) { ttype = get_mortalspace(tfields,TSTRING); for (i=0; ifptr,tfields,&nrows,&tfields,ttype,tform,tunit,extname,&pcount,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),nrows); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),tfields); if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),ttype,tfields,TSTRING,fptr->perlyunpacking); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),tform,tfields,TSTRING,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tunit,tfields,TSTRING,fptr->perlyunpacking); if (ST(6)!=&PL_sv_undef) sv_setpv(ST(6),extname); if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),pcount); OUTPUT: status RETVAL int ffgcrd(fptr,keyname,card,status) fitsfile * fptr char * keyname char * card = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_card = 1 fitsfilePtr::read_card = 2 CODE: card = get_mortalspace(FLEN_CARD,TBYTE); RETVAL=ffgcrd(fptr,keyname,card,&status); OUTPUT: card status RETVAL int ffgcv(fptr,datatype,colnum,firstrow,firstelem,nelements,nulval,array,anynul,status) FitsFile * fptr int datatype int colnum LONGLONG firstrow LONGLONG firstelem LONGLONG nelements SV * nulval void * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col = 1 fitsfilePtr::read_col = 2 PREINIT: long col_width; LONGLONG i; int storage_datatype; CODE: storage_datatype = datatype; if (datatype == TBIT) storage_datatype = TLOGICAL; if (!PERLYUNPACKING(fptr->perlyunpacking) && datatype != TSTRING) { SvGROW(ST(7),nelements*sizeof_datatype(storage_datatype)); RETVAL=ffgcv(fptr->fptr,datatype,colnum,firstrow,firstelem,nelements,pack1D(nulval,storage_datatype),(void*)SvPV(ST(7),PL_na),&anynul,&status); } else { array = get_mortalspace(nelements,storage_datatype); if (datatype == TSTRING) { col_width = column_width(fptr->fptr,colnum); for (i=0;ifptr,datatype,colnum,firstrow,firstelem,nelements,pack1D(nulval,storage_datatype),array,&anynul,&status); unpack1D(ST(7),array,nelements,storage_datatype,fptr->perlyunpacking); } if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),anynul); OUTPUT: status RETVAL int ffgcx(fptr,colnum,frow,fbit,nbit,larray,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG fbit LONGLONG nbit logical * larray = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_bit = 1 fitsfilePtr::read_col_bit = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nbit*sizeof_datatype(TLOGICAL)); RETVAL = ffgcx(fptr->fptr,colnum,frow,fbit,nbit,(logical*)SvPV(ST(5),PL_na),&status); } else { larray = get_mortalspace(nbit,TLOGICAL); RETVAL=ffgcx(fptr->fptr,colnum,frow,fbit,nbit,larray,&status); unpack1D(ST(5),larray,nbit,TLOGICAL,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffgcxui(fptr,colnum,frow,nrows,fbit,nbits,array,status) FitsFile *fptr int colnum LONGLONG frow LONGLONG nrows long fbit int nbits unsigned short *array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_bit_usht = 1 fitsfilePtr::read_col_bit_usht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nrows*sizeof_datatype(TUSHORT)); RETVAL = ffgcxui(fptr->fptr,colnum,frow,nrows,fbit,nbits,(unsigned short*)SvPV(ST(6),PL_na),&status); } else { array = get_mortalspace(nrows,TUSHORT); RETVAL = ffgcxui(fptr->fptr,colnum,frow,nrows,fbit,nbits,array,&status); unpack1D(ST(6),array,nrows,TUSHORT,fptr->perlyunpacking); } OUTPUT: RETVAL status int ffgcxuk(fptr,colnum,frow,nrows,fbit,nbits,array,status) FitsFile *fptr int colnum LONGLONG frow LONGLONG nrows long fbit int nbits unsigned int *array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_bit_uint = 1 fitsfilePtr::read_col_bit_uint = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nrows*sizeof_datatype(TUINT)); RETVAL = ffgcxuk(fptr->fptr,colnum,frow,nrows,fbit,nbits,(unsigned int*)SvPV(ST(6),PL_na),&status); } else { array = get_mortalspace(nrows,TUINT); RETVAL = ffgcxuk(fptr->fptr,colnum,frow,nrows,fbit,nbits,array,&status); unpack1D(ST(6),array,nrows,TUINT,fptr->perlyunpacking); } OUTPUT: RETVAL status int ffgcvs(fptr,colnum,firstrow,firstelem,nelements,nulstr,array,anynul,status) FitsFile * fptr int colnum LONGLONG firstrow LONGLONG firstelem LONGLONG nelements char * nulstr char ** array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_str = 1 fitsfilePtr::read_col_str = 2 PREINIT: LONGLONG i; long col_size; CODE: col_size = column_width(fptr->fptr,colnum); array = get_mortalspace(nelements,TSTRING); for (i=0;ifptr,colnum,firstrow,firstelem,nelements,nulstr,array,&anynul,&status); unpack1D(ST(6),array,nelements,TSTRING,fptr->perlyunpacking); if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvl(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem logical nulval logical * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_log = 1 fitsfilePtr::read_col_log = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); RETVAL=ffgcvl(fptr->fptr,cnum,frow,felem,nelem,nulval,(logical*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcvl(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvb(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem byte nulval byte * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_byt = 1 fitsfilePtr::read_col_byt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TBYTE)); RETVAL=ffgcvb(fptr->fptr,cnum,frow,felem,nelem,nulval,(byte*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TBYTE); RETVAL=ffgcvb(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TBYTE,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvsb(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem signed char nulval signed char* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_sbyt = 1 fitsfilePtr::read_col_sbyt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TSBYTE)); RETVAL=ffgcvsb(fptr->fptr,cnum,frow,felem,nelem,nulval,(signed char*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TSBYTE); RETVAL=ffgcvsb(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TSBYTE,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvui(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned short nulval unsigned short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_usht = 1 fitsfilePtr::read_col_usht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TUSHORT)); RETVAL=ffgcvui(fptr->fptr,cnum,frow,felem,nelem,nulval,(unsigned short*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TUSHORT); RETVAL=ffgcvui(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TUSHORT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvi(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem short nulval short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_sht = 1 fitsfilePtr::read_col_sht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TSHORT)); RETVAL=ffgcvi(fptr->fptr,cnum,frow,felem,nelem,nulval,(short*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TSHORT); RETVAL=ffgcvi(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TSHORT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvuk(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned int nulval unsigned int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_uint = 1 fitsfilePtr::read_col_uint = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TUINT)); RETVAL=ffgcvuk(fptr->fptr,cnum,frow,felem,nelem,nulval,(unsigned int*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TUINT); RETVAL=ffgcvuk(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TUINT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvk(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem int nulval int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_int = 1 fitsfilePtr::read_col_int = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TINT)); RETVAL=ffgcvk(fptr->fptr,cnum,frow,felem,nelem,nulval,(int*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TINT); RETVAL=ffgcvk(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TINT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvuj(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned long nulval unsigned long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_ulng = 1 fitsfilePtr::read_col_ulng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TULONG)); RETVAL=ffgcvuj(fptr->fptr,cnum,frow,felem,nelem,nulval,(unsigned long*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TULONG); RETVAL=ffgcvuj(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TULONG,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvj(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem long nulval long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_lng = 1 fitsfilePtr::read_col_lng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TLONG)); RETVAL=ffgcvj(fptr->fptr,cnum,frow,felem,nelem,nulval,(long*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TLONG); RETVAL=ffgcvj(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TLONG,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvjj(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem LONGLONG nulval LONGLONG* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_lnglng = 1 fitsfilePtr::read_col_lnglng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TLONGLONG)); RETVAL=ffgcvjj(fptr->fptr,cnum,frow,felem,nelem,nulval,(LONGLONG*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TLONGLONG); RETVAL=ffgcvjj(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TLONGLONG,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcve(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem float nulval float * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_flt = 1 fitsfilePtr::read_col_flt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TFLOAT)); RETVAL=ffgcve(fptr->fptr,cnum,frow,felem,nelem,nulval,(float*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TFLOAT); RETVAL=ffgcve(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TFLOAT,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvd(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem double nulval double * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_dbl = 1 fitsfilePtr::read_col_dbl = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TDOUBLE)); RETVAL=ffgcvd(fptr->fptr,cnum,frow,felem,nelem,nulval,(double*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TDOUBLE); RETVAL=ffgcvd(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TDOUBLE,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvc(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem float nulval float * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_cmp = 1 fitsfilePtr::read_col_cmp = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TCOMPLEX)); RETVAL=ffgcvc(fptr->fptr,cnum,frow,felem,nelem,nulval,(float*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TCOMPLEX); RETVAL=ffgcvc(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TCOMPLEX,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcvm(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem double nulval double * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_col_dblcmp = 1 fitsfilePtr::read_col_dblcmp = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(6),nelem*sizeof_datatype(TDBLCOMPLEX)); RETVAL=ffgcvm(fptr->fptr,cnum,frow,felem,nelem,nulval,(double*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TDBLCOMPLEX); RETVAL=ffgcvm(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(6),array,nelem,TDBLCOMPLEX,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcf(fptr,datatype,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int datatype int colnum LONGLONG frow LONGLONG felem LONGLONG nelem void * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull = 1 fitsfilePtr::read_colnull = 2 PREINIT: int storage_datatype; CODE: storage_datatype = datatype; if (datatype == TBIT) storage_datatype = TLOGICAL; if (!PERLYUNPACKING(fptr->perlyunpacking) && datatype != TSTRING) { if (ST(6)!=&PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(storage_datatype)); array = (void*)SvPV(ST(6),PL_na); } else array = get_mortalspace(nelem,storage_datatype); if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(7),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcf(fptr->fptr,datatype,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,storage_datatype); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcf(fptr->fptr,datatype,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(6)!=&PL_sv_undef) unpack1D(ST(6),array,nelem,storage_datatype,fptr->perlyunpacking); if (ST(7)!=&PL_sv_undef) unpack1D(ST(7),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(8)!=&PL_sv_undef) sv_setiv(ST(8),anynul); OUTPUT: status RETVAL int ffgcfs(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem char ** array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_str = 1 fitsfilePtr::read_colnull_str = 2 PREINIT: long col_size; LONGLONG i; CODE: col_size = column_width(fptr->fptr,colnum); array = get_mortalspace(nelem,TSTRING); for (i=0;iperlyunpacking)) { if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfs(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfs(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TSTRING,fptr->perlyunpacking); if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfl(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem logical * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_log = 1 fitsfilePtr::read_colnull_log = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); array = (logical*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TLOGICAL); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfl(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TLOGICAL); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfl(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TLOGICAL,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfb(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem byte * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_byt = 1 fitsfilePtr::read_colnull_byt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TBYTE)); array = (byte*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TBYTE); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TBYTE); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TBYTE,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfsb(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem signed char* array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_sbyt = 1 fitsfilePtr::read_colnull_sbyt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TSBYTE)); array = (signed char*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TSBYTE); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfsb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TSBYTE); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfsb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TSBYTE,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfui(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned short * array = NO_INIT logical * nularray = NO_INIT int anynul int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_usht = 1 fitsfilePtr::read_colnull_usht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TUSHORT)); array = (unsigned short*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TUSHORT); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfui(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TUSHORT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfui(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TUSHORT,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfi(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem short * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_sht = 1 fitsfilePtr::read_colnull_sht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TSHORT)); array = (short*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TSHORT); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfi(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TSHORT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfi(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TSHORT,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfk(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem int * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_int = 1 fitsfilePtr::read_colnull_int = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TINT)); array = (int*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TINT); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TINT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TINT,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfuk(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned int * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_uint = 1 fitsfilePtr::read_colnull_uint = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TUINT)); array = (unsigned int*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TUINT); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfuk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TUINT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfuk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TUINT,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfj(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem long * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_lng = 1 fitsfilePtr::read_colnull_lng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLONG)); array = (long*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TLONG); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TLONG); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TLONG,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfjj(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem LONGLONG* array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_lnglng = 1 fitsfilePtr::read_colnull_lnglng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLONGLONG)); array = (LONGLONG*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TLONGLONG); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfjj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TLONGLONG); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfjj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TLONGLONG,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfuj(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned long * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_ulng = 1 fitsfilePtr::read_colnull_ulng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TULONG)); array = (unsigned long*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TULONG); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfuj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TULONG); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfuj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TULONG,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfe(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem float * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_flt = 1 fitsfilePtr::read_colnull_flt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TFLOAT)); array = (float*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TFLOAT); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfe(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TFLOAT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfe(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TFLOAT,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfd(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem double * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_dbl = 1 fitsfilePtr::read_colnull_dbl = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TDOUBLE)); array = (double*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TDOUBLE); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfd(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TDOUBLE); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfd(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TDOUBLE,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfc(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem float * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_cmp = 1 fitsfilePtr::read_colnull_cmp = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TCOMPLEX)); array = (float*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TCOMPLEX); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfc(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TCOMPLEX); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfc(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TCOMPLEX,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgcfm(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem double * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_colnull_dblcmp = 1 fitsfilePtr::read_colnull_dblcmp = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TDBLCOMPLEX)); array = (double*)SvPV(ST(5),PL_na); } else array = get_mortalspace(nelem,TDBLCOMPLEX); if (ST(6) != &PL_sv_undef) { SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(6),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfm(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TDBLCOMPLEX); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgcfm(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TDBLCOMPLEX,fptr->perlyunpacking); if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: status RETVAL int ffgdes(fptr,colnum,rownum,repeat,offset,status) fitsfile * fptr int colnum LONGLONG rownum long repeat = NO_INIT long offset = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_read_descript = 1 fitsfilePtr::read_descript = 2 CODE: RETVAL = ffgdes(fptr,colnum,rownum,&repeat,&offset,&status); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),offset); OUTPUT: status RETVAL int ffgdesll(fptr,colnum,rownum,repeat,offset,status) fitsfile * fptr int colnum LONGLONG rownum LONGLONG repeat = NO_INIT LONGLONG offset = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_read_descriptll = 1 fitsfilePtr::read_descriptll = 2 CODE: RETVAL = ffgdesll(fptr,colnum,rownum,&repeat,&offset,&status); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),offset); OUTPUT: status RETVAL int ffgdess(fptr,colnum,frow,nrows,repeat,offset,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG nrows long * repeat = NO_INIT long * offset = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_descripts = 1 fitsfilePtr::read_descripts = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nrows*sizeof_datatype(TLONG)); repeat = (long*)SvPV(ST(4),PL_na); } else repeat = get_mortalspace(nrows,TLONG); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nrows*sizeof_datatype(TLONG)); offset = (long*)SvPV(ST(5),PL_na); } else offset = get_mortalspace(nrows,TLONG); RETVAL=ffgdess(fptr->fptr,colnum,frow,nrows,repeat,offset,&status); } else { repeat = get_mortalspace(nrows,TLONG); offset = get_mortalspace(nrows,TLONG); RETVAL=ffgdess(fptr->fptr,colnum,frow,nrows,repeat,offset,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),repeat,nrows,TLONG,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),offset,nrows,TLONG,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffgdessll(fptr,colnum,frow,nrows,repeat,offset,status) FitsFile * fptr int colnum LONGLONG frow LONGLONG nrows LONGLONG* repeat = NO_INIT LONGLONG* offset = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_descriptsll = 1 fitsfilePtr::read_descriptsll = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nrows*sizeof_datatype(TLONGLONG)); repeat = (LONGLONG*)SvPV(ST(4),PL_na); } else repeat = get_mortalspace(nrows,TLONGLONG); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nrows*sizeof_datatype(TLONGLONG)); offset = (LONGLONG*)SvPV(ST(5),PL_na); } else offset = get_mortalspace(nrows,TLONGLONG); RETVAL=ffgdessll(fptr->fptr,colnum,frow,nrows,repeat,offset,&status); } else { repeat = get_mortalspace(nrows,TLONGLONG); offset = get_mortalspace(nrows,TLONGLONG); RETVAL=ffgdessll(fptr->fptr,colnum,frow,nrows,repeat,offset,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),repeat,nrows,TLONGLONG,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),offset,nrows,TLONGLONG,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffgmsg(err_msg) char * err_msg = NO_INIT ALIAS: Astro::FITS::CFITSIO::fits_read_errmsg = 1 CODE: err_msg = get_mortalspace(FLEN_ERRMSG,TBYTE); RETVAL = fits_read_errmsg(err_msg); OUTPUT: err_msg RETVAL int ffggpb(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem byte * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_byt = 1 fitsfilePtr::read_grppar_byt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TBYTE)); RETVAL=ffggpb(fptr->fptr,group,felem,nelem,(byte*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TBYTE); RETVAL=ffggpb(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TBYTE,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpsb(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem signed char* array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_sbyt = 1 fitsfilePtr::read_grppar_sbyt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TSBYTE)); RETVAL=ffggpsb(fptr->fptr,group,felem,nelem,(signed char*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TSBYTE); RETVAL=ffggpsb(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TSBYTE,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpi(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem short * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_sht = 1 fitsfilePtr::read_grppar_sht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TSHORT)); RETVAL=ffggpi(fptr->fptr,group,felem,nelem,(short*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TSHORT); RETVAL=ffggpi(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TSHORT,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpui(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem unsigned short * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_usht = 1 fitsfilePtr::read_grppar_usht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TUSHORT)); RETVAL=ffggpui(fptr->fptr,group,felem,nelem,(unsigned short*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TUSHORT); RETVAL=ffggpui(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TUSHORT,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpk(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem int * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_int = 1 fitsfilePtr::read_grppar_int = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TINT)); RETVAL=ffggpk(fptr->fptr,group,felem,nelem,(int*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TINT); RETVAL=ffggpk(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TINT,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpuk(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem unsigned int * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_uint = 1 fitsfilePtr::read_grppar_uint = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TUINT)); RETVAL=ffggpuk(fptr->fptr,group,felem,nelem,(unsigned int*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TUINT); RETVAL=ffggpuk(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TUINT,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpj(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem long * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_lng = 1 fitsfilePtr::read_grppar_lng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TLONG)); RETVAL=ffggpj(fptr->fptr,group,felem,nelem,(long*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TLONG); RETVAL=ffggpj(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TLONG,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpjj(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem LONGLONG* array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_lnglng = 1 fitsfilePtr::read_grppar_lnglng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TLONGLONG)); RETVAL=ffggpjj(fptr->fptr,group,felem,nelem,(LONGLONG*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TLONGLONG); RETVAL=ffggpjj(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TLONGLONG,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpuj(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem unsigned long * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_ulng = 1 fitsfilePtr::read_grppar_ulng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TULONG)); RETVAL=ffggpuj(fptr->fptr,group,felem,nelem,(unsigned long*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TULONG); RETVAL=ffggpuj(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TULONG,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpe(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem float * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_flt = 1 fitsfilePtr::read_grppar_flt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TFLOAT)); RETVAL=ffggpe(fptr->fptr,group,felem,nelem,(float*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TFLOAT); RETVAL=ffggpe(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TFLOAT,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffggpd(fptr,group,felem,nelem,array,status) FitsFile * fptr long group long felem long nelem double * array = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_grppar_dbl = 1 fitsfilePtr::read_grppar_dbl = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nelem*sizeof_datatype(TDOUBLE)); RETVAL=ffggpd(fptr->fptr,group,felem,nelem,(double*)SvPV(ST(4),PL_na),&status); } else { array = get_mortalspace(nelem,TDOUBLE); RETVAL=ffggpd(fptr->fptr,group,felem,nelem,array,&status); unpack1D(ST(4),array,nelem,TDOUBLE,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffgpv(fptr,datatype,felem,nelem,nulval,array,anynul,status) FitsFile * fptr int datatype LONGLONG felem LONGLONG nelem SV * nulval void * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img = 1 fitsfilePtr::read_img = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(datatype)); RETVAL=ffgpv(fptr->fptr,datatype,felem,nelem,pack1D(nulval,datatype),(void*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,datatype); RETVAL=ffgpv(fptr->fptr,datatype,felem,nelem,pack1D(nulval,datatype),array,&anynul,&status); unpack1D(ST(5),array,nelem,datatype,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgics(fptr,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,status) fitsfile * fptr double xrefval = NO_INIT double yrefval = NO_INIT double xrefpix = NO_INIT double yrefpix = NO_INIT double xinc = NO_INIT double yinc = NO_INIT double rot = NO_INIT char * coordtype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_coord = 1 fitsfilePtr::read_img_coord = 2 CODE: coordtype = get_mortalspace(FLEN_VALUE,TBYTE); RETVAL=ffgics(fptr,&xrefval,&yrefval,&xrefpix,&yrefpix,&xinc,&yinc,&rot,coordtype,&status); if (ST(1) != &PL_sv_undef) sv_setnv(ST(1),xrefval); if (ST(2) != &PL_sv_undef) sv_setnv(ST(2),yrefval); if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),xrefpix); if (ST(4) != &PL_sv_undef) sv_setnv(ST(4),yrefpix); if (ST(5) != &PL_sv_undef) sv_setnv(ST(5),xinc); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),yinc); if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),rot); OUTPUT: coordtype status RETVAL int ffgicsa(fptr,version,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,status) fitsfile * fptr char version double xrefval = NO_INIT double yrefval = NO_INIT double xrefpix = NO_INIT double yrefpix = NO_INIT double xinc = NO_INIT double yinc = NO_INIT double rot = NO_INIT char * coordtype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_coord_version = 1 fitsfilePtr::read_img_coord_version = 2 CODE: coordtype = get_mortalspace(FLEN_VALUE,TBYTE); RETVAL=ffgics(fptr,&xrefval,&yrefval,&xrefpix,&yrefpix,&xinc,&yinc,&rot,coordtype,&status); if (ST(2) != &PL_sv_undef) sv_setnv(ST(2),xrefval); if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),yrefval); if (ST(4) != &PL_sv_undef) sv_setnv(ST(4),xrefpix); if (ST(5) != &PL_sv_undef) sv_setnv(ST(5),yrefpix); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),xinc); if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),yinc); if (ST(8) != &PL_sv_undef) sv_setnv(ST(8),rot); OUTPUT: coordtype status RETVAL int ffgpvb(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem byte nulval byte * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_byt = 1 fitsfilePtr::read_img_byt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TBYTE)); RETVAL=ffgpvb(fptr->fptr,group,felem,nelem,nulval,(byte*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TBYTE); RETVAL=ffgpvb(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TBYTE,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvsb(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem signed char nulval signed char* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_sbyt = 1 fitsfilePtr::read_img_sbyt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TSBYTE)); RETVAL=ffgpvsb(fptr->fptr,group,felem,nelem,nulval,(signed char*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TSBYTE); RETVAL=ffgpvsb(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TSBYTE,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvi(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem short nulval short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_sht = 1 fitsfilePtr::read_img_sht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TSHORT)); RETVAL=ffgpvi(fptr->fptr,group,felem,nelem,nulval,(short*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TSHORT); RETVAL=ffgpvi(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TSHORT,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvui(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem unsigned short nulval unsigned short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_usht = 1 fitsfilePtr::read_img_usht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TUSHORT)); RETVAL=ffgpvui(fptr->fptr,group,felem,nelem,nulval,(unsigned short*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TUSHORT); RETVAL=ffgpvui(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TUSHORT,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvk(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem int nulval int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_int = 1 fitsfilePtr::read_img_int = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TINT)); RETVAL=ffgpvk(fptr->fptr,group,felem,nelem,nulval,(int*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TINT); RETVAL=ffgpvk(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TINT,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvuk(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem unsigned int nulval unsigned int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_uint = 1 fitsfilePtr::read_img_uint = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TUINT)); RETVAL=ffgpvuk(fptr->fptr,group,felem,nelem,nulval,(unsigned int*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TUINT); RETVAL=ffgpvuk(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TUINT,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvj(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem long nulval long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_lng = 1 fitsfilePtr::read_img_lng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TLONG)); RETVAL=ffgpvj(fptr->fptr,group,felem,nelem,nulval,(long*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TLONG); RETVAL=ffgpvj(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TLONG,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvjj(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem LONGLONG nulval LONGLONG* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_lnglng = 1 fitsfilePtr::read_img_lnglng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TLONGLONG)); RETVAL=ffgpvjj(fptr->fptr,group,felem,nelem,nulval,(LONGLONG*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TLONGLONG); RETVAL=ffgpvjj(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TLONGLONG,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvuj(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem unsigned long nulval unsigned long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_ulng = 1 fitsfilePtr::read_img_ulng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TULONG)); RETVAL=ffgpvuj(fptr->fptr,group,felem,nelem,nulval,(unsigned long*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TULONG); RETVAL=ffgpvuj(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TULONG,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpve(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem float nulval float * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_flt = 1 fitsfilePtr::read_img_flt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TFLOAT)); RETVAL=ffgpve(fptr->fptr,group,felem,nelem,nulval,(float*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TFLOAT); RETVAL=ffgpve(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TFLOAT,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpvd(fptr,group,felem,nelem,nulval,array,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem double nulval double * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_img_dbl = 1 fitsfilePtr::read_img_dbl = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(TDOUBLE)); RETVAL=ffgpvd(fptr->fptr,group,felem,nelem,nulval,(double*)SvPV(ST(5),PL_na),&anynul,&status); } else { array = get_mortalspace(nelem,TDOUBLE); RETVAL=ffgpvd(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status); unpack1D(ST(5),array,nelem,TDOUBLE,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffghpr(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status) FitsFile * fptr int simple = NO_INIT int bitpix = NO_INIT int naxis = NO_INIT long * naxes = NO_INIT long pcount = NO_INIT long gcount = NO_INIT int extend = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imghdr = 1 fitsfilePtr::read_imghdr = 2 CODE: if (ST(4)!=&PL_sv_undef) { /* caller wants naxes to be set */ ffghpr(fptr->fptr,0,NULL,NULL,&naxis,NULL,NULL,NULL,NULL,&status); naxes = get_mortalspace(naxis,TLONG); } else { naxes = NULL; naxis = 0; } RETVAL=ffghpr(fptr->fptr,naxis,&simple,&bitpix,&naxis,naxes,&pcount,&gcount,&extend,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),simple); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),bitpix); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONG, fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) sv_setiv(ST(5),pcount); if (ST(6)!=&PL_sv_undef) sv_setiv(ST(6),gcount); if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),extend); OUTPUT: status RETVAL int ffghprll(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status) FitsFile * fptr int simple = NO_INIT int bitpix = NO_INIT int naxis = NO_INIT LONGLONG * naxes = NO_INIT long pcount = NO_INIT long gcount = NO_INIT int extend = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imghdrll = 1 fitsfilePtr::read_imghdrll = 2 CODE: if (ST(4)!=&PL_sv_undef) { /* caller wants naxes to be set */ ffghprll(fptr->fptr,0,NULL,NULL,&naxis,NULL,NULL,NULL,NULL,&status); naxes = get_mortalspace(naxis,TLONGLONG); } else { naxes = NULL; naxis = 0; } RETVAL=ffghprll(fptr->fptr,naxis,&simple,&bitpix,&naxis,naxes,&pcount,&gcount,&extend,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),simple); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),bitpix); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONGLONG, fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) sv_setiv(ST(5),pcount); if (ST(6)!=&PL_sv_undef) sv_setiv(ST(6),gcount); if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),extend); OUTPUT: status RETVAL int ffgpf(fptr,datatype,felem,nelem,array,nularray,anynul,status) FitsFile * fptr int datatype LONGLONG felem LONGLONG nelem void * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull = 1 fitsfilePtr::read_imgnull = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4)!=&PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(datatype)); array = (void*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,datatype); if (ST(5)!=&PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpf(fptr->fptr,datatype,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,datatype); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpf(fptr->fptr,datatype,felem,nelem,array,nularray,&anynul,&status); if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),array,nelem,datatype,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6)!=&PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfb(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem byte * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_byt = 1 fitsfilePtr::read_imgnull_byt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TBYTE)); array = (byte*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TBYTE); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TBYTE); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TBYTE,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfsb(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem signed char* array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_sbyt = 1 fitsfilePtr::read_imgnull_sbyt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TSBYTE)); array = (signed char*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TSBYTE); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfsb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TSBYTE); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfsb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TSBYTE,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfi(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem short * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_sht = 1 fitsfilePtr::read_imgnull_sht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TSHORT)); array = (short*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TSHORT); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfi(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TSHORT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfi(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TSHORT,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfui(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem unsigned short * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_usht = 1 fitsfilePtr::read_imgnull_usht = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TUSHORT)); array = (unsigned short*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TUSHORT); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfui(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TUSHORT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfui(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TUSHORT,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfk(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem int * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_int = 1 fitsfilePtr::read_imgnull_int = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TINT)); array = (int*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TINT); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TINT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TINT,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfuk(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem unsigned int * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_uint = 1 fitsfilePtr::read_imgnull_uint = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TUINT)); array = (unsigned int*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TUINT); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfuk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TUINT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfuk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TUINT,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfj(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem long * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_lng = 1 fitsfilePtr::read_imgnull_lng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TLONG)); array = (long*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TLONG); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TLONG); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TLONG,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfjj(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem LONGLONG* array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_lnglng = 1 fitsfilePtr::read_imgnull_lnglng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TLONGLONG)); array = (LONGLONG*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TLONGLONG); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfjj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TLONGLONG); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfjj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TLONGLONG,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfuj(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem unsigned long * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_ulng = 1 fitsfilePtr::read_imgnull_ulng = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TULONG)); array = (unsigned long*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TULONG); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfuj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TULONG); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfuj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TBYTE,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfe(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem float * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_flt = 1 fitsfilePtr::read_imgnull_flt = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TFLOAT)); array = (float*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TFLOAT); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfe(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TFLOAT); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfe(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TFLOAT,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgpfd(fptr,group,felem,nelem,array,nularray,anynul,status) FitsFile * fptr long group LONGLONG felem LONGLONG nelem double * array = NO_INIT logical * nularray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_imgnull_dbl = 1 fitsfilePtr::read_imgnull_dbl = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(TDOUBLE)); array = (double*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem,TDOUBLE); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nularray = (logical*)SvPV(ST(5),PL_na); } else nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfd(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); } else { array = get_mortalspace(nelem,TDOUBLE); nularray = get_mortalspace(nelem,TLOGICAL); RETVAL=ffgpfd(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status); if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TDOUBLE,fptr->perlyunpacking); if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking); } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul); OUTPUT: status RETVAL int ffgstr(fptr, string, card, status) fitsfile * fptr char * string char * card = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_read_str = 1 fitsfilePtr::read_str = 2 OUTPUT: card status int ffdstr(fptr, string, status) fitsfile * fptr char * string int &status ALIAS: Astro::FITS::CFITSIO::fits_delete_str = 1 fitsfilePtr::delete_str = 2 OUTPUT: status int ffgky(fptr,datatype,keyname,value,comment,status) fitsfile * fptr int datatype char * keyname void * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key = 1 fitsfilePtr::read_key = 2 CODE: comment=(ST(4)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; switch (datatype) { case TSTRING: value = get_mortalspace(FLEN_VALUE,TBYTE); break; case TLOGICAL: value = get_mortalspace(1,TINT); break; default: value = get_mortalspace(1,datatype); } RETVAL=ffgky(fptr,datatype,keyname,value,comment,&status); if (datatype == TLOGICAL) datatype = TINT; unpackScalar(ST(3),value,datatype); OUTPUT: comment status RETVAL int ffgkyt(fptr,keyname,intval,frac,comment,status) fitsfile * fptr char * keyname long intval = NO_INIT double frac = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_triple = 1 fitsfilePtr::read_key_triple = 2 CODE: comment=(ST(4)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyt(fptr,keyname,&intval,&frac,comment,&status); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),intval); if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),frac); OUTPUT: comment status RETVAL int ffgunt(fptr,keyname,unit,status) fitsfile * fptr char * keyname char * unit = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_unit = 1 fitsfilePtr::read_key_unit = 2 CODE: unit = get_mortalspace(FLEN_VALUE,TBYTE); RETVAL=ffgunt(fptr,keyname,unit,&status); OUTPUT: unit status RETVAL int ffgkls(fptr,keyname,longstr,comment,status) fitsfile * fptr char * keyname char * longstr = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_longstr = 1 fitsfilePtr::read_key_longstr = 2 CODE: comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkls(fptr,keyname,&longstr,comment,&status); sv_setpv(ST(2),longstr); free(longstr); OUTPUT: comment status RETVAL int fffree(value, status) void * value int &status ALIAS: Astro::FITS::CFITSIO::fits_free_memory = 1 fitsfilePtr::read_free_memory = 2 OUTPUT: status int ffgkys(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname char * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_str = 1 fitsfilePtr::read_key_str = 2 CODE: value = get_mortalspace(FLEN_VALUE,TBYTE); comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkys(fptr,keyname,value,comment,&status); OUTPUT: value comment status RETVAL int ffgkyl(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname int value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_log = 1 fitsfilePtr::read_key_log = 2 CODE: comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyl(fptr,keyname,&value,comment,&status); OUTPUT: value comment status RETVAL int ffgkyj(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname long value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_lng = 1 fitsfilePtr::read_key_lng = 2 CODE: comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyj(fptr,keyname,&value,comment,&status); OUTPUT: value comment status RETVAL int ffgkyjj(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname LONGLONG value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_lnglng = 1 fitsfilePtr::read_key_lnglng = 2 CODE: comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyjj(fptr,keyname,&value,comment,&status); OUTPUT: value comment status RETVAL int ffgkye(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname float value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_flt = 1 fitsfilePtr::read_key_flt = 2 CODE: comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkye(fptr,keyname,&value,comment,&status); OUTPUT: value comment status RETVAL int ffgkyd(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname double value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_dbl = 1 fitsfilePtr::read_key_dbl = 2 CODE: comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyd(fptr,keyname,&value,comment,&status); OUTPUT: value comment status RETVAL int ffgkyc(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname float * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_cmp = 1 fitsfilePtr::read_key_cmp = 2 CODE: value = get_mortalspace(1,TCOMPLEX); comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyc(fptr,keyname,value,comment,&status); unpackScalar(ST(2),value,TCOMPLEX); OUTPUT: status comment RETVAL int ffgkym(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname double * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_key_dblcmp = 1 fitsfilePtr::read_key_dblcmp = 2 CODE: value = get_mortalspace(1,TDBLCOMPLEX); comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkym(fptr,keyname,value,comment,&status); unpackScalar(ST(2),value,TDBLCOMPLEX); OUTPUT: comment status RETVAL int ffgkyn(fptr,keynum,keyname,value,comment,status) fitsfile * fptr int keynum char * keyname = NO_INIT char * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keyn = 1 fitsfilePtr::read_keyn = 2 CODE: keyname = get_mortalspace(FLEN_KEYWORD,TBYTE); value = get_mortalspace(FLEN_VALUE,TBYTE); comment=(ST(4)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkyn(fptr,keynum,keyname,value,comment,&status); OUTPUT: keyname value comment status RETVAL int ffgkns(fptr,keyname,nstart,nkeys,value,nfound,status) FitsFile * fptr char * keyname int nstart int nkeys char ** value = NO_INIT int nfound = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keys_str = 1 fitsfilePtr::read_keys_str = 2 PREINIT: int i; CODE: value=get_mortalspace(nkeys,TSTRING); for (i=0; ifptr,keyname,nstart,nkeys,value,&nfound,&status); unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TSTRING,fptr->perlyunpacking); OUTPUT: nfound status RETVAL int ffgknl(fptr,keyname,nstart,nkeys,value,nfound,status) FitsFile * fptr char * keyname int nstart int nkeys int * value = NO_INIT int nfound = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keys_log = 1 fitsfilePtr::read_keys_log = 2 CODE: value=get_mortalspace(nkeys,TINT); RETVAL=ffgknl(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status); unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TINT,fptr->perlyunpacking); OUTPUT: nfound status RETVAL int ffgknj(fptr,keyname,nstart,nkeys,value,nfound,status) FitsFile * fptr char * keyname int nstart int nkeys long * value = NO_INIT int nfound = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keys_lng = 1 fitsfilePtr::read_keys_lng = 2 CODE: value=get_mortalspace(nkeys,TLONG); RETVAL=ffgknj(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status); unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TLONG,fptr->perlyunpacking); OUTPUT: nfound status RETVAL int ffgknjj(fptr,keyname,nstart,nkeys,value,nfound,status) FitsFile * fptr char * keyname int nstart int nkeys LONGLONG * value = NO_INIT int nfound = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keys_lnglng = 1 fitsfilePtr::read_keys_lnglng = 2 CODE: value=get_mortalspace(nkeys,TLONGLONG); RETVAL=ffgknjj(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status); unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TLONGLONG, fptr->perlyunpacking); OUTPUT: nfound status RETVAL int ffgkne(fptr,keyname,nstart,nkeys,value,nfound,status) FitsFile * fptr char * keyname int nstart int nkeys float * value = NO_INIT int nfound = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keys_flt = 1 fitsfilePtr::read_keys_flt = 2 CODE: value=get_mortalspace(nkeys,TFLOAT); RETVAL=ffgkne(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status); unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TFLOAT,fptr->perlyunpacking); OUTPUT: nfound status RETVAL int ffgknd(fptr,keyname,nstart,nkeys,value,nfound,status) FitsFile * fptr char * keyname int nstart int nkeys double * value = NO_INIT int nfound = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keys_dbl = 1 fitsfilePtr::read_keys_dbl = 2 CODE: value=get_mortalspace(nkeys,TDOUBLE); RETVAL=ffgknd(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status); unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TDOUBLE,fptr->perlyunpacking); OUTPUT: nfound status RETVAL int ffgkey(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname char * value = NO_INIT char * comment = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_keyword = 1 fitsfilePtr::read_keyword = 2 CODE: value = get_mortalspace(FLEN_VALUE,TBYTE); comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL; RETVAL=ffgkey(fptr,keyname,value,comment,&status); OUTPUT: value comment status RETVAL int ffgrec(fptr,keynum,card,status) fitsfile * fptr int keynum char * card = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_record = 1 fitsfilePtr::read_record = 2 CODE: card = get_mortalspace(FLEN_CARD,TBYTE); RETVAL=ffgrec(fptr,keynum,card,&status); OUTPUT: card status RETVAL int ffgsv(fptr, dtype, blc, trc, inc, nulval, array, anynul, status) FitsFile * fptr int dtype long * blc long * trc long * inc SV * nulval void * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset = 1 fitsfilePtr::read_subset = 2 PREINIT: long ndata, *naxes; int i, naxis, storage_dtype; CODE: storage_dtype = dtype; if (dtype == TBIT) storage_dtype = TLOGICAL; /* get the size of the image */ RETVAL = ffgidm(fptr->fptr, &naxis, &status); naxes = get_mortalspace(naxis, TLONG); RETVAL = ffgisz(fptr->fptr, naxis, naxes, &status); /* determine the number of pixels to be read */ ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(6),ndata*sizeof_datatype(storage_dtype)); RETVAL=ffgsv(fptr->fptr,dtype,blc,trc,inc,(nulval!=&PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL),(void*)SvPV(ST(6),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,storage_dtype); RETVAL=ffgsv(fptr->fptr,dtype,blc,trc,inc,(nulval != &PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL),array,&anynul,&status); unpack1D(ST(6),array,ndata,storage_dtype,fptr->perlyunpacking); } if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul); OUTPUT: RETVAL status int ffgsvb(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc byte nulval byte * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_byt = 1 fitsfilePtr::read_subset_byt = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TBYTE)); RETVAL=ffgsvb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(byte*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TBYTE); RETVAL=ffgsvb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TBYTE,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvsb(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc signed char nulval signed char* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_sbyt = 1 fitsfilePtr::read_subset_sbyt = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TSBYTE)); RETVAL=ffgsvsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(signed char*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TSBYTE); RETVAL=ffgsvsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TSBYTE,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvi(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc short nulval short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_sht = 1 fitsfilePtr::read_subset_sht = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TSHORT)); RETVAL=ffgsvi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(short*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TSHORT); RETVAL=ffgsvi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TSHORT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvui(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc unsigned short nulval unsigned short * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_usht = 1 fitsfilePtr::read_subset_usht = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TUSHORT)); RETVAL=ffgsvui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(unsigned short*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TUSHORT); RETVAL=ffgsvui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TUSHORT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvk(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc int nulval int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_int = 1 fitsfilePtr::read_subset_int = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TINT)); RETVAL=ffgsvk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(int*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TINT); RETVAL=ffgsvk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TINT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvuk(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc unsigned int nulval unsigned int * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_uint = 1 fitsfilePtr::read_subset_uint = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TUINT)); RETVAL=ffgsvuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(unsigned int*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TUINT); RETVAL=ffgsvuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TUINT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvj(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc long nulval long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_lng = 1 fitsfilePtr::read_subset_lng = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TLONG)); RETVAL=ffgsvj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(long*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TLONG); RETVAL=ffgsvj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TLONG,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvjj(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc LONGLONG nulval LONGLONG* array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_lnglng = 1 fitsfilePtr::read_subset_lnglng = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TLONGLONG)); RETVAL=ffgsvjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(LONGLONG*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TLONGLONG); RETVAL=ffgsvjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TLONGLONG,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvuj(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc unsigned long nulval unsigned long * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_ulng = 1 fitsfilePtr::read_subset_ulng = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TULONG)); RETVAL=ffgsvuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(unsigned long*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TULONG); RETVAL=ffgsvuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TULONG,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsve(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc float nulval float * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_flt = 1 fitsfilePtr::read_subset_flt = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TFLOAT)); RETVAL=ffgsve(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(float*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TFLOAT); RETVAL=ffgsve(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TFLOAT,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsvd(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc double nulval double * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subset_dbl = 1 fitsfilePtr::read_subset_dbl = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { SvGROW(ST(8),ndata*sizeof_datatype(TDOUBLE)); RETVAL=ffgsvd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(double*)SvPV(ST(8),PL_na),&anynul,&status); } else { array = get_mortalspace(ndata,TDOUBLE); RETVAL=ffgsvd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status); unpack1D(ST(8),array,ndata,TDOUBLE,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfb(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc byte * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_byt = 1 fitsfilePtr::read_subsetnull_byt = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TBYTE)); array = (byte*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TBYTE); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TBYTE); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TBYTE,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfsb(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc signed char* array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_sbyt = 1 fitsfilePtr::read_subsetnull_sbyt = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TSBYTE)); array = (signed char*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TSBYTE); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TSBYTE); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TSBYTE,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfi(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc short * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_sht = 1 fitsfilePtr::read_subsetnull_sht = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TSHORT)); array = (short*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TSHORT); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TSHORT); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TSHORT,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfui(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc unsigned short * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_usht = 1 fitsfilePtr::read_subsetnull_usht = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TUSHORT)); array = (unsigned short*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TUSHORT); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TUSHORT); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TUSHORT,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfk(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc int * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_int = 1 fitsfilePtr::read_subsetnull_int = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TINT)); array = (int*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TINT); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TINT); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TINT,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfuk(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc unsigned int * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_uint = 1 fitsfilePtr::read_subsetnull_uint = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TUINT)); array = (unsigned int*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TUINT); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TUINT); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TUINT,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfj(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc long * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_lng = 1 fitsfilePtr::read_subsetnull_lng = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TLONG)); array = (long*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TLONG); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TLONG); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TLONG,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfjj(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc LONGLONG* array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_lnglng = 1 fitsfilePtr::read_subsetnull_lnglng = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TLONGLONG)); array = (LONGLONG*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TLONGLONG); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TLONGLONG); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TLONGLONG,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfuj(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc unsigned long * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_ulng = 1 fitsfilePtr::read_subsetnull_ulng = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TULONG)); array = (unsigned long*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TULONG); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TULONG); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TULONG,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfe(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc float * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_flt = 1 fitsfilePtr::read_subsetnull_flt = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TFLOAT)); array = (float*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TFLOAT); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfe(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TFLOAT); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfe(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TFLOAT,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgsfd(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status) FitsFile * fptr int group int naxis long * naxes long * fpixels long * lpixels long * inc double * array = NO_INIT logical * nularr = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_subsetnull_dbl = 1 fitsfilePtr::read_subsetnull_dbl = 2 PREINIT: long ndata; int i; CODE: ndata = 1; for (i=0; iperlyunpacking)) { if (ST(7) != &PL_sv_undef) { SvGROW(ST(7),ndata*sizeof_datatype(TDOUBLE)); array = (double*)SvPV(ST(7),PL_na); } else array = get_mortalspace(ndata,TDOUBLE); if (ST(8) != &PL_sv_undef) { SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL)); nularr = (logical*)SvPV(ST(8),PL_na); } else nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); } else { array = get_mortalspace(ndata,TDOUBLE); nularr = get_mortalspace(ndata,TLOGICAL); RETVAL=ffgsfd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status); if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TDOUBLE,fptr->perlyunpacking); if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking); } if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul); OUTPUT: status RETVAL int ffgtcs(fptr,xcol,ycol,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,status) fitsfile * fptr int xcol int ycol double xrefval = NO_INIT double yrefval = NO_INIT double xrefpix = NO_INIT double yrefpix = NO_INIT double xinc = NO_INIT double yinc = NO_INIT double rot = NO_INIT char * coordtype = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_tbl_coord = 1 fitsfilePtr::read_tbl_coord = 2 CODE: coordtype = get_mortalspace(FLEN_VALUE,TBYTE); RETVAL=ffgtcs(fptr,xcol,ycol,&xrefval,&yrefval,&xrefpix,&yrefpix,&xinc,&yinc,&rot,coordtype,&status); if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),xrefval); /* value-added, all around */ if (ST(4) != &PL_sv_undef) sv_setnv(ST(4),yrefval); if (ST(5) != &PL_sv_undef) sv_setnv(ST(5),xrefpix); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),yrefpix); if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),xinc); if (ST(8) != &PL_sv_undef) sv_setnv(ST(8),yinc); if (ST(9) != &PL_sv_undef) sv_setnv(ST(9),rot); OUTPUT: coordtype status RETVAL int ffgtbb(fptr,frow,fchar,nchars,values,status) FitsFile * fptr LONGLONG frow LONGLONG fchar LONGLONG nchars byte * values = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_tblbytes = 1 fitsfilePtr::read_tblbytes = 2 CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(4),nchars*sizeof_datatype(TBYTE)); RETVAL=ffgtbb(fptr->fptr,frow,fchar,nchars,(byte*)SvPV(ST(4),PL_na),&status); } else { values = get_mortalspace(nchars,TBYTE); RETVAL=ffgtbb(fptr->fptr,frow,fchar,nchars,values,&status); unpack1D(ST(4),values,nchars,TBYTE,fptr->perlyunpacking); } OUTPUT: status RETVAL int ffgtdm(fptr,colnum,naxis,naxes,status) FitsFile * fptr int colnum int naxis = NO_INIT long * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_tdim = 1 fitsfilePtr::read_tdim = 2 CODE: if (ST(3)!=&PL_sv_undef) { ffgtdm(fptr->fptr,colnum,0,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONG); } else { naxes = NULL; naxis = 0; } RETVAL=ffgtdm(fptr->fptr,colnum,naxis,&naxis,naxes,&status); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis); if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int ffgtdmll(fptr,colnum,naxis,naxes,status) FitsFile * fptr int colnum int naxis = NO_INIT LONGLONG * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_tdimll = 1 fitsfilePtr::read_tdimll = 2 CODE: if (ST(3)!=&PL_sv_undef) { ffgtdmll(fptr->fptr,colnum,0,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONGLONG); } else { naxes = NULL; naxis = 0; } RETVAL=ffgtdmll(fptr->fptr,colnum,naxis,&naxis,naxes,&status); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis); if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONGLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int ffgtrm(gfptr,rmopt,status) fitsfile * gfptr int rmopt int &status ALIAS: Astro::FITS::CFITSIO::fits_remove_group = 1 fitsfilePtr::remove_group = 2 OUTPUT: status int ffgmrm(fptr,member,rmopt,status) fitsfile * fptr long member int rmopt int &status ALIAS: Astro::FITS::CFITSIO::fits_remove_member = 1 fitsfilePtr::remove_member = 2 OUTPUT: status int ffreopen(openfptr,newfptr,status) fitsfile * openfptr FitsFile * newfptr = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_reopen_file = 1 fitsfilePtr::reopen_file = 2 CODE: NewFitsFile(newfptr); RETVAL = ffreopen(openfptr,&(newfptr->fptr),&status); if (RETVAL) AbortFitsFile(newfptr); OUTPUT: status newfptr RETVAL void ffrprt(stream, status) FILE * stream int status ALIAS: Astro::FITS::CFITSIO::fits_report_error = 1 int ffrsim(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis long * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_resize_img = 1 fitsfilePtr::resize_img = 2 OUTPUT: status int ffrsimll(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis LONGLONG * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_resize_imgll = 1 fitsfilePtr::resize_imgll = 2 OUTPUT: status int ffsrow(infptr,outfptr,expr,status) fitsfile * infptr fitsfile * outfptr char * expr int &status ALIAS: Astro::FITS::CFITSIO::fits_select_rows = 1 fitsfilePtr::select_rows = 2 OUTPUT: status int ffpscl(fptr,scale,zero,status) fitsfile * fptr double scale double zero int &status ALIAS: Astro::FITS::CFITSIO::fits_set_bscale = 1 fitsfilePtr::set_bscale = 2 OUTPUT: status int ffsnul(fptr,colnum,nulstr,status) fitsfile * fptr int colnum char * nulstr int &status ALIAS: Astro::FITS::CFITSIO::fits_set_atblnull = 1 fitsfilePtr::set_atblnull = 2 OUTPUT: status int fftnul(fptr,colnum,nulval,status) fitsfile * fptr int colnum LONGLONG nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_set_btblnull = 1 fitsfilePtr::set_btblnull = 2 OUTPUT: status int fits_set_compression_type(fptr, comptype, status) fitsfile *fptr int comptype int &status ALIAS: fitsfilePtr::set_compression_type = 1 OUTPUT: status int ffhdef(fptr,morekeys,status) fitsfile * fptr int morekeys int &status ALIAS: Astro::FITS::CFITSIO::fits_set_hdrsize = 1 fitsfilePtr::set_hdrsize = 2 OUTPUT: status int ffrdef(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_set_hdustruc = 1 fitsfilePtr::set_hdustruc = 2 OUTPUT: status int ffpnul(fptr,nulval,status) fitsfile * fptr LONGLONG nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_set_imgnull = 1 fitsfilePtr::set_imgnull = 2 OUTPUT: status int fits_set_noise_bits(fptr, noisebits, status) fitsfile *fptr int noisebits int &status ALIAS: fitsfilePtr::set_noise_bits = 1 OUTPUT: status int fits_set_tile_dim(fptr, ndim, tilesize, status) fitsfile *fptr int ndim long *tilesize int &status ALIAS: fitsfilePtr::set_tile_dim = 1 OUTPUT: status int fftscl(fptr,colnum,scale,zero,status) fitsfile * fptr int colnum double scale double zero int &status ALIAS: Astro::FITS::CFITSIO::fits_set_tscale = 1 fitsfilePtr::set_tscale = 2 OUTPUT: status int ffs2dt(datestr,year,month,day,status) char * datestr int year = NO_INIT int month = NO_INIT int day = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_str2date = 1 CODE: RETVAL = ffs2dt(datestr,&year,&month,&day,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),year); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),month); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),day); OUTPUT: status RETVAL int ffs2tm(datestr,year,month,day,hour,minute,second,status) char * datestr int year = NO_INIT int month = NO_INIT int day = NO_INIT int hour = NO_INIT int minute = NO_INIT double second = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_str2time = 1 CODE: RETVAL = ffs2tm(datestr,&year,&month,&day,&hour,&minute,&second,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),year); if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),month); if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),day); if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),hour); if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),minute); if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),second); OUTPUT: status RETVAL int fftexp(fptr,expr,datatype,nelem,naxis,naxes,status) FitsFile * fptr char * expr int datatype = NO_INIT long nelem = NO_INIT int naxis = NO_INIT long * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_test_expr = 1 fitsfilePtr::test_expr = 2 CODE: if (ST(5)!=&PL_sv_undef) { fftexp(fptr->fptr,expr,0,&datatype,&nelem,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONG); } else { naxes = NULL; naxis = 0; } RETVAL=fftexp(fptr->fptr,expr,naxis,&datatype,&nelem,&naxis,naxes,&status); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),datatype); if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),nelem); if (ST(4)!=&PL_sv_undef) sv_setiv(ST(4),naxis); if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),naxes,naxis,TLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int fftheap(fptr,heapsize,unused,overlap,validheap,status) fitsfile * fptr LONGLONG &heapsize = NO_INIT LONGLONG &unused = NO_INIT LONGLONG &overlap = NO_INIT int &validheap = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_test_heap = 1 fitsfilePtr::test_heap = 2 OUTPUT: heapsize unused overlap validheap status int fftkey(keyname,status) char * keyname int &status ALIAS: Astro::FITS::CFITSIO::fits_test_keyword = 1 OUTPUT: status int fftrec(card,status) char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_test_record = 1 OUTPUT: status int fftm2s(year,month,day,hr,min,sec,decimals,datestr,status) int year int month int day int hr int min double sec int decimals char * datestr = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_time2str = 1 PREINIT: int datestrlen; CODE: datestrlen=21; /* YYYY-MM-DDThh:mm:ss.[ddd...] */ if (decimals > 0) datestrlen += decimals; datestr = get_mortalspace(datestrlen,TBYTE); RETVAL=fftm2s(year,month,day,hr,min,sec,decimals,datestr,&status); OUTPUT: datestr status RETVAL int ffgmtf(infptr,outfptr,member,tfopt,status) fitsfile * infptr fitsfile * outfptr long member int tfopt int &status ALIAS: Astro::FITS::CFITSIO::fits_transfer_member = 1 fitsfilePtr::transfer_member = 2 OUTPUT: status int ffucrd(fptr,keyname,card,status) fitsfile *fptr char * keyname char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_update_card = 1 fitsfilePtr::update_card = 2 OUTPUT: status int ffupck(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_update_chksum = 1 fitsfilePtr::update_chksum = 2 OUTPUT: status int ffuky(fptr,datatype,keyname,value,comm,status) fitsfile * fptr int datatype char * keyname void * value = NO_INIT char * comm int status ALIAS: Astro::FITS::CFITSIO::fits_update_key = 1 fitsfilePtr::update_key = 2 CODE: value = pack1D(ST(3),(datatype == TLOGICAL) ? TINT : datatype); RETVAL=ffuky(fptr,datatype,keyname,value,comm,&status); OUTPUT: status RETVAL int ffukyu(fptr,keyname,comment,status) fitsfile * fptr char * keyname char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_null = 1 fitsfilePtr::update_key_null = 2 OUTPUT: status int ffukys(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname char * value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_str = 1 fitsfilePtr::update_key_str = 2 OUTPUT: status int ffukyl(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname int value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_log = 1 fitsfilePtr::update_key_log = 2 OUTPUT: status int ffukyj(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname LONGLONG value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_lng = 1 fitsfilePtr::update_key_lng = 2 OUTPUT: status int ffukye(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_flt = 1 fitsfilePtr::update_key_flt = 2 OUTPUT: status int ffukyd(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_dbl = 1 fitsfilePtr::update_key_dbl = 2 OUTPUT: status int ffukyf(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_fixflt = 1 fitsfilePtr::update_key_fixflt = 2 OUTPUT: status int ffukyg(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_fixdbl = 1 fitsfilePtr::update_key_fixdbl = 2 OUTPUT: status int ffukyc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_cmp = 1 fitsfilePtr::update_key_cmp = 2 OUTPUT: status int ffukym(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_dblcmp = 1 fitsfilePtr::update_key_dblcmp = 2 OUTPUT: status int ffukfc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname cmp * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_fixcmp = 1 fitsfilePtr::update_key_fixcmp = 2 OUTPUT: status int ffukfm(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname dblcmp * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_fixdblcmp = 1 fitsfilePtr::update_key_fixdblcmp = 2 OUTPUT: status void ffupch(string) char * string ALIAS: Astro::FITS::CFITSIO::fits_uppercase = 1 OUTPUT: string int ffurlt(fptr,urlType,status) fitsfile *fptr char *urlType = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_url_type = 1 fitsfilePtr::url_type = 2 CODE: urlType = get_mortalspace(FLEN_FILENAME,TBYTE); RETVAL = ffurlt(fptr,urlType,&status); OUTPUT: urlType status RETVAL int ffvcks(fptr,dataok,hduok,status) fitsfile * fptr int dataok = NO_INIT int hduok = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_verify_chksum = 1 fitsfilePtr::verify_chksum = 2 CODE: RETVAL = ffvcks(fptr,&dataok,&hduok,&status); if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),dataok); /* value-added */ if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),hduok); /* value-added */ OUTPUT: status RETVAL int ffgtvf(gfptr,firstfailed,status) fitsfile * gfptr long &firstfailed = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_verify_group = 1 fitsfilePtr::verify_group = 2 OUTPUT: firstfailed status int ffxypx(xpos,ypos,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,xpix,ypix,status) double xpos double ypos double xrefval double yrefval double xrefpix double yrefpix double xinc double yinc double rot char * coordtype double &xpix = NO_INIT double &ypix = NO_INIT int &status ALIAS: Astro::FITS::CFITSIO::fits_world_to_pix = 1 OUTPUT: xpix ypix status int ffp2db(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 byte * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_byt = 1 fitsfilePtr::write_2d_byt = 2 OUTPUT: status int ffp2dsb(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 signed char* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_sbyt = 1 fitsfilePtr::write_2d_sbyt = 2 OUTPUT: status int ffp2di(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_sht = 1 fitsfilePtr::write_2d_sht = 2 OUTPUT: status int ffp2dui(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 unsigned short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_usht = 1 fitsfilePtr::write_2d_usht = 2 OUTPUT: status int ffp2dk(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_int = 1 fitsfilePtr::write_2d_int = 2 OUTPUT: status int ffp2duk(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 unsigned int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_uint = 1 fitsfilePtr::write_2d_uint = 2 OUTPUT: status int ffp2dj(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_lng = 1 fitsfilePtr::write_2d_lng = 2 OUTPUT: status int ffp2djj(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 LONGLONG* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_lnglng = 1 fitsfilePtr::write_2d_lnglng = 2 OUTPUT: status int ffp2duj(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 unsigned long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_ulng = 1 fitsfilePtr::write_2d_ulng = 2 OUTPUT: status int ffp2de(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_flt = 1 fitsfilePtr::write_2d_flt = 2 OUTPUT: status int ffp2dd(fptr,group,dim1,naxis1,naxis2,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG naxis1 LONGLONG naxis2 double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_2d_dbl = 1 fitsfilePtr::write_2d_dbl = 2 OUTPUT: status int ffp3db(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 byte * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_byt = 1 fitsfilePtr::write_3d_byt = 2 OUTPUT: status int ffp3dsb(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 signed char* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_sbyt = 1 fitsfilePtr::write_3d_sbyt = 2 OUTPUT: status int ffp3di(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_sht = 1 fitsfilePtr::write_3d_sht = 2 OUTPUT: status int ffp3dui(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 unsigned short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_usht = 1 fitsfilePtr::write_3d_usht = 2 OUTPUT: status int ffp3dk(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_int = 1 fitsfilePtr::write_3d_int = 2 OUTPUT: status int ffp3duk(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 unsigned int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_uint = 1 fitsfilePtr::write_3d_uint = 2 OUTPUT: status int ffp3dj(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_lng = 1 fitsfilePtr::write_3d_lng = 2 OUTPUT: status int ffp3djj(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 LONGLONG* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_lnglng = 1 fitsfilePtr::write_3d_lnglng = 2 OUTPUT: status int ffp3duj(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 unsigned long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_ulng = 1 fitsfilePtr::write_3d_ulng = 2 OUTPUT: status int ffp3de(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_flt = 1 fitsfilePtr::write_3d_flt = 2 OUTPUT: status int ffp3dd(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status) fitsfile * fptr long group LONGLONG dim1 LONGLONG dim2 LONGLONG naxis1 LONGLONG naxis2 LONGLONG naxis3 double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_3d_dbl = 1 fitsfilePtr::write_3d_dbl = 2 OUTPUT: status int ffphtb(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status) fitsfile * fptr LONGLONG rowlen LONGLONG nrows int tfields char ** ttype long * tbcol char ** tform char ** tunit char * extname int &status ALIAS: Astro::FITS::CFITSIO::fits_write_atblhdr = 1 fitsfilePtr::write_atblhdr = 2 OUTPUT: status int ffphbn(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status) fitsfile * fptr LONGLONG nrows int tfields char ** ttype char ** tform char ** tunit char * extname LONGLONG pcount int &status ALIAS: Astro::FITS::CFITSIO::fits_write_btblhdr = 1 fitsfilePtr::write_btblhdr = 2 OUTPUT: status int ffphext(fptr, xtension, bitpix, naxis, naxes, pcount, gcount, status) fitsfile * fptr char * xtension int bitpix int naxis long * naxes LONGLONG pcount LONGLONG gcount int &status ALIAS: Astro::FITS::CFITSIO::fits_write_exthdr = 1 fitsfilePtr::write_exthdr = 2 OUTPUT: status int ffpcks(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_write_chksum = 1 fitsfilePtr::write_chksum = 2 OUTPUT: status int ffprwu(fptr,firstrow,nelem,status) fitsfile * fptr LONGLONG firstrow LONGLONG nelem int &status ALIAS: Astro::FITS::CFITSIO::fits_write_nullrows = 1 fitsfilePtr::write_nullrows = 2 OUTPUT: status int ffpclu(fptr,colnum,frow,felem,nelem,status) fitsfile * fptr int colnum LONGLONG frow LONGLONG felem LONGLONG nelem int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_null = 1 fitsfilePtr::write_col_null = 2 OUTPUT: status int ffpcl(fptr,datatype,colnum,frow,felem,nelem,array,status) fitsfile * fptr int datatype int colnum LONGLONG frow LONGLONG felem LONGLONG nelem SV * array int status ALIAS: Astro::FITS::CFITSIO::fits_write_col = 1 fitsfilePtr::write_col = 2 PREINIT: int storage_datatype; CODE: storage_datatype = datatype; if (datatype == TBIT) storage_datatype = TLOGICAL; RETVAL=ffpcl(fptr,datatype,colnum,frow,felem,nelem,packND(array,storage_datatype),&status); OUTPUT: status RETVAL int ffpclx(fptr,cnum,frow,fbit,nbits,larray,status) fitsfile * fptr int cnum LONGLONG frow long fbit long nbits logical * larray int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_bit = 1 fitsfilePtr::write_col_bit = 2 OUTPUT: status int ffpcls(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem char ** array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_str = 1 fitsfilePtr::write_col_str = 2 OUTPUT: status int ffpcll(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem logical * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_log = 1 fitsfilePtr::write_col_log = 2 OUTPUT: status int ffpclb(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem byte * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_byt = 1 fitsfilePtr::write_col_byt = 2 OUTPUT: status int ffpclsb(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem signed char* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_sbyt = 1 fitsfilePtr::write_col_sbyt = 2 OUTPUT: status int ffpclui(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_usht = 1 fitsfilePtr::write_col_usht = 2 OUTPUT: status int ffpcli(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_sht = 1 fitsfilePtr::write_col_sht = 2 OUTPUT: status int ffpcluk(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_uint = 1 fitsfilePtr::write_col_uint = 2 OUTPUT: status int ffpclk(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_int = 1 fitsfilePtr::write_col_int = 2 OUTPUT: status int ffpcluj(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_ulng = 1 fitsfilePtr::write_col_ulng = 2 OUTPUT: status int ffpclj(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_lng = 1 fitsfilePtr::write_col_lng = 2 OUTPUT: status int ffpcljj(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem LONGLONG* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_lnglng = 1 fitsfilePtr::write_col_lnglng = 2 OUTPUT: status int ffpcle(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_flt = 1 fitsfilePtr::write_col_flt = 2 OUTPUT: status int ffpcld(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_dbl = 1 fitsfilePtr::write_col_dbl = 2 OUTPUT: status int ffpclc(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_cmp = 1 fitsfilePtr::write_col_cmp = 2 OUTPUT: status int ffpclm(fptr,cnum,frow,felem,nelem,array,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_col_dblcmp = 1 fitsfilePtr::write_col_dblcmp = 2 OUTPUT: status int ffpcns(fptr,cnum,frow,felem,nelem,array,nulstr,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem char ** array char * nulstr int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_str = 1 fitsfilePtr::write_colnull_str = 2 OUTPUT: status int ffpcnl(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem logical * array logical nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_log = 1 fitsfilePtr::write_colnull_log = 2 OUTPUT: status int ffpcnb(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem byte * array byte nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_byt = 1 fitsfilePtr::write_colnull_byt = 2 OUTPUT: status int ffpcnsb(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem signed char* array signed char nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_sbyt = 1 fitsfilePtr::write_colnull_sbyt = 2 OUTPUT: status int ffpcnui(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned short * array unsigned short nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_usht = 1 fitsfilePtr::write_colnull_usht = 2 OUTPUT: status int ffpcni(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem short * array short nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_sht = 1 fitsfilePtr::write_colnull_sht = 2 OUTPUT: status int ffpcnuk(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned int * array unsigned int nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_uint = 1 fitsfilePtr::write_colnull_uint = 2 OUTPUT: status int ffpcnk(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem int * array int nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_int = 1 fitsfilePtr::write_colnull_int = 2 OUTPUT: status int ffpcnuj(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem unsigned long * array unsigned long nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_ulng = 1 fitsfilePtr::write_colnull_ulng = 2 OUTPUT: status int ffpcnj(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem long * array long nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_lng = 1 fitsfilePtr::write_colnull_lng = 2 OUTPUT: status int ffpcnjj(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem LONGLONG* array LONGLONG nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_lnglng = 1 fitsfilePtr::write_colnull_lnglng = 2 OUTPUT: status int ffpcne(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem float * array float nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_flt = 1 fitsfilePtr::write_colnull_flt = 2 OUTPUT: status int ffpcnd(fptr,cnum,frow,felem,nelem,array,nulval,status) fitsfile * fptr int cnum LONGLONG frow LONGLONG felem LONGLONG nelem double * array double nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_colnull_dbl = 1 fitsfilePtr::write_colnull_dbl = 2 OUTPUT: status int ffpcom(fptr,comment,status) fitsfile * fptr char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_comment = 1 fitsfilePtr::write_comment = 2 OUTPUT: status int ffpdat(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_write_date = 1 fitsfilePtr::write_date = 2 OUTPUT: status int ffpdes(fptr,colnum,rownum,repeat,offset,status) fitsfile * fptr int colnum LONGLONG rownum LONGLONG repeat LONGLONG offset int &status ALIAS: Astro::FITS::CFITSIO::fits_write_descript = 1 fitsfilePtr::write_descript = 2 OUTPUT: status void ffpmsg(err_msg) char * err_msg ALIAS: Astro::FITS::CFITSIO::fits_write_errmsg = 1 int ffpgpb(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem byte * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_byt = 1 fitsfilePtr::write_grppar_byt = 2 OUTPUT: status int ffpgpsb(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem signed char* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_sbyt = 1 fitsfilePtr::write_grppar_sbyt = 2 OUTPUT: status int ffpgpui(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem unsigned short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_usht = 1 fitsfilePtr::write_grppar_usht = 2 OUTPUT: status int ffpgpi(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_sht = 1 fitsfilePtr::write_grppar_sht = 2 OUTPUT: status int ffpgpuk(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem unsigned int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_uint = 1 fitsfilePtr::write_grppar_uint = 2 OUTPUT: status int ffpgpk(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_int = 1 fitsfilePtr::write_grppar_int = 2 OUTPUT: status int ffpgpuj(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem unsigned long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_ulng = 1 fitsfilePtr::write_grppar_ulng = 2 OUTPUT: status int ffpgpj(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_lng = 1 fitsfilePtr::write_grppar_lng = 2 OUTPUT: status int ffpgpjj(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem LONGLONG* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_lnglng = 1 fitsfilePtr::write_grppar_lnglng = 2 OUTPUT: status int ffpgpe(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_flt = 1 fitsfilePtr::write_grppar_flt = 2 OUTPUT: status int ffpgpd(fptr,group,felem,nelem,array,status) fitsfile * fptr long group long felem long nelem double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grppar_dbl = 1 fitsfilePtr::write_grppar_dbl = 2 OUTPUT: status int ffphis(fptr,history,status) fitsfile * fptr char * history int &status ALIAS: Astro::FITS::CFITSIO::fits_write_history = 1 fitsfilePtr::write_history = 2 OUTPUT: status int ffppr(fptr,datatype,firstelem,nelem,array,status) fitsfile * fptr int datatype LONGLONG firstelem LONGLONG nelem SV * array int status ALIAS: Astro::FITS::CFITSIO::fits_write_img = 1 fitsfilePtr::write_img = 2 CODE: RETVAL=ffppr(fptr,datatype,firstelem,nelem,packND(array,datatype),&status); OUTPUT: status RETVAL int ffppru(fptr,group,felem,nelem,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_null = 1 fitsfilePtr::write_img_null = 2 OUTPUT: status int ffpprb(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem byte * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_byt = 1 fitsfilePtr::write_img_byt = 2 OUTPUT: status int ffpprsb(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem signed char* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_sbyt = 1 fitsfilePtr::write_img_sbyt = 2 OUTPUT: status int ffpprui(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem unsigned short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_usht = 1 fitsfilePtr::write_img_usht = 2 OUTPUT: status int ffppri(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_sht = 1 fitsfilePtr::write_img_sht = 2 OUTPUT: status int ffppruk(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem unsigned int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_uint = 1 fitsfilePtr::write_img_uint = 2 OUTPUT: status int ffpprk(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_int = 1 fitsfilePtr::write_img_int = 2 OUTPUT: status int ffppruj(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem unsigned long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_ulng = 1 fitsfilePtr::write_img_ulng = 2 OUTPUT: status int ffpprj(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_lng = 1 fitsfilePtr::write_img_lng = 2 OUTPUT: status int ffpprjj(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem LONGLONG* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_lnglng = 1 fitsfilePtr::write_img_lnglng = 2 OUTPUT: status int ffppre(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_flt = 1 fitsfilePtr::write_img_flt = 2 OUTPUT: status int ffpprd(fptr,group,felem,nelem,array,status) fitsfile * fptr long group LONGLONG nelem LONGLONG felem double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_img_dbl = 1 fitsfilePtr::write_img_dbl = 2 OUTPUT: status int ffphps(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis long * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imghdr = 1 fitsfilePtr::write_imghdr = 2 OUTPUT: status int ffphpsll(fptr,bitpix,naxis,naxes,status) fitsfile * fptr int bitpix int naxis LONGLONG * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imghdrll = 1 fitsfilePtr::write_imghdrll = 2 OUTPUT: status int ffphpr(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status) fitsfile * fptr int simple int bitpix int naxis long * naxes LONGLONG pcount LONGLONG gcount int extend int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grphdr = 1 fitsfilePtr::write_grphdr = 2 OUTPUT: status int ffphprll(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status) fitsfile * fptr int simple int bitpix int naxis LONGLONG* naxes LONGLONG pcount LONGLONG gcount int extend int &status ALIAS: Astro::FITS::CFITSIO::fits_write_grphdrll = 1 fitsfilePtr::write_grphdrll = 2 OUTPUT: status int ffppn(fptr,datatype,felem,nelem,array,nulval,status) fitsfile * fptr int datatype LONGLONG felem LONGLONG nelem SV * array SV * nulval int status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull = 1 fitsfilePtr::write_imgnull = 2 CODE: RETVAL=ffppn(fptr,datatype,felem,nelem,packND(array,datatype),pack1D(nulval,datatype),&status); OUTPUT: status RETVAL int ffppnb(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem byte * array byte nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_byt = 1 fitsfilePtr::write_imgnull_byt = 2 OUTPUT: status int ffppnsb(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem signed char* array signed char nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_sbyt = 1 fitsfilePtr::write_imgnull_sbyt = 2 OUTPUT: status int ffppnui(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem unsigned short * array unsigned short nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_usht = 1 fitsfilePtr::write_imgnull_usht = 2 OUTPUT: status int ffppni(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem short * array short nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_sht = 1 fitsfilePtr::write_imgnull_sht = 2 OUTPUT: status int ffppnuk(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem unsigned int * array unsigned int nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_uint = 1 fitsfilePtr::write_imgnull_uint = 2 OUTPUT: status int ffppnk(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem int * array int nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_int = 1 fitsfilePtr::write_imgnull_int = 2 OUTPUT: status int ffppnuj(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem unsigned long * array unsigned long nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_ulng = 1 fitsfilePtr::write_imgnull_ulng = 2 OUTPUT: status int ffppnj(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem long * array long nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_lng = 1 fitsfilePtr::write_imgnull_lng = 2 OUTPUT: status int ffppnjj(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem LONGLONG* array LONGLONG nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_lnglng = 1 fitsfilePtr::write_imgnull_lnglng = 2 OUTPUT: status int ffppne(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem float * array float nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_flt = 1 fitsfilePtr::write_imgnull_flt = 2 OUTPUT: status int ffppnd(fptr,group,felem,nelem,array,nulval,status) fitsfile * fptr long group LONGLONG felem LONGLONG nelem double * array double nulval int &status ALIAS: Astro::FITS::CFITSIO::fits_write_imgnull_dbl = 1 fitsfilePtr::write_imgnull_dbl = 2 OUTPUT: status int ffpky(fptr,datatype,keyname,value,comment,status) fitsfile * fptr int datatype char * keyname void * value = NO_INIT char * comment int status ALIAS: Astro::FITS::CFITSIO::fits_write_key = 1 fitsfilePtr::write_key = 2 CODE: value = pack1D(ST(3),(datatype == TLOGICAL) ? TINT : datatype); RETVAL=ffpky(fptr,datatype,keyname,value,comment,&status); OUTPUT: status RETVAL int ffpkls(fptr,keyname,longstr,comment,status) fitsfile * fptr char * keyname char * longstr char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_longstr = 1 fitsfilePtr::write_key_longstr = 2 OUTPUT: status int ffukls(fptr,keynam,value,comm,status) fitsfile * fptr char * keynam char * value char * comm int &status ALIAS: Astro::FITS::CFITSIO::fits_update_key_longstr = 1 fitsfilePtr::update_key_longstr = 2 OUTPUT: status int ffikls(fptr,keynam,value,comm,status) fitsfile * fptr char * keynam char * value char * comm int &status ALIAS: Astro::FITS::CFITSIO::fits_insert_key_longstr = 1 fitsfilePtr::insert_key_longstr = 2 OUTPUT: status int ffmkls(fptr,keynam,value,comm,status) fitsfile * fptr char * keynam char * value char * comm int &status ALIAS: Astro::FITS::CFITSIO::fits_modify_key_longstr = 1 fitsfilePtr::modify_key_longstr = 2 OUTPUT: status int ffplsw(fptr,status) fitsfile * fptr int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_longwarn = 1 fitsfilePtr::write_key_longwarn = 2 OUTPUT: status int ffpkyu(fptr,keyname,comment,status) fitsfile * fptr char * keyname char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_null = 1 fitsfilePtr::write_key_null = 2 OUTPUT: status int ffpktp(fptr,filename,status) fitsfile * fptr char * filename int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_template = 1 fitsfilePtr::write_key_template = 2 OUTPUT: status int ffpkyt(fptr,keyname,intval,frac,comment,status) fitsfile * fptr char * keyname long intval double frac char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_triple = 1 fitsfilePtr::write_key_triple = 2 OUTPUT: status int ffpunt(fptr,keyname,unit,status) fitsfile * fptr char * keyname char * unit int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_unit = 1 fitsfilePtr::write_key_unit = 2 OUTPUT: status int ffpkys(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname char * value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_str = 1 fitsfilePtr::write_key_str = 2 OUTPUT: status int ffpkyl(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname int value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_log = 1 fitsfilePtr::write_key_log = 2 OUTPUT: status int ffpkyj(fptr,keyname,value,comment,status) fitsfile * fptr char * keyname LONGLONG value char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_lng = 1 fitsfilePtr::write_key_lng = 2 OUTPUT: status int ffpkye(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_flt = 1 fitsfilePtr::write_key_flt = 2 OUTPUT: status int ffpkyf(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_fixflt = 1 fitsfilePtr::write_key_fixflt = 2 OUTPUT: status int ffpkyd(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_dbl = 1 fitsfilePtr::write_key_dbl = 2 OUTPUT: status int ffpkyg(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_fixdbl = 1 fitsfilePtr::write_key_fixdbl = 2 OUTPUT: status int ffpkyc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_cmp = 1 fitsfilePtr::write_key_cmp = 2 OUTPUT: status int ffpkfc(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname float * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_fixcmp = 1 fitsfilePtr::write_key_fixcmp = 2 OUTPUT: status int ffpkym(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_dblcmp = 1 fitsfilePtr::write_key_dblcmp = 2 OUTPUT: status int ffpkfm(fptr,keyname,value,decimals,comment,status) fitsfile * fptr char * keyname double * value int decimals char * comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_key_fixdblcmp = 1 fitsfilePtr::write_key_fixdblcmp = 2 OUTPUT: status int ffpkns(fptr,keyroot,nstart,nkeys,value,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys char ** value char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_str = 1 fitsfilePtr::write_keys_str = 2 OUTPUT: status int ffpknl(fptr,keyroot,nstart,nkeys,value,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys int * value char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_log = 1 fitsfilePtr::write_keys_log = 2 OUTPUT: status int ffpknj(fptr,keyroot,nstart,nkeys,value,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys long * value char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_lng = 1 fitsfilePtr::write_keys_lng = 2 OUTPUT: status int ffpknjj(fptr,keyroot,nstart,nkeys,value,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys LONGLONG * value char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_lnglng = 1 fitsfilePtr::write_keysll = 2 OUTPUT: status int ffpkne(fptr,keyroot,nstart,nkeys,value,decimals,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys float * value int decimals char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_flt = 1 fitsfilePtr::write_keys_flt = 2 OUTPUT: status int ffpknf(fptr,keyroot,nstart,nkeys,value,decimals,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys float * value int decimals char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_fixflt = 1 fitsfilePtr::write_keys_fixflt = 2 OUTPUT: status int ffpknd(fptr,keyroot,nstart,nkeys,value,decimals,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys double * value int decimals char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_dbl = 1 fitsfilePtr::write_keys_dbl = 2 OUTPUT: status int ffpkng(fptr,keyroot,nstart,nkeys,value,decimals,comment,status) fitsfile * fptr char * keyroot int nstart int nkeys double * value int decimals char ** comment int &status ALIAS: Astro::FITS::CFITSIO::fits_write_keys_fixdbl = 1 fitsfilePtr::write_keys_fixdbl = 2 OUTPUT: status int ffpprn(fptr,felem,nelem,status) fitsfile * fptr LONGLONG felem LONGLONG nelem int &status ALIAS: Astro::FITS::CFITSIO::fits_write_null_img = 1 fitsfilePtr::write_null_img = 2 OUTPUT: status int ffprec(fptr,card,status) fitsfile * fptr char * card int &status ALIAS: Astro::FITS::CFITSIO::fits_write_record = 1 fitsfilePtr::write_record = 2 OUTPUT: status int ffpss(fptr, dtype, fpix, lpix, nelem, array, status) fitsfile *fptr int dtype long *fpix long *lpix SV *array int status ALIAS: Astro::FITS::CFITSIO::fits_write_subset = 1 fitsfilePtr::write_subset = 2 PREINIT: int storage_dtype; CODE: storage_dtype = dtype; if (dtype == TBIT) storage_dtype = TLOGICAL; RETVAL = ffpss(fptr,dtype,fpix,lpix,packND(array,storage_dtype),&status); OUTPUT: RETVAL status int ffpssb(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel byte * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_byt = 1 fitsfilePtr::write_subset_byt = 2 OUTPUT: status int ffpsssb(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel signed char* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_sbyt = 1 fitsfilePtr::write_subset_sbyt = 2 OUTPUT: status int ffpssui(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel unsigned short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_usht = 1 fitsfilePtr::write_subset_usht = 2 OUTPUT: status int ffpssi(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel short * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_sht = 1 fitsfilePtr::write_subset_sht = 2 OUTPUT: status int ffpssuk(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel unsigned int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_uint = 1 fitsfilePtr::write_subset_uint = 2 OUTPUT: status int ffpssk(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel int * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_int = 1 fitsfilePtr::write_subset_int = 2 OUTPUT: status int ffpssuj(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel unsigned long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_ulng = 1 fitsfilePtr::write_subset_ulng = 2 OUTPUT: status int ffpssj(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel long * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_lng = 1 fitsfilePtr::write_subset_lng = 2 OUTPUT: status int ffpssjj(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel LONGLONG* array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_lnglng = 1 fitsfilePtr::write_subset_lnglng = 2 OUTPUT: status int ffpsse(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel float * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_flt = 1 fitsfilePtr::write_subset_flt = 2 OUTPUT: status int ffpssd(fptr,group,naxis,naxes,fpixel,lpixel,array,status) fitsfile * fptr long group long naxis long * naxes long * fpixel long * lpixel double * array int &status ALIAS: Astro::FITS::CFITSIO::fits_write_subset_dbl = 1 fitsfilePtr::write_subset_dbl = 2 OUTPUT: status int ffptbb(fptr,frow,fchar,nchars,values,status) fitsfile * fptr LONGLONG frow LONGLONG fchar LONGLONG nchars byte * values; int &status ALIAS: Astro::FITS::CFITSIO::fits_write_tblbytes = 1 fitsfilePtr::write_tblbytes = 2 OUTPUT: status int ffptdm(fptr,colnum,naxis,naxes,status) fitsfile * fptr int colnum int naxis long * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_write_tdim = 1 fitsfilePtr::write_tdim = 2 OUTPUT: status int ffptdmll(fptr,colnum,naxis,naxes,status) fitsfile * fptr int colnum int naxis LONGLONG * naxes int &status ALIAS: Astro::FITS::CFITSIO::fits_write_tdimll = 1 fitsfilePtr::write_tdimll = 2 OUTPUT: status int ffpthp(fptr,theap,status) fitsfile * fptr long theap int &status ALIAS: Astro::FITS::CFITSIO::fits_write_theap = 1 fitsfilePtr::write_theap = 2 OUTPUT: status int ffgiwcs(fptr,header,status) fitsfile * fptr char * header = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_image_wcs_keys = 1 fitsfilePtr::get_image_wcs_keys = 2 CODE: RETVAL = ffgiwcs(fptr,&header,&status); if (status == 0) { if (ST(1) != &PL_sv_undef) unpackScalar(ST(1),header,TSTRING); free(header); } OUTPUT: RETVAL status int ffgtwcs(fptr,xcol,ycol,header,status) fitsfile * fptr int xcol int ycol char * header = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_table_wcs_keys = 1 fitsfilePtr::get_table_wcs_keys = 2 CODE: RETVAL = ffgtwcs(fptr,xcol,ycol,&header,&status); if (status == 0) { if (ST(3)!=&PL_sv_undef) unpackScalar(ST(3),header,TSTRING); free(header); } OUTPUT: RETVAL status int ffgipr(fptr,bitbix,naxis,naxes,status) FitsFile * fptr int bitpix = NO_INIT int naxis = NO_INIT long * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_img_parm = 1 fitsfilePtr::get_img_parm = 2 CODE: if (ST(3)!=&PL_sv_undef) { RETVAL = ffgipr(fptr->fptr,0,&bitpix,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONG); } else { naxis = 0; naxes = NULL; } RETVAL = ffgipr(fptr->fptr,naxis,&bitpix,&naxis,naxes,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),bitpix); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis); if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int ffgiprll(fptr,bitbix,naxis,naxes,status) FitsFile * fptr int bitpix = NO_INIT int naxis = NO_INIT LONGLONG * naxes = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_get_img_parmll = 1 fitsfilePtr::get_img_parmll = 2 CODE: if (ST(3)!=&PL_sv_undef) { RETVAL = ffgiprll(fptr->fptr,0,&bitpix,&naxis,NULL,&status); naxes = get_mortalspace(naxis,TLONGLONG); } else { naxis = 0; naxes = NULL; } RETVAL = ffgiprll(fptr->fptr,naxis,&bitpix,&naxis,naxes,&status); if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),bitpix); if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis); if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONGLONG,fptr->perlyunpacking); OUTPUT: status RETVAL int ffgkcl(card) char * card ALIAS: Astro::FITS::CFITSIO::fits_get_keyclass = 1 int ffgpxv(fptr, dtype, fpix, nelem, nulval, array, anynul, status) FitsFile * fptr int dtype long * fpix LONGLONG nelem SV * nulval void * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_pix = 1 fitsfilePtr::read_pix = 2 PREINIT: int naxis; long *naxes; OFF_T nelem_all; int i; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(dtype)); RETVAL = ffgpxv(fptr->fptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ? pack1D(nulval, dtype) : NULL), (void*)SvPV(ST(5),PL_na), &anynul, &status); } else { /* find out how many elements are in the image, * allocate space, read, unpack */ RETVAL = ffgidm(fptr->fptr, &naxis, &status); if (status == 0) { naxes = get_mortalspace(naxis, TLONG); RETVAL = ffgisz(fptr->fptr, naxis, naxes, &status); nelem_all = 1; for (i=0; ifptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ? pack1D(nulval, dtype) : NULL), array, &anynul, &status); if (status == 0) { order_reverse(naxis, naxes); unpackND(ST(5), array, naxis, naxes, dtype,fptr->perlyunpacking); } } } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6), anynul); OUTPUT: status RETVAL int ffgpxvll(fptr, dtype, fpix, nelem, nulval, array, anynul, status) FitsFile * fptr int dtype LONGLONG * fpix LONGLONG nelem SV * nulval void * array = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_pixll = 1 fitsfilePtr::read_pixll = 2 PREINIT: int naxis; LONGLONG *naxes; OFF_T nelem_all; int i; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { SvGROW(ST(5),nelem*sizeof_datatype(dtype)); RETVAL = ffgpxvll(fptr->fptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ? pack1D(nulval, dtype) : NULL), (void*)SvPV(ST(5),PL_na), &anynul, &status); } else { /* find out how many elements are in the image, * allocate space, read, unpack */ RETVAL = ffgidm(fptr->fptr, &naxis, &status); if (status == 0) { naxes = get_mortalspace(naxis, TLONGLONG); RETVAL = ffgiszll(fptr->fptr, naxis, naxes, &status); nelem_all = 1; for (i=0; ifptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ? pack1D(nulval, dtype) : NULL), array, &anynul, &status); if (status == 0) { order_reversell(naxis, naxes); unpackNDll(ST(5), array, naxis, naxes, dtype,fptr->perlyunpacking); } } } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6), anynul); OUTPUT: status RETVAL int ffgpxf(fptr, dtype, fpix, nelem, array, nullarray, anynul, status) FitsFile * fptr int dtype long * fpix LONGLONG nelem void * array = NO_INIT logical * nullarray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_pixnull = 1 fitsfilePtr::read_pixnull = 2 PREINIT: int naxis; long *naxes; OFF_T nelem_all; int i; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(dtype)); array = (void*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem, dtype); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nullarray = (logical*)SvPV(ST(5),PL_na); } else nullarray = get_mortalspace(nelem,TLOGICAL); RETVAL = ffgpxf(fptr->fptr,dtype,fpix,nelem,array,nullarray, &anynul,&status); } else { /* find out how many elements are in the image, * allocate space, read, unpack */ RETVAL = ffgidm(fptr->fptr, &naxis, &status); if (status == 0) { naxes = get_mortalspace(naxis, TLONG); RETVAL = ffgisz(fptr->fptr, naxis, naxes, &status); nelem_all = 1; for (i=0; ifptr,dtype,fpix,nelem,array,nullarray,&anynul,&status); if (status == 0) { order_reverse(naxis, naxes); if (ST(4)!=&PL_sv_undef) unpackND(ST(4),array,naxis,naxes,dtype,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpackND(ST(5),nullarray,naxis,naxes,TLOGICAL,fptr->perlyunpacking); } } } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6), anynul); OUTPUT: status RETVAL int ffgpxfll(fptr, dtype, fpix, nelem, array, nullarray, anynul, status) FitsFile * fptr int dtype LONGLONG * fpix LONGLONG nelem void * array = NO_INIT logical * nullarray = NO_INIT int anynul = NO_INIT int status ALIAS: Astro::FITS::CFITSIO::fits_read_pixnullll = 1 fitsfilePtr::read_pixnullll = 2 PREINIT: int naxis; LONGLONG *naxes; OFF_T nelem_all; int i; CODE: if (!PERLYUNPACKING(fptr->perlyunpacking)) { if (ST(4) != &PL_sv_undef) { SvGROW(ST(4),nelem*sizeof_datatype(dtype)); array = (void*)SvPV(ST(4),PL_na); } else array = get_mortalspace(nelem, dtype); if (ST(5) != &PL_sv_undef) { SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL)); nullarray = (logical*)SvPV(ST(5),PL_na); } else nullarray = get_mortalspace(nelem,TLOGICAL); RETVAL = ffgpxfll(fptr->fptr,dtype,fpix,nelem,array,nullarray, &anynul,&status); } else { /* find out how many elements are in the image, * allocate space, read, unpack */ RETVAL = ffgidm(fptr->fptr, &naxis, &status); if (status == 0) { naxes = get_mortalspace(naxis, TLONGLONG); RETVAL = ffgiszll(fptr->fptr, naxis, naxes, &status); nelem_all = 1; for (i=0; ifptr,dtype,fpix,nelem,array,nullarray,&anynul,&status); if (status == 0) { order_reversell(naxis, naxes); if (ST(4)!=&PL_sv_undef) unpackNDll(ST(4),array,naxis,naxes,dtype,fptr->perlyunpacking); if (ST(5)!=&PL_sv_undef) unpackNDll(ST(5),nullarray,naxis,naxes,TLOGICAL,fptr->perlyunpacking); } } } if (ST(6) != &PL_sv_undef) sv_setiv(ST(6), anynul); OUTPUT: status RETVAL int ffppx(fptr, dtype, fpix, nelem, array, status) fitsfile * fptr int dtype long * fpix LONGLONG nelem SV * array int status ALIAS: Astro::FITS::CFITSIO::fits_write_pix = 1 fitsfilePtr::write_pix = 2 PREINIT: int storage_dtype; CODE: storage_dtype = dtype; if (dtype == TBIT) storage_dtype = TLOGICAL; RETVAL = ffppx(fptr,dtype,fpix,nelem,packND(array,storage_dtype),&status); OUTPUT: RETVAL status int ffppxll(fptr, dtype, fpix, nelem, array, status) fitsfile * fptr int dtype LONGLONG * fpix LONGLONG nelem SV * array int status ALIAS: Astro::FITS::CFITSIO::fits_write_pixll = 1 fitsfilePtr::write_pixll = 2 PREINIT: int storage_dtype; CODE: storage_dtype = dtype; if (dtype == TBIT) storage_dtype = TLOGICAL; RETVAL = ffppxll(fptr,dtype,fpix,nelem,packND(array,storage_dtype),&status); OUTPUT: RETVAL status int ffppxn(fptr, dtype, fpix, nelem, array, nulval, status) fitsfile * fptr int dtype long * fpix LONGLONG nelem SV * array SV * nulval int status ALIAS: Astro::FITS::CFITSIO::fits_write_pixnull = 1 fitsfilePtr::write_pixnull = 2 PREINIT: int storage_dtype; CODE: storage_dtype = dtype; if (dtype == TBIT) storage_dtype = TLOGICAL; RETVAL = ffppxn(fptr,dtype,fpix,nelem,packND(array,storage_dtype),(nulval!=&PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL), &status); OUTPUT: RETVAL status int ffppxnll(fptr, dtype, fpix, nelem, array, nulval, status) fitsfile * fptr int dtype LONGLONG * fpix LONGLONG nelem SV * array SV * nulval int status ALIAS: Astro::FITS::CFITSIO::fits_write_pixnullll = 1 fitsfilePtr::write_pixnullll = 2 PREINIT: int storage_dtype; CODE: storage_dtype = dtype; if (dtype == TBIT) storage_dtype = TLOGICAL; RETVAL = ffppxnll(fptr,dtype,fpix,nelem,packND(array,storage_dtype),(nulval!=&PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL), &status); OUTPUT: RETVAL status Astro-FITS-CFITSIO-1.10/test.pl0000644000115400000360000012325610035327074014506 0ustar rpeteheaduse strict; use vars qw( $OK_column $loaded $tests_ran $tests_failed ); BEGIN { $| = 1; $OK_column = 40; $loaded = 0; $tests_ran = 0; $tests_failed = 0; sub pre_test { print $_[0],'.'x($OK_column-length($_[0])-1); } sub post_test { print $_[0] ? 'ok' : 'not ok',"\n"; $tests_ran++; $tests_failed++ unless $_[0]; } print "\n"; pre_test('Loading'); # get this in before 'use Astro::FITS::CFISTIO' } use Astro::FITS::CFITSIO qw( :shortnames :constants PerlyUnpacking ); $loaded = 1; post_test($loaded); my $template = './testprog/testprog.tpt'; END { post_test(0) unless $loaded; summarize_tests(); print <[$i] == $r2->[$i]) or return; } return 1; } # # compare two string arrays, returning true if they are identical # sub cmp_str_arrays { my ($r1,$r2) = @_; (@$r1 == @$r2) or return; # number of elements is not identical for (my $i=0; $i<@$r1; $i++) { ($r1->[$i] eq $r2->[$i]) or return; } return 1; } my $status = 0; # fits_get_keyname my $name; pre_test('ffgknm'); ffgknm("TESTING 'This is a test'",$name,undef,$status); post_test($name eq 'TESTING'); # cfitsio version 2.100 or better? pre_test('ffvers'); post_test(ffvers(undef) > 2.09); # try to open non-existant file pre_test('ffopen'); $status = 0; my $fptr; ffopen($fptr,'tq123x.kjl',READWRITE,$status); print "\nSTATUS = $status\n"; post_test(104 == $status); # fits_create_file $status = 0; pre_test('ffinit'); ffinit($fptr,'!testprog.fit',$status); post_test(0 == $status); # fits_file_name pre_test('ffflnm'); my $filename; ffflnm($fptr,$filename,$status); post_test($filename eq 'testprog.fit'); # fits_file_mode pre_test('ffflmd'); my $filemode; ffflmd($fptr,$filemode,$status); post_test(1 == $filemode); my ($simple,$bitpix,$naxis,$naxes,$npixels,$pcount,$gcount,$extend) = (1,32,2,[10,2],20,0,1,1); # fits_write_imghdr pre_test('ffphps'); post_test(ffphps($fptr,$bitpix,$naxis,$naxes,$status) == 0); # fits_write_record pre_test('ffprec'); post_test( ffprec( $fptr, "key_prec= 'This keyword was written by fxprec' / comment goes here", $status ) == 0 ); # fits_write_key_str pre_test('ffpkys/ffgkey'); my $card = "1234567890123456789012345678901234567890" . "12345678901234567890123456789012345"; my $card2; ffpkys($fptr,"card1",$card,"",$status); ffgkey($fptr,'card1',$card2,undef,$status); post_test($card2 eq q/'12345678901234567890123456789012345678901234567890123456789012345678'/); pre_test('ffpkys/ffgkey'); $card = "1234567890123456789012345678901234567890" . "123456789012345678901234'6789012345"; ffpkys($fptr,'card2',$card,"",$status); ffgkey($fptr,'card2',$card2,undef,$status); post_test($card2 eq q/'1234567890123456789012345678901234567890123456789012345678901234''67'/); pre_test('ffpkys/ffgkey'); $card = "1234567890123456789012345678901234567890" . "123456789012345678901234''789012345"; ffpkys($fptr,'card3',$card,"",$status); ffgkey($fptr,'card3',$card2,undef,$status); post_test($card2 eq q/'1234567890123456789012345678901234567890123456789012345678901234'''''/); pre_test('ffpkys/ffgkey'); $card = "1234567890123456789012345678901234567890" . "123456789012345678901234567'9012345"; ffpkys($fptr,'card4',$card,"",$status); ffgkey($fptr,'card4',$card2,undef,$status); post_test($card2 eq q/'1234567890123456789012345678901234567890123456789012345678901234567'/); # # test writing of various types of keywords # my $oskey='value_string'; my $olkey=1; my $ojkey=11; my $otint = 12345678; my $ofkey = 12.121212; my $oekey = 13.131313; my $ogkey = 14.1414141414141414; my $odkey = 15.1515151515151515; my $otfrac = 0.1234567890123456; my $onekey = [13.131313, 14.141414, 15.151515]; my $ondkey = [15.1515151515151515, 16.1616161616161616,17.1717171717171717]; pre_test('ffpkys'); post_test(ffpkys($fptr,'key_pkys',$oskey,'fxpkys comment',$status) == 0); pre_test('ffpkyl'); post_test(ffpkyl($fptr,'key_pkyl',$olkey,'fxpkyl comment',$status) == 0); pre_test('ffpkyj'); post_test(ffpkyj($fptr,'key_pkyj',$ojkey,'fxpkyj comment',$status) == 0); pre_test('ffpkyf'); post_test(ffpkyf($fptr,'key_pkyf',$ofkey,5,'fxpkyf comment',$status) == 0); pre_test('ffpkye'); post_test(ffpkye($fptr,'key_pkye',$oekey,6,'fxpkye comment',$status) == 0); pre_test('ffpkyg'); post_test(ffpkyg($fptr,'key_pkyg',$ogkey,14,'fxpkyg comment',$status) == 0); pre_test('ffpkyd'); post_test(ffpkyd($fptr,'key_pkyd',$odkey,14,'fxpkyd comment',$status) == 0); pre_test('ffpkyc'); post_test(ffpkyc($fptr,'key_pkyc',$onekey,6,'fxpkyc comment',$status) == 0); pre_test('ffpkym'); post_test(ffpkym($fptr,'key_pkym',$ondkey,14,'fxpkym comment',$status) == 0); pre_test('ffpkfc'); post_test(ffpkfc($fptr,'key_pkfc',$onekey,6,'fxpkfc comment',$status) == 0); pre_test('ffpkfm'); post_test(ffpkfm($fptr,'key_pkfm',$ondkey,14,'fxpkfm comment',$status) == 0); pre_test('ffpkls'); post_test( ffpkls( $fptr, 'key_pkls', 'This is a very long string value that is continued over more than one keyword.', 'fxpkls comment', $status, ) == 0 ); pre_test('ffplsw'); post_test(ffplsw($fptr,$status) == 0); pre_test('ffpkyt'); post_test(ffpkyt($fptr,'key_pkyt',$otint,$otfrac,'fxpkyt comment',$status)==0); pre_test('ffpcom'); post_test(ffpcom($fptr,'This keyword was written by fxpcom.',$status) == 0); pre_test('ffphis'); post_test(ffphis($fptr," This keyword written by fxphis (w/ 2 leading spaces).",$status) == 0); pre_test('ffpdat'); post_test(ffpdat($fptr,$status) == 0); my $onskey = [ 'first string', 'second string', ' ' ]; my $onlkey = [1,0,1]; my $onjkey = [11,12,13]; my $onfkey = [12.121212, 13.131313, 14.141414]; my $ongkey = [14.1414141414141414, 15.1515151515151515,16.1616161616161616]; my $nkeys = 3; pre_test('ffpkns'); post_test(ffpkns($fptr,'ky_pkns',1,$nkeys,$onskey,'fxpkns comment&',$status) == 0); pre_test('ffpknl'); post_test(ffpknl($fptr,'ky_pknl',1,$nkeys,$onlkey,'fxpknl comment&',$status) == 0); pre_test('ffpknj'); post_test(ffpknj($fptr,'ky_pknj',1,$nkeys,$onjkey,'fxpknj comment&',$status) == 0); pre_test('ffpknf'); post_test(ffpknf($fptr,'ky_pknf',1,$nkeys,$onfkey,5,'fxpknf comment&',$status) == 0); pre_test('ffpkne'); post_test(ffpkne($fptr,'ky_pkne',1,$nkeys,$onekey,6,'fxpkne comment&',$status) == 0); pre_test('ffpkng'); post_test(ffpkng($fptr,'ky_pkng',1,$nkeys,$ongkey,13,'fxpkng comment&',$status) == 0); pre_test('ffpknd'); post_test(ffpknd($fptr,'ky_pknd',1,$nkeys,$ondkey,14,'fxpknd comment&',$status) == 0); pre_test('ffpky/TSTRING'); $oskey = 1; post_test(ffpky($fptr,TSTRING,'tstring',$oskey,'tstring comment',$status) == 0); pre_test('ffpky/TLOGICAL'); $olkey = TLOGICAL; post_test(ffpky($fptr,TLOGICAL,'tlogical',$olkey,'tlogical comment',$status) == 0); pre_test('ffpky/TBYTE'); my $cval = TBYTE; post_test(ffpky($fptr,TBYTE,'tbyte',$cval,'tbyte comment',$status) == 0); pre_test('ffpky/TSHORT'); my $oshtkey = TSHORT; post_test(ffpky($fptr,TSHORT,'tshort',$oshtkey,'tshort comment',$status) == 0); pre_test('ffpky/TINT'); $olkey = TINT; post_test(ffpky($fptr,TINT,'tint',$olkey,'tint comment',$status) == 0); pre_test('ffpky/TLONG'); $ojkey = TLONG; post_test(ffpky($fptr,TLONG,'tlong',$ojkey,'tlong comment',$status) == 0); pre_test('ffpky/TFLOAT'); $oekey = TFLOAT; post_test(ffpky($fptr,TFLOAT,'tfloat',$oekey,'tfloat comment',$status) == 0); pre_test('ffpky/TDOUBLE'); $odkey = TDOUBLE; post_test(ffpky($fptr,TDOUBLE,'tdouble',$odkey,'tdouble comment',$status) == 0); pre_test('ffpkyj'); post_test(ffpkyj($fptr,'BLANK',-99,'value to use for undefined pixels',$status) == 0); my $boutarray = [1..$npixels]; my $ioutarray = [1..$npixels]; my $joutarray = [1..$npixels]; my $eoutarray = [1..$npixels]; my $doutarray = [1..$npixels]; pre_test('ffpprX'); ffpprb($fptr,1,1,2,[@{$boutarray}[0..1]],$status); ffppri($fptr,1,5,2,[@{$ioutarray}[4..5]],$status); ffpprj($fptr,1,9,2,[@{$joutarray}[8..9]],$status); ffppre($fptr,1,13,2,[@{$eoutarray}[12..13]],$status); ffpprd($fptr,1,17,2,[@{$doutarray}[16..17]],$status); ffppnb($fptr,1,3,2,[@{$boutarray}[2..3]],4,$status); ffppni($fptr,1,7,2,[@{$ioutarray}[6..7]],8,$status); ffppnj($fptr,1,11,2,[@{$joutarray}[10..11]],12,$status); ffppne($fptr,1,15,2,[@{$eoutarray}[14..15]],16,$status); ffppnd($fptr,1,19,2,[@{$doutarray}[18..19]],20,$status); ffppru($fptr,1,1,1,$status); post_test($status == 0); pre_test('ffflus'); ffflus($fptr,$status); post_test($status == 0); my $hdunum; pre_test('ffghdn'); post_test(ffghdn($fptr,$hdunum) == 1); my $standard = [qw(99 2 3 99 5 6 7 99 9 10 11 99 13 14 15 99 17 18 19 99)]; my $anynull = 0; pre_test('ffpprb/ffgpvb'); my $binarray; ffgpvb($fptr,1,1,$npixels,99,$binarray,$anynull,$status); post_test(cmp_num_arrays($binarray,$standard) and $anynull == 1); pre_test('ffppri/ffgpvi'); my $iinarray; ffgpvi($fptr,1,1,$npixels,99,$iinarray,$anynull,$status); post_test(cmp_num_arrays($iinarray,$standard) and $anynull == 1); pre_test('ffpprj/ffgpvj'); my $jinarray; ffgpvj($fptr,1,1,$npixels,99,$jinarray,$anynull,$status); post_test(cmp_num_arrays($jinarray,$standard) and $anynull == 1); pre_test('ffppre/ffgpve'); my $einarray; ffgpve($fptr,1,1,$npixels,99,$einarray,$anynull,$status); post_test(cmp_num_arrays($einarray,$standard) and $anynull == 1); pre_test('ffpprd/ffgpvd'); my $dinarray; ffgpvd($fptr,1,1,$npixels,99,$dinarray,$anynull,$status); post_test(cmp_num_arrays($dinarray,$standard) and $anynull == 1); @$boutarray = @$binarray; @$ioutarray = @$iinarray; @$joutarray = @$jinarray; @$eoutarray = @$einarray; @$doutarray = @$dinarray; @$binarray = map(0,(0..$npixels-1)); @$iinarray = map(0,(0..$npixels-1)); @$jinarray = map(0,(0..$npixels-1)); @$einarray = map(0,(0..$npixels-1)); @$dinarray = map(0,(0..$npixels-1)); $anynull = 0; $standard = [qw( * 2 3 * 5 6 7 * 9 10 11 * 13 14 15 * 17 18 19 * )]; my $larray; pre_test('ffpprb/ffgpfb'); ffgpfb($fptr,1,1,$npixels,$binarray,$larray,$anynull,$status); foreach (0..$#{$larray}) { $larray->[$_] and $binarray->[$_] = '*' } post_test(cmp_str_arrays($binarray,$standard) and $anynull == 1); pre_test('ffppri/ffgpfi'); ffgpfi($fptr,1,1,$npixels,$iinarray,$larray,$anynull,$status); foreach (0..$#{$larray}) { $larray->[$_] and $iinarray->[$_] = '*' } post_test(cmp_str_arrays($iinarray,$standard) and $anynull == 1); pre_test('ffpprj/ffgpfj'); ffgpfj($fptr,1,1,$npixels,$jinarray,$larray,$anynull,$status); foreach (0..$#{$larray}) { $larray->[$_] and $jinarray->[$_] = '*' } post_test(cmp_str_arrays($jinarray,$standard) and $anynull == 1); pre_test('ffppre/ffgpfe'); ffgpfe($fptr,1,1,$npixels,$einarray,$larray,$anynull,$status); foreach (0..$#{$larray}) { $larray->[$_] and $einarray->[$_] = '*' } post_test(cmp_str_arrays($einarray,$standard) and $anynull == 1); pre_test('ffpprd/ffgpfd'); ffgpfd($fptr,1,1,$npixels,$dinarray,$larray,$anynull,$status); foreach (0..$#{$larray}) { $larray->[$_] and $dinarray->[$_] = '*' } post_test(cmp_str_arrays($dinarray,$standard) and $anynull == 1); pre_test('ffclos/ffopen (10 times)'); my $ii; for ($ii=0;$ii<10;$ii++) { ffclos($fptr,$status); ffopen($fptr,$filename,READWRITE,$status); } post_test($status == 0); { # try assigning the filehandle elsewhere and seeing if it # still works pre_test("filehandle assign" ); my $tfptr = $fptr; $tfptr->file_name( my $fname, $status ); post_test( $status == 0 and $fname eq $filename ); # this should cause $fptr to indicate it has been closed. pre_test( "filehandle assign close" ); $tfptr->close_file( $status ); post_test( $status == 0 and $fptr->_is_open == 0 ); # reopen on fptr. this should not call DESTROY on anything, as # tfptr should still point at the original file handle pre_test( "filehandle assign pass" ); ffopen($fptr,$filename,READWRITE,$status); post_test( $status == 0 && $tfptr->_is_open == 0); # now, assign $fptr to $tfptr (DESTROYING $tfptr) and let $tfptr go # out of scope. this shouldn't destroy anything and thus shouldn't # affect $fptr pre_test( "filehandle assign" ); $tfptr = $fptr; post_test( $status == 0 && $tfptr->_is_open == 1); } # we should still be able to do this. pre_test("post assign DESTROY check"); $fptr->movabs_hdu(1,undef,$status); post_test( $status == 0 ); pre_test('PerlyUnpacking set'); PerlyUnpacking(0); post_test( PerlyUnpacking(-1) == PerlyUnpacking() && PerlyUnpacking(-1) == 0 ); PerlyUnpacking(1); pre_test('fptr->perlyunpacking init'); post_test( $fptr->perlyunpacking == -1 ); pre_test('fptr->perlyunpacking == -1'); post_test( $fptr->PERLYUNPACKING == PerlyUnpacking() ); pre_test('fptr->perlyunpacking(0)'); $fptr->perlyunpacking(0); post_test( $fptr->perlyunpacking == 0 && $fptr->PERLYUNPACKING == 0 ); pre_test('fptr->perlyunpacking(1)'); $fptr->perlyunpacking(1); post_test( $fptr->perlyunpacking == 1 && $fptr->PERLYUNPACKING == 1 ); pre_test('fptr->perlyunpacking(-1)'); $fptr->perlyunpacking(-1); post_test( $fptr->perlyunpacking == -1 && $fptr->PERLYUNPACKING == PerlyUnpacking() ); pre_test('ffghdn'); post_test(ffghdn($fptr,$hdunum) == 1); pre_test('ffflnm'); ffflnm($fptr,$filename,$status); post_test($filename eq 'testprog.fit'); pre_test('ffflmd'); ffflmd($fptr,$filemode,$status); post_test(1 == $filemode); $simple = 0; $bitpix = 0; $naxis = 0; $naxes = [0,0]; $pcount = -99; $gcount = -99; $extend = -99; pre_test('ffghpr'); ffghpr($fptr,$simple,$bitpix,$naxis,$naxes,$pcount,$gcount,$extend,$status); post_test( $status == 0 and $simple == 1 and $bitpix == 32 and $naxis == 2 and cmp_num_arrays($naxes,[10,2]) and $pcount == 0 and $gcount == 1 and $extend == 1 ); pre_test('ffgrec'); ffgrec($fptr,9,$card,$status); post_test($card eq q!KEY_PREC= 'This keyword was written by fxprec' / comment goes here!); pre_test('ffgkyn'); my ($keyword,$value,$comment); ffgkyn($fptr,9,$keyword,$value,$comment,$status); post_test( $keyword eq 'KEY_PREC' and $value eq q/'This keyword was written by fxprec'/ and $comment eq 'comment goes here' ); pre_test('ffgcrd'); ffgcrd($fptr,$keyword,$card,$status); post_test($card eq q!KEY_PREC= 'This keyword was written by fxprec' / comment goes here!); pre_test('ffgkey'); ffgkey($fptr,'KY_PKNS1',$value,$comment,$status); post_test( $value eq q!'first string'! and $comment eq 'fxpkns comment'); pre_test('ffgkys'); my $iskey; ffgkys($fptr,'key_pkys',$iskey,$comment,$status); post_test($iskey eq 'value_string' and $comment eq 'fxpkys comment'); pre_test('ffgkyl'); my $ilkey; ffgkyl($fptr,'key_pkyl',$ilkey,$comment,$status); post_test($ilkey ==1 and $comment eq 'fxpkyl comment'); pre_test('ffgkyj'); my $ijkey; ffgkyj($fptr,'KEY_PKYJ',$ijkey,$comment,$status); post_test($ijkey == 11 and $comment eq 'fxpkyj comment'); pre_test('ffgkye'); my $iekey; ffgkye($fptr,'KEY_PKYJ',$iekey,$comment,$status); post_test($iekey == 11.0 and $comment eq 'fxpkyj comment'); pre_test('ffgkyd'); my $idkey; ffgkyd($fptr,'KEY_PKYJ',$idkey,$comment,$status); post_test($idkey == 11 and $comment eq 'fxpkyj comment'); $iskey = ''; pre_test('ffgky/TSTRING'); ffgky($fptr,TSTRING,'key_pkys',$iskey,$comment,$status); post_test($iskey eq 'value_string' and $comment eq 'fxpkys comment'); $ilkey = 0; pre_test('ffgky/TLOGICAL'); ffgky($fptr,TLOGICAL,'key_pkyl',$ilkey,$comment,$status); post_test($ilkey ==1 and $comment eq 'fxpkyl comment'); pre_test('ffgky/TBYTE'); ffgky($fptr,TBYTE,'key_pkyj',$cval,$comment,$status); post_test($cval==11 and $comment eq 'fxpkyj comment'); my $ishtkey; pre_test('ffgky/TSHORT'); ffgky($fptr,TSHORT,'key_pkyj',$ishtkey,$comment,$status); post_test($ishtkey ==11 and $comment eq 'fxpkyj comment'); pre_test('ffgky/TINT'); ffgky($fptr,TINT,'key_pkyj',$ilkey,$comment,$status); post_test($ilkey ==11 and $comment eq 'fxpkyj comment'); $ijkey=0; pre_test('ffgky/TLONG'); ffgky($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); post_test($ijkey == 11 and $comment eq 'fxpkyj comment'); $iekey=0.0; pre_test('ffgky/TFLOAT'); ffgky($fptr,TFLOAT,'KEY_PKYE',$iekey,$comment,$status); post_test(sprintf("%f",$iekey) eq '13.131310' and $comment eq 'fxpkye comment'); $idkey=0.0; pre_test('ffgky/TDOUBLE'); ffgky($fptr,TDOUBLE,'KEY_PKYD',$idkey,$comment,$status); post_test(sprintf("%f",$idkey) eq '15.151515' and $comment eq 'fxpkyd comment'); pre_test('ffgkyd'); ffgkyd($fptr,'KEY_PKYF',$idkey,$comment,$status); post_test(sprintf("%f",$idkey) eq '12.121210' and $comment eq 'fxpkyf comment'); pre_test('ffgkyd'); ffgkyd($fptr,'KEY_PKYE',$idkey,$comment,$status); post_test(sprintf("%f",$idkey) eq '13.131310' and $comment eq 'fxpkye comment'); pre_test('ffgkyd'); ffgkyd($fptr,'KEY_PKYG',$idkey,$comment,$status); post_test(sprintf("%.14f",$idkey) eq '14.14141414141414' and $comment eq 'fxpkyg comment'); my ($inekey,$indkey); pre_test('ffgkyc'); ffgkyc($fptr,'KEY_PKYC',$inekey,$comment,$status); post_test( sprintf("%f",$inekey->[0]) eq '13.131310' and sprintf("%f",$inekey->[1]) eq '14.141410' and $comment eq 'fxpkyc comment' ); pre_test('ffgkyc'); ffgkyc($fptr,'KEY_PKFC',$inekey,$comment,$status); post_test( sprintf("%f",$inekey->[0]) eq '13.131313' and sprintf("%f",$inekey->[1]) eq '14.141414' and $comment eq 'fxpkfc comment' ); pre_test('ffgkym'); ffgkym($fptr,'KEY_PKYM',$indkey,$comment,$status); post_test( sprintf("%f",$indkey->[0]) eq '15.151515' and sprintf("%f",$indkey->[1]) eq '16.161616' and $comment eq 'fxpkym comment' ); pre_test('ffgkym'); ffgkym($fptr,'KEY_PKFM',$indkey,$comment,$status); post_test( sprintf("%f",$indkey->[0]) eq '15.151515' and sprintf("%f",$indkey->[1]) eq '16.161616' and $comment eq 'fxpkfm comment' ); pre_test('ffgkyt'); ffgkyt($fptr,'KEY_PKYT',$ijkey,$idkey,$comment,$status); post_test( $ijkey == 12345678 and sprintf("%.14f",$idkey) eq '0.12345678901235' and $comment eq 'fxpkyt comment' ); pre_test('ffpunt/ffgunt'); ffpunt($fptr,'KEY_PKYJ','km/s/Mpc',$status); ffgunt($fptr,'KEY_PKYJ',$comment,$status); post_test($comment eq 'km/s/Mpc'); pre_test('ffpunt/ffgunt'); ffpunt($fptr,'KEY_PKYJ','',$status); ffgunt($fptr,'KEY_PKYJ',$comment,$status); post_test($comment eq ''); pre_test('ffpunt/ffgunt'); ffpunt($fptr,'KEY_PKYJ','feet/second/second',$status); ffgunt($fptr,'KEY_PKYJ',$comment,$status); post_test($comment eq 'feet/second/second'); my $lsptr; pre_test('ffgkls'); ffgkls($fptr,'key_pkls',$lsptr,$comment,$status); post_test($lsptr eq q!This is a very long string value that is continued over more than one keyword.!); pre_test('ffgkns'); my ($nfound,$inskey); ffgkns($fptr,'ky_pkns',1,3,$inskey,$nfound,$status); post_test( $nfound == 3 and cmp_str_arrays($inskey,[ 'first string', 'second string', '']) ); pre_test('ffgknl'); my $inlkey; ffgknl($fptr,'ky_pknl',1,3,$inlkey,$nfound,$status); post_test( $nfound == 3 and cmp_num_arrays($inlkey,[1,0,1]) ); pre_test('ffgknj'); my $injkey; ffgknj($fptr,'ky_pknj',1,3,$injkey,$nfound,$status); post_test( $nfound == 3 and cmp_num_arrays($injkey,[11,12,13]) ); pre_test('ffgkne'); ffgkne($fptr,'ky_pkne',1,3,$inekey,$nfound,$status); post_test( $nfound == 3 and sprintf("%f",$inekey->[0]) eq '13.131310' and sprintf("%f",$inekey->[1]) eq '14.141410' and sprintf("%f",$inekey->[2]) eq '15.151520' ); pre_test('ffgknd'); ffgknd($fptr,'ky_pknd',1,3,$indkey,$nfound,$status); post_test( $nfound == 3 and sprintf("%f",$indkey->[0]) eq '15.151515' and sprintf("%f",$indkey->[1]) eq '16.161616' and sprintf("%f",$indkey->[2]) eq '17.171717' ); pre_test('ffgcrd/ffghps/ffgrec'); my ($existkeys,$keynum); ffgcrd($fptr,'HISTORY',$card,$status); ffghps($fptr,$existkeys,$keynum,$status); $keynum -= 2; my @tmp; for ($ii=$keynum; $ii<=$keynum+3;$ii++) { ffgrec($fptr,$ii,$card,$status); push @tmp, substr($card,0,8); } post_test( cmp_str_arrays(\@tmp,['COMMENT ','HISTORY ','DATE ','KY_PKNS1'] ) ); pre_test('ffdrec/ffdkey'); @tmp = (); ffdrec($fptr,$keynum+1,$status); ffdkey($fptr,'DATE',$status); for ($ii=$keynum; $ii<=$keynum+1;$ii++) { ffgrec($fptr,$ii,$card,$status); push @tmp,$card; } post_test( cmp_str_arrays( \@tmp, [ q!COMMENT This keyword was written by fxpcom.!, q!KY_PKNS1= 'first string' / fxpkns comment! ] ) and $status == 0 ); pre_test('ffirec/ffikyX'); $keynum += 4; ffirec($fptr,$keynum-3,"KY_IREC = 'This keyword inserted by fxirec'",$status); ffikys($fptr,'KY_IKYS',"insert_value_string", "ikys comment", $status); ffikyj($fptr,'KY_IKYJ',49,"ikyj comment", $status); ffikyl($fptr,'KY_IKYL',1, "ikyl comment", $status); ffikye($fptr,'KY_IKYE',12.3456, 4, "ikye comment", $status); ffikyd($fptr,'KY_IKYD',12.345678901234567, 14, "ikyd comment", $status); ffikyf($fptr,'KY_IKYF',12.3456, 4, "ikyf comment", $status); ffikyg($fptr,'KY_IKYG',12.345678901234567, 13, "ikyg comment", $status); @tmp = (); for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { ffgrec($fptr,$ii,$card,$status); push @tmp, $card; } post_test( cmp_str_arrays( \@tmp, [ q!COMMENT This keyword was written by fxpcom.!, q!KY_IREC = 'This keyword inserted by fxirec'!, q!KY_IKYS = 'insert_value_string' / ikys comment!, q!KY_IKYJ = 49 / ikyj comment!, q!KY_IKYL = T / ikyl comment!, q!KY_IKYE = 1.2346E+01 / ikye comment!, q!KY_IKYD = 1.23456789012346E+01 / ikyd comment!, q!KY_IKYF = 12.3456 / ikyf comment!, q!KY_IKYG = 12.3456789012346 / ikyg comment!, q!KY_PKNS1= 'first string' / fxpkns comment! ] ) and $status == 0 ); pre_test('ffmrec/ffmcrd/ffmnam/ffmcom/ffmkyX'); ffmrec($fptr,$keynum-4,'COMMENT This keyword was modified by fxmrec', $status); ffmcrd($fptr,'KY_IREC',"KY_MREC = 'This keyword was modified by fxmcrd'",$status); ffmnam($fptr,'KY_IKYS','NEWIKYS',$status); ffmcom($fptr,'KY_IKYJ','This is a modified comment', $status); ffmkyj($fptr,'KY_IKYJ',50,'&',$status); ffmkyl($fptr,'KY_IKYL',0,'&',$status); ffmkys($fptr,'NEWIKYS','modified_string', '&', $status); ffmkye($fptr,'KY_IKYE',-12.3456, 4, '&', $status); ffmkyd($fptr,'KY_IKYD',-12.345678901234567, 14, 'modified comment', $status); ffmkyf($fptr,'KY_IKYF',-12.3456, 4, '&', $status); ffmkyg($fptr,'KY_IKYG',-12.345678901234567, 13, '&', $status); @tmp = (); for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { ffgrec($fptr,$ii,$card,$status); push @tmp, $card; } post_test( cmp_str_arrays( \@tmp, [ q!COMMENT This keyword was modified by fxmrec!, q!KY_MREC = 'This keyword was modified by fxmcrd'!, q!NEWIKYS = 'modified_string' / ikys comment!, q!KY_IKYJ = 50 / This is a modified comment!, q!KY_IKYL = F / ikyl comment!, q!KY_IKYE = -1.2346E+01 / ikye comment!, q!KY_IKYD = -1.23456789012346E+01 / modified comment!, q!KY_IKYF = -12.3456 / ikyf comment!, q!KY_IKYG = -12.3456789012346 / ikyg comment!, q!KY_PKNS1= 'first string' / fxpkns comment!, ] ) and $status == 0 ); pre_test('ffucrd/ffukyX'); ffucrd($fptr,'KY_MREC',"KY_UCRD = 'This keyword was updated by fxucrd'",$status); ffukyj($fptr,'KY_IKYJ',51,'&',$status); ffukyl($fptr,'KY_IKYL',1,'&',$status); ffukys($fptr,'NEWIKYS',"updated_string",'&',$status); ffukye($fptr,'KY_IKYE',-13.3456, 4,'&',$status); ffukyd($fptr,'KY_IKYD',-13.345678901234567, 14,'modified comment',$status); ffukyf($fptr,'KY_IKYF',-13.3456, 4,'&',$status); ffukyg($fptr,'KY_IKYG',-13.345678901234567, 13,'&',$status); @tmp=(); for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { ffgrec($fptr,$ii,$card,$status); push @tmp,$card; } post_test( cmp_str_arrays( \@tmp, [ q!COMMENT This keyword was modified by fxmrec!, q!KY_UCRD = 'This keyword was updated by fxucrd'!, q!NEWIKYS = 'updated_string' / ikys comment!, q!KY_IKYJ = 51 / This is a modified comment!, q!KY_IKYL = T / ikyl comment!, q!KY_IKYE = -1.3346E+01 / ikye comment!, q!KY_IKYD = -1.33456789012346E+01 / modified comment!, q!KY_IKYF = -13.3456 / ikyf comment!, q!KY_IKYG = -13.3456789012346 / ikyg comment!, q!KY_PKNS1= 'first string' / fxpkns comment!, ] ) and $status == 0 ); pre_test('ffgnxk'); ffgrec($fptr,0,$card,$status); $nfound = 0; @tmp = (); my $inclist = [ 'key*', 'newikys' ]; my $exclist = [ 'key_pr*', 'key_pkls' ]; while (!ffgnxk($fptr,$inclist,2,$exclist,2,$card,$status)) { $nfound++; push @tmp, $card; } post_test( $nfound == 13 and cmp_str_arrays( \@tmp, [ q!KEY_PKYS= 'value_string' / fxpkys comment!, q!KEY_PKYL= T / fxpkyl comment!, q!KEY_PKYJ= 11 / [feet/second/second] fxpkyj comment!, q!KEY_PKYF= 12.12121 / fxpkyf comment!, q!KEY_PKYE= 1.313131E+01 / fxpkye comment!, q!KEY_PKYG= 14.14141414141414 / fxpkyg comment!, q!KEY_PKYD= 1.51515151515152E+01 / fxpkyd comment!, q!KEY_PKYC= (1.313131E+01, 1.414141E+01) / fxpkyc comment!, q!KEY_PKYM= (1.51515151515152E+01, 1.61616161616162E+01) / fxpkym comment!, q!KEY_PKFC= (13.131313, 14.141414) / fxpkfc comment!, q!KEY_PKFM= (15.15151515151515, 16.16161616161616) / fxpkfm comment!, q!KEY_PKYT= 12345678.1234567890123456 / fxpkyt comment!, q!NEWIKYS = 'updated_string' / ikys comment!, ] ) ); $status = 0; pre_test('ffcpky'); ffcpky($fptr,$fptr,1,4,'KY_PKNE',$status); ffgkns($fptr,'ky_pkne',2,4,$inekey,$nfound,$status); post_test( $status == 0 and sprintf("%f %f %f",@$inekey) eq '14.141410 15.151520 13.131310' ); pre_test('ffpktp'); post_test( ffpktp($fptr,$template,$status) == 0); my $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; my $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; my $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '') ]; my $nrows = 21; my $tfields = 10; $pcount = 0; my $binname = 'Test-BINTABLE'; pre_test('ffibin'); post_test( ffibin($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status) == 0 and ffghdn($fptr,$hdunum) == 2 ); pre_test('ffghps'); ffghps($fptr,$existkeys,$keynum,$status); post_test( $existkeys == 33 and $keynum == 1); pre_test('ffhdef/ffghsp'); my $morekeys=40; ffhdef($fptr,$morekeys,$status); ffghsp($fptr,$existkeys,$morekeys,$status); post_test( $existkeys == 33 and $morekeys == 74 ); fftnul($fptr,4,99,$status); fftnul($fptr,5,99,$status); fftnul($fptr,6,99,$status); my $extvers=1; ffpkyj($fptr,'EXTVER',$extvers,'extension version number', $status); ffpkyj($fptr,'TNULL4',99,'value for undefined pixels',$status); ffpkyj($fptr,'TNULL5',99,'value for undefined pixels',$status); ffpkyj($fptr,'TNULL6',99,'value for undefined pixels',$status); pre_test('ffptdm/ffgtdm'); $naxis=3; $naxes=[1,2,8]; ffptdm($fptr,3,$naxis,$naxes,$status); $naxis=0; $naxes=undef; ffgtdm($fptr,3,$naxis,$naxes,$status); ffgkys($fptr,'TDIM3',$iskey,$comment,$status); post_test( $iskey eq '(1,2,8)' and $naxis = 3 and cmp_num_arrays($naxes,[1,2,8]) ); ffrdef($fptr,$status); my $signval = -1; my $koutarray; for ($ii=0;$ii<21;$ii++) { $signval *= -1; $boutarray->[$ii] = ($ii + 1); $ioutarray->[$ii] = ($ii + 1) * $signval; $joutarray->[$ii] = ($ii + 1) * $signval; $koutarray->[$ii] = ($ii + 1) * $signval; $eoutarray->[$ii] = ($ii + 1) * $signval; $doutarray->[$ii] = ($ii + 1) * $signval; } pre_test('ffpclX/ffpcnX'); ffpcls($fptr,1,1,1,3,$onskey,$status); ffpclu($fptr,1,4,1,1,$status); $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0]; ffpclx($fptr,3,1,1,36,$larray,$status); for ($ii=4;$ii<9;$ii++) { ffpclb($fptr,$ii,1,1,2,$boutarray,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcli($fptr,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclk($fptr,$ii,5,1,2,[@{$koutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcle($fptr,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ffpcld($fptr,$ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclu($fptr,$ii,11,1,1,$status); } ffpclc($fptr,9,1,1,10,$eoutarray,$status); ffpclm($fptr,10,1,1,10,$doutarray,$status); for ($ii=4;$ii<9;$ii++) { ffpcnb($fptr,$ii,12,1,2,[@{$boutarray}[11..12]],13,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcni($fptr,$ii,14,1,2,[@{$ioutarray}[13..14]],15,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcnk($fptr,$ii,16,1,2,[@{$koutarray}[15..16]],17,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcne($fptr,$ii,18,1,2,[@{$eoutarray}[17..18]],19.,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcnd($fptr,$ii,20,1,2,[@{$doutarray}[19..20]],21.,$status); ($status == NUM_OVERFLOW) and $status = 0; } ffpcll($fptr,2,1,1,21,$larray,$status); ffpclu($fptr,2,11,1,1,$status); post_test($status == 0); pre_test('ffgcno/ffgcnn'); my (@tmp1,@tmp2,@tmp3); my ($colnum,$colname); ffgcno($fptr,0,'Xvalue',$colnum,$status); push @tmp1, $colnum; push @tmp2, $status; push @tmp3, 'Xvalue'; while ($status != COL_NOT_FOUND) { ffgcnn($fptr,1,'*ue',$colname,$colnum,$status); push @tmp1, $colnum; push @tmp2, $status; push @tmp3, $colname; } post_test( cmp_num_arrays(\@tmp1,[3,1,2,3,4,5,6,7,8,9,10,0]) and cmp_num_arrays(\@tmp2,[0,237,237,237,237,237,237,237,237,237,237,219]) and cmp_str_arrays(\@tmp3,['Xvalue','Avalue','Lvalue','Xvalue','Bvalue','Ivalue','Jvalue','Evalue','Dvalue','Cvalue','Mvalue','']) ); $status = 0; pre_test('ffgtcl/ffgbcl'); @tmp1 = @tmp2 = @tmp3 = (); my (@tmp4,@tmp5,@tmp6,@tmp7,@tmp8,@tmp9,@tmp10,@tmp11); my ($typecode,$repeat,$width,$scale,$zero,$jnulval,$tdisp); for ($ii=0;$ii<$tfields;$ii++) { ffgtcl($fptr,$ii+1,$typecode,$repeat,$width,$status); ffgbcl($fptr,$ii+1,$ttype->[0],$tunit->[0],$cval,$repeat,$scale,$zero,$jnulval,$tdisp,$status); push @tmp1,$typecode; push @tmp2,$repeat; push @tmp3,$width; push @tmp4,$ttype->[0]; push @tmp5,$tunit->[0]; push @tmp6,$cval; push @tmp7,$repeat; push @tmp8,$scale; push @tmp9,$zero; push @tmp10,$jnulval; push @tmp11,$tdisp; } post_test( cmp_num_arrays(\@tmp1,[16,14,1,11,21,41,42,82,83,163]) and cmp_num_arrays(\@tmp2,[15,1,16,1,1,1,1,1,1,1]) and cmp_num_arrays(\@tmp3,[15,1,1,1,2,4,4,8,8,16]) and cmp_str_arrays(\@tmp4,[qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue )]) and cmp_str_arrays(\@tmp5,['','m**2','cm','erg/s','km/s','','','','','']) and cmp_str_arrays(\@tmp6,[qw( A L X B I J E D C M )]) and cmp_num_arrays(\@tmp7,[15,1,16,1,1,1,1,1,1,1]) and cmp_num_arrays(\@tmp8,[map(1.0,(0..$tfields-1))]) and cmp_num_arrays(\@tmp9,[map(0.0,(0..$tfields-1))]) and cmp_num_arrays(\@tmp10,[1234554321,1234554321,1234554321,99,99,99,1234554321,1234554321,1234554321,1234554321]) and cmp_str_arrays(\@tmp11,[map('',(0..$tfields-1))]) ); pre_test('ffmrhd'); post_test(ffmrhd($fptr,-1,undef,$status) == 0); $tform = [ qw( A15 I10 F14.6 E12.5 D21.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ('','m**2','cm','erg/s','km/s') ]; my $rowlen = 76; $nrows = 11; $tfields = 5; pre_test('ffitab'); my $tblname = 'Test-ASCII'; my $tbcol = [1,17,28,43,56]; ffitab($fptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); post_test($status == 0 and ffghdn($fptr,$hdunum) == 2); pre_test('ffsnul/ffpkyj'); ffsnul($fptr,1,'null1',$status); ffsnul($fptr,2,'null2',$status); ffsnul($fptr,3,'null3',$status); ffsnul($fptr,4,'null4',$status); ffsnul($fptr,5,'null5',$status); $extvers=2; ffpkyj($fptr,'EXTVER',$extvers,'extension version number',$status); ffpkys($fptr,'TNULL1','null1','value for undefined pixels',$status); ffpkys($fptr,'TNULL2','null2','value for undefined pixels',$status); ffpkys($fptr,'TNULL3','null3','value for undefined pixels',$status); ffpkys($fptr,'TNULL4','null4','value for undefined pixels',$status); ffpkys($fptr,'TNULL5','null5','value for undefined pixels',$status); post_test($status == 0); for ($ii=0;$ii<21;$ii++) { $boutarray->[$ii] = $ii+1; $ioutarray->[$ii] = $ii+1; $joutarray->[$ii] = $ii+1; $eoutarray->[$ii] = $ii+1; $doutarray->[$ii] = $ii+1; } pre_test('ffpclX'); ffpcls($fptr,1,1,1,3,$onskey,$status); ffpclu($fptr,1,4,1,1,$status); for ($ii=2;$ii<6;$ii++) { ffpclb($fptr,$ii,1,1,2,[@{$boutarray}[0..1]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcli($fptr,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclj($fptr,$ii,5,1,2,[@{$joutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcle($fptr,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcld($fptr,$ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclu($fptr,$ii,11,1,1,$status); } post_test($status == 0); pre_test('ffghtb'); my $extname; ffghtb($fptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); post_test( $rowlen == 76 and $nrows == 11 and $tfields == 5 and $tblname eq 'Test-ASCII' and cmp_str_arrays($ttype,[qw( Name Ivalue Fvalue Evalue Dvalue )]) and cmp_num_arrays($tbcol,[1,17,28,43,56]) and cmp_str_arrays($tform,[qw( A15 I10 F14.6 E12.5 D21.14 )]) ); $nrows=11; pre_test('ffgcvX'); $inskey = $binarray = $iinarray = $jinarray = $einarray = $dinarray = undef; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcvj($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); ffgcve($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); post_test( cmp_str_arrays($inskey,['first string','second string',' ','UNDEFINED',' ',' ',' ',' ',' ',' ',' ']) and cmp_num_arrays($binarray,[1..10,99]) and cmp_num_arrays($iinarray,[1..10,99]) and cmp_num_arrays($jinarray,[1..10,99]) and cmp_num_arrays($einarray,[1..10,99]) and cmp_num_arrays($dinarray,[1..10,99]) ); pre_test('ffgtbb'); my $uchars; ffgtbb($fptr,1,20,78,$uchars,$status); ffptbb($fptr,1,20,78,$uchars,$status); post_test( pack("C78",@$uchars) eq q! 1 1.000000 1.00000E+00 1.00000000000000E+00second string ! ); pre_test('ffgcno/ffgcnn'); @tmp1=@tmp2=@tmp3=(); ffgcno($fptr,0,'name',$colnum,$status); push @tmp1, 'name'; push @tmp2, $colnum; push @tmp3, $status; while ($status != COL_NOT_FOUND) { ffgcnn($fptr,0,'*ue',$colname,$colnum,$status); push @tmp1, $colname; push @tmp2, $colnum; push @tmp3, $status; } $status = 0; post_test( cmp_str_arrays(\@tmp1,['name', 'Ivalue', 'Fvalue', 'Evalue', 'Dvalue','']) and cmp_num_arrays(\@tmp2,[1,2,3,4,5,0]) and cmp_num_arrays(\@tmp3,[0,237,237,237,237,219]) ); pre_test('ffgtcl/ffgacl'); my $nulstr; @tmp1=@tmp2=@tmp3=@tmp4=@tmp5=@tmp6=@tmp7=@tmp8=@tmp9=@tmp10=@tmp11=(); for ($ii=0;$ii<$tfields;$ii++) { ffgtcl($fptr,$ii+1,$typecode,$repeat,$width,$status); ffgacl($fptr,$ii+1,$ttype->[0],$tbcol,$tunit->[0],$tform->[0],$scale,$zero,$nulstr,$tdisp,$status); push @tmp1,$typecode; push @tmp2,$repeat; push @tmp3,$width; push @tmp4,$ttype->[0]; push @tmp5,$tbcol; push @tmp6,$tunit->[0]; push @tmp7,$tform->[0]; push @tmp8,$scale; push @tmp9,$zero; push @tmp10,$nulstr; push @tmp11,$tdisp; } post_test( cmp_num_arrays(\@tmp1,[16,41,82,42,82]) and cmp_num_arrays(\@tmp2,[1,1,1,1,1]) and cmp_num_arrays(\@tmp3,[15,10,14,12,21]) and cmp_str_arrays(\@tmp4,[qw( Name Ivalue Fvalue Evalue Dvalue )]) and cmp_num_arrays(\@tmp5,[1,17,28,43,56]) and cmp_str_arrays(\@tmp6,['','m**2','cm','erg/s','km/s']) and cmp_str_arrays(\@tmp7,[qw( A15 I10 F14.6 E12.5 D21.14 )]) and cmp_num_arrays(\@tmp8,[map(1.0,(0..$tfields-1))]) and cmp_num_arrays(\@tmp9,[map(0.0,(0..$tfields-1))]) and cmp_str_arrays(\@tmp10,[map('null'.$_,(1..$tfields))]) and cmp_str_arrays(\@tmp11,[map('',(0..$tfields-1))]) ); pre_test('ffirow'); ffirow($fptr,2,3,$status); $nrows=14; $inskey=$binarray=$iinarray=$jinarray=$einarray=$dinarray=undef; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcvj($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); ffgcve($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); post_test( cmp_str_arrays($inskey,['first string','second string',' ',' ',' ',' ','UNDEFINED',map(' ',(0..6))]) and cmp_num_arrays($binarray,[1,2,0,0,0,3..10,99]) and cmp_num_arrays($iinarray,[1,2,0,0,0,3..10,99]) and cmp_num_arrays($jinarray,[1,2,0,0,0,3..10,99]) and cmp_num_arrays($einarray,[1,2,0,0,0,3..10,99]) and cmp_num_arrays($dinarray,[1,2,0,0,0,3..10,99]) ); pre_test('ffdrow'); ffdrow($fptr,10,2,$status); $nrows=12; $inskey=$binarray=$iinarray=$jinarray=$einarray=$dinarray=undef; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcvj($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); ffgcve($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); post_test( cmp_str_arrays($inskey,['first string','second string',' ',' ',' ',' ','UNDEFINED',map(' ',(0..4))]) and cmp_num_arrays($binarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($iinarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($jinarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($einarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($dinarray,[1,2,0,0,0,3..6,9..10,99]) ); pre_test('ffdcol'); ffdcol($fptr,3,$status); $inskey=$binarray=$iinarray=$jinarray=$einarray=$dinarray=undef; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcve($fptr,3,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,4,1,1,$nrows,99,$dinarray,$anynull,$status); post_test( cmp_str_arrays($inskey,['first string','second string',' ',' ',' ',' ','UNDEFINED',map(' ',(0..4))]) and cmp_num_arrays($binarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($iinarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($einarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($dinarray,[1,2,0,0,0,3..6,9..10,99]) ); pre_test('fficol'); fficol($fptr,5,'INSERT_COL','F14.6',$status); $inskey=$binarray=$iinarray=$jinarray=$einarray=$dinarray=undef; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcve($fptr,3,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,4,1,1,$nrows,99,$dinarray,$anynull,$status); ffgcvj($fptr,5,1,1,$nrows,99,$jinarray,$anynull,$status); post_test( cmp_str_arrays($inskey,['first string','second string',' ',' ',' ',' ','UNDEFINED',map(' ',(0..4))]) and cmp_num_arrays($binarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($iinarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($einarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($dinarray,[1,2,0,0,0,3..6,9..10,99]) and cmp_num_arrays($jinarray,[map(0,(0..$nrows-1))]) ); $bitpix=16; $naxis=0; $filename = '!t1q2s3v6.tmp'; pre_test('ffinit'); my $tmpfptr; post_test(ffinit($tmpfptr,$filename,$status) == 0); pre_test('ffiimg'); post_test(ffiimg($tmpfptr,$bitpix,$naxis,$naxes,$status) == 0); $nrows=12; $tfields=0; $rowlen=0; pre_test('ffitab'); ffitab($tmpfptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); post_test($status == 0); pre_test('ffcpcl'); ffcpcl($fptr,$tmpfptr,4,1,TRUE,$status); ffcpcl($fptr,$tmpfptr,3,1,TRUE,$status); ffcpcl($fptr,$tmpfptr,2,1,TRUE,$status); ffcpcl($fptr,$tmpfptr,1,1,TRUE,$status); post_test($status == 0); pre_test('ffibin'); ffibin($tmpfptr,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,0,$status); post_test($status == 0); pre_test('ffcpcl'); ffcpcl($fptr,$tmpfptr,4,1,TRUE,$status); ffcpcl($fptr,$tmpfptr,3,1,TRUE,$status); ffcpcl($fptr,$tmpfptr,2,1,TRUE,$status); ffcpcl($fptr,$tmpfptr,1,1,TRUE,$status); post_test($status == 0); pre_test('ffdelt'); ffdelt($tmpfptr,$status); post_test($status == 0); pre_test('ffmrhd'); ffmrhd($fptr,1,undef,$status); post_test($status == 0 and ffghdn($fptr,$hdunum) == 3); pre_test('ffghsp'); ffghsp($fptr,$existkeys,$morekeys,$status); post_test($existkeys == 38 and $morekeys == 69); pre_test('ffghbn'); $tfields = $ttype = $tform = $tunit = $binname = undef; ffghbn($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); post_test( $nrows == 21 and $tfields == 10 and $binname eq 'Test-BINTABLE' and $pcount == 0 and cmp_str_arrays($ttype,[qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue )]) and cmp_str_arrays($tform,[qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M )]) and cmp_str_arrays($tunit,['','m**2','cm','erg/s','km/s','','','','','']) ); pre_test('ffgcx'); @$larray = map(0,(0..39)); ffgcx($fptr,3,1,1,36,$larray,$status); my $tmp = ''; for ($ii=0;$ii<5;$ii++) { foreach ($ii*8..$ii*8+7) { $tmp .= $larray->[$_] } $tmp .= ' '; } post_test($tmp eq '01001100 01110000 11110000 01111100 00000000 '); my ($kinarray,$cinarray,$minarray,$xinarray); @{$larray} = map(0,(0..$nrows-1)); @{$xinarray} = map(0,(0..$nrows-1)); @{$binarray} = map(0,(0..$nrows-1)); @{$iinarray} = map(0,(0..$nrows-1)); @{$kinarray} = map(0,(0..$nrows-1)); @{$einarray} = map(0.0,(0..$nrows-1)); @{$dinarray} = map(0.0,(0..$nrows-1)); @{$cinarray} = map(0.0,(0..2*$nrows-1)); @{$minarray} = map(0.0,(0..2*$nrows-1)); pre_test('ffgcvs'); ffgcvs($fptr,1,4,1,1,'',$inskey,$anynull,$status); post_test($inskey->[0] eq ''); $nrows=21; ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvl($fptr,2,1,1,$nrows,0,$larray,$anynull,$status); ffgcvb($fptr,3,1,1,$nrows,98,$xinarray,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcvj($fptr,6,1,1,$nrows,98,$kinarray,$anynull,$status); ffgcve($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); ffgcvc($fptr,9,1,1,$nrows,98.,$cinarray,$anynull,$status); ffgcvm($fptr,10,1,1,$nrows,98.,$minarray,$anynull,$status); Astro-FITS-CFITSIO-1.10/MANIFEST0000644000115400000360000000100711612061251014302 0ustar rpeteheadCFITSIO.pm CFITSIO.xs ChangeLog INSTALL MANIFEST Makefile.PL NOTES README test.pl typemap util.c util.h examples/INDEX examples/bintable.fits.gz examples/bintable_read.pl examples/image_read.pl examples/image_read_pdl.pl examples/m51.fits.gz examples/check_status.pl examples/match_datatype.pl testprog/testprog.pl testprog/testprog.tpt testprog/testprog_OO.pl testprog/testprog_longnames.pl testprog/testprog_pdl.pl testprog/runtests TODO META.yml Module meta-data (added by MakeMaker) Astro-FITS-CFITSIO-1.10/META.yml0000644000115400000360000000073712154152345014442 0ustar rpetehead--- #YAML:1.0 name: Astro-FITS-CFITSIO version: 1.10 abstract: ~ author: [] license: unknown distribution_type: module configure_requires: ExtUtils::MakeMaker: 0 build_requires: ExtUtils::MakeMaker: 0 requires: {} no_index: directory: - t - inc generated_by: ExtUtils::MakeMaker version 6.57_05 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 Astro-FITS-CFITSIO-1.10/examples/0000755000115400000360000000000012154152345015000 5ustar rpeteheadAstro-FITS-CFITSIO-1.10/examples/INDEX0000644000115400000360000000045307054531101015566 0ustar rpeteheadimage_read.pl - read m51.fits, display image image_read_pdl.pl - same as above, but reads data into PDL object bintable_read.pl - reads binary table data into PDL, makes hist and plots check_status.pl - check_status() subroutine match_datatype.pl - match_datatype() subroutine Astro-FITS-CFITSIO-1.10/examples/m51.fits.gz0000644000115400000360000066776411544504173016744 0ustar rpetehead‹{ˆ’Mm51.fitsì½uøÅõþ}òÁ!Xð`BB°î $8A‚k@p nÁÚ¤h‹´…R(Z …–R U¤¸»»»?ûš¹ï=›”>_y~=×/×5Ùýì{wvæÌ9÷‘93;f½6ÙpT¿~«õûš›÷Üo­ƒÆíKïЃÚGÖ\oóMÖÛúëë[fØ×½äÿýßè[¯7¦ßhßÿ¶¾¡_[ß2+.û¿¬oØÿ¹úÖÜbôz›÷£¾í|ðÁ;ïÑ~äÎvî·åÎû2nàÿ¸¾µFŽÚpó¯í磊 ýŸ·¯Ô÷µýý_Ö·YÃ._×¾¡+[z¹ÿe}_?CWú_ðËZ›m9bï痦ËÿËú¾¾}ÿ»ú6ßf“Q¥}·þŸsǨ¯´oà6ÿGꃟkûF´ë¾{î÷ÿ±ÒRß°ÿsõm¼æú£ÖÚ¼Ô·ïrCûí³ÿK¼ëÎûŒÛíYïÆ›­·Îz£K}ë²Ë.ûŒë·î¸ƒöœÐÈq¿Ú¯q»NøŸU¼ÙˆzlêºÌÊÃVZyزKÒÖ1¸_ó¾u7ï7bÌZ£FYoãÑÿU}›ÚpÔ˜µ6Þ$Û·ÕÚƒ7Yo­aÿËþ޵–Û·ì +]nåe&k_sÆë±ù£mü[w½1›o¼Ù6ÍÙJK·ëRÆ Yfå~›Ûí]$Üý ý÷í79]÷Ü—ÿÿÿµ6ÛxóÿŸ—ÿ_ÈÛ¨Ñ#ÿçýßÿ÷ßÿý÷ÿËqºÊw&+‡7å¦Ô”ý›²Ž“—C¾¦œ>YùÁ×”S¿¦pïYM9Oç\;c²òæœÓ”ï7å»M9M÷Qç…*<ÿc_Ò”_4å—M¹·)Ï4åynÊMy¬síÖ¦üS忦\Û”;ô÷­ºö7ýM}OÖçzMÕ_Rù¼)o7嫿ú´M™¡Ëß³«Ì¤ß8ïÛ”ÁMYN…óa*+6e•¦¬Ô”MÙ¨)cš²MSökÊ:RÆ5e÷¦4cÖkslèÐë§M9^¿mДÑMÙ¼)[5e[]ï–UôþYÕΙÔÖ-›rbS®iÊ :?·)ßS[VWF¨‹¨\_§)ëë¸Ëdíçï½›2^ïX_ï繪‡¿nÊjÿMéÓ”©UæVßèOýÎnÊ7š2Auú;é=Ç4åHýnNTÙ^}¼Xô¯ß÷R]wÞÍ{—W?=F›¨ÞSšr˜ž¡-ë5eí¦,ݔٚ²£®í¡ÂyÃϽþïÕðl¯†G{5¼Ô«áç^»ªð¢Qùfþ(¼Wʬ•÷ʘͮq ² ®Ñæu›²[SU_×RûæiJ#_½–hÊЦ oÊ4M_ê·)UælÊ|M™¾þVÊgMù )ï4幦¼W߯6å®úw‘‰·uþÚ³‘ü}õ便Óÿ´ôýšÒG¥wò_|Ú”÷Eƒ×¾¦¯Ö6–:‘§¹4&>úõ#C#£Êü´ºÆ½Ÿøf6ïÔ“µuê¯)3M¡ÝÓ5íù¶Ê1“•F.£á÷hä%Þq:N^&|M™8YùÆ×”¿¦p½Á‘8[ç ^ý›^B?X7œÔ”ã¢b?ÿ»¨x Ö[\¢¿¯ÔïŒIñûá³'UÏ÷­Ó½ÿŠÔ%WxóHð|¤˜J<ø¶Æ}ÐSù´sc¸»dTì´NX¹)kŠS° ïÇëlÛ”FO÷:DX±§þnhЫ¡O¯£¢êƒt¯?HÏtËÖQqz~µqVµ“6€ƒ‡ CÀ¬† þ©gÆëwÚµ‰þwõÆxú±½Ž[4eg=c~óGHæ=–Ò3?Òo´o€äg=BS¡×åM¹ *în¯ßvÒû¶é´ËúÇí§vÿVÏótÀŽjçH7r_4Ç£âñ¦¬_·}G‹þœƒ»FÅWÚº™Ž'«^ëîÆëÕðl¯†{}§Sמ¢å±µïðü ÿ{D“¢ê¨Y¢`vyÇ:zÿ^z?ïlp¶ìµBT|_Y}ë¥gÁ pgAõwÑz=^oÊ‹:";/4åÝZG¹v{SžnÊ+*œ?òß,ÈÓ=My¨)þ‡ò¢ u¿¥òÁ×”/ÿëRú:y™o²Ïõ=Àר|oªïÏ6åqµùÉÊK„ÄÓ³Eâ¿eÌø¿~¤­Çùšz÷ô*àýgµõkõÞ ÿ¡0ØØÑàía“tÀMix5nÊÿƒrädeâ×”¯Ó ´ü?Eç?Rûºåü¨ö?¾ÀɪëPýý³¦\¤û8ÿyS~Ó”?4妦\ß”Ët~·ÆéÁ¦<Õ¿—›r[S®Ós·‰×ýüŽ­ñ¾ŠëxP÷ÝÙ”?Gåû†ç°ŸŠìL£¿{‰×ù(üÊ}ŸI¦–®2XäÙ[M2 Þì"<-|)ÆFÅ{på»*» S(Øt§écÌ?Zìͳ&+Ø®ãÔÚ‚¸¯®SW3½®ŽŠS ôúVSš1(¸{²Þy„Þ9Q{»‹µ ‡6Òßà?¸v˜îÛFý´O„^¿±7=–‰‚meìšRìpž=\ï£ÆÝo¨n·c{ÑíHµi#õìn숂ÿ—è^ÛüèņÇ{ŠŠ3JñEÀZ0aQÝs²ê;Lô/Ú/£±Æÿ꯾à«4¼[tïz¸Œû¥úLŸÀéõUOÃsè©b{`ÿœ%,Uaß}is‚5}ÕöCÔ¾ŸéÞÞjób•/óø8*?.Qy¶`]cÿÇQ0¶ø;Wþ…¡E±‰°ÿ%Þ~Nç¯Õö”6Ù®î¿(ÆÑ'ô÷‹ÿ¡¼¬òšÞMùôßK§)"ý˜É ý›!ÛÙ–y'+èÓ~Q±Ø:`êZwë¼"Z<5Yy°þ^ê…gŒù»öÿàHü‡ç—ÓXôŽ´ó'oë4ñヒýÓn±=Õ¼¯ÄO°½‰¥€Áà>±â>Ç©¨ÒÈRÕ)܇ ~|çðÿèÉÊ·t´>9¢S÷qûŽÐñdµç{:þ02îs†Úü]ýív;vdßÀñlÿ_Gõ .Ô9ö?¶½ã>èdlvëçWu|¾Þc{ªµóŸŽj“`{|¦±~Q|ú çØÿŸÇ¿ëݾ¢½üÔb¿ÂOƒ"íÙAâÇNFTYocB$Ã`¾c> - 6ƒÁGë7düç:"ßã#1Év;{úWQã`:¤Ñ£·áCǶ‹j?RÀ|Ç”(Ä,ÐG©ÐŽŸ¨~Þ.À~Û°‰u _ÀôÀÆj÷q:n§g†ë9â&#%´kÑ¢§ÒµÐóÑ ¬GWî¥óSE3°¿Ñÿ= ªMè‡}$c;Fú.¼ÝÙØ E?l©÷ï&Z`‹›`픕мaÇͧë{‰뫯»êoÚ¼¤úµ»þv;'j¼~«w¡19D´¯þñnðc¹ÊCÅNAW ×àz©Áò#]›Im[Jí§Ïèt|–å5gFYMÔïðáѸO¥³cMŽ7óy½§È ¸ýV½^ìdÃ1ËÚ½’·g"}î¯+ý‡¢¸kyß 9þ$2¾¢¸kù»'24“èƒ =µÎ­ç´Ç›Y229@/ ûå•þ;ô•úÿ´ÊЇ"ý ~ÿRíëó5e xh)•j‹x½è+l~ôÙtzfõƒ6õŽÔ%æIÊܺw&ÑÄø¾Â^?H¥áÉ‚×ßÓuÇ\ŒõûèÜúý~£ûOÔùýíëFÆ|NQáÝßÐñ½óܨo[ž#ºá|µ÷»ºÖðl‰÷Pˆ9Vä¹Ç‚8ÿÛd¼cþƒïRy>2^ùjòQ᯷5–÷×q,<4¥ŽÓˆ<ö]^t¼¹™_Ç46ðT7Þãø?çŽÿcƒÛ¥€ `ö Øpªd–cÓÏ//Ôñ›*à1{0ù\ðž8Ç¥QíMð»÷ ]G`{6S0ŸÜØJu_otB2D\ä,ÕycTûLÅÆßCurÄÆ{Á¿FÕE«­\Ã'Ø[ïØPï“ч#"ç&|¤>tÊ’º—zNV›Á¸±êÃî*ãECôÎÈÈX?úÇ>ïBŸà›a¯ƒ™ E‘3ƺȜçz6¨ãÒC<…÷ýPí`LG©íøè“4ÆÔ¿«îÿ;A4;Qýg ÑUËëÞ ÔüäŸy‘Õ&ðbÑ Z»—>«Ç¢;6R?·è˜]Ô÷Õ¾ñz)¼8‡úûFÎ )–Ùêìo|xß1"âò/GÆQŸïËàו¯Ó ]ùE&_“\~XÛRÞkìwñµYÕö9UÀÉÙD£~ê#¿Û&ãÜ·LzN «SÏì‘v8ñ^âMÏ Œ¶¹n¿Ÿvý'ü_(2vç9êÇÏ@Ç8^åƒç&Çÿ¹Ä”y#ýŽ©„§Ä{NþNŽcÓ÷9ZxÌ\ï×á?ÇCôÌI*GªN×Çßè€uD8ÞÞONùQä@c;–xÎ*ÄnÎÑÜÿÑ FÅźßÏ;¦dÝòmÝs{¤.~¨3.·«píEßÇõhl/1›Äkoiüfýg‹Ô½b’9¹‚÷óGÎ× ˆôù<ÿ‹|a׉Ä~p|CÀ 0œÜNò þc»‚ ØêØØí§©€;¿‰Š#œƒÝ`kë)?Qs‰éà\Uw .ÑsDQ [À°›˜¾þnhß=Eô:ãzŽX¸ná;­>l¡k ¯¼çR;ÐSǨ¿›è^ÇñWWY2&;ǧ§Á.t†ç)öT[Ðûiû.ªkwµa½o¢ÞÉxŒjÃo®º·U!&F,gÛZøI‡UìïÙBýØSc¹˜êÝJcºú…O´ƒÆ;ÿ:Ûhùs³ÔÚ‹Ž@žV,xÐOõZ?-Cà¹Þ7 «cØ3›èMOTýæsÕ6ó-i¬Ôü¯y¾øÁoIF>­²Spw­Ú®¢ží`7:â á÷3ñŸuÀ×Ùþ]ìUu}ÿ>ÇÛÅë-Ë}·ûè|AÑh>ÑÍ6÷B:2ÎËë8Ptï«û­½£ÏL‚ÿ`Ê¿„/ÿˆv΢Œƒçä'/ý5n¼gîH_dV=×TQæž{ÏñZLŽÿ”…UP•Pð<>42î¬Êi*à÷áñõñŸ†¯‹nà7ÛÜÆ{p¸á«2wlì?LGc¿ãü`wƒ=q£Îþ‹ßGÅzbñ×ëx®¡~£ó?¨\§ë Öýàr‘Šï%FOüÿA)Ä_]?ª¥ÐvÑrÃâ#σ-(˜¥#óÔq*ö?|‡½à9Ý‘*$SŽùøúÞ‘sÁ`ÎNºf[› £°»×k±ãÁêk#ç|­sbÈØ <Æ&'‡dìGî‰;üI×ÀüÆw*:¤¡]±¿©zÐ3‡© ûEÆ.xߋҷ«ÎsÔÞk"±œ~œ¨gè±)âÄGl«óÏå‚Ùè‹;}¾l­ãjº¶ŸžGÁþítÏ&*žã=Dïåž±QíïKÔFžñœ´ç]ÆFÚëä ­c]äpN%ãv,¯±;^cc?bý¶jgÌÁë½ÔGÚ°‘úú'Ñ—q÷œìl:_IõÀÈõüµ]…çœWVÌ­#ü‡mjçÐÚ¾ÚAþÚw"óž¶ ¤¶Øá9ð¸DoÕ öȦ,qï7«ü‡÷—¨m.8ý¸ð›9jlØÏuÝXþüÿ ts‚>Iç9ïiu€±ßþ·íöÙÔÏgC#|#æfSÛ—½‡ê|¨þF ˆÄUŠskˆE~V1¾è€‡„û·4¥ño‹Í‰>ï¥ö|þƒÓ ©ô×xöÓ;ѹөß_TZ–ñpkrüŸ?r¾~!ñÑ\jçqÂèÓ„Íû Ë9/ñøƒuý¤NÙ]åÔ˜47Ô~Ãñºaß «3ö×}áüÌK„÷7GÍÕùµþ¾)r÷Ï*׫ü¥)÷E Ý$ü¿J¿é׳ë¾? û™‡ÁyGÇGtíMaÿ§’“mgO-zîðÌÚž°>X8r.Ç8?GŽœÃI=àÅ&ú{uÉžóh¶ÑßÈ?¸`[{|ÄŽÅÖ'Öò‹Zzxï­ùw¯?FµçÑ ØtØáؤè‹3u~ z¡áÓ‚ãÍXôjhVìPpñ¢¨øIäuoÇ«þš÷#{¯ªŽSÕÆ3Õ/ŽÇ¨œ«w:EŸŒÌ˼ºSè3˜F¢#°ÁgÏ#,«¿)ÄìÑcè‘oëYè‹}s'‰¾cUöÓ}ΧZ_GÆpkÕ‡,M%yÿL×Ðßè"â8®ìAÆÁ't x˼íqêïUm¢¿éøŽŽA­­{x?¶„ç!7WûVèÐbaÓŽF§ôÀ‡øÌ‘c“â—¡+Á’%Ô&øã^ÃÑlo½¿°Á‡ÖÏû—à^.SÏ ½ Yc>xZµAzL¿×訨˜]â¬Æþ·¿¦|öz&Úxl‰‰tc€Š÷”ú5/ÑꀹDCÇËæÕ9x<.­²¬èê\Œ¡¢—q´¿hhßaáh}±â‹8¿€½oÛÿéÈØÃ[jxßÅlÍ©#cú¦3í¤÷ΧgŒSž°6s¤¯3k$^õÖ>-ö¿ãõÕæþ¿»ø?Q8~–އÏÿûèÚ¡‘ú1¶sï±gÑ/à?qyðŸùYã¿çkoŠÄuã¿}0|çoÏqÏUúÝXÏoëèûÀü×įÄ$ŸŠ´ýíSM¡1˜N´ÄNè­ëKtÆ|å¿,,/!ÏÕ¯ù%?`‡s^ßç»Ës›ODµ'èob ‹ ¥ß]Àb¸¶ãñ-³×ýª >»'*¶cÓ]ißSˆÿÕ=Ø`7:¤¡qÁ}±éÁhpì:½ŸcCÛ²Îàýv‘Ú…opvd<¢úF=à ¸s“Þé¹è³ÕÚå8x ^ã8sc±ûÖïGê½ØÔ`¼ãLÜC |Ç©.t zÇó;ˆæ<>¢wÁÐÕ4Ëê;yo”×U®-©ßyG#/=ö`/Þ¥wª~?  ç·V?NVÁ5ôÞõ4fÐ̇ǰ_ÍCt>JŸÈ9Cú‚ÞÇ™J¸ ÿž®÷9–tGTÿÜ¿XtF‡m¢ñ§6¢_VÒû6èœCƒ™kÝÅ~z±b[yßô:·±¯Þ.¢ò¡®u×üWøßÍÛÿ ãÆÃsŸDÆ…<ß69þCÏÅÔgtÙP•e;c½²ÆYG‚£ókupV¸]ú÷qäÜo7þÓÍyWííZœ™£s>¯Þåõ@]üWÎQ;Lß&Çÿùu46õŒ'ÿäë`ó3×KŒæáÿQÂrŠã6GEæØ+l7Îï ¿ÉCgXwPÃcmN…üÌsTœ£ùaý_:XoÌþK¤í¾ðý/‘±æt™¿½CÅó´ð zÄùü·ÿ†ÆÉñÇO"ç´<¯¥‡Iüƹ"c~óiüŸ8wLZ»#CžWC¯×÷Z(0eûH¿à=Çïà6÷¶’Ù­uÎý`v$v8q|x𬇷¬gJåºà1Î;߇sðÿÆHìwA4¶KÁåkêy:yºL÷ð.lEä°¡iÑÌ£;îPÛÀ-û‡¨?¿Óý¬kºDõ>56ÅœÁõ:ÿ¹ ïCÏìÜ¡Õú:¿@4Û^m¶êwÏ›0ÿÎ1ö¯™Ï ÞyÝØ¿¹Ê8ÕGœk—Îý`-òä\é#çúŠVÔûÑSõ<:æS½ïbõøOµks÷:ú¾1¿¬®vc3€U`’ã?ĬÀdxg¸~³} ôW=\&:¡+‰EËp©Æ{ïH¾¯~Ò—euÜD÷À;·èÞÕ6lU0rFÉØsÂWíg)Ôk›]1ú6þO¼‡¸O#/íš…'„ÿ´ÕóÆåñnŽŠáĈùØÑø0'Õ¸Dôó‰=à=9qy¤Âù :b«;Ñœ:QGð‰üœ 4È/8ŠîÁžwNéž‘s+‹æèÓ4;éü HÌþFþGéX Žz 2é¸°ã´æ“95¾{鹯þï™Stù©Úµ¹Æ{wµ|{«?¶Fè^t 4œ²ÓÞß`Ù§]`•íLìCð]66ª?‡~E?ã§Á+ôþuDWøì7Átëj3z½°¶è¹bdü©¹¿ÄĘ B–°k»1 ç |ÿÙþã¿Q¾ˆÌµ°fûV1 v-¾m;ãÿÈõÎ+j|Wˆôß4]ôéðH?qÑ×y¤3¨S«-øƒWŒ/Xþß(]àõ ä–ôDÆ}<×ìù£n1Ÿ.«w›ÇœßC±ëçSû8Ÿ?2wiÙγ åD3†±0šyÚ]"ã9¶ãÎ{¾=p¼tÀîÂý]õ õKÂÎ?CÇ£…ñ‘¸>2¯ßó¸¶ù³óŸŠ\x§ž·Op§®¿ ̇ÎäT5øW|«/£ÍÍ/¹;ŽÏz¼¦Ìk¥8—jJñëôºw–È9ÝÅ"}½…Å7¶†k|œ#n\òúÜíu¾}çoã?×mûo¯ãÞ*ÄF‘¬m™Žñ~Ä ŒîiÞÛC»¥çðç‘g°L}QçÌ \£ß¸†ã€ùÆ®5ú²äqޡ߈(¦„_Qâìë^bøØ·ÏéþFÏ€Î9Nmߣ¶·gî陣ž—ç˜3ÿoT»ŒùöY°™OS߾ѡ×*‘x.#+ȱãÕœƒ©{‰và帶6XºoäÜ´Ç ,Ü@c†ÎÀ­ñâ½Èà,â0Y¤?ÈÝ|‘¶$r=Rãf{ºáá¢ã¾¥1­1ßUçà‘sy6Uÿ6׳̋©6 ûà؆¬cÓbÿ R[wôÀüjÓvªŸ>=¥9tÐ~¢ÿ¢íÅwó༾±h‰¾<#rîe¸h€ ¬¬:àÇB爜“NN ú:üÿ¯ >d¨ïÖyžo›)ßQp¶›Ú‡{^w•È}<è»m4ÛlÐ}DdÜ‹qô|댵%¦üad>”1Éy†÷ÿ_”~ø*2ßÇëöº>HÿW‹Œ3Ø?è©æÇÿÏe,™/þc·7þl±Ù›1,öúnÂþ[Jžæé _ßOVÛ÷ÕóûêwæÎþãq<ÿæ¦Ü zy–89þäûܪß'œ'FO\æaÑ”¹b<øPÞ³á)ñ€Ö•}﵎‹ÔÒÎ1}$͹dVý&߽ĵ.ºÜëu©#DÙDOÏÍêðc€]´µäc3ɱÇí½ö¹§²Ÿ~?\e¬îÝ=rrOµå{‘k½Àvb-È&ö56qC¿‚ßWèwÛþà)8 ®c¯§7EÆ|:;sl}ôGãW•|ÏtNitm™O€^oh¯p݉žE¿¾Tç{¦Ð³Ï¨]gE®;Oïdn¹ë^Ϫ`‡¢_À}tÊ?õ¾?¨\9wýÑo e)ñýªpo˜ÆÌñ~æÀÎMu}#]ßG´e|Àº º¶« cã\"ps½Çó‡È¶À\‘kôFtÊš*öVQ›{¡6m¦ãÈÈ5à¼åØí*j+Ï;÷ìpµLë¥=ð Ðyؘ`Æô~0ßNœî> öÁ:jÓåp¡wá±cÔ/úÐè—bëR¿×£S†¨ô=Õ;2NF»l{rݾµóëœ3ù®pÓk0ßúϸßÎÓävYµý3Xc¶ZÞ;{õ´X0‹ÚmŒµ£:¼Ò`Õ${o [DÎ,õ¶Øïùßç"÷¥pì~•G¥h—ç¥oDYNýq›\12Ö¶J䜀}*Ǧ=§ ͱ_‡•"óZµ†¡ØóÛ6¥ÑsÅΟ¨#ñž#õ÷1Âv¯Û=Y:Àk{¹vhç7tó^³u‹pèŸÒçv~ÿ¹~c\ö¦hú°þ~]Ç…ûä¿\ï+ôvL_ëµ¼¥å8.èµXÎÇ!~w¦ùžµ :ßk!—éÛQȸ~£8MÇ##÷cÞöøÈu¸Ø°àô·TœÓã¼læÝ"}íï¨æïÀP|sd›Ík¸°íÁçô{ý¶&¸J<űçKuÿUºç÷QíypL†žÄøßRih^|ôm3^=àJ£z[¯,}¯þΜg‰QçÕvêÃÁô :ˆz½ƒ®xT÷=©¶ðîuŽÿA¬ˆùtÅ!‘û8{“U4vžo Àt³ó­ ?²²^d>(˜²èî9á}5¦Œ‡óް}‘ÁMõ>ä ]…>3‘ãa1éú ðp[½oHb{í jÛò‘ëls® çïJ½ðÐþµ¾bÛ\ >YQ78ç5¼öì#ÚƒÅð:˜þ‘ú‹m^ý‘êÙFubÿŽÑß´ ~G8GqÍH-fÖX|S}ñ:ýÀdç+:ÆJüº'rmÍÿþûwÝS꣞¡‘kćEÚÁž°ok}ÏýŽ}ÉUƒçˆg^ém™j?ƒ>Dµ%'Y#ä5CÞ#És¿J/h޼Í„w‰†C"ç}ÿ7o{N‘ßàó~ªcž˜4'‰â5öÎ[á>üö4 fC §áÃûÿ¶ðÛØ¢ðŸXÏ7„÷ßþƒùÞÁó»üýM±ûú•ع=Yr þ¡{/þº»Ò«Èä"—¦oÅ>ÿ<Ú˜L‰ëV;?Pù,2>ýh§¼R±ª´Éó‹Æçpy_ë箓â¿ó‚Ôõì«,¹gÕŒõ%ŽÿÍÈ}?±Ë¤#k³Î”Nø¦0›¿Y×uŠôùgˆã\¤¿Éë$®½°ß¸O®ÎÃÂ{ò¡Xçuôs¹ïˆžð5¾¾óä§©t¥mÎ΢/²7äþ sEæyœ{àù'¯Çâ¹â‘A‘kµlïˆô ¸6^¼ŽÍƒ¾ä~ÁΰŠÄìtl-ðÌçÏ܇¬ïú'G>¸@÷b_¢.Óß\w^=s°ÈcTeûóÄÁdŒ8«ñWÁpœÆ~·^àñ¯µ¿T×l‡ž«B¬'>‚ > >ü¥îåœ9Wbìö œËOý¿ŠÔ´é Õ…}ëÜb,OÕµJ=ðßkŠã–NhhÝ–A[ôD¯º·AOƒM=«W{¿ä¹÷Òú/dåyé†ä ìèa>ìg oUû±Œï®w¼ >½TuOÉ7ºIýÇŸùÊÕ_0fdÜH3ÆØ=`áÞú \ÝXôðüæцkÄ}öÓX¡·¿«ç½ÿ:—ø zÊòŠ sA6±¹¼Öw½ÞÁl碎ÔýËëÚžz÷Û¶v®¶Á©jŸóœ¨Lòú%°Ý¹ÇÞ“Âù9àø†ÃßðúöúýµcöÎoƒUÏ=- 6ñîyÕnëûŽuëÍ‹V¯M²OÿG‘öòÿÿù†þþ´bl±ñœÿN»Ð7`˜ßÉû˜$þ?$þƒ+©Œ/øßàvOƒ=ô…<"ÛðéÊ‘øï¸±±ê˜4þù׃=ÝÁüeäe&ÑÕü3¨ÃS¶Uwþ¶jü,zw×-{ ÃäñŸÙ"ã?ØéMUb;—GîÁ þ_ kà3ñùÆ^l÷âù¹ôؾ®]' 'Þcdù:äéàó3GK\fîŠñ….OT:\wNçË‘ó@_Õqk×UPï]ªƒû?ŒvÿsèPr>MSÆÅk¬¼vbŠã@ž«óz,û[œƒžpÞ9|æü@°lÀžÄ&s̘¶€ëØëØSØð` X vcËâ“'q\ÿýÍ»¿ÌgÀ@|RìTtºœ¿Jüêú¬ÄÆ¿Pí@7€cøÄ|Átú}K¼L~G݉íO' ^T¾Á ¿`錞ª'Š0³Ö¼>¢ës«ôV¾ÏRê1Æ»ÿÔÚ¿’‹ò¦æ±ÞÖñ+µïOê'1©[Ôoúf:–ïµªŽ£0†`éŽ+Æ€\Ë·×µ4–øbà?z}p²žßCuáb‹£ÆF•7úŒŒ9/<OÀgð¬ö€‹ Šœ/®ì¦wî¯1ÞAÏÒ–-#ç ¸]²¢®«ÁmðƒýíÜKè6c :ÿÛ¶|»¡h8DíŸCç{ªÄÑW{<«¦¯ýuÏÌ•>íèà䜺¾T$föÿ?>¾4Yy7ÒæwÜ÷ÉþÃ?à9Áwâ’`<¸ï¼œiõþÞUGüð|±1Ûñ’…46ëŠ&ÈOƒ×=Ã4Ï/þDc3\ãiL™#r®aJµkJµë³È¹m ó¿ÄB}¦ÐósjlúŤ±ÿ¡1éžÀÖ`RwN˜ë Gîõ ÁèÇ«<¿`íYçËZ.ìü‹#÷RûWçïk=Çìi×Ù^¤£ã<Øú¬Ø\0úiáz'nWú…윩«§Ô3Ï Ï_Ž\?-ü/:õÑS9Ÿ…fý#u98½QäZ®~>Ÿ=ÒOrÍóèÖ؆Î÷Z?2ï{ýÈ5.”UÅ#I&ÀÏRÀÛ‘à<˜ Æ‚ó`xC·b矫¿9³±­NÎ ¶ï[zÜCw>Yù±üF¼†Ø8y–ĘœÏÃýè âéè ldÅ\Jn¨ó8y/8 Þ¿Píô§ùJ¼ŽÑðpÏr5®SpÐðAÏ|5–_ôÁ¬ú=°¢|…>znˆð.ù#je,ísŽíÄþ¿¶¹Þü\ñäô³ª¨³´gßÐ0O>#&Fœ ýIŒ{رsô€ý2xo?XîÙgÂþu|¹‰ŸDÆâNV!æ„~Ç/ô:1ô::ü€×txe=½g”®ƒ£#÷¾%ãÝø†ø1è°×ú_sýÈo£qï'â/øþ*xÓñ ­M+84¿žã^ðÑsŠÞ¯bÈà E/Î+/°Oáû­ÔWÚy¡Ú‰÷ºänx€wE`×ZzϺõ>»¬Ä/yo²òVLêXt×ò| :ÞIö€ksÿµŸK›Ÿ;L»l+£G¨ôûŠø(uƒ¼Gãþã/§ƒUÇBñoø_tÍÇ‘öÿ[:w>ÐÓµ-}ÑÝàõ2ª×mrÁ*‘9(¶[W‰I×´÷mc íôqeÕ±p¥A™ƒÅ®¿\XßàOüV_£óûunûÞÅû5»éœLÇõ±émÇϹ³žƒÉeÝ[Ô±)6<¿¿#Z½“Îßz¾]m8øp†ÈµÒsU^.¼ð¤xpdï*‘kçœ'î¼<Ûˆ#"÷Ûñ5Ë‹çè¸vÇ9H|/78¡SÀ‹ó#í|°,1þ«s°CYK,›82˜öŒâèÏÈëÀüÛ"çCÁÁ{…·ø{ØúÖMQ°‹kÄVÀHôî§š%¯{ûOÂüþÂì)…ÕSÕXKÏâÂvîYKe³Ÿ)Ç£›Òð|ÙãrŒtòLNÐ@ÙLóÖw—߈«z¤ô^À†g®™ùô²æÜ¢Õ–Y;±ùûEG0ÿuŸèyºhŽnEÿ‚§^ƒmŽ™‹…®ßXe{Ýoÿ}ù¦Úæù˜ƒu¤þ}õ¼óêÀ=Ï xN‰b{ ¾Ã·ð>Eà«uÇöz>B_m«zÁH|“et¾¡îã½öKñ+Áèì2¼îýGæÕ»{np~>x…ݼ‰hD?œ;N™ë@!Ž# TÛÐwžÿ:*&Íõ:&tÐÜóŠ];kd|{Mµëv¿$L|f²òbL:ßë¼Ïîßα|7r-sAÞTá·/k)±)Ç·œs³tdNïÊ‘ßdC^‘Qì2tvºa-ÑÄ1˜Åãßñÿ­N±íÿ¢ŽŸÕûʸͥöP‡s~WÓùÈÈØáȘÿ»öÀ ÈoÄtËbj'ch{g˜~kx´ýÞÿW ó»…øv?y›¿ŽI¿£øGéì÷Ç„ù÷h<ˆý¼ViRž\ï†ÏOÖ8h®ÉkáŠÎþ0rû¨ðzršÈÜø¬—ø²¯î“.hñÛët†ˆF`‚ñŸã.º¶~äwÿ¶ŒIýçb8g“ù²c#ýÛÿçñ`ƒƒGà?rŠf¯¾(2_ù@g54,¸Ì|ècº†ÝÆ¡/ñ°÷ÐàæÓÂld»ä)ÕÅü+±ü»Tõ C>•½Žíƒþ¸©Þ_0¶¹ÆZÔ¢ö,\íðÏçZCƒž†{6”ýÏùQöîY^¿÷Ué%Ì‹žWÁ§hìžMªïPúAÐY·©½3B.ÐYÔ>‚û¥MóDê ®ßÚéÇÏ5&?Í¡ñ‰‘û;ƒ™`ÿqÇ13çò€ÁûéêB§ C™ãÅãˆå1€> 6@ì ÜÃ~—‰Åœcaž„W÷‰üžزm§ŒÕžÃ¶Àcüð—¸ÊÁz:c˜úÀý`ƺ1©¾ñZÏãN!yò\À¢‘sØ1àñj‘ëÁ #÷Ѧ=Ø‘àÕÜjí€ÿÉgÛSí_U¿ã?j?ƒbëáLíüo›£ëõ9Ÿ ÓŸˆßëù¹Þ;Þ?YþO‰¼,=òiÿߌüæ$í𺯃V“ã¿cdÈ=²À~CŽ¿¥¾n*Ú,­±0¶hO…ÃÏx=ðg‘¹HÎ94þ¯ùM4ð:{D¤=1,rÿǶWÒz>ÃzÛc8\õ:wú7XTâ÷Äó™ÿ%Žó›˜to5â:äz›Á¶¿UØM¥ôÁÝÒmZ“]ö|ýJô˜¥CxƒxvÜfjÓ2¢)6ÊBGô4˜OÚëC>­¼Ü~¿a¹Èoø8gzöÈ|M¯aÜRõ3N^³5:RîÁ ä™x²qþÀÈu [Fî n /Àì~âØŒ?TÁFÀ–?ˆ#tçqÁ,l °\!'<¿™¯÷˜»¸K¥ñ…z–•ý ¶Ãïêla°þ=ÞxY…kدéÞÏuþ‘~‡¶èž¯—.)8<ƒ|°~¨b?KÊØZz`Cá9×W©u=2µ| Æ‰ØØÉjÛ;Õ_(}4^£#/­q©Rãï<¦#mýDíQŽQá¯R׺Ð_ôÀÝ¢ýÏ"÷´'ΆNø¾ 2 Žã/0ópÐy?÷DæMÖ¹ïµ@`¶sG?Á+^wæ»ç öÁ»‹ÐKðê¦z{{}ý¼ÿY}~R<Î3G€ŽXK4DžÑ5`2}íŽ#õô4T®}›ø#½{yÕµ˜Žë© Î{ëàÃ9t/ø¿ä<ØèÈ5Tœ#çðÀ4õ=%&k\òºhÖ‘}^ï+þÿ«¼vüÿéÈï¥K_ïÜ÷¢ðÿµªãŠÿ©Ê[º÷õÈ8;XŽòü8¾fäþ>ÆKè¶ÆŠñ>\ýel<·‚uŽŽc{`ÜT¬WçÞ_€þ˘^3}Ä/‹¨à>¦×éÁgàµ×š8v=0rfùH?te½ÇqÇ5tߦêãªÑúsíwV®ö7|^âþÄõ+=ÀzÜÆ¦,vþ_:…¿ÉíÑ|l9ò÷ó‘9—3Dι̨¾Ã£ë«­Õ^ôöשjßì‘ßG“ž,±¼7Å·ÐÚó¸Î÷v®¾‹}3¿Ë{, gÛŠ&Ö·`»×~î¹ç\#çØþà v;¸æ¼Jç꟩ ¸‡|ôœã?èìWúõ]ç¶0˜C\Üox¾`&ë¨6&÷ïà9¯è¾çt?Ð=¯ ‡±¹ˆ·3òнoœŸ¿Úã_ñ þ*qü>i×Bœg)Ùý .ô4²QbOk)ÔèFò#Š?зúå½Ðä=ùcêïÅæ§¯¬¿ýöºúÀs/«O´û}õù5ýðy­³í4ÃOz8r}ØMz71ñÆÆ):‹îaŽ=ü„žýeäwvoè<ÿ]ñ$8{¡îù­žƒ?ð ¼7þ…í`dÎk¡À0Ý;2§žB^±ñÑ%ÎkÑ7¶õñÎÓ{ÖÕ½è*¯-Ä~ {y?8V;7œ68Ôo²Þx-óxµÅz„‚Ü9– _aÇÿèŸ "ó ­s¦ÖsKÔ>—uiÓEî‹?‡î[#26Ñ7ò›Vovlæ—#÷„vÜÿÎߎá#<+]à<ËWbÒØË[Ò/è ðÖùMKD®FŸ®¹.ÏþÜî2Vý]9Òö_Jôõþ;³H}“ì9ÔîC:mLºV >†ÿgU=ËD~›sg£«V‰ôæœ_1rŸjÏxÍ÷n¨ç6Ü'‹\r8™ÿeàÂrzˆáÜùÝ5âûØüä÷x®÷V鯻z¯êâ2Ö΂¦`¿ýRüç­Å¿Øa7À:tì?Å_E~£m°xvîÈýEFDækçÇè:ÏÚöÙ$2?;ÞyÔ[Eîµæ£s'¨lÿ½ÕFdýà8X>1ª.¸<ÛÁ/â„Øú脟־µ{êƒà>1xÛýÏé9ìy°ì=ý†ÝþX¡÷œ§8 2øÊÓªëÅ\ÕÏ:Xú‚î#gxØ([Ú¾@‰ñ,-ÚÏ"œ$ŸKúÐзgt½§Ä÷—Ó5ò?×Ô= +ÆÃxƒ©Ì?ü¡¶¥è˜i«Ž(ï~OcLû¨í*¾ÈçU7•¾A£¿«/¢E¡Ñ{ºÿ=ÑëȹàÇtÄx\¿3¯ŒïŽ.ºTcƒîÿïгøe­÷:¢¿Áhëöh¬yö·jÏQ‘1mcûÕh³iäZûa‘ûj®©3ÇèúèÈyž«ñÅ®çS{8GŒüø1:¢ ÀêÜßÁ…{j̤`=8Ãñ~påöú{±ÙÃF.ÐÌ×ʆ/Œ½€½ ¾‘ûNîåaŠÃàKÿ©ë~=7£p¹Ã·3Ñ=ðჵ”ù]t)üx}G‰û(î^ü‚¹äx`iÙúØZUì~°xÔ¹ÝeÔv|°äï‘{F<íþÂe^½Dlç)õÿyµ‹vÌ®~?§6ƒÓÆò§D;ÚÎÁ7uý¾Èý‰×ýÄÞnÓoØÿØþçêxsT]LÑQwDê¢ÇÔ&Ç}NÓ3Œïy‘óËŒï7u »á¸HŸýPñXCŸÖVOáù=ÄsÄÆEì{0^cvÖ5øs]Õ¼\¨{œ³†Žø®ð¶óLy—s^‰\ÛàTɳ„wÀöÕõÛ>ª{ Ýâ¸ÍÑ~×¥Å$ã¿c^{FÄϳ^e{žž*r6Æyîí]K±‰ß/OÞíàÿ²ÿŸÓ3Ž ½¨k“—7…M½ôNúÚ¯Sè‡ñMÑ·‹ÿc#s³œË mÐïZ÷VbÆÿé"óló¿9?ñªÚÿVý½Ü¿€x…1įÜ^cìµ,‰ÏÐ}Ë×±-ØÖ/Ò7Y rþi„ø•øåNÑîE\òÿ‰ÿ0|jTû¿áñÛaÙ@§ß齯>¾ù]‡Ï£Íãj׿;·mÁÈyŽ¥ÕìÇahvö¾¶×zâÏY¥û/5fc"c”#¿»çu\߈ŒÑ;]±¤h¹W¤­6!2ƃOíü‰Q}€îþ ÄÀâÈÈ;±òï¯Ðùm*ÄmÁuð;Lipº¬%çŸÓ½pc½·Øðƒ„½È÷‰ôÁÂ×9#÷õçyÅ|J aÅnfÐoŸ×ßÊޚėÈñœ¹ê“¢ 7ºŒœSâ(`ûkÒs«¾ùšC¶ûÂ醟Jì½sUÝ?»0œµ ¿T[é˜ý¥êÆw€/žÒ{ÉšJ~2ÿÀsÎ_ºL÷âS¢Ði /ýÆßw‹æw«€ëˆÜcè1z›Ýp¯Úö’ s*ꙟh<­7ÐýøØûF~‡[@,Æùý£Ägð4ØŽ€ËŽÇG>-ò8'‹þèÝŇû«NŽ`³}îAߥë`õ†‘ €IÎ]Cv°ýç×ï³v0û9DFmGö‰ÜO~n=c\#ÆîÍmÎfÑ-Ø\ZsÓæ[ƒ÷Ø)ð°âÜEnÑžsœ£&(>T0ünd¥Øôo cžŒÿîoÿmãç¿ÎþQø/ö°IÁNðÃsª«uƱÜU…ñqž«ç-ƒ_\4òƒ/Ôö7Õ^ç°Ûþ·ü¤ÊÒŸª=´a¤Æ×¸/¼.×Á¾õ#÷ï¯q_%òÍsĤ{PÛÛ-oÇÔö—}ˆ÷cï³f«á»2ŒNzJ´F§Ý¯6?«~|TǸôóqÝ÷~G¿½i·{Ÿ Ø|‘ϰfäšóç"¿ÏMÿFg½†¢øŽŧ£"çK°§ºkáÀhçq:vï~W<¯ãXÿDë‰*Ø|Æ~ŽgêüHýFì;»ñ¯:~Pmã‚%ØààÌ+Âöid¿ƒÙÕXI¹çù>SUÛ»ä¿P¾T¼Gön©cÑú[±÷ó)GÊÂ뙄ÏÈãûõÙ‚íïèï+n·{B3­ŽŽxSuƒëËÊçXL>ô}O/«÷ n¹^ ìB'^'º=[õC™Ë`¡á±h/»¾Ä…ð96Tì‡v‚ÑÄßÁ÷¿×ûн?½¦öB{t+zõöÎÜ®çÑØùŸFΠ—¯QÏWÚü,ò›õÄÞ®Šüþ:¼„îÿÁpÝv>ü.ztõŸþb—rn<»±þ†ï˜çòžÐéñ$üHþ’盩_áôJÿ2g2DïàëÍ"¿ ‰¬ƒžf¬á›ùª·ß$K°cCt6x­a;Íùñοž?rÏxÛõÞó`Úȵõ²ýÛïžÚöwNöLªì÷š9è6säÞiØü¯EÎÿÞQíЂ÷¯ 3½&€8Ä£Òè~çƒzî×ù7Îr ¨Odžl?ѬòüÍèH¿lOÆ\öº ¯eCŸ ;g«u·ûS>¯6>¦küÍ\éÂÊg„m3©h±˜Ú³Zd<ÛñŸUôîÕ#óÄ–¯4më‚—WŠÌsD‡€«;Šo:>EÉý$ÞÃ<ðÍQ÷ð$ÏÙ Ñ„þÜ­öÃSH=-:?SÇ«ýÆÜLúý}õk­Oa?qý6µšbG=¹‡ÂútÝðÈXáÈ=FV\ó…-„žð|°sã(ãÕßõ7:¿ŽÜ~;r¶ƒ#ñŒw¼ÿç]®ß9‚;àL£{¿ü˜‚ßİÀ¢e3O/»ü³ÚׂÁ¯'þa㕜ùÅ„¿ÓwðÿËh×ßZ?}2£î£Ì¹wÉú[Ñ-QÛàu^%îÏ8`Cƒ±ÆÇX>P}S¨m¬hx¦ÌÍ,*Ý2RXö³® >}¯ö¡Ðl>O<×èú?êU}ˆž†~Ì܃^þ÷—^/îSûžU›h78þ?¯ö^£ã£ÑæÃº_ߦó÷õ71ûê¹†Ï î¿'ºØøJtóÚ¹jÜÏÜg |'¾ƒ/íüRp¬CwŒsݱœ>‘ßñú3htQT]p’ê/rù#dƒ~;>ö?øîø ºüÏÁWä ÁV_£æƒ Œ½sFy÷ƒú<œBÏ.®wؘ9Ò?˜)2¯o.½wÕ;Cä·¶À0L9Ýí÷ËgÒýÈù†j/r=G}ÿ$øo̼K:Àë¾ì[»kMÑOtt€ç‚ßþ!=HÁ”¹Õg¯S7ÐŽŒûìÙK°\‹±GÁ£i£Íw*ïp[ÝÆ‡Õ—‡#¿EhüWî{››40r?@ç©Cgûké¸fäžÎÓÖ¾¿kFµßë—h'²ˆÍ²C¤MLü‡<Ÿ«#¿›È€;¥GfVý k¼Ïz\ýzYEcRò}£9è ŒŽ\ûç¼±qâÏÕ¯íDwx‘˜éÞ¢ýšâÅy#¿5í<Ç(ñ{WMÆéàÜoê÷zŠuÄw¶åkâ ÞûÌ?EG ˜ïN|uðƒ8ÁÍ“Öp9®®ÀóàØ«yÙ‚-Ðõõбž(ó¯‹ ÏÑ`ÙÇz†ñ„?ÞÒ}ø _Ê6_Xºb]›Muð÷ò)xžø:êŸjX‡¾ç~¦>·«0ï°0y)é€þ‘óÃu͹¢+èèÃûõ~hA\ [{âåÚ¯v=ó³õ·¢»˜SøNÕÅ_yYt¤mØíø@ðÔÔÓöiýýt}wi~Àe‘ûÚ9†òtä÷jð7ÑWjþÚFz'2ÒOeá1r5L÷ͧö-¦öñ<²;gd̾ÄþŸúè=ÎBÁ t:pêhñ¼ØZ О†F~aÞú\‹ÙÄ—ï•x@¥‹©ö mútÀ£:"2wÔºà#µmJµ•6N™'CÿÁ*ϳãs¡ÃÁŠÝ#×|Bóõ4Æ $M‹Îâ}/Ĥß(p<ú^d,èɪZ{yø\e;Å¤ß \/2÷eŽJ×ò>d |¯GEÎ}Âض`í1I~L‰ÿüªê¤ƒÖ¯8ŸfïÊ ¥~ê]ºÒ¯Ä‡ÞŒ\s¡8[ûÝá™:|Ä3èø»ÿ–¸ËX½k¿H}¶šh õå_h §Œέ{Eîëé8ÿxµúí“~Kc”x×ýç±ëœçƒ8[G0Œqþ8 vx-îí:‚IÏÕc±ÕgïÜ}Î_×=ð±ìì)„CkÙ®â|»&w€°~¨â.³ç–yW¸õqd¼Ïó´óNõóëÕ'øâHñ q|攘ÛEvàõÅ—ÃuN,»Ç6%øíµ'Î;þ¦êF>.Qá˜Ý†OpºÎ­;ÀQäÛ1kÞé<l?Ïß"‡èe¯}õz„…#sO‚Ì!ƒ`Ñ@=ÏùÜ‘ø2‹êãˆ~˜Sï€ïgbb×â'L9Ìq=Ãß`í¨ÈüOìøg#¿ÿÔ<¯ëäz 곬÷üÁäØÿfÅö»è3é8Tïw¨íBp’Ø6?úitä®`‰×þj¿ 禗¶¿SûÝÎ[>&]voä÷^fÐoð픕&¥}‹ë}#ÅWð(ö†s×·Ñ»ûFÎÕ‡è<}ä>oÔa¼ƒ·ðW÷ïy=Só[‰õûÿ/=?Fü¸˜xs˜h±ºÆ{o=ß¼¿¬{Et\!Z¿«ý¾Jo{í¶:>>!rí<°ŽÞ¹ xÏú[jP´9¥ÏsŠçú‰7á{û›}5.]üßOcé\ÚÍ"ç÷¹yÞ‹Eoäò'¢9¶ñ °yZh÷÷OvÞÅÖ†÷ˆg¼÷ÿü~ðœí”S‹­¾®,;xmá÷TÂÙEôÛbÒKè|6ÙÚŽ ûK ‡Xôx½S¼^Œv‚ýà;v/>~s®Ögà#¸ V¢×ds—ØÐT‘{õW¿ÀFðö5é%rý÷S]?ÖoˆNØþ/©Ýó¨?+©Ï#+-Š™Nýá9âè¥çë;J?ø}õxä\ñ“>xþ?«><)Ú¿£{¡z ½ð¢úËX_σÿwŠ.×FÆ…œt¼ø ~ÆÎßSühßÔk¡KÆO@÷QðÖXñ9 ØèJøöXÑíÈüÞwT$/Sr 6,™û?LuÀÃØÕŒöºÚ"O£ôXÖl?õÜy³s«OŒ÷ŒjãjÓí‘ß|Qø©>—6a+\ìp[a'Í•ÄsŒ1øè˜}@ôú™‘¾:nÝh¿c]tÒÑî™YÚ£9ÜB úŠ|ÿTÏ"wgèùæÝÅw€öïT=Vtß’µïE'2æèôÕüâx y@FöS[gŒÃmWÖßÎ-óü–í¯M­±B™Gß—UÙ8Rwã4vŽý #Ð…øÓÈ º»ï ùûï¢÷Cþ±_ÜÓ9žoEê„×£Í}ouÂÇõžb¯•Ý;$r Öì:òû 5–RtÀ4ÂU¯Ëõ~ü/>…mæ‡Ô60ÿIÚÕØKØøål6b,` 6%± bÍèIìQ°éÚHlº@üw¸èuœh}u­·ø+¼ÛóóÔÒúÓ+è~0 »Ruí™ÿȰ†Kü š= 6_"þ×ïŽü¦0¸ o“ømØôŽÑQÀpæwŸmç’ŽµÍMîQÁws,OkëJþºxÞÎ? ~ø‡øãÇ‘ßß×°÷‡E~ÿ™¾xNš#‹èщQyò×¢Ë8=OŒ¹;OϤ1qÜì÷šrž?QcÁ|ü^­.zÓX_ïªzç†ÿÁ¾‘ß!ðz²EtݲGßfÜ?Œ~.¹ÖÉ9CK©¯ŽOô¯øPðþÈoЯÄG‹F«h À5+•ß¡˜úFmk‰)ÎÕ®9YXã±¯Þ À¸=ônêú~dìßÛÌ;HãvÆÛë­À^ðò·úu½ú|«ÚÄ»ÞÖñÑò^݇¾@ÿ9Žwcäz½ûu|Sc@{_ÒØšà¯ãˆ=‰ý¶xäúq°ƒ¹*¯¿eìää'j‹ç‹Ü«èòȽAÑ-w‹Ô‹.ötµcBØ2ëDîS€Ÿ σ׫«þ-"÷¢c<#¯æYì#ÛXžË/‰õ̪¶s?>;v¨cü³G®9RûZüÿÔoí‡-^dZù‚ížžß}5òû¹OD®ÿ;oNý¢ƒý¬]jxµì[À‘5LŠüÖ:±¤G„ÿÌÑ~¬öÂóhè7¶àb¢ö¶÷XUýEß9æ¯|ÃÖv×>íš+èD|鿃ÿ3FûíÈÒž…5Vh,À'ì/0]¾Z½§èRìÑ>j'cmü‡'œç9Q×Çëú>Ñæ2½ˆoÖðqÉzAØÏø ÓØ9Z³ÏÅ;Á×½D4Ž«ÆèÞâä¹7¶ÛW‰ÜŸ¾ˆÜgy›¿ ‹Œí¯®ºé×Õ‘9`8òFûø›øó¶ŠÜçþ{ÿtºÊ9~Ä.Šü~"¸ÁòÕácìDÇ˱¯üž’÷ï\zçiÚ®Ÿ¦âw¹æ¿‘¡/TÞ©öf™Wý@ññE"s,‰å`/˾’í ¿‘CÀ ÄÃÀÐ"ãäðý j«c7Gæ¼/½úôȽé‹ü&-c·V¤Š}΃‡èk땘 v8öìÊâ«÷jx¹ìDŽÐ¡h¸ÆÞÃÖK–RûÐÛj|Ö¸1w¾Æ7}6r/!ûà+~z€½ý’Úxg¥wyãý÷:Þeœ¿ÐØ>&¿Æ¾:…¹ë‡ôÜcª£ONRûñÍ÷ýÖ•l4z¤Ä{?ÒßÈ:=€.D¾ÏÔx\©±ù‘èwŠêCO<¢6ÒæËõ;:=qœÆÌGn!Ï wȮ罆kL©\[Fô]3òûŽ‹«PŸuÁjú ½ˆ|ŽŒô¦ë`˜¿F­¯äˆcŸôî`><-ì+;gæyáõÇ:'ÆkÀÀІo‹€`ïò×/htg4|[|€f<Ê7¶Œ\OÀ-q l³E#÷ÈXG} ë`ø´Âwüpx[{õu‘ÚæÖ÷A§8ÿ„ß¿ÿÿÙÑÏW`û¿¼Û`¾H=³\åÏ…_‘µi¤ÃœSÕGã²]dŽ»÷´ÏÂß¶³ÆÖ1/º_ëš:n¥=Ä*½Ÿ‹7Ñóðã¹âÞ=¯ÆØÜâ‡~•¿Ë=ÓF~à f cGîÙ³Ú½zäwí7R;·‰ÔDþÆËÑyÇG®ÍCˆ-!Çé÷4¾{«ë·#"ãØSØVä–`Òp{]9ñÛ»ùæÈÇövÎë:z'WÂëº>nhtUÉ©‡NðX¾€ôÁ§‘ù*´ãälú(Ú¼ø’C4‹îƒá+t2øŠ®Ã_ÏDê³W#÷[À®f ßÑ“ESè¶}¤¾^½òIÁ üBôÈU‘óG»ˆ¦Ì'LTýYÛ]Ö4ØÍÜG¡çËzÌÂvXC¼‚~ëÇ©œ®:ѧ‰¸†-Œ­ò=]§/Ø Øîà,r°“hV{tuî:]¶âWüCcÿr´ß»/~1|üÖn4<ÔÃ|À碲ŠN„¿OŒ\£¸€d <_±Ã½Àlø³oÜ |øMõñÇê‡c^è²tŽÏp’Ú}¡úoc{YŽ :Cƒ­#¿õ¾Fm_ëÛ¡¿÷#—܃˜qÁ®BW÷Õõ úmÙÙ䆡>ûoóÐR9A·iã@D~Gñ•ÈúÓ‘±t0þGÒ·êobAQöªÛþ¹÷þ³kÛ=ªÁy0 Ý^ƒÝsGîqƒ¬ÏíwÝË÷‘ó±Ž÷ +<çC_ÿè­¿ /¥ÏÊúÖO¤KxfañÊšzÇ1âmä ™DîÀb’DæPÕýÆy¯w(žB߃»'ß•üÏ ¥Ko”N„6?Òø;.¶¶Þ/Ÿãêí\{»ÇŸæÃKû¼¶þ[Yun™×ê<å1‘ñüõÅK^?‰]„/¶¹xÓyt{jì\›±CäœzáôȽ&  ˜lS`DZ‘ë}ÁMtò^ÚÆ· }ÿð—Âð9…ïÃ#¿U«ù’Ç9Ÿì\Ç}¦Tý`ÊWŠócC€ËïÔk[^¦¿'á½Þ¯¿—˜v Xy[½¯à»}¯}Âö}R1â@êÚºlFÇŸùå‡ý¸¯hº¾hè¼bx>oÀY캗ñ{¾§:¼ŽÚ>¤v7þDOÃ{=ð'óËçhÜÑ×Ä ûˆ_ÆEî½qM}¶´?…gñ àï³#×Ìr¿yBd.ïaªÜþD4’oWðÝûIܹ>þ»VcÎ=o‹ÎŽ62]æ°ñ—~­÷ŸS¯·ï„×±Ñæ®ögûM"xt‡Èu¥ÛFÎ À»è²?E~?ȹªàÿïÕøö_ºþ]ш9oô1óÉÈ=6¥s ‘0¹> òØ¿ƒUœw‡-¦yΧ kÎ1D=GÀ}àá2Ñæ~¼ýBxzg´ñÿ²gäó‘{â8WòíÎßïF®À¸+r…ïÒñaYà ÑÐ!^¾AþûÈ9×W¢ý†eñ=h/z }ööV»?J=T°LóÚZðÄyå"õꊑ{Óuǹ¼öëÉÈ8нzÇCj»ñÕsH亣ñú{Ñ~5ÓJ‘ë;G~`ÈÜ`Ç}Ð È·×34õ•ï|5|UbdÄÚÞ¬}/s»ïHç-¢qÞ¥òpÉÅÇ!r- XÔKž×myí8><~(¸±uä·ºW-=ïë6Çû|¸hqª~#ÎC,ê È½SˆW` Ëý•žÁ6ÂF:VÏ#kÈv ë`‘uì@d9ï'NðjçèyTåt:^ß®Ï"–³²b1ë·¤¬ø »ìø¼Æì‹΄®ØÌàЛÒ!aLG4¶jOƒ³eo®9Ÿñïj#õûüÞOußG=ºšÆøB§ãÞg«o< Þƒu§iŒi2:1rO'îû‰®&:ñM¿ÝŸ­4-s)è†ëTþ™Sú¨žC^—ÿScð@£Ö§@ýNÏAÇÕâÈ$² ®\­÷ÞùÝ©³õ·uçMjÇשU/üŽž½A¥y®äÀgÃUœ#ˆ=…^ÿñ¯œc·‰Ž+j }YùÍTxx:ÓL‘ßëcì:ó¿÷ÁRòy~ÓÑwvðÿùŠù'Rl¼`.6PCßâ<™×ßÈa±íÉÿ!墨ö5xOܧ±KÊúVths(1òø Woýýl´ß¢/8¶j=/kŠ?¬X׿”/®>ƒ·ÆxëMøÛÕñíåôüKªÏ9 ÿ”xFzîCé&d=CÜveÑ>ñZ]ðq[Ñ[rQ½Ÿ¸ÆÈœ×8h'ñ<¼søÌÿY/ñÿ'¥{úFû=ž‚á3Wº·k²ìÓhߌ¢œG5X톇ç- ×ÀÈïÓsŽ®Ež×V{½îËkÛh»çv—³ŸÎ‘çîºdY?P×ììXd_›ÝŽŸ¡âuùØ©Øià ù>`%ö²û¡b0ÄÛá ü}ðâ±È=-íhþµ`ôgÑîñÖÆ„´«`ù,ŠõfÌ.Ûìy0rï1Žàó}jcb߃XÆ=õùÒfÞ.8fñÇÈoˆýTu¼VÛZâ.øÛر¿Õs`Û™¢ùZ‹ ÄCðÛz‘û¢ÂƒØù[ë>º•øŒ±„6ü<Ò'ƒ‡ñÕ¾¡ã•¾%nm‹n›%|ð}ˆ¬ÿÌçÀ³`ýÓ¢;6.úç|ÑíýO°¿xf¬Ú7V×ç¿Eêvôù]¢ó*ŸDΫ€IÐ3øðÔcÒý2˜[ø—úó¾øäYµ ßÇ< ߢ°/~í~€¥ ÐÉó*ø¡kü‘YtòI‘þéÍ‘y¨ŽUym!:}ÿ£3࣠ÔƸ'˜À<úýÞ͡ߑ×ù#mXdÙû÷XÁ…4Fž'îÑo\ÿçŽö€Å®ü‹pÿSá«p¿à´žAX9™/àoè,5v:'èUaþ?„÷ïèwâ+ØÕ¯è:1âIO¨Øx8r}×çSÛþ^k÷׳ nXB3têT¢ý¥¾ÑîUTôÚÛ‘óïEî•ϵG«~(u€íÃÅ ÈŠc6Ð~qµ8X‹¼`[­¤ß×W¡]ð¿óö6ï^®?ÉN.zùÁªË¼Í U¯:`;`Ïc³/¥>1ó¥úÄ1—ø›pÁ:îÅŸ‚/ÐM£Ô§¥t\Kí§­‡E®)vŠü ö?26!Ž#£þ [?œïFVÀsd?\{TñêÁÆGŽÁ+0,û®êà^pßž{/r¿-ã¾óG4çë5WW¥ Š>»¼ÆKy9åëŠYj,©èžÇ‡?i°ÈëMÁsìSðâùËvŽ¿SÛ8o쟂»`Òó‘óž`Õ›jã긿ó ž~Î-#ÂþýpÛ…;j¼°ÇáQxõ4µõƒÓ4VWŠîŒ×j'6ì!ú>AgÎí~ˆíþ2³Gæ-Ó»P4‚·ÁUp}ƒ¿ž9Ïk )ð:¾ãy¢Û¢9ã Ö‚©ÏDêøgD#Æäµõ{jÃy¢á-‘눢OÑÍȼ†n…W¿™KKÛá5ì±O¤‡ðz%Ñá|ó¯ÕVdÕkÁîˆÜoäÕ÷GÙ)_vÚò==÷ãÈõÝÄ–'lÓ}#óC¸ŽMæ¸5rÞ÷‹I¿¥ÄßÓ‹¶ëKö½¾gö:^Cáä¿ ·pþÙȘÏÝ‘{û<¹¦‹±pþ¿ç‚ßþöè7îwÌÄúáa}Ãw%†~= ðnmg¹îõÏU|+ïXú ?nŠÚÞbWÏ)l¾¥¾§`ì¢âQú:Jcîc·}#ñuÑãuáOä~dóYtÔzüÇ>F7×­¯÷¬©±¡-K«]ð·ó”x9õÚÆ{B¤lsV"+ØCÄÞ”^|©Žo»‡ÃÑîé º¾©q‡_¦ÍÐYó‹¯û/:zà“kwŒü¦éÆ¢áúê2ÒÍQÿÁwðþ¥È=šÑ‰è/pû›Y»‘/¯cµ\"?ôYÁvÿ¬#˜„¾8>2þL#/Ø„àéºö¯Èïé¢ÀÓ'#÷_øX˜> æé´ß-ŸKç Gî׿5Z«ÕyϲNw9Ùò¶çhëÍjÿ•jm¸Dý»\÷ ë°ñþ¦1&VÞ™ó›h€œ¾©ú¯ÔÜØÿ™îûNä:RÆÆ¾ç¢kæo†FÆ;çO¡óÁZâoàãvµßÅ&¥?è€óÔVîù]ä÷Àdtñ¶zßb’pâåÈ=i÷ôj¼ct…Æýñò³P§ýØiÈÐþ:'î^ús¤Þ|X4z¤Ò§ì— ¼ qþ»è½‘0÷lñ¿º1ò›føS`8ºi ñ¼Žõzôº{Þ¿Nõ"Ë{è7ÚxµÆ’úþ([á=×ü^ÖØÑÖ»#÷xÂ'¹Hm¤ÝØúÄðV°%ñ ÐO¶÷‘݆Ìí|Ýò‘ß ôú¯!‘{1ègç»{/–)e;öŽ´yÿ¢ñ|\X ÿ.&Ýáƒh¿ÛUìÍiU—mvæ>y-×›õZÑ1Ô…_ÑЪäÿ0ÿ‹4‹ô ˜ÿ·ÈýÊWÝG»·þHúáõoÑ„v!ØÙÈ€Ö¼L^>ræ9"÷äצ>¬þ¾¹ÿ³ÚPô ²…Mµ´ ¶>˜"Wèfð_ÍëšðAÀÖ4†¼u©c&‰ÀRä¼óðwŒv/¼ÒVÙöeë#¿™ 6õÔ~5•è@ÛЃ:Gçk:å|â-Õ.Þ¢ÚL-û£ÅŸ´ÛsÞÄ÷±ÏOÑß°„µ›Ä7mK‚•`3²„œ‚…Ä!Ð!Ïêþk#÷<¶ð3Õ =ÀXì¬+ôŒsÙñÿ¯QAîàolü„£Ý³Ø“O˾ŸYxO|1žrÍ뽬ö_Y‡Õ£¹Y0úõ |[~.9äϧè2ð,ÃþÄæ;'r_çßëHÌ^}^÷Òï?ëc×ÇwC¾ÓxÂK³FîݶΠq¶ÍŸ+Ãæ­CÁ²}4¿ÒûÁ:t؈M¿“Þ3GäãØ`€cè0Çxq‹y#óµy?>K_µÍ¶¼ÿ_­v@Çð ×+õœ¹›rŽn¼[ô;YÏ|O|ruç·Ë4肈¬ Å[šû‡÷ì¯0OƒÞF¿à+?©îÓõ,ãƒ^‡ïnÑ}7éÝouÚ͘þZu¼­ûþ)ú_*º;ç ý‡Ï†.DþˆaWm-Ú-¬â-´X4÷û‰/°AÁ{pžAïÎù­ïéêß·6{þ“œluçòÜ+¼%&óÏÈ}›7/>Æû1É÷ÓKýŽc‡Ì(]Ã\æµÎ‚WðȪõþò;kœþª÷¿¹6ùs韷ÄØرÆôþ‘ëVçÎ"8_‰È}ò¦‰ÜoZ1þbçÐÑOK×¼¹§1º!jó¼‘ù·ÇGÎé"søÝÜI¯÷Ý2r½À‘‘9ïÛGÎýÂcÄjáéíÔ¦Ï"÷¤ó<Ž÷阽ö¡ôkûUš·kþŒùG®3îo9±K§½Èå·Äƒ^v@ä7·Ó“tmÆf9SÏÁÓøÐÈ$¶ðtÏ7uß±z~ÿºYCÀnì© cÒù‚ïëxªæ Þ–¿ÉÈ42.{ý.ã®<ü‚åóÕRd,i°ªä ­!¼Ÿ[÷aa_ÀßIgL¹W: Û ¹ÅWG_aç‚7ØÍ­ãWôuÜR}ŠB×ÝD'tˆ÷ àü§ê686±ô±í«!ïØ8ðú‘ëXwì“õ"÷°ÜXc·¬®yý-ã€/±Þéø:z¼ý£~çÚQ‘ë^vøÐ2 &€ÃÈ2‡Œ@ßÅÄèÚŽ÷1z/Ï¡ß6T»±3À=ðÕkÞÑüh£cÊž¦ÜŽ%–…,*Þº"r¯iøùù¹Þ â›]©r—úøSÑŸ¿ñ1~­q¼YŒaΛâ&Õu”h¯þNï}Iü„ýÞVéXüâ…è tÿg¿ì€ï«¿üì¨B߈á9κ¡®ù‹Š¾KD~çóY"÷íA¶‰Wõ~<[AoÃO3 KÐåëü%?ó:6ú©Ì{.§y1Úï´”ЗÂýny]m…oÑjreýå²éõ~¯#VôŽÑæ^–>¼*{ãH¿§OäÞ¦3‹§_Z,¬ksêŒÙ‘ó¯Š>虤±÷z"¿…°läÜ®ñ}‹Öwm{Ï?8n7RcJ.¢qF¿Ûîw\ÞFï;ggºÈ=9>v†÷Þ,{E|¥wˆÌûó—ëW\ä¼NÊ.‘{±¡ À pzlTYÞ+2æ¯";è=|W°ÏòäõZßÕßgêˆ_€ ]©ßðÀwdYŞ®G#o¶¸ÿº÷ºJ£‚Ï`ÂÂelj×ùõâ=í_ò8û ÿ?­ï)û™58Ùs t@Å{ЕŒýõ=åYl)b¨m^ï͘©èC°ÛüK°±ÿ°%ÏŠô‘ lÕ‹Õoô(˜tƒèé¼b|$t$¶ºkƆ~Ì¢?yïô ó¿;ŠÌ¶©Á­st­;çŠ<<¡±š ñA‡ƒÀžgžY@†œo &Ÿ}ªÍTä~5µ¬ßLãx¾þ¾H}Df%ìdL'ÖO©÷cK+æÖî›qêÆ§÷|ÕºŸØ:X ýFÏ3i<~'^úÆãáȽãøÍ1®¿©±?%rnù`Õ•ê;_íB«çÑðȻӋõÚ†ŽÁ~¸$26ø#]?Kt9Xco9CW×xŽˆ\÷ë\çn€ûð ¶>6ébâ °‘80ö*íœFtŸ)Ú5VÅfŸQv/s±ädþQzàa1ˆ×tÿ§²Þ‹Üícñ‡qÊ~ˆç5œOœ2°¾Ú8M´{=@¹»cãöÒ{ñU^ŽüWo½Ì¨¾- ¶Î­~Â/ð+²‚í0§ÎgÔoSªþ÷…ýOª?ÏU½Wü›ÉcLâÿ×zGôø\ý_áçÃ"÷L ÏÆÙ½”[²‚Æüß/rnõ@=¸‚o¡ö|Pu^ûM  _„¸[¹æ¼Î¾1i®Óê‘kzƒdÀ1Ÿ16ì¤÷#¯ûªÀÈ;< ^ý@cé5<ôLÏÏÐ=–7b4ØsØUÈX€_¥{/Ö½Øià¥sâ±ç‰"Ëà×=:¿B÷>ªüΉW¼+ÜŸFvül‘ßäý—dušŠóíœ@ãïô4í*ßp¡Xcþ‰äÚ9=Ïê=ÎßùAäœ62 ö#çÄê±£½Ö”ûÀ2l™v.»¯usø°Uì.”¶t±«?ÐXõÖ8'§’}ßзìÏs« q Íó¼‡'ÿ0r=ìôªwµƒ:±ˆx=3|äøÞîjÃbzöoUŒ_u£S>SÛ_Py9Ú=îZ0‡äbÞÚ_cuŸ3ò[ ³³?‹Œ§¿¦~‚ùÄ^Qß¼¦µ¥«óZ?ø³ú|‰Yxm ã1RcA|YöœïfºÏ¹ÎÎõ<Â.‘ßBĦÙBô¥³F~ÓmÚÎ9Xæo¹gƒí}Ïxnbýȸxï|NŽFÆö‰ÿ¬6x~››|CFÇ®R§Öùƒ‡‘?dõO‘ßbìæ¥È¸pSä·b½îó2Ý‹Où¥î%ÞŠ ^¹‡2æ~"ŒŸ·Ú÷Îl¿“»¨ìHÆì Íý6XÐÓ´·§iWÉ¿çì™U÷*/ë7t˜€þ³ú„]÷Hä¡×ˆ>ØíĽС½#¿G:mäw<Ÿ‚¼Às hì°UÀðß>>ü þoP+~8˜‚´N‹_À'tï]*´œ%ÆÆ`ymu¸SõbïL!ûn`äžaÐ0ªœÁö€GóØë«]+h,‘)t¾"x Ìï®]{VüH™Ze:=û™ÚH»Ð5/DîõyKä÷'ïÓßÌu`ãbô‹ÄKh Žö\S5›Æ{Áy¯ÅàÞÙEÊ0ÕÇ}àÿÞ‘ßÃZ=27Ô±l¡Ý긗>¼Rë+~õ,¢ñ›U?i”Þíüçü‹ÔA.Î=Ú)r=‚ã?à‚u:ìÇ®¿ ò[|È̹‘ñ0ú/*'«ðÛ7#íä»íj]ÇŽGŽÕñ×:"3ØÑ^Kƒ½Ü¼ù­D~C6®«1 [Å_Ä_C98sˆÆ›qñ|ï_8Úï}·>åT’1Ú2uµ³ÚøïUžÚ|“Y;4Â^;Ú=Z ÞÑ|Û]ÅcCdG½.{ _Lí÷ºvr‘±#°'è¹sDcÞ±¢Þ}ŽÝ|¨ÞCLÑkááßï¨ü@´1öŸªëêüW°¼Æž ððOt/óˆß¼¾àžÈýêÀ+äÄë ¾ˆÜ“úIñ1ä; ž'ÆŽ~>¯Ó¦[ÕçM5Vàçò*ÊÝ/ö¨È= Ö‹Ü¿e¶Ê/¯œ×Î|.s6Äð?û pŸøk³~¡#1ð;„ý¯E»Æ¶ÝGÌv¨tIûm¬+”k`Ïj+ãðbõ»‹ ²žÆþÅÈ\Ñ¥oÞÝ']CNÓÕþþ{ª¶ÿßðʪ׊m1e´ëqË:¼9ÕþH÷¸ß7ëønÒÆ5Ä_ ªÐy>É®sMÁ$äÇŽwÜÅx=@cç¹Æ`›|dd\ÆóÅ;«à/(W¢ôÇksÏš'r®»_ä7v­ì ø]Ö/ÝõÇãÔ&ã?ãâ|Ž^ß æËØB`øÅâÓcô÷‰úû¢H{å;‘˜Ã³`$6X„ ãÈÚÑùôèô ²aìz­æàlgð±±ßð•mOŸ‰ý¿¢[(¾Ï¼!cǘ}¡¸r¢õcå»æÄ€Ö®Ï—øÿLªþ½WmþNäºý‹ë{Jö}~ªßÀd»ìp¬û½ þ/$9z¾ŽŸí÷bÏ` õªòYÆìgþ;b¶H»‹¶M¹§ cíœüù#mõ55†ŠÆÄXûCà‹Ã{C„ ïD»¾¾[$ÛèåÈu2/DúרfÏÕ{НïürÅ„J}Ÿê>ås—=‹Œ©âC  ™“À¦Zý€ÇµF¿ôzáét4½Ö]ü dññ$ýöšBl¯C„Wm×€ÏñK>®¼XâàøíªÇyËèË5žØ&à:€y'ü„ˆ_y¼|:r ÷ÿNÏBwô ºÆ6rÏ£ð¡‰-$¾Á‡DfÁ#ðuºªƒËø.éSÎ(º9'pÎJ»2.3èöàu•Ž%Î~Oäþmw oÿ¬ñy\ú¹–Êk÷ÀQ>Wùú¿ì£¶0~ÈÚ|;|LìŠûÄwð-ô™&ré#¿ÿÞ»>Wlx, µýåzO¡ÃÔ‘: "ó#_¬ú¥ýØýWéÁëý%΄LëúmÕymžº·ŸxŒ¾([äÐë ?PýÄj–‹\‡‡ì‚¯ëè:ϯ¨qÜEã`Ûkëëo~Û-Ú¸{ñŸ¦I÷r˜62¶ãx>ö víɑߑ\'R¿ð7˜ÿƒÝ`>rÿ#è¦:[À›êAü ü«ÑMØÇÆ=ôxØà<û”ï`cOƒõà72ó¼lqäÈyõg©xÞ—úÐoD»÷O‰ß€¹§G®9@¿ {Øe¶©À§_GÆt‘džV=è'|ÐW'?XÜŒOOCòý‹®™¯ÞSÞï¸ô ¾àü-¯ù‘Úû7úéxr‹Ÿ„|xÎùÊ!ì|GG¦ðÀ×ãD·CõNâ>·V^*qçaÃ_/B'à 2ïcÀ×÷VÞòw ~Yù§§;¾¡Sü€¿ªÌÏ ƒ0¶)¯Ñ9ªÎW-ü>]­Û{•¶ó¢Æ~l·¢ÿ?Bë ¿¨ß§Ôûgþû§úƒÞw_šnœª›ü¦òÌ‘±Çrœ ºNäü<Åø þ;ï™ûÿG sÄŠ¶‹vÿ†âKÌß¡CßÈ¸ÎøÈùºu:ÅkÁ]¯ãýøÍذ߯çÄ÷¢s~Ã.Â>‹ñKÁ6ë„cô,2‚ûÄsÀTâùØ[`ðS5—¦‡ØB#íZ,úÀÀ—ð >Ü­zvÚwTßU‘k°‘ä·—˜Ïéz÷vê#s©ŽËÒžGê;["Y.ùžàþý Õ',±!ÆñmýÞOþÃÒÒ5ÏêÝž#Å&'Úo«rläw¦kðÖ`ßb/~‚òÔ zíã›ÂÎwÄ—öåú‰ÎÄ:À-l|Å}Zy¤Ý‹èþ†g‹¯þÛÖXG|Mq‚øŠþ#_ð3²9›êë¯ö`[Í£gÁÈi#×Mn¡÷ÉF*}yµb?²Sl«„Û f–µDªŒ ²N7ãTb Ϫ½è\솭t/s‘7 §°E_Ò½O©niýRÑ«S¨?è̽Dwt¯s+»ö?}:,rÏ\ì‹kg¼V¼Œýu›Æüñ6¼ù/ó+òž‹ü†Ûâ¥yêØ—»¹òZùm&ñ;ô]JíÇnÚ2r_9c±ãŸ}ÅSÎùk·´ÿ猜'àZWx>–‚x°ÆÛ±=â°Fîå·}‡Îàñ5ôí¸È}¢<×à|2çš:¾y½ ׎Ñ}Èáiâ9ëìqâúGwîóz¯Yú“ê⼑ÖRy…’kÓ£ÒWy6ØGÐú=ÅZ~ ÚÂÿ`Õ¥jõ½¬÷±6^ÀN×±Éw½nVˆãÚÞý£ úÝ†Ž³Ïí€ÝHýƒ|#ïO©ýè}d,ÿ›hp‰ê¡MEÅt¸h¿ º¢?±Qîªãè½FJÌÕëL^‰Ü[j&“ù Þ@×’[ &`û!×+ŠW<×7Od,ÚÁgs‰GÀ tòÓ_|Ä|¢c¼ Ûc€xgÅŠ³¥-ü¾³øb”ê[GtÆ>q¬yÅÚþ²G!>4ñ„Ç„Õİ«~-¹ûP㣼éo½NÏ|¨wëXCtù£°ÿfÕ^!WägüjƺØmÏD~ŸúmZë)rF›÷_í£>¡˜‡À†¹O<ÿׯ­c^°ù!Ý/!>qnÐ{•7‹Îx'òÛc~+ßO€ïWŽºgø(ÙSëùÆwîiƸçlÉÄrÊ?@O’;€N`® <€÷±u?|°ÍÕGpÙßP㲎ú , šk:YzõjÑó®È†uªÖ|¾ù-0’ù°Ù9†Ó ÷¹wšh¿a\ÎçÐ=s‰·ÀóEÅ‹Œ}è]”§#cޝIœ%\_ ^+ø+›¿ðøÎMí:„b[ͬ>Ñ—›ê=E×y-ÁÔÑÚ7å=}+ß—6<,Þº'rOüY$;žÿk•wìoD´ëîÖÕïη´ Þ/2ö³’dÉzzS¯ö¯cUbÝôoc]‹HßÊíA6׊ܯgï¹ÛÆú{_ÿîUù¡`‹ótÐ5þ7ául$t¸ü =Þqn2¸‡¿v‚Çà&xßG8O~~£ëÊÞëÄ îi0»§ÁÏú¹¬pÿm•KÕfðœ‹ñ)à;Ô®ÛdOƒA&ñ<½_ä¾AÛwÚx¬þ¶®¥ýèd@Lÿ|ýýgù,o¨Ï§i<ˆq‘@À¶r‰>¸HucOþ¾¶³Ð1çÝõR?þ'¾/¸õ]õ^p.à%â@;éwtÍòºû`7\ékë‰W†ª-è¯ À~G”ãYìð¹ÔãÄ'é½Ä˜Ç¨¯`8væ™JÜÖsŒJv•_XtÁåMih[rJ°3Ï®ƒç?–îðZT°¿{XÄUzþ6ÉôÒ)»nR=Šiú ËàçÇÒWtóþ≃4NðØz¢xä²:ö…×~¥1ý‰æ+?‰Ì©Âæùc½¯ä4ã[¾½„~\“[0w}®ÌG5íèiÆã’DlÝŸ@^Ú¾uî©ý4sóÈ"vþø¾ßSÕãõ·ý~ôº×öoí÷» ÝÐ¯ï ¯¦ï}¦±ÂyNùqý­ðò7J4…—æŒÜ?¡wåeïEÐ~7Þ±Šs<¬I…>ÎZ¾þÝæ½í7ÚýÞò7˜ÿ‚xjùHÿåÎÈïEþ¦Žué×CÂ}ì¯c~Hüt¿øŽ5ÎT¹+ï?[õ½-]À3øEè:ôŸçi‘äßKó^›ÕõE"÷äö|ïì•Vå:˜‚ý¯0/·Ríg;‡<®ûì»zÝz†°×~ÿ½ÞZ#ÏØèä~³HÜ÷š2Ûð^[û-]óZ¬ó#¿uôÈ=QàEìÓ-#÷q?D¼‰]L,Û‡¹Ú¦ï=kI6Fh~u¦:ÐÓ`GÏYÒ¬¹…nèb@ˆ_ѧTO(n„^ÆænƲ‡~½Xï)²kfCôÛA´Ç‹üæx·[äw؈ÉzMÂÁê÷cS€ãøàñ|0æîÚÇ‚7ˆv§èÙM4–Än‰7íªqel<—Ù'ÚolŸÙyzÈö²ö7ÕÁñtÑ{ïhóмӗ­ôNìtßšú›ëø+GÚ´=‚Ú MÀöµ:mXIã ÆC÷î¯~ÀÏgŠæ{Ǥ{QRÐeVY.ØÿFäž`8±frKÎ’¼=m¼¡àrG̬wÕEÅŽ¿.F=,Ü'>ý«ú\±eÁ7è„<ÂO`ÌÚêËJ‘ß=H㵿Æÿ,~1v6˜“h/jb±íáml kÄøu –”bˆÈs×ßÄ~N¯<¢y¦Ñâ{læ/[üHºbãZWÑÈùÕlbEûjL‘Ibh§j¼—Õ¸m&~ ¶Ö€C¢Ýë ðX3S´óˆþfJ)_‰/ïÜ?ß9„à>:p)Õ1ê˜Røï:ñkº¹kKëýÈR/ñ˜sjúF®–íïù‹bM-þxG+.Tô˜c~àùSâñ™¥/nOÀkŒ÷L©kWëúǪ›yïÆ_/¶Æ½â3êÿ‡ú?y®l‰È=”{©Ÿ¡ßs¿HdÎ=º~®JŸÒgpÊøOY^ô\F4f¼˜·B–±ÑvÓûéûÐÈoÞªßWè\_L™GÆÁò‹tîâ˜ö x~\åïröðùúýlÝ{¹xÏ9søØçê7êû‘ ôe£;‹ÝB<åca7ºþö_/z`G醦O=ýÒƒLý0rχ+Ô&°þ^ÙMËVÿ¹è äîY݃îq¼ ™XOýG6Ö89ÿ‰sçÌ(þ„ö΃¥_`¤çkˆÆè|Ÿ«ß`r >‚UØÁãÕüsïM0Hï듼RâoTž)óeø™#÷òÙSíØTôv^Ê‘¿}"óBöÓ9:Ì·½oÌ¥6©¿á'ìÆ‰ºæu‡à!øw‡êcNœ¤¾¡öRù–êòšïEÀß Dæ/q>«äé&鯮(ßÿ{ºê‰Ÿ}¹Úaņ\4rí ´c~{ÿMÑíïëËÙ~L¿?¨÷ü½Êv‘-ô˜8Fô;Z}ÛÀ}ôüÁ‘{òߨñÆŸ…'Át/ÚMùÝœC:ÇÍÔ}ô7<4PýqLh ½kIý ¦šg¶Ñߎcóâó¡Oál‡ctíR1ã Ž9gà5ããÔ®+wºØtOFúÓÎ3gNøÉàë»5%£ïwÚ…-Ìí¬6OQÇ¥ØgØý×T{Ísá%ŸèYï}×TÁW:1Ò×¥½c£Ê×°9ÐïÄüáctÑ­ê/4Gœ#ÚüNö=㉟@ç9Ñû‡\“¦oäþ¾/Ú5ÈÿÁ,ìÝw¢ý]Ƀ{OuÞ­gìcb‹.ãxR´ßq¾}áÛÅÕ_øj:ñ¼„mï¡+V©üPöWè«gf\šu;¥¯êòúû{Œ5¶'†ÞWÑî­YÆqA•)kÛŠ­¦©ï(í›?Z?¢Ì!jÌ‹XÛQŠã@ïDû-÷ríËhu[Ñý`:ñDçr:w€øþâ¹*ð~@£Ç£¡e‰>¹×ÿ•¿7-ÐcÈJé1çÞάûàÃY;´±ÝïÜÑtŽ®X¾ŽA9·¿Þÿ,.º"çèKtŒ×¶Û¯‚¶`=òÝ»Z¤í‹M^í¡²£þ†à÷߈OÏW÷ÑÞ<¿­ãùšƒ_¯6|áÁï‰'Á*åâûè‰Zا­”…U°{ !kã‘slêÔý’êÃ*Þ…Wi+f£ì+ U¿‡G®I>R÷l úx ÄN¢÷^:¢ó°»ñ­7Õ!'#Ecû¼ÏÖLdî»ðD][‘IäeE½°=W«bk½ù½˜ï©mè¼#TçÊSèƒÝîùaÛî;¨Í`¿×Þl®>÷=ýUÅü†¬9Oñ¨Âã‹Æè/0¾!î…Îý…Ú?xrgµom={‚Þ±¤Ú£|Œ2?MìõfÙgÌùþFx£õÅEÆ™óœYmaœ°›œoÑ»âU¹Ð¥²÷^]gö_WõJÁûÕKilÁͳt„gˆæÇj½v>$ör‹î=Z}?Gç‡+®®{ÝÊú›=þYýÖ2Gij¬k!žF|,xOz»ñ£ªÊ|×cuþ¬]«žðºdlº“TÜf^õÓ9àÕÿé5ŽæIçÙbÒt¸søñÅ^Ö3¶ëiÇŒ‘kŒ¦\×êüd…øöL‘k³×i"×ß©q¢ò¼×‘´{q¾¹'ÝÂô·búö J½}£õYоÀÆzWüv{ãÿitn4XuÞŒyù1zÛ¿±oKlò…J“¢ÿþTõC‰mî$þú,2>õ®è¬Ø¼Ÿm÷hXNÏ*Ï¡Åÿ"çæ¶êŒ vÜX穪׶<2@¬_i¸Æskýî ÊŽ*[‹OŽP9ZGóöXÿ#ËÈ<öòìù~û~oñÀ(l#ëŽÛd³ðì–z®Ñ·=è6|ágÅÇØ2ð±’÷kŽC»ŸÚ=êv:2H¼¬GžîÕsÿRש-ØQ`!¶<ø¯ƒ©ÈzÙØ&Ò_rÎ1å˜ú⇺ß9òÐlEìG;oо¨n\­:Ð àþw4†^O±…îû¦x]²¤x¾ôÙ~üf‚9íŸj VÐs^?Híûέ¾CoxÒófümÜs^4%š€±`|JlµÈÏKáÓ1º®1.zÈñ>ðÐyÂ?]Θ6èd|‚u4&Š”µ^ÓêÝKTZl° œŒRÞíwÖÌ®ùíql´çd§qíñª_Šü*:xý1v2‡>DÆÐ_FÆÁ|ôv;q›ï‹öèl!dg‡Èµ«^Âs“_ŠÏ‡  ¿œ» > CkÅŽ‡§áíÏ«ïP¾=Ñ4·Ì7cÙ³Œl%°Üg> ûà2Õ³Þý3½›eUõåÙ¼Ãêûb‘ù˜ŤùÀðÁ0ñÄ2ul íx?<Š|Ú¦Uœf’=fÕßð¢rŠß/¾SÇÖëŠþÇfžO¼€ ?eþ^tÅì?çç|™ÓO}^ü–î_T}ëí>Ŧ`Ýò/…ñèŸó‰ñ4ãŽ.¾¿3uì‰ÇEƒW¤Gn¬ý*râ<ë¹£Ýû­ÐišÚ®Ò¶~¢ç’¢7¶Ÿ÷e¦sçå.®‚í!WcUà'|;l_Ç(xfcý ~YÆçƒøÈsà8±[ø>>£S¾ßá©ïGêÿv€x 9÷¼.´À®‹±ÑÑw7é7øQë«JÎÏb’ ðû¬HŸ‚ؽs…°‰þ©çÀqt€×» 'Øïÿ®÷=«v!‡Ç‹ô}¸¦è öÿTmçâjÈò°”è¿©ž…FèKãâÒ‘qãÃô.ôÚ8µŸöWD~[ëýM ©Û«à_€çè,lpd#õ÷ц6‚)‡«è}‘ú°îµí-°f”異ýŽk±MFé=ð¼„ð-µÿ¾´,£ƒPÝSÈ.c. ~ÇÆZR㱿ڇ~Ç~ó/ézÝðÝϽD³£Ôè0}ä^ºøØ›7E®Ç|D¸þ^äÞòÎkix½äý÷q>÷#’y°¸<7PmG6§Ü¼ ˆnÂ6pÿ¥S°ÿšh}Ý2'´½øÃñ(x‹þDzՉ]Eèmd¹Evà-ìÓE{æ´¼†{Œdí ñr%>ìùžükâªïªÞ§jÎD›»Lç‡F~/ú£z@´ö+ìÝÔtþ”×|;½täwLú‹§¦½ !ØŽ}Žðz0»ßë³úÕ±,¸ù†xHe’ý5?Ü7Bó=E·P7ü8§Æ÷ÍjK—:ÞéØjì?RûfÔ=OGî]ôŠìt€m°þbáýÂÿ[Äoćˆí¯{È#¾+ÚoäøÛb…Ÿíè#xx†Èï¹ ïnS?M 5v”cAý46‹‹Gá't.øtÆrƒÈpÁ9\GÏ{Ž ŒÇž·ØZ|ÊßÛE®o¤ ³ÆxL³½ÎüLGî;_÷Q7ò,0׉ýƒÉèd =ž7t*¶ ýrÍå)ø®Ü¹=üHŽ;þ:<þ‰žE,/: ;`ËÍzÏ[òß–Ÿ ¾áÛÿVýà^ì4pyWÑ œAV˜ŸC‰Œ«!ÿÞ iÈ=–œ£;l䬧1ÚE4ÝNõáìúÆ‹~[i\=çàgœGÃ9ö˜‚ìm$ºPÐ1Ømsª=ð×:·yCþ +¸fÂùxÊ»(¶Ïî#ºì q·®³ Ì Õùòê?k2—žz^hz¼êØ[õ {ÁvpÓ˜®Æ¾@¯¦÷Ù˜ ZƒÁ3è½ÓÖw•Xý¿$³ÄcM™Ë¶b¥A‘ÁÛ%ãD~‡ä㪠Š~qnâtUn[½Ž¡K×Mi¼ž2? ÿ"ò›m"¿u:X9…÷°káã†ËÚÞeë¼m‘•ïh ‘9tãDÑyy­Úöåô¼÷IåÄ5¶KÏ.òÈ ÿÁOú„O†?x¶øìw‘sÚÐÔ±­C4^`ø¢û±Gàï•#÷úÝ 2÷Ĺùðß’û)ÄèiÍå”ó9#¿¯;—Žó‹¾ÆçoFLÿy·3fOÔ±,|ŒîX¬¾£Ì óÛ¼þ:zà>a¾Ö•¸Ë»‘ûQÁ Ì_$€ñžS:Gæþù梚ñ)ñÿ ‹úX¼öZ_ñ?>ŒÃÓgçU`L)¾„– yÎ×þÒ\‘ßàrüg]c¸Æ©ýÅGà7òŠm  ÿ2®ÄjÀ(çø{€bÌçˆ æ9/dòç^çØâÄ0Ï×õ+d»¿¢ë7ÊW]¸ò{áŠíäýKñ컊¡;ˆyl¹‚~a{yM%÷xO‡Ÿê±ìiâØVèâ>ä=ª˜é‹º~½Úƒ_¯ƒ9àX„Á&EV®]×Ô}ð8r`½lމÜSûÙë³wÕ9cƒ¼í¨göV߈cã/WÐ}Œ+ئck;O<Þ.Ò.@ öïˆu¢#‘3xæìÈ5Ðú*#ïX1r=⪇~N§¿o¡`ÅúÛó‡ëyl°Þ‘sQ몟´u/=Á|t+î[Ê‹8F¼vQÀS°[˜uM7Ôw–º™_€ÏÉ@7€7Ôoä¼­|Rô€×Ò¿«¶<¨{À}0û ÿþPÑ™ßQôÛCíØMt m`5ú\òÚ6®ƒèl?0ÜzyzXϯ¹¶{ŠÎo£~2>è¾mU?ø‡lî¯qõšwt¸æõî£ê|§#¿Í†>…·Ð­ðË‘ß Ü\íá1^ýÝJŒÐ ‡«ð(ø¶Ú¸gdތנϤ簛OUßñÀJô>åÏtzøÑZW\%2awÑaˆhþX/"Zb"늧yDv?”œ¿¤‚ÿ€ß€m€à¼<°Bó‹íº™ê2¼‚Î='vCÍK.¶ 2‚oŸ€5È›czЕØec›²¯OÉÛç¸Íé,û=,YõAÏ®Êw£møËÌ-Ãߨ/ïWŸ¶Ü‡þÅ–ÂׯÀû âH7GÕÿ¶óðý†GÚ„`±‚}T¶©4+¿m#>±žXPc¦÷ŠvŸý‚ÿØÑÄZ½æËskøóD®ã…?‡©.„òÍZZÚ;ö¦ØO{½Wä7"g¬:£¼[yBÅFpŽ×myßžÏTÇL‘ßj¿·¾¿ìg¤\ü’ÇC<‡øÍ_T˜ø¡ô×oŽÜ«„œÐS¤ Ì,¹?wJGµç2l%üÊGT?çøÈ º÷}°çXÑýƒL€7_7Ž} F1'Æî¢ñ™[JÛOÒõ‘‘ßFøm¥Kû-0|¿ª8/üGì.¿Áöcô<õöS±Ìn¨:–pÄv[W÷ŒÖ¹ãûët¾É‘¢ƒ¯¥>SýâÙu"óHytïc:w iùÈï0C;0 ÞÁÞ÷zçQïOÔÇu/4Ò¾ß=ßÌ^ǩ؎+€MèDç)ž/±l>|÷Ë%ÃøêwD~ßð³h×û´ûT¢K<Ÿ;VýÆF‡aÃ\¯6¿¥ßâë`CyÍ í»¶òr‰Ýô’À1æƒYß²N²ŒÜý2·‹ÂþG"_Ôü·²¿È#ú ŒÇ@¶ÀÀ¿ªm߉ܛú[÷="×yn™ÿ·oLš?–ÀïàÅvÓÅ*ÍËüË ‘ß3éèÔB7Æ|I×2*¶mÔRêx¥Kî òö÷Dêúî¹€#ãA>‚ëØÐtÆðuÕûeä~ýº^dlÙÈﲯUéRîû‡ ñxòýñ);¶¬=otzœ!ý€ŸˆÍ®-*Û]ÐЪø˜è„³Tz†øÓ‡‘{}Ò†ÙD'å`´sÈñüâac×faw oøÔȸƒÌcky ×ÏÝÔ>pÉ:b/#eëHàx¿uÁ·"¿Áè\Çÿ/!„¬@ lml~æ’~¯ò@ý­`2xŽmàù_Æšx9ã€Ýö»Á—£ŸÏVß_öØTïGþ/Ð9¸ÝØemÀŠ¥zn ý‚iýò›lcÉ“`g>:/¬:]ãâõ¿k‹ÎÝ5tkk,欼éüÐ"'ü ïÎù]¡ #ý;ì$ltdoýæuY{i\wÖX:'ueµa5Ý­ÀGä|$Öó#Ñ’zÑ7ŽºÖ/ÛF걺ì=<27Çûb€…éYðbOý6Võ@¿M;Ïí¬öÁèMtê·#ý$¯FŸù=–C5.Ä2‡Eî ã9ú=ﶦ´1²vÇG$ðr7]=/×ïÖ98ἦ÷5–ÖŸôÃû)8_×ãy†¯s´ÆöL=ðO_¨se¥44*û†jx½§“’ωí¿mß-v6r…oÍ\6ν‘ß²ÝÖ#ËØð;vÕwcÒµœØè&ÏnéÇž¹æì{‘ûul*:¢3ÿ.ü~®þ]° Þ¶}ï…Œ8_œ†ç—ªÇòÜsÚjޏøÌ[ØN^@¿õÑø¡ÑùmÞúwOlþ¥#ö+Ôêér\‹>ð½O «;¶äö4øWìyr~™/±sŠÝð—Èýg¹÷VaüÓÒ÷Fî®Ä/z3Rß,#¾Ãž_B´ë-þõ\Å‚ºoñh×2¬ç7ŠÜ£cFý¾®ˆôéÐëø×Î?§ì!Ø:r®×ëDÓ¹ã?üíuS—鈌boÜ™ãM|…xÐÍâp »Û9 ÷ˆ/o6O!?àQñð]õ÷¢!t qþST?xƒí¹Aäüó“zÿ‡5Tò¡±'à!t ~ ú;]†-þÿL}F–Í÷èˆÑâY¯uq.<ø mª¿EîÝD_WŽ”©%"÷ÄwŽÁãÂdcæäÅöW Dî1´ºÞí†;Øfž›…‡Dú ËèÙ 4¶Œã<µ …úIc ^n«þî®rR¤^¥>¯£ßx?x‡ŽÏ÷л¶ŒÄþm#÷ÚJÕïGEî?†O>¢ˆg`ü@¿}Cm7~ñn0¿_d.:½o6µl½EtߢϚ¢Í Èoi~­à qàë9*1èg%Û–}¸p‚ñÂ&E#—àüù¢Ñ6j¾º ™ÀîF-d[Í<·®èÿ¥°|ože¯Û‚÷ä¿MP¼SóReNŒ¸><ŒÝ ¦cõôü%Î|«ÞèI,Î~ÊùâŸo‰? ¡ó¾ñãA‘mììlª«G×>œý}¥QÉ]û°ÙàµyêX´ûî£ Õõþ‘ßÈ}ªþ]x~ÁÈoP,¬ñáþ•öÅnš7R^"Ú︔1^¦ÖÓ~³«—°ýô¯ø·½ûË}3K&¿P¾n?.Üg®—¼þ=¤°í‰1ppŸó?ˆwÞS=ÏFîýfÅÿ·ÓEîC±Lå­Â£k‰·‡DÎ /.>ÕFTžk‰!A›>z~ùh¿AÐî¹»Bäš.ðè¯â“ïFîã†l¡ Îé\÷|¯×oé œ!ž½H|¦óŸÿ"žäx•Þfƒ%·h¾Ÿ{î”ÿÚ£\¡ª€ÑàõËŠåÏ&Þƒ§o«±ýb÷ÀÏÛˆ§ùûšZgÑ!è÷fÜK.á-ê»÷ ­ÈŒe”þ}àþĨ˜„½³»ÆŒ_5ò[©œƒ-ιY.r=<ŒþÞ°|¤±¨kè+tàþâ¹VûŠà:2Œ/¬ºá#cª×o¬™Ç·AdÞ¿uÞXÑy³Èùa®)Ñ×QzŸs6í×·{ä¼âá‘ëëÐé'Dî)å|¨ÕVÛʼYõÍñãá‘ûžÀÿ3Eæ‰ñxÉû¯@‡%T×ðyÿ«ê{O½vo°D×y£ý~lÁ§YTÇ¢±Uü©]Ô'ÇJ½zYµ÷LõÞÁŽÀonø½§Ñá=—×¹ãâ·270¦ÚHe¬ÐÈvv:Þǧe^¬±÷Ê~à/9ä¼Áߨbè0ü¼Èµ9Ð|µÈ\pû2ŒñQì¯?G»o#9ª¥nÇ…V­´)y1èJb$¶a- 1ò çú3g@Œþ¯ÂXîãV];ø_äbvÕ5³dhnÃÔ*ü=:ÚüÇlç·± '¢Ý¿®#øH¿ßÑûªèþçJ~¶~cgFc“Dƒ‘%tcd.ÙÝÒ1J¾Éý¹SïDG¾Sñ¿Ìñb“:^ÅxáÓ`'"C}ÔoÛùCDxvÝ;(òû5Ø1Ä?άgO:g¾ÿ¾9wdŸôŒÎߨùØ`ø#×ryÍ×ù‘ßSùydÎ%{x ûØ:|~iåûùD:à.ñå_ÅOð&ãðt´s¸%n£¯óç"רpï3jó7#}^¯3ðÁxb ÇèýÈ öŒç9b?9®ôטtï"Ú>0f­ɧ—Ò¹ç[Vîä~Y׌º†Nöz(¯åë™+oŒ_;ò»ìà¬ã7KèúšjÏ*ȬcAÎõB¦ÑàÓ+}@þçCÆù­ÍYè°®Ú ï ?ßWŸè‡sŽQŸh/ñ¹—ë¼n‰ï7:´ìÕÖ[qÆ?Û’¹f¼ËÞ'È|}y­£¬“ïÑ\14AŽIlvìµt/¾r´¯øºÂ÷?OÚ—9d?øg•?J.Ò êk®®ì—ñs#3GîE¬»0[´ß›m¿÷ö…Æltä7oŠÏY5SÉæ¥ ³Ç¤ß2d£ÆLms‰!>ª~¾_Û_ø¼^[÷C‹E‡Ñ~Ÿ¯ÌKÛ›'Òæ™)roTÙþöc ;·; þAŸ"ÿÄï°×ÁoÏóž©N‹Ä>ÆÜ1!ãÿ_Ä‹ä,ƒ!`'8O<çÕ ¿¼Sy±èøL~®òpñ_‰·ƒ?Ø'`òmªë©ú{‰ ![èrÛ°%>VhÛDµá½>E_`O£È5òºJÊ‹*_FûÍèžoWù*² ?#“ž—„Ì7 ăÀŽ5DSÛÃà/x ~m«{ŒM^ÁØ­©{öÜ?™'VâüKÏõð7º|” ïÀv6n­¹¿ÓNª‡¶{2æo¤2^mõ|Àbª]aM·‹ú-Àqë¹5"1œvm9'|ˆÞá9ã}T}^*R7®©öR?6ãQzþ$Õþì™cð-ý>>RGÐNða‰H}q¨ÚŠ ÙÖñÚ–Ñ‘ûñy!¯‘9D45=¶ÖáÃE'¯'BgñÚ%âÚÆ¨E:u Ïk‰FÈÐ…ê¸{Ž;Fڸ§úL 9‚áu0; ¹XãÏ4rÓØ’;¼!ÓðrHÜ\Dþ rDÏRA†á=æñìÓ;Ÿ‡¶"Ó—©^dò:=‡Î8SÏrßsK\Û¹žËþ¥íÈ«ç3‡iLœß0TãÍÑ¥ý#sví¿- s]óÃÎû)ïïgïØÚØsU l¿Ù¢| ‚«Äýo—-~¿ ˜Nîy=¬g—yZò÷™ßmð š1d·¢çywƒ1A:€ÜΆ?£¡}‰ÿsèWûáýEJœçEéWÕÇVÏí7- Í»ï/>FGzM3×WŽŒL]íÚ‚×#çA–‰ü&Ø<¢ñ¢;ó6ØX'küáÉïF®ñrÞ'¼vFäw]÷Ç4þÃ'ÄvÀxìtlIÏà/rÞºäiñ2¾ÙªçáȽŸ±ÇŸR¾¹,û¡ÿY´ÆC‹s¢Úƒ¬`gx}Ù­ª¹ÀAw8Nz‡þ~µÖæô4má[2E~¼.ò`ñùït º¢»ˆs{­­s.Á\ðFþ6Õ!O`>2x°aä·¼À<çëxõÂëÅôø~™cu>Rï+½f`[Õëõ¼wݳµêÙAÛÿ[9r®çû‘{÷i×{®r.Ýôd¬á[äÞ{ƒ|_´§MÇ鲈ÌbKÿFíþIg¶×xN/ƒæÌ¡âa×Yà¶÷¨ðƒ—‹Œë0^Šç;ßÀ}ðÊyoƒUúlºú¾‚{=×Ë>jÊñ/øÙ÷<£ãDzñÁÿ{"s?“AOÜ!ûýFÙü¬ëm°­ø3Ä}æ*X»…Þ#ÿ‡Ü愚E#£å{óÕ±/÷=SŸ+åQáÿk¢sϪޕğ}ôý9O²h¤´²x¯ŸèÓ;ò;”ïêý³ˆ¡çú{^Ñ{µÈ| ¯írùVäœði‘ûý_™ó¯9o üÿƒŽàîÃâ]ø ÜĆù@<|zäwN®×3Ž/=®ë\C_¼£¹`üà¹äË6í.ûö3ö?R[ð{Ð#ðßÛ5溺ìQü“ß°>“ïÀß¿º—ô'òµž,ûË1AŸ+º.Rß¡3~'y`!XqµúL{°ëÁ´-#¿Ÿ±µú €ñûªdYsîÎfúÝënx<"&ÞÃ{þ”¿mO¯®±ÜŸ³Eç^ç~n¤úƩ몴 »=ÿ´Æí$ÕÜΠöyÍÁQKx>r~°sG¨ |Ù>Òò\ôª‘±šmuŸ}ç¦n™«`zÀ—'«½{ª«¨Ï»¨ÎõÔWdÉyþ£#}´Ã#÷åöžVÝw8×Ù¹´¼|¤wí97 vaÿƒû³GîÃØ/ò{†ô,rs^ä~\´Ãû§@gx`Ñ:ͼr„œ}Qç _^(ºzŸ(êÛÑ «‹öŒ!öØ–oûœëy spèü`0Ëñ]l8dÝñ7l2tçØxßV¢ûüÑæ&¼¢Ï`1¶6èT¢~Ó’‘{ÀÀ^·:\ǃ5†àïùðιZ¼‹y}çM|Uñ®à÷[Ñ®Óö|h9¾,œ}µs|22¯‡#v?6c³ßàWï)}".»¢hÜ´¹ÄqN’ 6„?ð‹J‡‚ó¯é¼‹b÷£Gn®ú¡Ì¼®ßÀ:â½Ø«©¯ÊO.¼¤õÉí\·×ÌAÏÁƒ)ô.Ïaã?€u GîÇ4êPÇ«ÈøoÌwÜçûâMc?ØwQdî±El0\sìŸk`>þ&ñ­WT°Mþ)žC”yXx]El^ñÖ—}°¦×<×GºóË\ØNš&Þ¬2>à6s^ëK_,$»žû>¿cÓƒÕÈÕíÑÚHeýÀv²£µë"÷n¡Ïà ¶.±po7ÑÙhÆ»¼E·0~Ì+rö¾÷NrLþÑÔõÒõÅW¼Ã2 ¦9f³–x™™/Ò—ð¼tÌiG=³q§žƒ#mêotþÞLï§€ÃàâÞª}±§ÚÀ{º9;^ƒ{D¤~Dd¡sâˆü®˜uÜ<*K¨í«ªþîšÞ»{ä|‚ç¾wW=›F®!ØUí_Iu"#è5ÛJŽâ8~µäþå;«¸\ÛB4@.Ð™ðÆ¢¢ceèØÑŠ‘ûÚ gÈs½›6ŒP{{ç³2öÎÁ9\}Á§eÞŠ92ä ^…Ÿ°³¾PÛúj\Uèêßè>踉ÎiûNz?c‚¯ÿ3ožãŸ3'ÏãW`wÁûèäýàHߟÄk0 åPõ{ÙÎøÍ¹/×-¼^ œ¯׸ۦ¡žÓE{b$oG~Þû.Q°‹™_x\6ôƒÂÒGe÷>'¼ÿP8ÿ¶Ž ߊü&å+‘9 ÷èÈœ-6>ñ|b:äõ0À\/¹+«h –Q=ä95ãUÖ÷6¼N.1¢+¥›ÞSÝÄd®Ò½wH× gî—ÐÞˆ¥½ˆo¦ü†Ÿç†OÏ+^$þÃ\ˆs|f‰\£èµé^ÿl0@uŒÐŸ™ÓyN§8ÆM€}¾®Á'Ø7©8žC]Ø `ûûº[üÇEà‚¹ø’Âü²Öõž8² Ÿc_¿è½Dôjs[‰‡`Óù²÷K™9rÏf­½(1o°\kºÚoO‚¥¯êøiÅÕz=Ú=£Ës䱟¹ žómhTòy®‘®y¾þ^bYŒËüÒ¿Þ“Úð@‰ÿ#„m¹zmOñ/¨ƒøÑåÂ~tÖ¥Ò wK_z]—côØ1Žùûú‘y±à¿¨¶À¬¢÷N_u“÷Djçµµæ¹ø Î$þ‚½~ÿ0r¾Íy ߌ÷süŠ×g:Ÿù"]çš×˜`»0ß„}KÌÚÜ+ž}´æµ•{Ðï*·ý… @¼ý aøÇú ý>_™§6ÿ£ÖWtÍ5•¯K~œÒ´éÈý¨V›þ¨:™ x$rí2vqNd?½ìØ 6ªuè7ÕÖ#÷ïBNNÓ³ªìiï©|Z䈂Œ:Wp“H@1žc/m_Y/2>²™ ¸‚·àÈAwÚ×ËóÆ~=^ƒeã"×a“!oèúΑñ“ãu>QýÚIeïÈ}J}m¼Þ¹‹èxŒèHL[d&Ѿv¼ _}æùQ0måÈø ½ ŽŒíÖQŸ·½À;Ï3Ó‡e"×ÏÕ®¹_7ôY;r½ë¾ªc{ÝïXµç–Öý`¬×³:?Å9»È&˜^÷M±—ÀêoF~WÎz ½²zä~RÐü|Cu­8Wòl´åvUÿ]6Ñ5â1ïé>Æ”xü_ƒÿØùè|zd}€ÿz‘î&ð2¶¿u :t•ÍD{Æ ZBíßV´fø ÄN^.Í ú«±AFö×ù‚ÂìûÄŽû`ïvc?Øàö °§Q{ލýÿ7û_q¢ö[bÊ­.ØŒ O¼Ÿµ]7ËvoÚÖ~çñ á5¹¬èxŸìxâ9Ì 7:2ÆI(¦SÖ¼]mû²Žº±÷ÿ©sÊs‘û [¶Óèôy‰È=l3-¤ßÌ1ú¼ý†â|™_åy–~z~E38÷ý¯)žvìü¿ªÆaJ¬…¿Áÿ+T°•eƒ·sð´ÿ™ÿ'±ÛÑÄ‚^U þ™ÈuXØÏ/)þƒ#oè=G}ïª Ø+è­‰µž’3×[1æ^P;?Ò\ñ}êØt–ÚLßñÅ=O~ƒ à×I`7®ª{º1cíIêsêNÔ‘¹düØ)ò;&ØSà)23BÇ#}—½UŒåžÇÝZíòZ=ä ׯDæÈ;–>^mÞN¿#Ã^;…Äï/çÖ}à‡ó0Ð}޳y.ÙEl¦v¨{Ʃߔ ê·c)Îß^BÛÖð<xáõž_†ö`7˜ãv1Á©t/v¹uÌý,¯÷p´¨>ÏžŸ…&kF®mݰÓÎ #ç/ŽŠÌqˆEæ"ÒtX†^Á®B®fî´o.±•©¿Ûãõ=¸lÒºàÖ½''ÉOù“°ç_Ñî VòI¦ªøRÆnIÑj¢ :k7µqùP9vvøÆ<×ïuNlè°È5{‰öKföýMz©'rÝ|ÖÀOÈ ²½°¯ÆÂk½OäÌñ¯‹Eû ‡>‘û‡C·UT†E~ÿp°ÆÌ›¥biAñõñÿ¢][àïµûÿƒó¬ÍÅF'w‡ùÜDoôÁM—†ob/ý~¡tùžÄð®Õ;¹þ µã1Ñg*ÕÁx¾"|Ñ]Ú§¢ÍÙ÷Ú5pÇóX D®•ž1ÚucÅú4ÚõDEÿ|©zfŒ6ç©Èe¦H{\Ã.pÌÇ9 ØÉŽí;7 »<&¾ƒó]ãûûùwºÆoøLØÅÄ~}WÖp½9¯õªþF<¯û^Õ‘¸ö:6::äAµë9ñé}â«ÃtÿG5¹ØüøŠÂþrßSzÿ±‘ß/;=rÍÓߥ7ð‹GE~— }é˜÷‘ûßî­¿½7ÞªË9ðÐ ¼wloyÆþÊê‘sŠ#uô¼ìxþƾÂvsÎØï=p ùtÐ6‘û¡Ù¾¡º·­Ž œË³™~7¿5ï+öÕÜ‘ëÕÐιßA…wìéל¨>ã‡Ý™[³od>=ºn½œù‰hä|Nè ,¬s÷uÃH?šªÊq»÷æ(½c¡HyŒè=N40½—My½3Tõï¥1Ü£S¸gÝg=k‚wynyˆî¥^ÖccÎ)Çü¶L•ÑvžcÑÄó}Ó >Æß, z¸âDÁ”[õÌ´µ?å^dûhµs_¥ñ²®œ]}„'àWròÀ|ä_Ûøkäzwçà§qçï·Ë|%mº/rä5ûD®áýöµÏл‡¨4*tã]ØŠoi¼[bNØÃ5^ÎçŒÜ¿¬÷š;Ï1 [æý§­¥ÌG¼™çûzÕÒÆ„•ŽÃ»¤ÌåÞ¨#¾v>ñ{l|Öz5²»Ôñ(þÁ Qó@o©ú¸à<ú[ÿ!ç«¢ú€ùf°uƒögúDî=AßvŽô…÷_Fý§ýSEÆÓˆG½§zïv[OÓóÞåüíÊk½úEµá¬£qßs“EÅqtêyQDZïŸÍØþıÀÿ?«üIó¹`:ï¥Màùêó:¿× _DÎ5SB‡€'Øæø¦7ŠÝæßן2?ðI­§ýÞ©æŠïÀ3ß̹+'FÅ!0ë‹këïñ‘ñIðìZu}¤3"¿GvbdNèøNñ¼.vñˆÈøGðÉy,Žaâ?`«‚Î r¼‡6;ŸóÕ?Ï‹€}èŽu£ÍYhýH° ó%ð ¾SÁ-¯U@ÀG êoh³¿Þe=xXL:—½·®MTÀÒã"ç)ºy6Ž“ñn0Àùj#&£tA{=õž¢¿#…­„Í8TïÚMíd,Á?¯iÝNuð7úcÑõàÈ\8ðn÷È}‰<—ãü!¯aÚLý»ÖQ›‰·…÷-{‹–Ã#×d{ ƒóýN½(lÂV%Fq¥°æiñA¿úî‚eä8¬§õ]'IÎç®ãî½(K®9}A6áwâ€ø¡–±‹;Gƃø.>²ó /˜LÞ#ó®ØÎŸTìosP†uÆŒgñÇyíf7ˆg¶îÍ$š4ïë­u7´gÑ›Ec³Md,t#½Ïkö°ÙÀ}ÏuÊôšvßÑÇ„ýOÔzÛ5äwÞ.ì'†ÓÈyÙÓ¡ñwJ<šÿ@¿±Ö—ÜþFÎâé†ë¥› ä^-̇oP÷J¿Pû²Ä‚žJåï ”üÍ/Däó’ÛE`üçÑ~ß²ÌwÌ™{LÜgæh¿eÙò›óˆl¯ô«Çò~pž¸Øíµ~ÄT°™½J¼àùPpœÆ¶ßÁê§"÷w€‡ÀéGêøÜ%ÏÛŸw>¦wÂäÏ Ã`:8Mä÷o¯?w¿­g˜?8Q×Á„?)VÔ[ñ¢ûå`;xÎÆü/qÌýÄSðÒ::_QÅë~Ž-xØå˜öîjõã8;ò›ßÐýÈ ˜ ¦ »Fîs@ÝÎa9^mð\/méæ™ï‘'0|÷œ*2âuØàxê¼çïï¢ç='l[VùyEnf‹\÷d¼§ C#çKGêÞ>‘ñæÔoúµä>лªoàëyu< #y-Ä?NRA§£O‰1œÓéÏ‘±—mÔVèÛè¨bO¯Ø¡«1~½ÈoQmoX#rþ×yDÐmíȘÏq*ûF~ç`‹È=éãØÈïa¯kñÜsQÑCè5äØë_ìý…ô÷²:ï#,nSù³0|jd«Ä!ð“§°ãfÌùí“y+Žð|¹wÈïNb[9ÙFΙÀ/¸:29s~2º;aµÈ½0ßn9ïx3õÄÖ¿S~8u!O`zã÷µßgï«qGFÁt rþMñÐ(Õéü©ãÅ/ðéºúæƒýèÚ…#×aL+¼|OtyUz°Á¿âÜu½îéÂå_FÝÛóÜÈÿºÖ¼»Ø÷ =J®'º€XÏyºv¢îÿÿ Ýp’ôÆÕä>Œ\Û0]7ÏÓ¶{|a¿Î¥~ëŽÛ#—³G›Ûß®ñ].rÏ ÆöZMçxŒE"ã?Œ5Ø v_9× ßü]×ltçü;ï“ß×ñ/*øw舮@ß‚ÿ´¾%þƒ¿JÜ,w^ñ_õ7ñý?‰÷Ð9—Š7ÁÚãÄ/¿œ«g(7éï)ï]øºê¹\}äY0 ~Å>C¯z½Ø<`ž¥#ï@&&FÅSì\ì<ðÀx?«z¹yAÖÀóC"¿E°¿ê85riøy\ä·`À|°°}çšñ ¼±= ]`Ôð¨ö¬û°¿ê´íº­žßPm“é¼éöÛ`<6H퉫´ÜZ(r½ó†‘þ’óoló»ãÅãõ¸írs£bœ'ºAû^{ïù!癞®w˜¿7ÌQÝ*2÷uÝÈ9Ç[¸tdLÏy¹`?:`ãHáÑpGÑúµËïq]Aïáù"óQw?x͸„^óüÞ’ú{`´ûþú{PÅÆ&îC è«»j)xcÇÝ-|amÝ/û²èÇ#ñ¾‡Ÿá±yDƒK"¿ÁƒüÙwE¾‹ünèʪŒu|Ìì‘ßg{¢ÝW¥Ì¹>)üþ¦Êw¤®ŒÜëá*¬›Ÿùâp—ª4øYöãùñÒ èmÖ ÐWüˆk4nÌ%<"ü÷üóçoxüÇF¯§Ÿ-¯¿§ŠœžAý–'6ÄÜ:8;Wä÷ÑVÒsk¨ïSGúûƒDûÁ‘ûþ2þ×jŒlø»t˜#:œùRt8‹ÍŽ`ÁytŒ¸O|äÏûëº]‹®§Ÿêü‰xŒ÷cÿÿµÞ[b6O¨~tÍ¥:‚Èø|¬x†¶ž¹Ö§òÐ3¼]ñSõÃ1lÙÅCËEÚ•à9>ºüÄÞ7Þð6Œ÷Ä›Q;À<0È{ì¨ç¸n»Øù’ŠÆ©ý[DÆü½ž Ú>rçá::v„,‚ã«ë¸bd¾¾ó ¿¨ß~fý°ŠýíþWð 1yxkúÈ9iÇÀh2nܲ>Ú*2ÿÒ}Ü_íàýè8ûJÐP>_ÙË~Ï)¢»ý™Ã5ÆÈ3xŒÒÍ—=C´ßAýÜ/rÿÚºÞï¼QÏ猎ü–u"zmBdÜf£Èœž"¿YæõÊ»D~Úë?[Ec²“Æj¼®ñ#ãh‹E®ñ^\Gç¹€ûÄ-½.ôvroŽüBò^4¸Qò_¾ nÔØhø _¾TýtúÉ!ƒäÔ í¡-ÏüY÷ÁëøãEOúÖ€õsEæž ‡ˆI"—Ž9î«1]@㈄½‡\akm¦ÝCѾíÁ¾X_´…ï–‹Œ‘îùýSèÚ];D×hßÑî¿_|Vðsúh¿ÙæCâW‘“ùÙê`>óìäs6< JlÿFéà/tþk銫u/ºágÒÑølWÖ‚§w<©òªèN›æýÐÿ×¶–±ŸA¿A—™E#÷z˜OÏÌù­ëE‡yÅkýEì<âIÓEúØ+ƒuriýŒœç/ŠÌë¹L¼A~¶:2 Vc[ƒï7ªóÑÌ'9ß“ö—£ñ^O œƒÃñב¹¢ÿòî«¶[O€%^ÿÁ÷¶km¿ö´s9Ó-üal:Díuž’cdø.È>²JLbuÑ>€¯àIÛMðžçI×é´‡>ôÓ=ÈÙÈH1'ÚGïù2¯1a_‚`>¶¼C<ó¤Èøó‚:2èGt×@ÕOà9„‰¦iŒ6-ñá~¡ñÙPôX!ÚX~ñè¯×îÙ‡‚‡ô§wÒ˜S13äÌ[EÏÒÎõu>—hÌÜêW²¹gÜk—ùr˜Î“>¯Y›E ‡X1žs…ÿØ/3Öö—¹˜[ôü]Ò̉“úÛÈ]Ç%‡ô,áÿ='rs^SˆÕ|)Wó«ô•8øð¨såðÍ41é÷ÁÕïê_Áêp>èJ3çå.,šÁ«`“ç•ÁXÖ ^ªñãø[âå¶Í‰ ‚¥ŽÙð÷£‘{JÓà/: B§ïAßá—âwÿé:>sà€}{û÷ž[v>éßÅ_×ëyt䋊ñ3.`¾~Gã{•ïãm!?àRÕï­÷í§¿á °<Áã};íÀFì›ÂÓ?P}ß}¾¯sp̾€çw¬<ÓÎwÂÏkDbØHìX"r/9ç—¯¢±ž9r‘ÇÝà\IçGNP›ð«°ÓÀžo¨”q‘s¡`÷°Èü{d þÖÑ»=á¼ù­#רÑ92éÑXÑÕ롼>—÷¢S9"ò»rÐò4bgê2ŽžÂfñZ·­Eç«n°YÙ%Rïìiÿï£'÷ŒœÀ8,ò›cÎyqìÈ:Âs7ôã(=Ãø®™—¦-¹ŸÙr¢×Òú}hä7•kÛÝœ["ûØ}ƒ"÷o¹=øÁ\#±åÇ…CÊ/ó‹—ÉŽ½S¸Ö\¡6A#d›XÛ¿"ãÐÏ9¾ôýÛúèuž7ßD}¢­‹ê¹¢Å9»ñ¢?ºãOß="sGÕ­¡1F¾_RÝ+E®_ô¼Õú1éžL«©=üÝWÅ9¥ð.ñ,Ë„tmɃa>4*Ö–BìÿVéÉSeÇ_+ü³(ð7=™è×´½Äy;®ØýЛÜϦo%fÄ|òu#æ Þ+¾×{ݨóg«/1tü6KÞ±²èøYíoÑ÷ïI‡¡7?Ó7¿­¦ç¼>ÞY^c!Ó+ˆvð2çœëÅÆ{°|¿QçÆ~GO46F‰¥xíHƒåeÿN°;›û;ºçl~lrt1_bzú×cÁç âCxïñëñê×ÄHŸìqî̉âQðãµ ,uÎè1ºÿ»ªãûª“wl!ZÃÏ{EÎ5ƒÙkj,7¯!Z8r/Çæ‘•"mÅy;ãêèò*›« ›ª]žÇ<%RLP{œÃo{¬^JþAν†h£H™BŸ¬¯þ€àŠ÷·à7x üD—.¹·øë½ xàX4ïB·þ,2t ÑùpüzvªíÊ"×¥íùÍž=Uxý²ý;ýÝJ´òºh¯W£oûêºçë9zí×ÇvÆrS=Ø.™ ³¼®í¨ã\úm5õ‡~y]§b¸í÷fGtãON軲çÿ à\õ¿îf©ë` s—ÔçÊ;&¨Ðn´ÆšÀK‹Eîµ½yäž[DÆáƒUÕ®#ãËŽý +»¨NÆøÂÈ9þŸFÎÿœ¥:iòíz]ä^»Îç¾(ªÈoÎãBîNQÌ«E>ˆ…!+Êw)9PÖÕ{ZüFxÝOÌ€yÙß ÷"Üþ¥èøˆÚŽ¿Enè¹ÂyìüßH'z:jì‡qjúQr‰NÖßÔOü?í¹ª+ÚïÚ#z^ÞéGÃC%Fõwá=×#2WhªÈõ“ƒÄsàƒ×ŒA›ùEîqŽ›óxŸðz+ìvðýÅds¯á%0ðG]g¾•ö‚ïÓ}è[â;Ì#ÓÌ x­ÀMS ºâz•CÅGßÕsä$ >Ð>ó)Çs~ÙõÌ[âìZ÷ùiý…‹"eñ’mÿ“#÷ÆÎAvÁŸSõ~î91r„Ã#mýïŠwá[°jbçÞuRïÜ:rý2aì“®g˜|m۸ȹ ß³½hv è±ë¨½žÏø‘î…—wQsµ‡ž=D¿¢qÙ§sºFéY¯m; s<(ríõn¹ŽoÇÈœ"¯Ø4ÿ½ÆaùH}ˆìÿØaZÃ[ô=ç‹Fæ¯àb3؇òú_x;ŸâüÄÈ#¿_8F^:qõÃ…/>a¿sF®!ÙOGÞ?ðKµsÑb¤Þ íŒôQ½¾¬¯~»KtZ»CsìŒïiü¨ŸøöÒ5ÈÑY¢+6Øi¢ØNì zµ§¢|þԹ…Ú=FtÁÞpsáäÛ¢=1ï)*Η¸Ù‡•VE†/Ç?úi§`÷ß*}pcÕí¼¼ó+Y_øb­¿äé’KôFä:tÆË²×ÿÜÁ~æ.Õ˜‘‡ú¨ôñÏoa[¹wûÅ3 F»‡iñg‰ö[eþžAñ!fè”Døoxn“ÈïÐ"ï«E®y³Át°œøŽ÷BljÍ_™»I¬‡|cbSÄþñ ¼—¸HLˆø;ÿ²ŽØòØÆ^òÃÈ<¿›Uˆë¢ñ‡§ˆõã$VÔЪgGå8ÓGÇŸh ¹¨U~i¿!sAä$¼èµíúýD“‘9 Èö:¢ <¼¯x€n8UÏc c°±ÁRÇÿŽÜ¾_Lãàœ¯ãæö¹çˆÖ,:^¹Z團üŠü¢Ã±7±k½>Õ9’Ž[ÙŽ¥xÚøÈïÓ_ rbdžËÁ‘û\n“®qò^àÆhÚjÌÞOmØJ÷{­ôj‘{Ô­­kÛGê#ë/®Í=_º–Úâye°h¹H¼åÚ ê;.r}´ý™5v¶ow”/õVªÏmÂ7rÙ[4jp²ÛÅz ¹Ú rÏ7Æ yõ¿;^¶–h1HãÖ3çuaý#÷s\#r®ºãÓo.ÚÌ[Ÿ+qãeOÞ \!wñû²ÿ‰‘óÏš¤ëECú7«èHŸ±yiì¼k#óÐÌ_;©_›ˆ†GæúÌ™“³¼Æú‹ãŒ'kli˜xp¸è¸tä¾ôŒÿ-â ºïæÉŽž“}Wk¬ÀpžØ:8 _ ëèr0ÿz½~ä¢ÈµØß×ûÀþS#søˆ ƒˆáG|u/ç15Þ_~óúÚëÔüô>à jËž‘¶7˜5VÃo[EƵ½Ÿ<¿‘hž?ÁSø;ž>[ýÁgÁxuî ò°lä7‚áSd~NÅRÑ®÷ñ÷J‹.G®À§žÈ=Zg×¾oÁZðßñt¯§ò%ÏÁÓ>Rí=We¼žÙ7r~¢‹ÿk‹6+ŠNŽ™#³Î;£†ëºsó­à5çîSבs Ž+‹Œí:Ïi„øÀë³øm]Ûvúm_Ñ}?‰Ô›ë¾=4à?˜o?`÷Hüß—ë»ÿÙžw {È£ÃvE€ÈÂaê/¶?²‰|_¨þï™O¶d§Ð¯a¤1öú…e#íäÝì9=¯é€fÄœgx–®'†GÖï–½“"ór#±›èéµ×Ž?Ñâf`ç²è+:` Ùêø³Ê®ê‘> îÓô»Äxn–>ÿ‰ëcOö¿0~SŠQ1»Ðú“ZoÑw ó½^Ú·9O:™ºï•ÞÆö]í›±Ò»ý~ó-ëýà¸ý°˜2‡ÝáX\_õ·¯xÆkÈ?ÜsjXäºÑm#ù~G > ×ny/l÷Û:{߃<#ôñ«¦/íš-0ŒkÀÊC"sÙ=rÏxx^DŽwQ_ÎŒÌáwñÞ¯s¼ [ñ¸†]!ãœ8>||©þž¨v8çïȽòiÇN¢Á™‘9Ø_SU½ÜæÛlªöñž#÷N¡½Žgìƒöz£#s+fÖØ}Pyf’oqÎ,˜'ª_‡n7rŸWç꯫±3vÑ—ƒbÒµd^g¶‹ÚãõfGÎoî™K3.2Þíµfà¬c8kFæ³ÿÁ1ǹÏë_Á-óäJ:8ޱ±îY&2ïÞcãyâÍ#óÚûWl/x½¿YG­§vðt<>®u¤s`µÏë±à¬s¦FhÌ›6Š´E½NŒù]rü‰?\Ú±q×ùݲçŠÜƒh Þ½#ƒÇFÎÃ쯶Î^ûSð:z×±.¶(8³Zd^úlçÈ}BÁ0IJy¶Î±ñ.ÓßÇj¬z—ïÛ÷S{ˆ³ƒ '©.ǃ(Eò?¼„}1g§=ö9ûE«'Ëy_ÙêÚÿ Äƒ°ÃÉË÷Þ*æ—ã;ª:a[ìRÏÛo {ýÚ›ª<ÿ‡êŸÐÄ‚.–>¹C÷?%¾³!gZñŒc7‹‹—掜ì%:7ý-ߨÜÇ·ÕçHM¯1E7¬ãXìpÚˆ >l¹'ƒcî;F΃zN[ »hT·Ëwί}~ñf»ïØ<ÑîI[Þ½€î¡ Q[ŒclùÝ-ŽÈÆ¢í˜Èol¹§c7žG0ö¯ÓyÆyðàø ã?|7,R_`o`ÿ®©ÏæŽÔùÆÚ #×!zž™>9 °{¤¯ïÜ¿-E‹#÷x8°Ò¡Ä¿+où]çð8ÿÔsÏ£#×Ì ÝB×ì{­£ñ[Aïäy°e1Ñ‚ñÜ¡…|õòû€È˜Ùª{Ísºœã{¡Û–‹Ìù™Iç46سè—ÍÔ§ñªwÌ*žZv(qÕ†_˼ øõ×jK”6õŠÜƒtœúcÿ×ñyÓžö€ûCe?‚!ÓU»¥àÕj«MÔ6ç(!ÏΗCþ™sÀO&¶ÎD¦ñ/°-Áö+u¼(Š —}Ú¡ç/Ä3`ÏÅÛëX—댙竆ª_ȼ·}ä>¤´?¬@AözW]]ð˜u¹¿>¿¹?ÄÛºï9õz ë'IÎ\õ@Sz@ØþߢºÁßkT¾ñ¤Gª^)…¡O¥g¦ ‡\,SǤÍ÷y·¾·¬ýúDýÁF"ú˜_‘Ùm£-Ú§À@ûæ›w·‹Þà>d~?×ÀBÞOÞ ºùöÈïÃ;ߊI÷~?N|p’Ê>²m¤,b|'2€}z¦ÞÍ;¼ìE‰‘Ëó`䞇Ǥ{a«yÝ!~ÀªÑ"ÄÓÛª?êºçЧ©ã^ðw6ÉØ3R<86rO[çÃQÛuŽžó³ˆ=×/r?0ÛMð²¾Bo£¡Ø-S¨ŽÞ‘ö6ï<(26º«hüi8±cäžÛ‹ÞÛGæ˜ÕÑs¶ëGî­büÇf€¼^Õû'¬%zmëvq¾Èý¹hëΑ1+Ï-#»èVëU;űÚe¿€¶áûbÛØBÇa¿œù}ŽèÏ;B‡#"× íÞ©Óøï}-6IñýÈõ1£"÷éà™!¿ÙEþ–=^0ÇyŽ[9^œÐùNjŸç  ï"OÌ&ÚÔÝÖÄ›}*&±æ¨\{)2ÿðqáñÅ56øÃÎë¢ÝÖ«ªos©=óŸ„ÿE‡D¤=/-Ü?ÆÚ{¥`Û{މslDpÌ'7>õÚÍŸé^|â ßxã N çÎÝu®-vÇâ‘ßÑöûŠ”ú5ƒèŠO†œÏ[…ÿžÇ%¿êÃÚß‚»^3 µXÛ×õ·„oU:ŒGïâsaçߨñxUºô^ÝÃÜ ˜:‹è:ŸøÆzuP¤Ð\C»—Ó4µý­ÍÛeEÕa=ˆ‰-6oLºn9ÙNãÙ6A?3ÿ ¾b3ï ÖƒWOko~âa—kœ~¹yKÈÇÁ‡îÒ‰ÛS4ÞøŽ9ž%žANÀ¯[U7Xo“;ü‡H¿ã*µy||ƒo¨^p[áµoSÑÅ6×Êsô&ý@°Ë—йc«ÍyY Hÿ{ôŒs®†EÆY°ÙÇÎðÞl”ïªßžï…gK2îŒÜ{|*ñËDz;Àßeo!_àžóþÉ;G~“mÇHŸÊú×듼uíÈ5Î[hÜ–RŸÁ#¯§ÚBýq|w°ÎP{=ßäüvÇ)œK³mäœöêÿâk}Mñ§×À§ø.ΓZMçé·1jӌ¿!j'úØÂù‘{k§;12¯è`ÕC;×8jGý¾ìéë@·eD/úƒÞŒÈÞ2‘߆f^»7,r}ÞðÈ=Š·mûñZ¯£0xÞë?ÍÇ´g'µŸ1 °O»^)y…ÄžŸݤr›ð†1[Pü±±ÚŠ¿º]dž'ñˆF¯•xuÏ]û[ÖcƒUàï ;çkÖ:nâµàüEQí3ìÇoÔcÉ×þ­Æ„k[‰æÄ ¾ékÂİ!‰çb¢£àwlØ£tíȼ$ÇE¡ÍF¿-#çà‘½ÕŽ.|KÕ™%_öÏÑ®§+vý»ºvd\md¥Äu É"•.%Nð¹dc†È¹€·õ;:Aq˜27€®¸]X>“Ú…m7Vc0º¶±Œ§ùm µç%avásl¡zvùȽ¿‡Eæ„Ûf[?rÎÓ¶¼…½öƒ«Ä[À[çÜ¿«¸ v¶swh¼h7¶Öý+ÆçývLdlÌ?_cNÿD|€ÀWœù­`æ¡ñEþ¬ß_Q^çãª¿ãæ¨>ó¯»èú â«M#cªÈjôø]1©ßë[i\òðøm:a±ã¹¶}úFΗÒØŒŒ´›¡'6 raûy°xv-¤ºxç̲à°ä¾jk¾b̦ôzë¹¾úm×ïâ(úÕ9Ÿž'ÝTíä½àÏnú­¿ÆŸ>­‰Q`ü³ª~sÎ í¹ÿœß»™îwþ‘ç÷Šü¦–íµ®?ÒÍùÜ(&]OÐÍK]U4i×­¡sû¿Ü‹->xLùøŠçGƶœ?6o¡÷ÂÇ;OV ÇPw‹ŒCѦ¤{¦ŒÜ“~åȽ¶o¥mE›‘9±‹tÎW‰Ü¿c„Ú½D~«r£ÇÁA¯ù›S¿imEÉgolÌÂSžg| Ú¬¥ÏˆöSFòŽuÿì’b®‹ê¹Åd¿>Yû^ú¹adîm@Ï;o›ldôRË#m4⺣ýöFY·yµÚÁ\ñçsË÷·‘?è:uþFçĺ°ñð+¾¥úè‡ó¶ˆŒ{Ì+·l7¾EY§…ø{džÏÉåÓÂmrÙgŠö{1—gÜKžœ6Úo[î½|¦ÐþmÅ¥ŸŸQ—sûú×gÚõ¼ÐØk¦çÖ8­ ±XFt¾Y±O0=»µøfˆÆþZRo'™ŸçÜÿFÞ$cÎÜÂçuž•|þž¦=žìgi71t²ó¹À¡ÛÔÇü½üþ© y@`ûTnиãç¡îoc„nÀÖ'7ˆÜ~äü>ñ×™Wúcä7¹îÑ3ð%v&X¹P¥e±çŸï2Ï~ί2ŸÊÜ9~%®ú…Ƽî÷ZŒ…#×f­*þ¶éÐ]☈c$к›§0E}_ñ ñ±×{iü±·æP»–œƒ]Zý㛈G–_ðþ±1éœ><1FÏS?üïbz¿‘yôNÎáIt€cäŽ Žü6·}TÏmn©;6‰Œ!uóN×iüßE×»s›èºó§lÿÓ?ëÜU#¿Ù»’ÚÍßë«ßð/vÌóÚoœûĆ­ÔVtøå|÷cÒ=´×½éÛÁz~Kõ™Xv2öî*¢ýÊ‘óß#ÔnäžÐ#~‰û¶÷mˆÄÿn~Ð@µgÿmR_ÀºƒDç>µîö¸ÏÉöùJõõW?¼®lKú¹l´ûÈã3y è»?ÔÒæ$¬é-¥ë5žàò€¬_¬#ø@,lÀNÁ><;rýº »?,¸]_¡9?äÛðß©{ÏÕø\ÃЙ£óÞÏþžJ‰Ùß¹qŽP¿?¬4+9CÐböŠï­Í>kd>ÍX=ó¼ìEûj g­Ï=€®!öå<Ç3Wö.å9ÆtæÈuì‹EÚÈËDzÇÕu¯%æ×‘1 Ç2àSû­[‹>¶§Ö½÷PÙM¾}|»®¥-¹–̵6|ØÓànÏ­ï½RôÆÆ?Pc‡Ýÿ;~ºÿj~ç§z–sbzÖ1-6=׈åxN™úÿ?Ó¹×àc§:_¼t±ÚB®ÁèH¿Õsh}ªþ-~2ò‰¬`{9ޱŒÆYž.2Î2PÏ#okÕzÊx/éǯTy«Ë.§w€+èˆa·¹"÷4»çÖylƒw*¯µ1qæÄÆ«NüÜ=#×67ÝJã8Rã8@ï˜SmD–=ÿ@Û½–ûÞš¡öµÄ'?¯vNákôÂT¢Ãâ‘9ëŽÍ+Ú͹¯”ušªßö9cá9_Ú ž;Ý1ŸïÔ¹Æ9q}löîZdê^=2¯ˆþí&ZónìIìAlöý«‘%øcÕ·}ä÷ WÜçt¤Ú‡¾tŽçÛEæÊñ·sT=ÿíØ ø¾lä7לëºhd|Ü~Ï.­wc£xŽ »‚kÃ"÷cê§68¯€zàÏeƒ#CU§Ö¦–ý^—íó‚üË7#ñœú·Q¿©weau)öXÖ'«`Nóß«‚Í9g¤´²ú ÐãÄëÁì=ì:ò}eæõˆ!`^¹–ƒ6ƒøä:¯}ƒ-‰ž@ö±ûæˆM`ÿ{-¡×rx.ؾc°˜úóºl|tÑ‚‘ßšü§~çÝ3E›£ãŸ6p¥z½ðèüÑ~[²È8мL¨m(ëò ÙCÒ¡VýSðã4‘ûÃrÿ陇pÖ>!ÓàX±WdžµmÅ"ùux¤Lÿ×Ü; Þ>:êwq‰õÌÖ”F‡öl(Û¿áóžçz†ê7h\nÖ¸€ãÿ¬s÷e¿i[Oƒ=`櫵ÞDÉåGgß- ÖÞƒýÐäAñ ºãb•+"¿AmˆÎA/¢˜Ë"¸äw]çˆô—§ýÀ½ÍÕÿ¥õ7x6ŸÆ1ñ tYG|4:ò›àž×ësî¼Üu"í[ÏP¿çSáÇ-È÷Z=·ß~£ÜùèÄÄð°[m—vsûÉØ‰Œð¾UT´&¦ü¶ŠÚF[ˆqÍ)ûð“ê´{ca½¬k¼s ñXÕGu9ߨþˆçdÁ#Ï¥n¹oÎØÈ}HwR{ïàyõô˜ÈüÙm5¼sÆH´@ä¼-ؽw‚x™ÃÏÄ®.ä`CËz±Y1&ýž¦Ë†ªÛëà6Ò{á dy@ÿ[3T¶ß#^)2nµl¤íæ|õÑ›a‘öÿÑ`ddþК;ˬçíi‹×EñÛLªŸ±ýamo±;É=yPøæ=#ÚU™72w õqÙÅàýßÄ#Ž—?Víà«SW)¿±.^ß™³À%ðÐyyÄhal?°; Až™ }H¥QÉ¥qžß{•.ů׼@Áclœ©"¿IßG×-x¿ÆÊqŸ©Ä {G~k ìÿ±ô |i{íKégrMÐõÈÓŒµ­eþÏëJkü9êÛ˜S9\¼ öCbáÈ× Õµ™ø ÞÛÀŒQ‘rç\¬1Ã_¿:ÿùæçâì:ô1E|F¯å9ZcL?œ;èuJÓFÎÅy•ç©7\3¾Tä^ðÜ»—xÌ1ë•"s°ôëÈÈoR9?Þë™ ÍÐÈ|@ljEîÀ;¡Í¼‘û@6C]pdWõ«'ò›¦ø1+ëýÐ\ò 2â½ vQ°YÇ‹WàKpuˆŠŸGmÓà8µxF·M¨gõH'hÀÿÕ¾ UÏôŸ»…1ÏÊîX\Ï/«> ª¶mYûÄZØë„‹×J<mÞ|Á&h×`R™ø½ÆžÄ>gÎ_ß;‘¸¶<:Ü'vC :ãÎÈõÁ»j<‰# ÿÈ=:½A܈ØÂ7´¿ {4Ïô4vtsÊøÄŠà¯oEîONÿÀZøuµ:ög¹=Ý_ü>eµ÷Ë~ÐT=Wè©R°ÿ%é9­Á,¾R_ã6}EoðmŒl©Oêsem}A–çPÝßÏ o3ë]oE~ÓëµÈ½}ףŗèÎã#sêÍ¿ƒÅ øàü¼zmoá3æÛ‘› ‘1QÑ®§c¾¥§‘žá›œpÿðJçžf¬{À"âe]ÑC_Þ×ï _õ¬]cõeî²û¿Ðs#õ7ó ÷©æ|ñé~)^áoô¿ó6àor4Ñ1`ÁøÈ5]È]lÕYõ7˜ºTäz7Fm¼þzn'š:nèÁ#ã+ö»VÍ–Ô¹±×ü0^åxÊL:. ¶Î­b{w½ÌÂVFÞÓj%½‡{ѧ·+¶ÎDÖ˜+ãdŽXz ÛðXÑÐûB€o^'Ü裒WöE=/˜½s¤í‰^svßôœ×ž+2? >Û#r4¾7úÈëÊçß(ò»Ç\ióÚVsN<í…‡±ý‡D®9µmM»VW»ü¯iõú¥"÷£È 85XíÞ$r_³=D¯Ëu¾j÷ºï¥/ø«uÆxäwèƒç‹7Šün½s¸þÿ°õÞqTÇÿ÷p‘¦‘Þ› H J ¢ØöÑĨQMb’oL¢I41¦cL¢±ÆÞ»X° ¢ØÅ^žóžýÌ™K~Ïçuï=÷”ÝÙ™ÏÔݦ#戅¯:&ü£­u?´.:ð}‚úpˆèF<õ›VÏ¥Š56=.vQ{r¯ü0^EŽ7°z?J¿ö Ëýܯ+T×6¾\ìU§×ß-üD¿ÁsWX®Û¶có‘£C~‰ƒ_S.ͯEÛCEäÝ‹M ÀËèÛe—)ñhÏÙD6*Ÿ=Ôžuæàä?5ŽØÑÃ„ÉØÜ‘ œ"ì_m¹G|ÈEÔ ÖAìžX±ü'Ï%ƒ×ȸòyþÜŽ¢MÑóÑ¿ÃÊû}\»ˆS Ô;±qú–ç¹?÷sõ^B¦±‘¡‘åùõž.Øuý5>ý-k{áá°Oàkü*l"0›i'ÑýMa÷ð‚1ª½‡¥®¬ŽêŠÿ•ŸÑø¶â=ôûjé Î.¡âÙÆ!:ÀLlûg”ÃyBtC§¾n¹OÀ âŸÕN°+ì^d¹T<}o¥ï›—1vZL_‚ Qÿ²rÇ÷°=Á߈Ej)Ç«;l+Ëš‚–µ|ïgu®Øc‰ò)ëœëX˽HÂW‰86yp|äÃ4¾´¼9Ër^oÌÕÜÞr?p ?èúù»Díi¥ñ>Cýîbß¼»`ƒ¿™+ÚB‡¨ß¤à縢7êZ„îŸÃ-ã;¡'†YîÛ»•eíøn–ë?ìÙtOÔEžv3Ñ-æMEý¦–ûõn™ó8Ðr€Y–õX“-÷x ?.êí°"Þ¿“åšJ|‚ëÿ9b[[îó"w°¥ÿ3W÷¿D_£¶•öEü'â…ûYÖ~Ƽú†}ÑÏ2o vwÖß³Ô³á?@OügìJæ³{|L6lÌÍÃî­ñm/ ¼Uz Â]_S”xñ ò¡àòŽ<-øåïÁ†"öALE ï`Ö_‹½Ø@ïW6sƒþ ãÄå.²ŒÏoa¹N,Øÿ»r¯ûè êÀŸ*¶¨ç'{[Ò÷’B÷]jeŸ¿_© Ï•X„ß×SC¡ÛéωžØéË­àzé€÷Ó=Æõ‘hVÑÊciÏ[î¼ZôyR÷.®¿_tˆï­ôªô ˜°RíyßêÚÏV¯ëçm!oI¾a­r­óõ¦–¹Ê^–y¢¨ÁßûJ×­k9×>ÞVüùß’;v»q‰å‚à,¸û„løJ÷6n¬ŽWÇÑòÈTcÓ`n…7¾®25YÄô*ünTrà9éVç=PµÉ×èÄVý›x»€¼ ¼ˆ~¾IÿýSrtïm¹ÇÄÚeŒëz°?bëklÖ×8÷Óyús´ÆàËð ýž¡öì¬>ƒ+èmt!z2êOˆ§a¿ƒ=Ęï†l¯ÄØ}›ú9ÿÁ­ÅÇÏþ­kúÚ©]|_¨vE<»¯ú‡qŽèõƒÐ}~88ºXG`!¾hó‹4jŒ#ß°ƒè¾¥¥Íõ6àq;°á Ëð½Eô;|ø½­î¹`矮þm¤wÆ÷ÈïNQ›6ÖýÍóÈh3º;|˜½-q1ƒŸç«ÏÇ[îã±ÿ¨ýiö"Î3Im ì_¿Œ·Ÿ¶ ÷ï¬qŽÚhÕ¾\ïs‘ç® ÒÑ¡ÐÄíþJž} c®y¦`¿×Ç´ÕuÈrÕGý¤ÏäóMfk<Àmlõs…9Ôo«ý£øYì¥{è;¼Œ¬ƒؼÄ|ÀÚ˜7¬ùHî¼^0È×~MØO®œà?D_êŠÐ%1 ß§Ò+׺+1»Þ¿¦py•äþßT®sº.‘n|]8n!c‘Ç{GúU2ç6ážåœÓ÷>-ò‚ôź§¥ð¾ƒe~åyÉ­‰ÖËy§ÕÖ:7Eôk'¾€_4w¯Ža…¿ ¿!_á{c;bë§?«Â«FÅϬqÕ¨hÞ8T>µ@•Ìù^*ä]ª~yM>˜ž®ø…n£›гÄé¶Ãýtñr?ÿOüSçn³ÜžBN‘/ôù!–s:#߉Žw£‹¾wµ¬™j¹þõH˹Lè͈5‡mv´åºð`(X³«¥ìFî'ìöÈ1€à|›2~î~©ßQÓyBWŸWÖMc¼å~\<+°‡qF? טÅ<–ˆíFœú„Â_NîÁÞ‡fŠÏBÎWY]³çùºU…/¨{vÞÒá2r·p'ßö+tÙAç{Y®cÌ8œiiËs,kèLjÁlnçäý }b®±>_} lm9Ÿ/ò]ü‡®ÙLÏ&fp^Óø.'^ÿnGk-šÇ°]-ó¼1—Ž1ÚF쿱â‰-Ô–ˆ)Åzà/>Zäè#'3Cmâs7ý¶Úr€eN8r¼ÁoüÞβÖ3âNÐXĢ6˜p¼èýD~ÎÑóˆõQ¿ó¨ìÑ4¾ÈGk_á=s¢nþ·Ø¾Ï066u[½9¸Dýk-¾ˆúYÆþºb#öø%c‹¿²‰úÑK´*^ ~`Û`»ãcCBg¨°Ýç!}.=@½ÈÅ>u,û‹Þoø< 6ã.Ã÷?]íÙE÷à««±¢½ð;rG â2=€è’côß¡¢?};ÕoGXÖQÃ|¢'ñ¡Ó÷ÐQûé½È9Ø„®ùd`2…Lv-ö„óÄŽVïsê´ˆù¢Q¿Ö޵Ì9î«víW®uyˆÜág¢iÌYºHcGÛçYÖ²`ëƒë`:|b¾Ñ¾–؈å~^‹áS ·×ôQ;gèˆñ¡1Ùßr¾VÄ¿'ŠNŒmä·×ù›DÆx\ÄÁúQMÏï¦#ò&á_2Æ`kø7s,c…Xîçø€ìÀcYΕ@všóM‘ƒÂÆ:Æÿûçêzh5²`´/}®†¿OÖ;g•þ6Î3¯›ôxÈýÂÁ»…í–1ö±„¿ZŠoÓvý¬­vñ|ð;Ÿ&Þë+> |á³9'öb›aYĈؼóÁmâ9ØÝôû\ÚÞr]0(òr#-çZ/}‰ø¢ÛÁ1Çï8'ÛškñFŽŒ6Ç<•°9·”>~CÏBo›Õu@Σ–c_ûIÐ#r‘?¢“-׉‹0}@æÁŸˆ D{§Ú$¯¸._­¾òÞSÕ‡é¢UÄzyÖ.–ûö„-y¶Þ;ɲ&k¨Þ·™ž7ÓÃø{ýùÞ^¢óúúŸ¾¬«6ÆšêàÓž–ëŒÓøã«ö ·¬a#G mÀvl·E?°j±eíçá–û@ñ}‰Æ;®›M޶ܗ—OtÁ)–þÒ”¦OŽ‘–1>ðò õ\Ú]ô8ßF¢[ÌQFÏ=¨{fz¹?Wd²žãŒ.hè®çpômÀàý,ýɨû‰œRÌ%8Æruú Ãÿàäj+¼¿©å^Û«o<+ò%ÛXæàmð¿“Æ¾µåú0GŠŽçY®iÍûÝW4†ØÄ†zíÊße/Ðï,ãvØ(ðw áի¿–õq‹ˆœÝ4nà/s£~ϵ¬ÍE_\¨{¿-ú,U{±Ÿ°åÑà;Øÿ¾>y:,Â}HÏ –|­Æ2rãí ]<¦ƒÿ ðžüÆ…ÓQÓÔCc=D}‹úä§»å<ê÷D'åÀŸ_–]ÔBx×Ý/š¡[«þú¾ ׈Ö÷ëý·ë¸_ú÷–s­Ñ7_êÙQóÃ,·W;w²ô 8ÆýŸh nE]Áx}ßÄrÝ•ý4~S,× bìѳWXñ©°ï°ãÑÃw‹æÿÒ8`Ç`F½2¼žÚ7Qm%_ñ¾ú¡ùs®ïà¡VâÍEz7ü4ÍrÎlÈ´ ï}E xr­Bs÷“>½Þ‘î«q«1EFÙÈM†"ÓljÔý“t]àÿv–{ã,±Ägž ψuï®ÿêwÌ \Eöc1ü6Ír}ÍðÃoóæë‘+ßݲæf¶¥ž˜RÆÓ圾·²¬-ˆÜzý×Kô{·¶ÌsL·´¿xæLý·DÇjÓ«kI\¾.²ÔaÿŸaYûsÕhãõ7Æ=âbí ÎÕëZ ±ÌIEÍv¼J\å rŸc˜ô¯‚cþþ°sÀ øe-Ù4<{t±¯<þº‘å|50ß÷¢?¼NÝpŒè¦ƒ%øÄÀzx……žQËà}Žõ~6ô•ܦuí6°œƒÀwð¹ûÚŒ¿¸ÐrÿÚYù©nó1öè£ñjçI–ö}äø½Dç"þ^Ô …=r”åÚGgXÖ†rï©–µý1‡*rQ;z˜åšñLÞu„þßSï;Kχ¦'¨ï É*tB§Âƒ1›q€ßZhÌ¢&—~‡N»²´ßw}è:’¸ ru°Þ}¼Ú±@m<ÈrݽÐèàÅðEw´º^Ñm‘Î’âØ-צªgÍÖ3ŽÖgñ }­äÚkñ§wSßÐsà56 6ôÛicº<gÅÆž¤ñ€?Àvâ¹ø4ä%b3ÄvˆÏçó‰Ýƒ÷`=qœóõŒÊæl ċРĆžÖ¼/ú ö€ÿ·èÞE\þš¬þÎ|XÆ2æÆz]µÚ‹[²FD‘¾n\žá²Éx"½D¯¸‡¼8ÜFuŸøFwYî%s^(úDZÿO¢9ø÷´¥p½ÎýÿþSK¶ýÚzÿÓÒÅ‘oY›Ö¡g‘Iølˆµ§ZbÔ=†¼Ì³œãΟ\j}¼¦–çò~ÚòË}Ž³Ü¿ýTáÂr¯óy`rŽŒ°¶È›V¯o±,Çô¨ŸÜÐ2FÔ°ºnÑãe/ ×á¿Ä{«Ïƒ¬^¿ÆÇ²o9ïºý>޵œ¯3KýXOÄÖÁì~0=âë£Ä7èÈï/Þè¦þhÇ:^ôk¢†ŸÏÃõžCšÎÑä&ðm‹¦#ì/®Â~ÛÍr¾ZĤ¶]î-üWÇFYÎ!ÆŒøözúì'ŽRÛ ºêµ ¬«±ß,¹C÷ËÖ_d¹†Û"Ëy]ô1êjojoÌ >Ørаq¹½Ÿq¶%&óýtÑ8ò gë›2hº.âyÄÐàêF¢ë>–k†o3C×.µR7{]‘a§cÌ{àiðw¤~G~6bgÐpGËõ'§kl"ïÆxFþÑÁ+ÿg¹—OÄ÷ãþœe¹Þ߯–µ€´3°M¶©×2vm#î¹è0P<€¬µæ€ÿ+ôÜàÞÓ¶¼Ç¯‹8y·ò®:Æ_Ëù¦Æ0æoq„¸·úý}¯0Ü÷Á„§À,|lLìzl rèæ+ ç7"Îs“žžEo«N¡ÞëØY´x!ñÃñóvËùYªóq<¤±›l¹Ï0øG~h-½£—Õû!Ô{>~nYóù°°ÿ}—L:}ÿ$œ_nÅV}©©=ä×"gðRѯGR=ãyb×;Ê3»ì®£1¢­èúC-×µŒ˜¼ñî Û,âÌ`2ˆ^&þùËýmÑÃØûÄyÁù£5ÞK4nð-9ô>:!ì=äoGËZEÕo:®/“Í1Èê=°¼†¶…hûN9ÓÒXÆòÑѱžŸ£Õ/j²°m¿h9ï*æsB0<êíÁã,ã.'© š">Ü[mù±e­1¸w¤øúá×c¹f¸‰]|Mµœ÷ÃØì§óô%æl®ÿfZbÙá–µJ›ˆ£­Þ£Éçn… L°\4æ=LÔøod9+jÚGYÖCŽ*¼çXÉ3ÁÛ;5Þôc©¾ÇÜ­SÕט»u”x$jDΰ\10Œq‰|Ð|ÑŽ¸AÄ„¾&ÚŸ`¹_;Øq®è nîf¹ÞPäRÆYô®ñº9ÞKí:ÊrŽôîV°ÐkøjgÌ÷c9¿è–ëWl¤¾€ÙÁ[ÛŠ†»Zîw0GçÎÒotÁiêOÌ[ˆÞ ]2βþ'tÒ Ë5L•¯uŒFÎÖÓûÑ… Õ6pÌôþ5õ=×Ür„OúZ¸­E¿ÀŽu…AŸ”O×肈!n(:G®qŽxàñr¶_]ÎûºÂtÍeš+ZÉ€¯ÓBc}…{ÅïZî#ýbEàòÛQ˜ÿ¤åºË¯ ‹oU_öªf°ž Ñß2W†~\xÅ1¸Mé³ã3txÎÒ–}LÏUïý¯åšÔWýÁJŒ Û›?òË…û«tþþ26n'GhÌGøL÷¼m‰£`"øvllYË!ûÀy¶Ÿxxˆ¾Ï´\¯†ƒ1À³yÿg¢û^â5èŽ^ÀFÁß ¼gLðùε\;L8ÇÒ_Ÿ&þ줶 Ò8µ(}rÛ¥‡¥Myâve˺‰&øt¡×àeÍ£ À¯[Tx×í ôüúŸ{£)–øu˜‘g`ÜÃÎßFíŸkY/H¿àmä9¯ð™ˆs‚ûØ2`?x‚ž<È2ñÒ°÷¶ŒÍb¹çjÔŸ~Ï·¬{çºí,×,‹¹Qkü©ú51óôn®û'‹¡_éÈ{ÌÄ®à^õ ¹%Æ-è¶ïfóà¿ýt>xTŸÔ÷¡–è^úy[ÚÁ;Ljžð2‘èx–ø^¾¦ÿö£acõ¾«±£OQ¿F Ó±…åÜߨy‚Þèõȼ¯{¡Iè úMlãjË[œßUçà9–ó Õž–ó¢>3ꈎhº¶9þñÀ¨9ØÚr¯ÛúŒø$2l¦±c¹_ç@٠ĈšìxǬ[„WÈXø‰¼«µúL†|ŠÐZ¾•çøó:¨}YîI~˜Æ€ñ'§OTæŽ2—Ès‰æ4öÕúíÊo××èŒ;þAÔ÷Ž´Ü×y7K¹’¯î¸ÿ¤úö°pšþÝa¹_;ØÙÖ²f#jì£Þ þÙKÏ[­kZXÖC½+œY-{a…Õ1Ï5£g¨1ú‹ôëÍVrÁ÷èÄ|"GÀw 矕>X™:ÀÛ‡ÞŽù¤=%ï]ÕïˆeL/¢ #4ÐRlc©/gê0"ìè}ˆþ‡Ÿ‘MläŽZ¬[õ?ãñSçéâá£,×W› >ŠÚ:Æ'l0þ›l¹Îí(˽Å#OÿŒ¶\ó1øõs˸ÿ°¤µëêut=±txk Ëø㉬‡\í,¾,ÚFü}Gõ{SÝs­§Y®+°@¼:›õ8Ñâ õo˹y4>ûZ½¡ç±ùõ§Ä›Z[®ó hSäð&éÞ9ºš€W}t@¯‰–ñø–û #›kYæ}ûèûx}F,y„p¯¡qŒÃOE瘳»µÞóõbNÛËõ£v²\Ë0rC§6}.²´3Âæ‰Ô6z×$ËuÅ£Ï`ãpï@õµ³Õ5[µý([Öí†[…/ÜÛNÿE=ßË}F Wï—=ºÂêµküýëë<«ƒÆòxõ Þ—°‰ÿcg‚ûÔ’#ÏØÔ› ®×ø_n¹·¼¶‡Þ?c+¢ÎUñ/Ï/vR?ƪ¾>âÈÑV׉DïõËÞ‡Y:×Y´{C}n«gÞ/üÿJï}Lº!êB_¶Œ]+=ûŠ¥ý¿ð>âB´;z@ß_QûÐc/Z½‡päù]NUÓç×v±œ3FûÁ†i¢Sä ֳܷ™F'ƒeÈ ~7ò²‹øÅöÿ/Öø¡–Zêè†?°»åzì3,mutËþâ¥í-å#æ¼O²Ü‡#âÉð/¸4DÿE¬dˆž¹‘å>]ä£ÖoôÔ±©®8øhñsØicEÚÖ‚ Èü Ñ”óØj1gyœi™“Œ¸}ÄmÁp7rQ[9ßrNr¹þÿ‘ ° ݈ìFù$K?-ò¿3õ{–%¾m­¾DÝàXõ•~#Ó‘¿lõú†±Ö`=Ožh/9@§DMa§ÂóN Æ =\í<,csé°á¿­ÿO·Ôðz<³ôõóô?Gø §ê÷I¢96 ¾¼ßÂ{1Ÿý µíË:š-D£,÷ý›YÖC@7tÀƺnÑÞzÁ20J×2æ},s+1OqKË:”xßD½csÑp”~#gsD»): á9êú w¤å<ã¨õßÊr-o|Ÿ…–{Lò¹›ÆŸ1í-œû¢üv<"v£ù¡ó'¶J|cõ­›h°§Ú}jyg=/öqñÑ»ÂÏ–âÍ„…/ £ÿ£-k¨ù¤¶„šNâ¦àõ&Ô[¡n²Ûgβ´+ Õq–û£¦%æE@[ä6êu>³5ç,bƒö,}÷þFd˜èÑ©iœGZî‹À¹Ï^ÂÿV¢Á£ÂrÞó\á?žæ?ÜôùðþÝGŽœ .ÛŸ ›…õªéû“yíê›–ë÷ñÙ¿Œ™ãàG–þ 86@}'èŒ'ÝIt ¬AnÂw&:Güõ4ËuÜ‘ýc-×ê¾@ç¶´\gtŠå~‡ðì<¶ËÐÒïz?ÓÍ,±(j¡ÇêÞȳjY;ÉuÓ5.Œ£I¯·µÌ…‡ÞˆzLj méüdñRÝÛM<Á;°ïÃ&;J×E $r›´5âڡ϶lj7z/ìÔÉ–kCû¨C¢¶ ´\G:æîE> ê¶zYÚ|ñ®˜µ{Ý]d¥·ž /tµ:îë¶~ѽÙOÿ/Œ(ïwz¢+#w{€åüŒ¨ý_(Ú|_ý=F´;Icù¤È€ÙÔsþƒy`;:ᇖ¹_®Cw:K×þŸ£ÿÎÐs¹þXËÚXøeBM9‡M-÷¯8ÊhÑi¦h۱ȵÓ)ꈣ7ü'x›èh˵vÕ³Æj &‹¦YîûAwÖ»iz^ø£èt¶¥¾ç4Ë|ý µ=ò£-÷}=Àr^€üÏ£uµÌU~®ó¯ Sî*øâ˜ßCcýµÿ yoٯ̒Έµ¡ïÇèYÏ;Õqfw«÷…÷ç`Ó3O+ò…è+µ&0˜L ø¿Ôr.mŠÜЮ¢ý|˹ä`hÌŸaéÿ‡þ#ÛC-×Nh¥ñ×ÓXn¬go©gO,c(ªwüW>Òý b>O ã_µzÿe÷šûšð?æGìüBøÿžåº+,ןx\ôÅ ñÆxPi¿c?rµ…},ë±m§èØÈrƒmÅWŠ¥Ôk7nik®³sú"OþXäy9·¿å^ºŒCÄPÐ1Ç#æ.…ýòó£ž~ÙÀ2os¤6²œ§¾»ü5õíÞµŒÄøÓýÊÕ1òÃôy‡ž¢Áâ¿E–¶.2»•ú±ØrÍv®‡Og‰fðî|]¿µú ÖQßsšÐ™Qƒ´‘e~¯¹>wêÿœãùïaé¿ôý"ôš«qæzôHCcÓUtéj¹fö=;æǼ…I¢S»B[×=ÓtÏ<9:!êZ¡ ¾<6ñ¹ê+²ó~Ò5lj` ²nÃ#èâä ©%¸B×pD­ü%–9àoë}ç[æžZÖÿCÿ)–º:O´ÄÿˆÇ„îæüdý¬'ñ{˵ÿB_µ\¯2r,³šÞsoÆZîÍÆyxe'K\y_'7µ=r‹tnË5¸£†«·eÍNÌ…ØEc7P×P¢6¾…ð)â· ›* s, {b˹ˆÃJßýZâÙÏ ûž—NˆµˆÅʶõz¡þj×Q+tö™{ð{‡¦qäˆÚѳ-ëÒ9QôÎr+Øß‘ 8Nc¾›Æ0t ý-Ú@¯Á–øuüîÐD—°I#ŸÒÝrïo°D1ÂØÜñ?ê8Ÿ“X¦#rϯêàëÍÅ<߇D·˜ûu»å\€w¤Ÿ?ÎǼ`Ž7õ^ÕһݞxÑê|„Û+í-ãwÛZ®¥¹¹å¼Ñ˜sk‡XÖ#L³´‹øò}>Çløn”e­û¶–óô‘Kl³½ÅO›XÆÿùÁ\˸SÌm ûKË}wRû—˜+5Lc¸KïØ³¹¶û0¿­å܈ÏDÍ*×`ôQÛ"†1ntÀ…êG`óvâ½ÀŒ]-×7‹º÷CD3úµ‰GZ®Eq£9–óÇ"Ç OGM}Ä9‡¨ï“Õç¾–˜3Tã;@íˆ÷´²Üi|¡…×?GKÔ7ÏÙÊÒŸ›d¹§u?Ñs’eÝ'˜y`|ƒóEƒ°í[Ö‡ž)ZÆüà-× ÅžS± /ÑožösÄ7ÿÁŠÀÿïê@D¾[e‘h‹ý:ZGsÌ1°E~¥«åÏÐÀÎØSô‹\ë~–y™˜ë~Ú(Ñy[Ë<Î K¿jœî㺘ûüu?;Z® 7×rÏ5îÁîë¡q«ß 4Û8Ï'Ú ï±#©K!ÆüHé£×¥<%ìÁŽ\Çrï£Qê/1ŠÖÇ~Yxÿ…pŒrän*úÅ1>ÄvØBm×É Q×y•Æ’vŸc¹þbäý£jŠhu¡îG.‘¡Ã,ë‚£¶ó[ÚMCEëùÈ·¡O{•þ:ÆÓØ÷V{Á€.IcJÕ{ÀêÓw¬›ïöC›Ç¤g#ÔlÿƒóQû§Îߢq@W,®þ\ÞéyÐuEמ–µŽïJÀßͱÀHôdÔº µ\;g]Ëøt ÌÙU¼uVÓ,m|רíäºÔžÖ¢càÆz/÷FÍòóž¶¶¬- /GL[~óó Ë5m·Öµý-m¶mx&b‘K˜d¹n(}íhõº¹ÞߢQÌ£+:m«çEÝ^Ôkžªß`KÔçìl9O«ë2߈×*ÞŸ‚§[®3za¦÷ðì©–k¼nu®®qfkîC9Á©–ëÑ—NÒ‰ü¶€AÃužø5Âg´!æL)ýqÃW¬v·´"†qŸù–uœÐ¬ŸÞf‚ÿðõÜä‡Áqü!ð>Ö”àó—úŽ ^œ«ëB|»ézð !öç³uDŒ/úŹÆ ¾Šz·ÁVÏ?÷šñjómku|¦Þó¼ìe;[&Œà9«k'|.N+éŠët]÷¿ý¢ÖçÑö éåúÎ|€×ôœMkµ½§x!b/imi+ï!zmn¹6L¬©€BùP÷O°:Žç4Ã.Ž:ÆÀâ¹âµ-õ.èÚÝrM戋Ða_íb«î«woFŽ%êÎz[­gëçv-cR¯Gõ‰ð¬£Õ¹Êz_ÅîzFÔuļ änžøe åæ1ÿtˆdäƒò|÷—ÐygÝÓr?X'úïD~yÃÂ'ž§°Œe6ÇM¦h\ö²ô¦XÖ„F,&æR…ÉùÈ÷~mú?c±¨e º„¯ÔW¼>Õ·ö´Ôuá¿,ÖófZ®=È8OW›¡o3ÿÁ/»GÖµ´_7Ö³OÔs‰ Àt°æK¦ßleÎ(çàGpÿÛú$N ~üZÿGü{’89‚˜'¼ÐÖÔká·FÍ òóýfXÚíÐ{ŽÆk‘å^Ú‘sßÞ2~ó5ÑiW=Ÿká¹­,÷ ¿.â§X®'vϳŒ#m.ú† íàïˆßqÿË5âÐ0mÅÃq}Cø¦ƒýGhü÷ ÛZP~ƒ~ÿL{L}½ìæcÌõQw1¤ƒ5'[®ŸõÄ‘kA~ÂR]P=¿¾Eç {7´ôGuýõ´pü}FýÒü ·ùß´z­ÇþÀü×…[àØü¢ÜÏzRÏZ.ºEÌçJ[3öƒý“Æ}Šn¾¯I!¾–Yεê©þFܼŸb9„¾¬+>¬k ú¢Ùݽé™1×ùfYÃkg ë>.4pL/nÓÆ6ýg™ßŠy`=uMÔ´¿%ž£¿-,×:êWx®ÎÓ€é[Yî}9Ür§-Å+w[Á1úŒÌöнÊùú8ܧgÃCø>ð~ÔêO²Œp~„e¬^ó‘}|È¥­m97a¦¶!Óð7úe[[sݹ –ñŸÀª-þç˜d™Ëž¨qe¹ÎüK_8pos½cg«÷ÃpúPµQÜ·Â.%î®í¥ó;©OðOàgäŸá¹–ù×éMÏ„—¢5æ%,Ñó©¡$ÞËÑàÿ-õx@­:âbøÔ ¯Ot˜ý>¥óÈzø­‹šÆ+p-â–[Xúƒœ‹Ú©Íu-¸/!QS ?¼ŽãìcYw6Ær>ï~–ëv„>à€×"FÙÜŽ­,}åˆksÝÑ Æ 9{Ô¹mjYÃô•p \»[ó¼­¹ðS–±jâûÍݦgG+=çUé…JWÛÿ ‹Ð¯ˆ´Ëô=æo¨6Fíëoµ—ö&u0×”qeÞW}&Ÿ¥ñ>OãÇø£Ó±ßNÑÿ§[ê†c-÷[˜#šE¬/æ¨EýßH˘¾ ñ“•¢ýma9o>æðtuÁ;?>-Øï¶è:–ùß7-ë8ѳ“NyZ8u§°Ÿs/ {®—n@çà«á_¯{Ã2·¾²ÐÙ±‘xk«×º÷ؘ³ž° Œ˜'ì{ç–uOÐêPÑ÷òämæ´|‡ޱœ«Ä3Úªÿ Ÿc¾MÄ›ÂÖ†/]-ó¹›êÝ1O¬½¥MÿAÁïSw]CûcÞzv°ŽˆÛÓ‘ó¡½è}3Å;¨}mtMK¢¥®ƒ§"×sL~oÅ®C¶#^þÃXéªç4FƒDo°o‘®Ÿ¨c¤åÚCS,ç´Àk'‰ø4ïÛÙ2& ¢fû÷·ÌGNÖ\¿Æ3ìÈ,÷œŒüü>j2ƒþ8Òrýë˜wŒlÅüfl÷¶æ^QŸø¶V/˘RÄêÙÍóh¸Ž}G̰ïÿn¥fù‡/‰G=rÄ‹Àÿ%j7Øx²Úµ[—Zî5B?Ð {é÷ü¦¶G¾i¾eüÜÞÃÖ\on_Ë9¾ðPÄ®³Ìã Иoo¹¯ùj_ŒülDl'l£ˆ¥E,w´åœ°-Dÿù¢-çO°\‡/jîTTLJ?nÂýÇ…AŠg?“ŽxNxõ”tqÍ'w{ÝAüÿ.Ùcm,óÏàÿzjÄbŽòþì£ñ£èí+?,·¢ãç+ô{íLñueô3æ že¹þÞ¯ˆé†O ¹Ë.‰žà9¶ópK¬à;8 ¦DŒ1ìe¹êçÂÿwÊáún=ý÷Ÿ´Œ¥=l9ÿ÷¿Ò—YÆü#Ð\zgÑ!5¶ÒÆ‘ÂAÕñú{Þ±:'\Ïåû_üÜÀ26;År]ƒÉ¢åÁê×–{i£óK­`Ä$Ñg;K̋ړÐàI_Ëšñvº¦¯x"jÓ#þŠD}Â([c};w},ZiYÇòÀó»[ÖØMÐûhOÔzÅØöÑÿð$òz€åÞ~ð…æ|{Žûn®¥ý½‹Úù8°é2ñ\Øç[êû÷c}ÙzÍ¡ž–só“M-ã`è•ÙVç`Üwì wrŒ·Ü“`ŠeÌh²e~ž6FýiÄYÖµ‘k¦ísÔîÖÆ ;Umˆy'Y®i¼›žœEÝÅiºn®å\‹­-åký¦ÚF- ˜‰ì‚Ó`àRËõÜàâ7ø•xÌLÀ' îO Ý 6+€ÑÌ¿EG|WmÚG}ZµÅj÷×õìS,÷ žk™Wk9p{Ë5m²\wÛ}1QÿCx ú“Ú¢Æ ¼‹ù^Qc 6/Z­1Ÿb9g¬§åú&1?³cÓù]-÷Oƒ&Zî£|¤åz¼LF¾Æ[½–Šã¶ê2阣 Ï­-𨰋Ç{ºv¥tÆ3Eø}ªÿw¼ßJãŽÞ5²ÓÕ÷™–ë‡}:vWÝsœ¾OSßêá×loËŸ§þ!‹èŽt€ÝGÛwCËØWäEã9;è¾Èml«ßÐôVÖáó:Ð`4yl|æ$V2âz€šðYÉ þQ÷1ħÏѽ` ¾ÀÙ¢oÌ%¾§Oêô‰3ýPïB'D.ŒÀî³¢®̼"z0bØ|?Aý‰¼bÔmo¹nsԊεŒ©í×D7>‘'ñP]3ÉøàS·Ó³Â\¬wâË€“èâ#`aÌ=ãúˆ ós=: ×_Î?o¹†Ù[£§…ÿÌ=ÅxVXö¬ð¥åúš1/%ôÍtñFø¦´%rÞóÕ®sD{Æ¡zF;¾›åü·è‹_‡§Fá\K}o’7¸Ï23Ýrí–©–óöG©=‘Ï"רO}i«ÿö³œ/¶ŸÕû’8îGxKžö¥¢=6ÿ¶èó€°ýßÒäFþ"ìÿeuTzÏ*ûÅsïû‰ûï¶¥¶wиµ-8~\ÄÀ_‘¾X]žQ¯ýÁóØ+Ùi<6·\ϾŸ%þ‚eà2>IJþ„ëZYÆ#7ïn¥ÿ¶oFÝIÔñ2ó¢f'ò–¡‹{ªŸø`këèk©³×¶¬ËŒºÞ~º~}ïeõú®«_:ë ]Èúwõ;æØÎ¶ŒóF¿8ÀMlį[®Á o#¯;èy;Yî)íí«vt°¬Ã¬ëÖ–œ­*cè績[‘AÇЈËO²5íA|°=l+°i±ÆüwбèoøØÞr/0hcK=³…e¼ºeëž–¶oÔ¡„}Žž‰¹Ë{¨]±vEÔ@í(:C7üˆ˜#6»éðó¢oà?õ€WXÁuìyäŸØ¿ò‚^Š¸É î]¥kC‡`÷ƒØ‹QûÉ;½h稜þ9cô :á<Ë}é¢63b9ÈÿRËúœ“-÷7 ý±µe&豕¥¹yžs8"Ç~ˆ­¹ßãfú ™¦g2®ë8¶‰ô]uŽåJ 46ðNÌåŽü|;ÉÇ‹ÒøÖÈäÚ”e«‚ýwYÆ:– Œý_|ß”¨ø~Ô™-"–¹ô=›èýµýdõ¿·h>MóüR|=ôÀéêßÉúŽ~@àóÙ¢1ïaYƒ¸©Þ=ÅÒ&\Gùʨ#AGtÝc®Ã½V×½º<¶O=à´xKøû±hô¼ðœKÄ}ðˆE>÷ïÂò+•ÏX¯ýýÁqð£Mâºzù2¦õzpŸJgƒ`‡ëhõ>¾;Zæ« d ŸõpñÞôßzè¸0BÿÍÖF­#ôx32ÒrÍè5ê¨÷‡âû†–u ðæ`Ëu­6T;çZæ°ÌrÍŠ¨wémkִĺkY½ÏLóŒ'<ŠÌ^ªóÃ-냢.©9¿±‹úÀ5È2 &ÄœøaœúÔ˲ž t×1Ù2çÄ3Ñãw]©~´±œwKãþïËœ÷Dî:raÓƒEó,÷•$Ö?,Ò÷3,1Y·£î~¡èÃû뺣-÷m'6¶ö^¢Ùa–ë1ó r¼à7ñ´?hl¸ž¸?˜þ#ûØï`x}ƒ®½Z÷’@7£ÿ¡vž w€5_]ù}‰eŽ9ðŸ¶Î·Œ#N¶Œ3Ÿf¹7õޢˢzŒ‚w‡Z®ƒ·Ørn ôÙBãµÁ»Z®r¼>cÞÞBË}Ñÿƒ,cZÜs¤h}£•½XŸ³ÜGìTËü ãùl«˜¿yµENê5ï±CÖÝ),ŠœðÊ‚Kn÷®UXç² fnb¹Çq3 °ô•ǪÿÐþü¯Æ >Gþ‘IälŸ¡g kÎàÛE>ê8½3ìÆ]º»îû”÷ŽÑø¬cu-Tøõ¾"‘ÏbõÚ[3cl‘ÓÈç@OôÞZŬö˜üãÂÿ{-÷š„V‘· üǸFßo·\óùNËú ‡,ãß+õy¿èÞZúçKáÿ+E?ø£7Àð»•ÚJûX®ŸË8\oewx›cÝ7A´á¾ˆ› O"^Má먉ˆõ­¢þ| =±ú¨qˆZIÞ1SÏ _ ½åü…ˆ!Ý,cEœGwàt±´ýcî.´ùÜr¿îQ–q•a–{ã`€{Qw ©¶×ûq‹ˆ]ï`Y›³‘Þ»¶ÚÜÅêý œG†[®¿´¶žgâ‹Û¬žÏQï-FÄz:ÄA±°oÀø O²ÌÁŒ·Ìé c¢& ì8Zã ŽƒC‹-cGa ÏÓwpó,=û±¶Es] X ï€ÿK-mzô8y…e=ø˜ú€ˆ¸Ìy–þCÌû¢žƒXÐÕj75ÿØ÷?-ÎÕAþ»üÇ_¨üjrˆ¾§áùMçÁŠ›ÔnÞ9BãÈs.×;/²\C µœ÷5DßUOQŸæYÎ{‡¾1'lK=˜²uå~³ÛÎ2~sºÚní(z¢ÿÁ0xL­ó§ë™|Æ\è',÷aZ g¹àbøÜaSõÑg;aÆó?ê5üµæƒÛ´Ë…eøw‰goÞÝ#ìzÁrNø(˵ug5Ðü‡¿Š^ßµ\ï¼Á>`u~Úíè©?&æØl"zFÍßÑ‹;éù‰ÎÐlAN6°\³»É6v:w´:ç]ÏeìQ®q éjµŽ«ó¾o‰ŽÊ ¸vÿCMôÁÆÇgúBøÿ°ÎýL¸v?1ÿ[ÿõç} ú¯Ö½àû›»‹>pÚ·–€ã-5Ž-¬ŽA;-ÛhŒà½¨ßÜZüŒ\Ì)׺_3ÐrÏ)pe¢ø°Ù¾ VX ¾‹ø3¼f›žõ&QËþoðûñKó\XÆT¹àºŽ3Ö¬,>ýÂrýÿn–{‚E|ýŽo×YãØ°ÄÏq–±Â¨½ _&°þ"˺X£aˆ® ½Ó_ŸÝ-ó.ʹz]YìƒUGe›zíDÈÝHËšÃý,k°1«ëÜîš—‹ ½¼?1Çn¤è8µéŠ<ì¥ïôa_=rW½|ÂÆúnáƒ:öO,á8ñ~âot qôºäpè… Õ>rµWªýŒõl}ÿŽe?Ÿ_×ûá0 Ù^ªë¾«g‚±þ íø–î_ÿ¬wñ¼Èï)z¡ÈüAßCÿЧ³EËÈâ+Ä\1Þ> mŠ83ïü‹ž‡þ;]}šoYOº•øžEÿ¢·nÕØU! ,×Gý¾hŒ Àk'Y®1ȵÈì8sÔ/§>æ÷ª‘ä9»‹– õîðÓ¶·¬ˆø8ôC+Ùðp‹úž~4¸Ö±¼·^×ìÍr]ÔùµÈÞº7æ£ ;ðÙþ:À„Ej#ß²¬;Ô|·ïÀ²ázWËu_4Èe9Ù[tæ™Á¯ØAQÿ ¶Áw1/›ñŒù.m%?­Dƒ÷Ëá¿Ç[m÷ø¹Žz7ÿ-­ÕV0 _¬QÝ£Çab]ô±ýßX®Õp—p{UâµÓö!˹¿é¿·Ëó=ß¹†úϬÌ?øÌr=ˆw Æz-VKËZÒ½ÔN°jªåšá E·°g"öÓÒrœˆcp_Ëõ–[Öl}·×ø^n9/,j?ºYΈxó"ûYÎÉáˆÍø¯u–]IÌâuñ£üe¯#ÙH´ë_ð¬–)|‡WeËòþˆ1À‡Q‡·‡åÚ E›ƒtD¿FJ.¸9Œº[~ã§ +ïöÏ‘–1ᘇ ƪ~…ï¾­å<Ÿ¨¹Úβî0ôKÄó–óˆÿDcˆè‚ý?ÆrïŨõ­Øtõü¯¬ž;àvô–û€Ý¡ÏåÂòÕ–ûÈ£¢(ê€ÿÃ÷Zi9ç÷qé%Ƶ»ÞÁ³^±Ì ¯(mp\ia™/xøë3-k°á×ÐoŒñZV×ñ»½J纔÷:VBóYƒ˜Ü_ßñ¥NÖ¹Ñ⥨=aü‘‰«-kZæ£Þ;l =j;×U›?M<‚œù--}€ˆaõoÅ<âÈ[ Óyx |E¶O#7Ó²>fŠeÜ?l åÎêýèƒFQçÓW|îÿV:Kõ›®«;èú˜7„ŠÍ† Š={kÙÃ1t¾èÄ{#§ñÎæü{Ôn‚Gjì¶Œõ#£9Çé¿Ð`ØíLL{›¸ vóÏ-ãçQËÃõØÉ`räo¹÷<}çÿë9Wëà~°±»hL{Ð;QKq®=-}ø ƒm:çÑûû½ó:½—œãODK>ÏTûhºmšè}NÕÿ£§ßè­XkŒ[¨1ÛNã5Qc9À2=Içéϱ–ûqÀïÈäú<^ã¹ÐrÿAèƒÝ=÷•å>X´žÁ~ {?Öµ  ô@Ì[@Fú—£^SúÊêÇåAzv—‚]u=IԹㇶ2¼µ'Xε›eY[^ï`¹–Í<]³SÓu‡©]Sôy¸eœZõŸu¾` eSõ«›eÜÞì©6kí…z½ï~úŒ<Æ@Ëùaã,×ÚËr.ôtËxHÌû+Ë8P÷Bó:ÖŽÞD·˜Óµ¶Õk¥×óÈ7²ô»â9ý‹Nð±Dw#;Ø·Ø'è ðì(Ñpš%ÞÏÖ÷­,mŸ-׬;Uc†Ý~ºåZ¦gXî—¾¤éZ°ð2à ¹Xp¸ vá¿õ»²Q|/Ö9ó¯Ôç5úúâJËõÀÏ_èYØÔèpûDK[pgSÌ»‰¹$E·Cõœ+u?Ïßщ6ßÓotÒMVâä¿×»¾©¶¯ë¯Vû°_ט£ÏÖsNÕmçók–µœðÇî–¼:V|fKQ‡žŠ\ÎBý·å„˜£p€Î¡+ˆñ“çý£è‡~ÛË×çX®Ã¸¿úp‚åú|b‡MrßÞrm1bù-ÔfxYZ[öä+b5ð|[a:à «ç½Ö6²·“èGÁ^ð æQM²Üci'Ýs¤è{’åÚ¸[[Μ¦ß1›cS%5:è¹ÕWìM,ç¸of9ï>ì¿zv[ágÔ²"‹-ëñÞÔ5ÄT÷ä±³˜û?"»ð~fe3¹=þ”åÚª/H<_ôiÿÓ±íÿ­ëVéš,ç Dîø£r®^wûué…¥ƒxÞ#VìaôüЂ7þ{]Ëý 'ˆÉ[¶¯ö×çõ]ËØáÖ–yCh¹½xlwÑž ½Û<uriƒóÌÁ–ñýé–kD¼e–euÔ—†Ï2Æ·£n´¯hO".ÕGߣ–!r=ÍyìÈU±\$bˆ?¶ŒûD ^Z ¾G»á©‘z.tBÏF.:0?æ#„Þ`¹— öU/Ë|´IžÞ³zWÖB½,Æç'¦|„]1e~ÃËÛY®·ù·°±OÔƒA`Ã×5–Çè¸@t vö;¿Át°œý›ÚÃoìéÊouÛ*ÞwåÛüûz&ÿýNÏþ³ž¶÷1êGÌi¤qŠú]Æv}9k܇>£Ñ97ë][®#„LR+þÿÕr-‰ïZÖp^¥vD<;dÑëb˽Ϳ­çÿD}û¦Ú¶vä·ä ÜBN¶ý©åþ'Yîkµ_Ó;–¨Oè–óÕîUê߉ÓÈ#ƒ1ÏŠë#®w–úr„~sMØÙØÎªQvÜx³à‹c^øìí-c[Æs7,ãà6Ê'Â8â$ÄS'd¿Ù~â½ð$25¡a—Óžy+ü¬˜¯Í²Àr?—¨-™*þ¹‚¶hœ÷ÑxAìÍɺþÙØrï…Àƒ!zv+a?:Cù‡X/ÃûÕ²ÉþÆ@øM¶žúÍ}K­ðã)’ç¤3®¶ß«ç‡ˆÎðÜ!zïú­ž ^¾¦vÇÚOéýWé?PÛŽV»¹}x€ÎGÍ=þÁeêóU–~ÑÏE÷Ð%´=æŠUñQßÉs/Ð{Á»#Õ¦ëõ<žuŽôÔÅ:¾c™:BÏŠš®˜Ç±Dïž'šp}ÄüÐ/û[î5ÿ"Gð0ź £Ô'è¹KÆå<ÑpOÑxÑ›qÀ6A®Ás°ùR½Œ“À¡ˆéîßù«°‘ض?ùÕÊ.ôúíÀÒ?ë3r¬<ƒ˜uiàÛµºÿé¦wñŽ»­Ä78À—+¬`ì7,׌ zœ¯gͶ\c³ÁyôØŠ}ΙÛ-}|âT·YÙW†Ü9ü†ãD¿?éGˆ^O ?â7¢:¬¾Zï¥ÍèBâ6È8Î>^ã¶ß¬¶\`é+ļ&ÆâþÅUz6ö2 >EÞ6°þú¦ãï:OÛþ¦£ò=æÏ3þ¬sà|q‹¼Ç†yX}@7`ãƒÃ7ê>|ôôÀo}ÌŠÞ ¿Øó`pÔÑGp$6r–úð¦|oÿ|M}»IíøÞE{;õÏ;UÏÓ¿gY—}OT®´ô…®o¢ßïôýgê{èäãšžû¨è‚ŽG.ö±¬+âÙ×é=ß]¡>â^¬ß´'jb>A¬9zLÿá‹füXü<«ë0ÿá}ðêËZ:d¬ÀŽß‘1ø7æiNšû ` X‚ݱ é]Qã·§Ž¨޹ `ÿhË}>ö°œ'¹Œˆ×öÕ÷Èÿ†¹8pcfM¸Ûa”Úˆ ?DׯܣÂÅq–óI­ôËíH°9#ÛZÖý€Ñ·üuÿÿsá¯|·ý?mOŒŒ˜5~V¥UràëüÜ"œ9]+eß?*ð°0ßá>}ºVºáyË\âGŸÖ–s¬ôÛuÐ[å¼cã†Ís©XÎ ]hâã=A´ \‡ÎèYd[4r¿ûZîkÕ¬×÷iúÍØ‚§;YÖöð\pu²e­'ŸQãú‡wN?Âc½Ä—ûhŒà×–²O”÷÷޳\7o°Æ&jO÷Ôûˆ«Ÿd¹ïÙTµ}Œe jÔ´Ub튈u©–¢žÃØEç+æñ½w›ðdá'~QÆÇß ^TØÙ@¶±_µ‚ ,ëÿ¢.äÏaâih±£ÚF›w 稿ØâØé`Üþ–{3þ¤¼Óõz[|zZï§o×q§bÄ`'öû–ñœût€ùà!v>:áA]óm}çÁŽÆN¯øÜñþ9}rÿãúö… {±åþÊQGÊÿ`$ó»Ñð*v ú[²ÂÕ¶²ñ²ÚþªÚ´%_.@\b¹·Ú·,ׂ×Ñè¤_è@üE}ù›úÌw0‰N@Çb_€c‡«½WYÖí kàÓmʳà±f|—ÿýŸsÕÎGÎYCvÁ樟ÛLôA÷Äzèl|ÆÈïpÿ^–6]Ôq÷• ú¬ð\˜¨çÃSSõ>x¬¥ÕûLyœá".o؈è«=ô^huøQG·Ú;HòŒ,Á¯ª?‡¨íQç‰üW{xFËufÐgðuÄúãÚˆ!tµ´ùÿÿì|ö˜cÝ_ïW^Ôã,Qgÿ‰Õkè9îÑóf¨Õ3Ü/@§"³k‰>Äü™+QÙ¾DÅú°þ½c¥t:Ÿ˜9`rìË„_Yî/Cnàߺ^óÔ\G=£k>”þêcõ~Ïu=bà)~C'KÛ{‚e½ÐbCÔ Æüjp Z$ÞŠˆ¨#œ­kw³¬3œe¹÷@ÔM´ŒýƒYÃÛÂ2°­åúèý-×jjeé߀¯-×̈º_ú2Êrß½¹–ñAä˜-˜<Ðrž8÷"ÄõðïbžïxõoàÿðÑñœæ$ÔµHQ¯¢ypž_kYè^ë}p]±‹hÝ„>BFÁ>teäÏÂÏšc9ßlŽúùÅ5.ÄCˆkV˜Ñ¨žÑ€ØÄ`-¸ ÎUº¦AÀdp žïÑê7z€ØLÅ›žƒ?©•Ãþ§f~]çÑ3`mØôÔ=¨s¼›îù½Ú€M f_d¹¢ê[e5ªqiT<ÞÀþù´|oŸïþP}×ÁÚ…¢=<ó à‘?[®Q>c³G ý‡>¸Fô@¯üXãÞ÷g¨øàUÌÅCFþ¤wüŸž{•¥/çO/D-: æòDÍÿÑz&2‹îŠzšˆ¿â‡#oðXŠýÕŲfý!Ù¥ïé?äe€Æac½§°ÿ£‚Mnw¾,°«úKÍËð\ýEW9Ÿ¬Ö=Ã-s ô¹{~ªÆjžø3jG¡õ| X5Ä ˆoW|רúÔ@'Q†}}‡í V5àzÄÉÁ|tCÄÊßÓÿwê7øO ~Ï‘ùŠæ x,÷ð¹ê_ƒñ"®s‡îÁg+Óµ<ûßjOõ»1BXÍóÀ°È÷aCƒŸŠ‹7z鍯©Aí½½„­ŒøUé¯ï/RñHcƒÒžòJM\%×µÕ7b/Ô:-Ò½¿çØþÿ}b^CÌ1ÃN¿MÇ¢#}G7þFÏãYÈøµTïaŒðÎÖ{b.ÄuzæM¥Ÿ®“«ï覨ã„oÁFì6üë˜Ss²åÚM!¯øLÈïéê²uzèbغا•ïæqfðmœø ÙÚÆê˜SY!Ìo-œANÀñM-÷û <™¢ßðuÄcÑ?àîÆú ¦ÃïØXÈlÌàØ.çë~p$æ2 {ýôŽá¥­^Cuâÿ{€{QÿÏwxÜGþ° C^£æ¤Sé_ì/[ï¯}È+X¡ŸŸÇö¯øÚc.ĈˆÕ\!LgÎOÅ»ž®ì·ÿ—KgD>;>æ@Ûguï*ÙŠ¯HµÉïî,Ó'1#|•úõKàâGåp¿&ê|Àž–óáB_ް\ïüd <Œ<m¹æÿƒ3gXÚþ|†/‚û35nQñ¤)–¹âÈÿF,]0Xc?Äêõ ½OïX½¦„óXß]GkËùÈëè=Ôolë[Ö#3¾QŸÃó·P»à‡.Mïç9#Å7aëGýhØ|°ÌÿnÐÄ—ŠS­±ö÷ÃúþdáïÃÆ¢OÈPÄpfZúº1¯>j߸~oËÚqdœ¸8‰M, ¼ù¥¾ƒ/àørλ æ‚^ÀfÃ*žkðÚ†Fƒãà+2Ý_Ðoì]ô.þÆË'¸ìÿIy–cãS:ÐKOè>pl/á7xçÑœÏÁà—…×øØï• Ú˜UtF lž7 Ö· V˜/ö·±ÜÏe–è„ï…‡nAV6ÑóÁnäû­•å<ÞK® _|ÙNtAæÖÓ³¢^®_iŸ?gµÚÉq˜/,k7úÈ–{WŸ`÷ã’ïûŠntl®ì©:ß{«ðÿaþKMX~åZpoY®íÀíÿ”pä K„˜Ï›:Ð%Š…Ôs“y?v9Œ–Ò9ºÏiI_ÁþAMŸŒaÄ ¯Ä_‡‰¿YÆtàãó-× ÀæØËrýž°ë§[®Ízžs1G ¼®1š¤ÿøºy=ñWÌémc‰÷í5nªWóëûÞâ‹–¹á‹Ï‰è'¾Åþé«ÿyÇDËÿ.âÅ :ßÝrŸ{>ÃGÜô{dáȱûX“#¦÷˜Æä.éwph ËyuQ·º¿è -±í"¦N`‡MÕ'cnEͱlÓ+¬à=ŸØ©`ñé¨YÃÀâÑà6yä5ûi@K°ñ~x=8Gìämá'>ÂÓ–û¸>Zb.Ü×è-߃رŸ/´ŽÅ£j mWÁIpiGËœc{|é_c˜ìwèͰ±¿Wîoô‘®ªd¬q ÚŸñ[½]‡þA'¼QüÞåèÓUº=H.ž>ϲ‰ÿ?Drס³ÐeϨoëx]Çãzæ•z¸}¬å:NçjÜNÓß¹î[º.j«.·¬¯:ÙrĨ:A´Ã?À^€‡Àø¨÷ÏcÎrØÖÐÔ„ýÄ~ÂÆÅX[øÙÎÒöm©ñé(|sרëD¾Ç[ÆfÀìBü nzq8ð[[fõöƒ%±~É$õþKf¨O<³»x¬Ób>Ÿ¡{ÚêøµÆ©³åܧm-×M+;Sõû1Ç}ìŨé{?ÇÕ1ûUËõ‘®³\´’C«xÐ*9ôõ€îÑ«,÷€ÇŒÜoÔ‚Þn¹NÐ*µyìPúíúãéOôûÝ‚)Žÿïëÿ˜Oö¢¥Ý¼JØíÀTp¶“Æj´e\q!oµÐŸÀžð_ј¡¿£h¦ï{Yæ}›Æ/âæ´¥¿Þ?Q¿cžW«ñÜcü´™_Ï2îE¥èða¡…ëd¡g¡…ólÔ:· T7åmà}Y®'s|cÁ8K]Ekže hÄoÖ-ï«×žCo?.žo#¯Š÷Г1&âjÈ ²‹îÝMôã¿Sôι…ïóÁ+bÓØíØãàiØù1g ¬"ƒN@ ®ÒýQ«õ?ÿÑ'öþý–ñh†-©›ø´Ä×}îÁ»åhT<Ô€V«Õ–Ï­Î4*9ll-Ÿä`õ“ï{ŠðöÚâu0|¿ÒNžé1¡•ê'>|…ß]ÚÓh(ÖSáIcŒtmƒ_xÖ+êÇ+Ò耞Ò)÷ˆ.+DKp{órÑ }…þÃÏ@÷Ü%zb뿦þYü“Fgµ•g¡+®UÏÔø]¨ç~˲æs¿¦ñà|Ä~þl9GŽ1ÿÁøoèºoˆ"fuen&>:Ár~UÔÎÓuZ3ÅùõN«÷:÷y¿ÿan©ïíd˼¡OÆ:âùS,÷ŽÀ·ÁâEg°išeüç@õépÝóqÐÏ1ߺ=àõ([sÎVä1;©-ªÁp |Œ¸öã::zªOð,0¤œsüx[4yËꘊëÕ‡:Îò?ö¼CŸüF'á÷|Y|&nçÒn§5c@Üñlߢ3z\'t”嚨KÿçÝá«¡ŸÀ0;>ðÛ? æ……ßþ‡NX"~‰øÿqlúkÒÁà´ƒWÁä®–ëâ`G­$r…í†Ì"?È?zm”Þ1L㌿G0戮þc÷ƒ÷1…z½Bü Y {1b×È[k«÷;¯ó³Êÿ:^FrÖOxúÚƒ «Èq'˵N•¼‚›ãÔWÅÔG_NÿVß5GÉõá³V×ù'5ü7 ÞµÜû÷Ò ÷[îÏç­–ûÆî(|‹˜ÿ¶æÞðŸ•þÔñŸ7ÊsîØ•1ljqQ®Òiµ…è.¡‰ó`gÒtà‹c»D]ï|U`|Ä÷ÔgØûS,×Ûx\÷+l¹&BÔhu¶œ¯ ïa#Òýðåpñb¯2v±ï§ëû^–5ùŸçs¨eÜp&^ásË=tGé™ñŒxç·UßÇZÊÇ «ç!x®¦­e ï#«÷h«çøvµ\«|'Ѩ¹Æ=€œ"KèXbÄÁ0{»ì »ž#æcñÿ¥ºLÃ9Ný?Ò¹¨gÁ¶%~ý¦âüØSuغðù—å<8ïñuü…{u`OS‚|¹Äý?S Î[j¶ðBµôÕøƒ[cÄ´ ]­öj®¬ÛÙ~4À£•7–ШƥQñ{ctÑî+ôW-Ðæ²Ïñv+ù÷ V•¾y~ïØõ·‹†èLìøgÔÇ[-s´÷èÏøH±¥uE“E¿ˆ/Åœ.pù:WcH©•Aÿb£i¹·95¹äq~':q?˜–>/²\ç,G&ÉÄ:~Øj‡é™Qz´Î¥ëÁ>ä ܤ®%ñxs]`2 f#È2Яüï~Ø2Tc‡\3ûh\#‡uKØ›ð|`ä¯ÏÒ=»Š'¦ZæÀ0t\È틚N޶öÿꦎå\ÿaÿµU£>´_þëÙ¹Ïðª>W 'Û[Ö>Qëó;_בox<ô{–û€½",¾Y×=!ì'&ôá7:â>Ëù]•6{ÞæóûeËõ¸?Õ»W[½Ž¤ûÏé9Ü‹ß Ž`'`€1Äkz•6:^E|Ä?Õ8€ùK,sWðLÔò¢Îoíoi·ò0¿9ö¿åÚ³£›x`´e c5Òr}¦—–:!Æ+tƒâ“®Á&|œo賫úó´†6µi#[û£Þ4ò¬ãõÞ¶…wbÞ±óØ:–yâT=Kê¹-ÕŸâ,שn¥v£C6Ô;¢&YÄ>;Ü2í°©‡3‰€ÔN‚A`âOõŸØõØØØœÿgÈ9þZ×/÷‰/ĹÑøà µ,ØØo•xŽbWÁ×ı …—î€óè 0ó¹r½_ƒ-ò_Ë8ž’g8Rß¿&zwMv-à¯sšÞ Ö^¦v>%œ¯hçu­UÇ ÷Ѷ5ªç7*~kl¨˜¼öLñ<'Áuð²rÂn»ã¯¬/ð¤hø¼èm#|0ÿËÙWD úý•|€uBo¢îR#¿‹Þ;Mç‰Ïýðǵsôù+íyÃïYÆŒB¤\ßÓr¿•c,÷¬Gœd‰±§‹öÈ-4Dñu;Z=gÅ÷óàuø^Ëñ刯‡ý=XcÇýÈ=²ÿ"OÄí‘i°þÆàýð›Ð'[®MD¬Ù6[Ç }³œ£5Ð;â-kÞÛª_o G_/ÿEÜ žgÚæ>lõ~0¾&hg«ç¹mÿ¼ŽG¤Þ(}¨×êOòþ¶Þ ¦/<"]@œ§òkܾG'w#6q£ÇõûVé…×ծǬ®µõãE½#æ­,cçÏá¿¿éúëËs| ziÌ6´¬lë®–26?ñ|€½-ëMb.ç±3"þ¿¹åzšSš~Ç|©¨ýýÿÃÿðçT¿Zû1Îá'Œ*ŸÎ«Â]·Aà#ìß¡–1%°>jŒ¦Øšëö±œƒ5›[½×€?ÿ1Ëõ}ZY®94FÏ¢çÄAdÜì.>Rí•?££ÚÔÛ2W5‚йܵ‰mÍ5ø±ýÁQbzØýØÃ?ÔÿÈèïtüQ¸rÆ CÁäì$Ëý¤.Òÿ`v/>#1«ˆ·Çg̈úMl}â9ØÄ`<±–ÈÐ_lt¿Õîï[ÎßÅݹй^C 惨~<$<潿VûŸ-ÏõXÿýWx?¥`yã`é€Ò ÄŽàí¤3ú•¸Tcû¢×¼óKéÆã}õñÑ€~ÿTm ßÄ~n³´ýßÖžl%üïX¾û³Â‡‚Føcà/vì·D?ú….yFÏýÆòÛCÆü¯ÏÕ3~ ûc‰Óô;æÎ‚¡‡ë€Îøèd¿‚8Ë7u>b¾è^ä Œ{KØÝÓSmÆfÿmo¹'5| ¦þã“áƒÓè90;ìÅÝõœ°7Ô3yx‚åþ]üÆîùè°ÜØÂroñf›?lưƒ¶å·ëƒtD¬øU=#âµaósžèWôù—V¯7Q¯%5Lï€~ªrüoYžá1º×,×NéªëùŒøÕ¢:w©h9ä(üxüì>bÆ×ê;y™ð*p,ÇVþ™þ ÿ@µ? '>õþ?Ò}1/ Bw`ã `ãüŲN»þN˺÷›,÷äýEÓ=ŒÇ½–þÆy–ë«ÐG³¬ÙPc…¬Ã_`1ð)^V{±£ï/øî63zœ~½\ÃêÆAÒ dÓƒcØæƒû!G¼wñü7s ÆÝàñæåVìú,óâ·¨ŸôŸ\Ø¿ZùøßïsŦz—„ã?íÂŽÄþ"¾Ž£o/×ó 9ú¿ŽžŒø+xv~¬µ ±>ÐOlÍ}2ÑØÏ3-ã³ûêyøòàÄà=°žÛZcй`‰ËX€s6С£#ßΟ¬{‘1hˆÄ¥ÐMØà þÀŽMÇ–â‡þ¶æš%1×l»¦g6×—Æü›M,cÄà _Õ{ã…>X¾×±óÏ­öܘmiÿóÿÃå³®õyÇ2÷úœ0|™®»KçнÈúóÒ¡'î·¬áyÙrOåG¤;ö£Oþ-pÞs?´ŒýD½çëVï'Sç$;©-1_Œ9/ê¾ÏËõú5èݨãŠĘ‹}žÆ ¬?Ür_˜Ë5ÛrÝ=ÎͲÄOøb‚eL¼±ÞÕÖX?ÄßÝN<ƱôË:[®¿1é×e‘ë}Uã¯6kžp½¯WÄ€û±×*c^¯Iÿ¡±½ŽÓ³°wˆÃǦm+Ú¡¶ƒetô,4u{ÿcµßtpm7˧¡jö z{°Õóñ®`Ïa–ûFì—öŸ{Á+0žÚD0œÜ"xNœ€ð'ý‡- ¾?nóG— /ÀžKu µ”ÃËÆžÅG ŸöaǾ(ûì&Fò‘þ_n9 ¼¾KïC÷ Û*ãR¯O>.¾Ùµ‰—°ZîUN’G®ÆÈsËmd»ƒQ¯©ïo#ÂÞfr ‹ÉKï$›¼Â‚FõìFEŸÆ™Õ1U¾ñ ­ÊóÉåúsá©{D[ü–ÈüWï‹ùgê÷ŠùD^~‹Þ׳ž´zNžÓúUõëÓ’—p]‹íÞ½Dcþm}^`¹^_äÐ!‘Ÿø›Îý\ßÁRì2d6ð‚ÏGŽ!ühs©°·Ápäoy¶€±­ ¿»mþX4ðzêä°ÀdŠ|sÌ×>\üGNÖy®‡—‰´Ô3b]‹¨ _¢¾"ðŸóQ×óo"<+\ãûáçë]~ß”ÝÑ(Ÿ~]Ãjÿ¾ÞWåÉ09Õ7,çàÞ,üÆÎ&Öò©0þaÃó–k2¯¦/×3Þß]èéúã>=‹g0W`¥Î?Ù¤oÐïç²]ŽóªëôÜwË\BÅž[æÿµÊž³^­þ®o¹ÎkÌ%“Á&òO1¯w±eÜ'Öð ½1År>Ç,ËµÖÆ‰_ÐÇ›ŠÇ6°Ü²åÚ›`ûÚ–óÖä­a÷÷(ã[ëïWËX:ŸléSni¹æxàÿFúÎ1ÀëÇ[Æûyú-æ ±zÝçz··Ê89¯D¬ªŸh\ýs4B¿ÔµÔ&ú®m9ßm”Ú‹½†ØÉrN14&¶sœÆ¹ »ó<3ð¼ë¿£ÏÐ|þ¦é×V|ë5˜àtÔ1‚ÏWè7xõIɺíZñZãŒk[ç‰éƒ«Ëáu”è|]lrb"ËÊû“N?m®ñEÞZ–±tz·ÄvÀ ÞCß#WY=/Íkm¨áìZâ8n‡?£~µ—ÞÚ\ñj¬=ß;UØÎW´nT8Ú¨låÆiú,¡òü6¾Ä§@‡]+ÞºTtÄÿº@íY-z¼RÚàïZ[¹„ÒÍ:Ý6>4B§<%šÝf¹ÏæsÞ³¿x=ô«[æí¯Ò£B÷o:W?Οà[ ‘çfüŸµºnÜùÿ>‡.È 1t qË:·½Æog]†ÚIŽRûñ7à_tÏ.jö<ö_ĔַÜg`Tá—:6ÉF¬×EÎcnfG˹¢ÿ"¼Tü¤ÞÏ%ìiáiì \×ÙÄ5o–¾»mÿš0Ü}F8ŸåþŒË…ÏZÖîG]窂ÅîÜ¢Ïu/ºä^=3b÷ò5bÇºÈ ¿¯öKRªM‡òézˆ97[½G|¬Uïryñ/u8Ù\óx¸ø/æEMñ|ñKÔ«óqltþNú>˜hkÆþñ×bnOË=ƒÂ¦ÿ0Ûçÿ5J?ëý¿BÇk}× êXþóõHË#®ó³FþO›8§y_?‹ºþÇ^ÚÃê5a]¿Çø!«àNÔuSŸ6ßjŽ×E|RøÅy[µÆ£B>È•O‹Á¾õ ¾ï-úbûõ؃Ĉ­ çฎ~Ë2·ú“¦kˆÅļ/òˆØ‹Ø±Ôt>¡8} öVW²á5õ×ë¿­,ñ¢º³•â+[ÈŸTbŽ}}û ¯«Õ†¨SE§ó >E¾e‘xêtµD=§ç’‹#ÿÛìëЧˆÓ3öo »Ñ)Éèª~àg|"¡¢Yãéâ@£eÿãëáO¬°´µ/U?ÀAôQ¬õCŸ• Šüo[ùA°*êÐÄm°×oÒó.±\?4t82‡½Ž Xõ_ÿGXλZ4¦Í{‰Æè ônÌ)9Mïw—ê¿È«‚Çàh{á: >‡G‘¡Þ²k|mp|mË:»¢ã=Xm§g[ØÌ²¾d¡å|÷–M¶“ê8]ÖÃþßÑ ýîh¹Ö ¶XÔ‡Œ(ÿ×k4„ØþðBÔy¬SôÛÊoZbPèÅÿÝö^!œÑÒ@¼kÇy@Øõ;ÔŽ>l¹®ÏƒÂü¨·¥'^׳¸þ¿ºæE}b¿ß ,Rúa™åÞ›/‹f«…ÿäm>—^‰üð[ºÎ,s˜Ð ;´³Æ<¿Á÷­ÅøžÛYî…º›eÞ…ó“4&ØÖàäK? æIEŒ#ò¬ð6¢ê£ÜFnaõÚw±¿Ÿ÷ãeáÔÜDž‡#æ /ÄÿMüà±û÷Ô¾µmÍ5ú‘×6¢_ÄÔT#æ:Vu_QCæt|WüùF[_ß"/.3Ë4Ž/êúÅ_XÆ6[ê>°xväÖ÷±Éféä)ò»|“wlDâ:È|¬ÀçZâ×Q`#±kü™°‰“o+G§b£_§˜u¬áC¬™Á†GööÅ_‘>àztõÇÒ'è=b?ع`5ù<ð†¼0qŠkôYE‰#ÿCÿÝ¡>`£}QÞãñ¥g„£Ø†ØCä-ÁFbÙàúà?VÏïõxº ¿ rÙÏH¬,ÿ7ª{<'j•>*6»ÛѼÿ=ó7¢#ô$çþ®Úpv¡cÄþ}®÷¼ û_µ?®:êÙŸÝéø®èÀX<¨> ÿˆ« ‘½5î`78 æže¹g2zÿbÑì–výÿYÖäqÿ÷Å;‡h< Ùqºžïİ=Àbx®wÁ~çah9ªð½ã.ã;Aãû[KyDÞáqjŽÐUèul˜£õî¨!óÃ?Xÿ®úÝŒQ1ÿ^1Çñz?ò®8@½ÎÏ“À©©jWs ÿMÝ1ëÞÒ àEØþŸX怗Yo‰9þùš°ÿ6}Þ¡Oìÿ?é¸[8ò¨ž±ºÜïz|xÉÖ˜§ê:c™p?ü„ëQûëüDjþ~Â{÷¢oÐY§4çÉuz,ì©óŒý^–þ"<²0jOË}²bí¨™‡'Àw°žeü?ð?ê÷{èИÄ^ËŽó`ãzMôÀr®EG[3/Œ¾Y·\_× Ñ.lɵ¬Žï» Ó½`q½çÑÚ¢Y‹ÂnÏ·Éë}ÌžÖ÷—¤>±œÿð_¼åü MÑó[ïõ1GNÐ}èÓ#,cFÛX®—„oŒ]DÌû$ÉÏ,ñ(ò{¶åÜQì<0ê +9d,‰¹¡ñ‰lbûƒÿà :;»|~Lqb6ô88 KçÈ-ƒÉàÞkÛ=—Ú£è ×Ð}A^à?º÷Ÿj6íEjã ÎÇßh¢rÿS½÷µüýL¶øíêu7øÐóRËõÔÀÀËô.ΫCÑuYÚîè·–{Áð|tø9pú»¿èEÿŸ*ývò\lûþ:wby¶ç Þ–€+~õùg]KŸÝWê\§<>EŸÄ:ø WYÚöáÃÏàûi¢Yàÿ/tM¬q¹~sÝ©MÏï¿ÓÄ+`ñQj;´Ãw“±¿ÁÌCõ}ˆì¡÷ Ïûï·¬žëŵõüf°ùǦ‡¿Ô{Á|ºjó!jøíu€[ª­èl9tC7›–w»­ó„Âæƒžð-„ÜÇz/\öiÄ‹{K~›c ;—ïgvüW¼¨ŽýD­ÐË’ç˜?±ø{õy“ð–œme“ù|€Ù¯çrE¾+âGoYÚ’/K_D é%áÏzF̾É2?ý˜¾?]Æ©ÖK+ÔîÅwøÔ²ÎÚµ´œ/€ÓÝ2m°ý‰9 “7±\¿9rÀÍøÏØc[ƒïØýäP'kÜ'ˆ'ëàÙëëýŸ«ï`r`qWõeY×z.Üõ–û·«Ž·Þÿa€ÎµÐx;êÕÄ«],×¢ ‘sh¯ç4ʘx[{Jç|TÚáºÈÊû]'ÿ§ŒM}lY«ÜWï™Æs#¿òŽåÞœÈÑÛâ¿î¢4BW-µâs%ú‚óßÖw®Ùßr/?dœ@î‘ñó,cÜG^Ð~‚Øò`ùЧV½ö®jÙÐ\Œ5è#˜÷´ìXžõ®>ÁLü“½tÐ&ðèÏj+µù;(ß§`#úÍùþ9õó-ÙÈÐ…|+ø†®¸QþíÇoù‘žn»B×õŠKKû=ÞS; ¶_ù¼¼ÇóøMwê<ºê½ïÝÝ¢žŸ¸Ø{¥mž3þž°{‰S½¬k?U,íóB7×ÝBOŽ’®øJ´EW^©þà­½ÐCèšã5Þj¼ñ÷~f9_ïB\‡s™þ;P´Àæú!x#bEGk|.°ô+‰ùE¾\ÜÊr_wÆû†(|‚½õ+ËÚ£«-÷ž§ø® Ô0a¦úÁ³±oˆ©â\âÝèst±(0&æiF\EŽ·Ñ'¶¼ÔVÏÀÆÂ¾CGD-ùºúÄ7QœÁ?Á(xu³‚™Í¶b`’§“3_ëf}Þ"Ü®xÑë4¯îãÜ¡ÏÛ,ç{Ý/,ù²ÐÑñ:ê¢Nèö‚-ž;ˆ:¢ˆ5=ezͲ®g™e,j¥ÚRɆÇn³\ûyˆåZÐëŠN‘·™hiÃ«ŽÆcÑŒÉtqÔøDN—ë§iŒÐÕè‚–±ö¨ciš›ëmüJã/§mŠNp{³ô©®3í`9'!ìü~–µºQƒ£¹YŽ»/éX.ìUL†~¸¾_Ë2†öªå\nìËžêCÌõxGã}OÓµÔ(P×,¬o¹çÎgº¿ú©XS½Q_ɲ°§ø[ »?lBl4délË=Û‘ñˆ£.´"O‹t8B¬¼—±ñÑQô;Ö-ÀÎĆù\¶*þ𳺆ÿÑ_ §;ËÆï?†M†“Ǩ ¼û,Ë:1p|Æ;©«_0Ðc1Q—=M÷?g¹Æv;8ˆ½‹ÝNƒ/íö¶Ò¯¿ê=üþ±¾£ÃþP>]¯ýRí€&ï[® v]©û¾&z_gµ_äøû`¹Öû ¾¬†/(y÷Sˆi€Ýà)ºr e¾¼]Ñ›î+õÍþû˜ë–þ;~ƒéÌÕ½Kx°\z ÒnóãüÞÊ<€‡„AÏZÚô\ÿ¶åœ%°EÁ×#÷Y®÷„ô ÇM–1 ˆSÇë[èæ4½¥`¾÷s€Õëq;þ.¼ëQ;Å<Š^MÏZDz–©Y§BOä0räì£VúLýŸ‘ 7Ád }ýmÝG`Ã"gØ7ô+jç#GÚŲŽUñKÔqº°Žô¼ñ•òø@Ä(ˆWaCþûßSŽ:~MÏEo¢w‰Ýœ(z-Ý^‚ï`.¶7ö/ý|dðý–ƒûÇ¢¯`%kY€Ûà?ŠÍSÉšûàãÞ ĥŽ×ó°ýÁ@l`âGP{9ÀÿÏ­®ò¸m{@}ù‘žÃ3~¨öÂc»ÝßYØ_é…Æ&Ò%Ô¤ŽUÌgb‡ƒÕW« äoñ©£.—ë°YîSÿ3Ñ>Ž£ôÿ¶ê|¼½øèÝw‘Ž“5>¼g±åN—‡n`cĸo­Odýüié³?¿;†˜ v xfGì`žž1Kcx n£3NUûÃ?@LÑ'ü‰ŒàS€é` <„ÙÛr~¦zïCO!{m-ç Öýй[:Œ¨÷y\×Òþïeõ¾ñOÁŒ9»· ï+ž÷9V•~uÛŸß?~¿-ÜTzàiý~MØ|]nÿ·I<®#l{Õ­Ös>´Ì[/³œ“ðœ®å¹wYmK»Ý v®g¹Ïì~úŽ~狇¾.žŽøþ±–mDרù™j™ o¦ÚÖ묾[Ƨޫxœäbªx}‚ús¡óý5rø!Øc ô¹“茜!¯øöØ`耥V0 ÛÜ»NãÇ®Fm>:á%ýÆf†Î`/ n~"œkŽ{@ç»õ.Úq²Ú]OŒ<9Eß¿,÷¸>é$q›xx"¸»½úyry·ã üòi‰õsõG¾nÃIÂÍÈ/£ÛÀ tòÒ?×Ï«?íè‹|½óÆv3^Ä~ªgÇsÉuao€‰`ûYŠU-S[±Yþª[âzÑé½ÿï›ÛDëW¤º)ÖFMjE?Ÿ{6T±­Àñ˜Ç.C×G<†¶üAíü†x‡ën¹Vvÿ©–óòƒ/¢®] vFv‰øˆq¿íh½{{#5V3Å#訨ÉùDô¤ía‡WcµÆü÷6¶füE·Ìӻè目6Âc»Y®Ï2]íÀž›¢1â{ĬÁó¨aáý1g ÌÚLã¹EiKì¡â29Ír½)~¯m‰ý3Žÿº˘›…­ƒ>±ñ+?Ò*Õ.µÜÛ…˜ËßlM{üaÿÕõAÿæ£GîNy[x¹Ò2Ï«ú¤ÈaÔu OZÖù<×ôüæüð Â#Íar þ´n¿ý@¼÷Ûb÷ù¾èïá⃖û´EžžÏÝõÿË\ìËõØxW a{ÔRÝm¹G!ó`ŽÏ`ï£ÏÍêyÉÞ'ùdõ\ôQ⥨ã‰|n«×j¨kú{‰7ûˆ/hÛ/ôî âil*lwt ú¬Ú£ôi½s¶zïÆZWÿFã÷Ÿ¦~¾¡þo¨“Äóó›ä^ÞEçÐ1;=èüLÛYìä…¶æÞ¾\ŠÚŠübÓ/!žq‡Æ¼ÂÆ'Þ-©‡!¶öŸ[½.²Çe¬ØÙ®°]ÁlQðš˜KoÑ÷DÑßl‰uÀš+¬è,lñ»ô¬gÕö£-÷ò˜£¾3ŽÇ©Ä\Ð9èê&+üòº¤Ã¬Þ«…5=ëvCÛ¥?þ}€ÎŸ•ÿ=>3°\çkÿô.v·ë'ÆÜD7bc£+ÁÐk-÷­ÿ¦eå6][á|cGµ§ŸÞ­~£c¹bKÄ‘ѳ¸O5Iµ?5NøÏ1YþybQO©Mßµ´Õ¡õßÕNð»)æiWíÄv·/´¬`L­˜o³µèÆãtáiêç!úooñuø›êí¥þ ñE‡aë€Ã Ëý¸‘EôxNžUþ¿?ÝëÍð||äþC·ˉØ×(ŽêvƒÝ„¬ ±\¯kGõšìj™ƒž£wÐ'mÞÒ2®>zÔ®›ï‹õïoŸ°\·™ËO„ûG óc/ø±}~?h9x…Õõ&nO>¦ë*XâøÿxnòÌ[-cA€ßQGÓQï.ú|j9ŸñÅŸÝWc³•Þ1Ecº…åÚ®½,×g€Ç¶Ñý[Z®SJŒ¿åPñ5¶öîzî@]3T|LЛ7h\™Sw•hël|Zt„ç¾´Ü :¢gÁºôžÃÕâ6ÈÐHË}nº‰ŽŒÏ&¢ûTÝ.œ" G‘aì¾?ˆ–ÿö–Ý &£·°ŸVL惦ØtÌMBG?!îÇ9ìCìàïhL¦‹~` qþÇv<¢¼Ûm~è ^¡À¨ýÄ'QCŒ\ž¨6Ï×½¿èÇïA>¾´\Ï¿cŸŸ…^ØZí§n‰¹Z•>oTôõ5f‹‡™ÓµtÈZº¹Æ&fõN7é]Ø+øDø`9 òœØúO û7SX+b±0=1©ßZ®ÙùKË<Ïo)ü§&±Îû[øÅÈç#z7ú‰XÞ¢ùì#| ü,âþèó+E㘧þŸo™‹Ù]ôÇ–ˆúžÙâÃt-¶_äæjÜwטu°zÍ›:W‹¬FÍ3ôìc¹~2²×Oß±ѨG¿ Ó}›iì[[æ‘“˜sÏ#3`¶°×åCsWë¸L7Ý_‚C[é|áÔWtx°‘ÕúÄesc˼eÌã ]³–eý jÅëuý?³¬Ç¼AǯuÜ+ìŽù|~aY þ†åš+Ëóëu:£–ôiáËëÒ5a×_g9ïëM˘Ï'–yÌ›„ÿÿÔç2«÷dðzd³§0µ›åÞVW~òuÓ«ïÊži€'St íÀ€¨ñAïŽý"¿ë3 ·z@ïÿ‡Ÿ˜ëÔ[üî-^ØYmb¬ÖŸ)ç±ôŽúOá²ç o°ô#ç4º¼»^ÿs˵ÆÇê~ülp÷HñÊÖº®¿ž±·ú,¿Öiˆ?†íÿ¨tõó–õº‰®1ç’÷Ð;£:ðþgz7r·£þC^b- t×û–ë QŸh#²óÒ 'x Fabûƒ%Äç‰ë€ëľР¿-¿È<6é+%6â×-=ÐÍØ×ÃJ¼]'h¬È-ƒÓ«àÎ÷Dÿ?+–Ž#Ævâc¢>u°œÃ3N¼!ฆa/ƒµË¤¿6P,èìê¨ð°qŒpœuŽöW´hTú¤QµŸõ)|>×3Ÿ«¢Uãåz¯É¯ðÝç,ì/ÿLUN¡QÙ‰Óõ¾6êþ)8¼²`·û¼ëa÷ÏÊ=çyT×£ ®o®²Ü[ 1LvÿfÒÐó¿EøzLø[ètb÷à?¸ù]Ëu¾'Z=j¹ßÕºæR}Ç$¶u’øû¤¦ã@ñc ö_n¹¶× úŽجŒ›c^äÄiütTÈýâ݈½"ßÈú†ºfÈ8r€üm-þ‚§‘uú½…þÇ^ÿ8ê yXõ@QOÞS¼Õ[ïœ$Þ:VÇbõu˜åº4gkL#Àyô[Ëõ`"ÔÆj_Àqÿ.aî]²gÁ]â5÷[îûû‚å>/ ߟ¦?.¬=ð®Î¿b¹èrýÿšåÞa·Jç,³¬GÚÿ˜v«ôÑM–ë…’\G}e¼¢Î“þOÜ$^E–*»¨-‡ÍÛGcs5Æ6ýî©ÿGë³½>cnUÔævÑùm4¶Ð½Œ]ù5£qUÖù^¨ó­-ã˜ÈñÕcÄWc-mÅ›è½Íºjºþ›i¹ÿÌa–û¾m¥k6ÑàÒ¨2`–ݳ¥¿>.Ïè3ò3ÏHÇ.Šœ|ŒŽ£Vû[|Æf$_ ¦ÎÐç®j?´\{ä@v±Ü·‰y“#þƒ"Ì‚9šëä±Zì^lŸÏôßó²y_TÛ¾¦öÒF|lebFè(pŽØÎÑççå]>çõ–¢K¼¶ç7êCГçN-cés [‹GÐQ/rºÚoi§Çü¿&¬Ó+,óõy®’m¦_¬k*Ú5~+›¥zV£Â'_Ëëºörá~oétÄQÂù· ­§©ÿfÿÂ}'0¼«äÙëxfIGË®çTcá댢ï©AB¿£WÈÖï#úCó7ÔŽŠÿ=Nÿ)^çó*Ð?*câ1&ÆL'Nón¹?¾~ :ßë] o|_ßÑÉèã%z&>ïizÞÏÄïüþºx ü ûM¹.çÉ#ô\î¹@÷ Ç±{ëÀ0~sñÁÎú¹&N„¼ Ò=È7øuƒc,kÈÑÛûêss˽õèYÐ=€¾@"·6C¿‡ˆ×ž™¢¶ÃÃý-ã àÄbˆ7µÐï6åÓqlÆ÷'Æ0û^áîµÂƒÀÿ°ùWX®Dìrc铨ýú ¨÷ ÿá ËšŸ°ûÈïË,׫þ¯å~1÷Zæ‚Á™VêŞfÌÀSìr[Ìá?¾Øý ì¯OÄ‘ŸÜL4ÝTcu»Qs ­ÇYî§2Är~gԇؔ‡Y΋8`GñØ2V×·´ç‰›\#>_¾%¾^ ñäº3õ{±>ÁGbÌàið=þ)1Ý“Õ?x|BŸõÖ»‡j| ;ùþO-×ÝSô·£^Ý𨰈å^cÝÕ7lpûŒ¸8´¥&§ÒõŽÉÌG®"¶ƒ·»¥¿ì ë¶×yb´[i<ø} eí±câä"±_i17âÊøwÓíßJþ=Ÿ¹TtD_€w`Í­²…+zyÜù¹S/!ýü\á?†GÍùž¢7úY¡vcËÍÐ{"_zƒžžáCîT°Ñ±¶Â¦F5öï‹?ÿ(&?ûýW=«QÝßÀÁeþ-ñÌŸK‡P³O^¡êkƒþ1Ï™˜xީˬûÈ?–]¾µl#âL‹õYÑ5£ý:ô#8Aþ&ò,Ä~,z¢Þ?€1'öֱеQñŸû ûצ±|B|s™hŠNAGŸ/ºû·ˆ‡®·\—¬?OÒø¥ã<ýw¬å>0Ø"`@Äÿá¥i#ðÒ„Y´ 9:Xã îߨö¢oæjÌ÷´Ì7Ã÷È3¾zl? ;2¸P¼ N ÿ`ý,˵cv°Üs&â Qw¸¡þǦÛTÏØHm§­áÃÑó"W¸¹Ú€ÍÖkmßSv-É~Ìè¢s«-×u»Cö5¶ÿ]‰˜÷õ~b¾ç@4Ç+Öµðwáóu–¾Ñœd·÷ŸµÜ;þnK#j>ßiÒÿ/XÆyb¾WÔþ¼^ô‘Ûáªe÷þËwÔ8}§ðŽËZ…? óÔ¥¡W'YÖøÄ|¯–s;‹–¡{{Y®kïdž[î 1¹¯t?1Z¼·¡î(¾û±Æœ¿J¼†>Ÿ±E–¨ÍœÇßÜÝ2gí¾¢‹N×óçˆÿ6Ô;{ëýèçW¥G±ñ‘©ö¥->¾`ýrËu.ãï4ú­kd…G¥3<†Ì{Èå]l¹Vïaúþmµ~¢‹°“/µÜÃïñ÷dÑocÑ™~ÿÂrŸZlmbÙèÚÀ¶&öðCáä\=8†D½ÐÂ&æx.Îá£S¶ÌI?¥|#^x†ÚJ;ñwËY–ua| wô3øsƒÞ ÆK` zñÙbŸ{®uá7qŸ «Õ;SJû¿ªŽ •NjTÏjÜ([ŸZ¢j ç óÏ–ÎÓÿ¥ëÏ(¸î1—eÒ9ÝuoŧîCÐwrø gêžÅ:GÛºI7è>§18𸒡ãFþCï OÔ~øšZÛžê|ø’xõ'4ì°¥§å0”ï—yJ¿¹g­òÝcíàîo…Õ|§&<êúÁì…ùàkéì‚vңР›™Æ•Âô÷,÷ £.(rÆ‘ó} I÷¼Ð¤cbþ× –¶>øor¯Õ{×û OQG¿©åžk×Þò¼vá%Å>r\$úO±\Ïg¤åzÉ¡o;Yæfºj<±«Gèÿv–q ©–¹ä už±Dw×õ;ëÝÝÅGðö¸‚.‰‘~[G/ñ!üÿ·©èà±qÚù}ñþàxË5B··ÜÏ´Ÿ¥ Ñ¢I¯¾¯±ú¤Œ³ÿǸa#¬²Üs`¤üžY¢íFfÁÅߨMÈ56WÌËç@ ƒó'ªßô݆Œž§ûÎÒ3ÁPð}AžX61bñÄ °£±¿‘ÝÇ…Q›ÉŽþW±cÝï±á‰oÑ?â*Ä©Çû×ã´ÿM}8Oíú†ú?7§hÁÒø QûÉ¡ƒüÁßô}š¾SçPµÉóŠ‹9Ý>/:Ús¼øøoyéP=ã0á6º¢‡tüô\i§ë3t"òW鯗ù¥èL ¿ôú QÆ ã|Ê3⇢/üqƒî%ž‹®>Uã‚ð®Ž5~ø Ç[ÎÙ'Ït¾e]ÓRýªÆ ºãw^¨sð2ˆ×Öê5}üÈ#í£ë¸?›a‰Îd)ƒ¼Ù¦Â& é®w ¿Ð}€Ü€é`ÎNºg±åzcü¯ÿÇè;¼õH‘#ŸÀ° ¹û#w5`ù |zôŠj»c.mÿ£oÛ—#æª{üþnË5"·Ëïg„ 1/ëI«×¸­÷x]ôüÂê9Qç¹Í²îÿaÊ›V¯‰Vï)¶Êr½ˆ×¥3À|ò½ÌAÃö¯ìL}¤k‰á½*}À{ÁêÞ¢ôÿ‘Æõ9Ù6ÔN Óˆžá‹Eî.èzuC]·¾å:ÊŒÇLÁµâž9Vïe ±±CTïÏÙÊrîFäfvÒû'ŠOlwbŒè ü÷ýÅkûŠ·/¿N±\_Œž¥öï ÒûûY»ñ|ÏÛMãö‚ÆãIÑ+¢'ãô±® Gó\Gñ®˜c‰,ÿT´FÁÓó-×\ƈ|Øq¶®oÿnYgx±å^/åÈ!¶8~\Ç‚‘PpÌc àÔÖ:ÇÑRöéçzÇ1¢Ý Õß O8oÐ6bÈãÑ:sdÙ'ÖvžúëD Žï‘wäY÷ ÷ú Ë[«`Œ­¢µ&Ïhvñ:‡o0Uö<1âY»“Z‰c‚íø/»ZÆiŽÓ5Ûé^pü"ÙöøÈÈjÔõU[éYqíÉò¾YðÚ×ÉÀö~Kº=†m~¿åº z]Ô_Õ~rø!Q“ú¾Þ÷’Æõ_zæ!¢)9ü˜Ï÷–hV£#Ћ¯—gx>‰>Ü"Þ ìÿ¦Æh©>c¾¼ô :*æ@D­²‹ŒôGݶú›<Ä•jëñ–{rîR;Ï¿±ù“‘]dA¶£~<Þ»›Þ±DŸq?Ÿ“,m´À#d,ÁÞÚPÇ]OÌaŠø¼ Ü ·"þó…ŽO%×ÛW ‡ñƒ°Íc…·„×/ û6`¯ße¹‡rÔ6ÆÑ(÷»_ñ¾ðb†žù¢åþïû—« ïI„ž Øù×ë¸TÇM–ëY.³Üö-Ë5Öº[ÖJn&ZþLvö+þË4Ïv¢9×b Ô½-ãC›è{jüºêüpãz§æÓ¹};K÷ųððÙ¶.|ç1!|Šð+7?¢SÛ6Ð=CÕÎý-çñl¯ÿ£–«øl„ÞFâÿ Òûj|Ö*ãíß[ ÿ_±\»/ò>O%]ýy=tP+–âwc_!È r gȲòCË9?ØÕä…ÉÁí—ZÎóùž'yK<9ƦFîÉ%¼Tl}Ç•†0¶½ü»½„uð%õó3„·¼û4½yAvð3°%ÑÑø û>ul‰ZùùoÚŒŠ½þõ3æÙ¢GV›yÞcMö/ïßB¹½pE<¼tÄ¡+Zë?bY ÓÖ½û ÏêÙäÈÓâ7 •ˆ|-õDèZ0ˆò3^»Jí:VÏÿvöŸZôŠc.ý£†|°§Áù˜Ó@ÛMt!Öô²Î!Äê>*÷»ÍŒ- þ“—EÇâ—y¥´Ïçi<¦1¿\üÂýª-Ÿ—quÞ9ÞÒ'GÑÕÈç½ëë[bU·«Ýðì\K=_·¶xyÅ>ÛN¼|î¥ÿ'é¹çkìÿ¤ï‹,×âDö&ŠÏNïОÔFü‡m-÷—¢½Øû1S-ýh<ƒùôŽ ô?¿£¾:•\·°z-|µ,óÖb/˜zßVÍów, ¼KŸÿ°Üg ¿àNËÚü7óY5ö·-¸æóÐÖÆZúæïzAmxBÿE.[ó5ý5¤üw£°›Ÿ9Ç—Yæ ^W;>ѱ²è·©cîTÔø C‘éJ׸ž Ÿ#î?Â2ÞsZ÷×ý3Ä/‘Ïg¬kìÀEÕ6úi9g yÞXÝÏr.÷Ë|>c9ÏRá›m&~å]»ëݲ«¡-õQ;6Nm¡½è·Ñ–µëX® ô¶Õ{ù8жõ¬® Ž}Àb¿7ש]Ô.d—~ 8O™åÞìœÇ†#'ñCý¾_¥ïQÿ\í¡>"›Ø|7êàø éÙÿÞ·+xï˜&z`„tÅ(§ýÈèÝj7üOùôþCä¡9¨ÿÜUtFo`˃·èûrÑ»½‡_ö¡tkB¬]tŸÇÛ¢îõn¼ôs=ØL|çy=û5õ›8ÆÕâßëYøõØvèõ•âÈëÎ,òPãmøg§ˆ±®ß‹è}ìt55²]V–XÚ%ô ;ñ6ñáR+6Á¯5î§ê8Þr dÛÝ5þäþ!ÞÞÎr_AÎïf¹ßÔLýsbÀ¡ˆ?LÓ³hãË5‰‘ùÈ7Æ\‚¨í!Þt·zÏ—û·¬ŽÙ¯1¯\ÇxÏ2FîVãíñû…½Q³ƒ þªå`§Õ²¶ÿ¨1a ÐC· ãßÓ;Ã÷ç½ ó¿8ˆõ3ØÏou“¸ÇrÊ/,çc›å>a}E¯ò«‰/ŽÍÀÔ˜5¿S¬Øã#›è:]c3ÙrnŸQ .‚»QÚ[ŸC¤÷àÝöŽ»ëįÃÕÎ9âç ÅKýõ¾ÅGYÖ™DRË5º[ÎU ¶ûÛZ4èXt³÷gްÿ“r½ãý‡jCÔ´òÎFÑþ<~S§A¬ÛŒø&¶ÎwE[dìçú|½P´æ:dâ‡åÓóǪ-¥/¹þöB[Çxt]EM‘VÞã¾ñ´È™3nèÝÊ~ö8ÑPÝû¢?<@\Ÿ {š|2y æôQ«qvÑ)®·_ÒwžƒÉa÷#`16yăë ú¦Æ[YCî'èþˆ=Rw„¾Âß³/Ÿ.µœËÁqªÞm­^Ïmâ¹ÅjÓ<=9^h™/æýWZ® þ‡°½¥Ÿ²«¾ï.¾«Oä˜82¶!˜…ý‰ü×!¶ýÇ–{ó®NóÀ<×»Òr?È÷-÷¾Wím”ïkìÍ>¶E[Ë5í#wÈ{°ÑŸÑõ Û?*m‰}ñj?äqË=o-:Ã~,ìÇG¸V×½ª>½béï˜ú m°sŸ–žÂ‰8¹°kñ 4C/`SÃç½-cF+XÜL/>EÑ,WÁÆn¥Mõ¾_Sñ¹Ûéù­…·¡޵Ìéslª6ÆÇ\ãmôûx/íØÌ2/óù:XÎio¹Îøžº§¡÷£'öU–þ»þh‰…ðZè>žÝU< ^R×€,‡:Y< ö"¯aëã⟣sèº?è>l+쩈Ñr-6‹ÿ€ï„í>ø¨Ø§wP|Øñ–6ÆÖÿúƒ=¦LN=‘³yj/ú…x2z  lXl9g^:€éê~>?˜@ì\{Mø?K˜°ð~±°zþKõ .S¿ÿmáö)´Jz\ŒßA÷/•8Q¸ V´÷ú™-õ{”ÞAíµ ‘ó%¾4¡è·ÆÎÂå!ÂrxIl¼K‰ŸMÖ½ÈγÂó-˳j›û«óÔþnp|w½úQ|ŒõDW胞&—Ž¢cŸ*Ïw\ßZcÀX&^ùƒÆðEé,æ «wšCoû“å¹¾¦ÐG⻣4nûÙšûx#+'Š_gpýoâ­sÄgȶ6¹lzô#zþF½ÿVKŸö2ËuI±9ÎлᯈÛo©÷_ ~äü¨…®³Ågü¡x,êúés¬ežŒ‚nØ‚`¸€mŠŒútÆ\êÐô¹v± ë9»ØËï C¡xô¥tÃ[–q!0ýe«×Vp<{Sxÿ ¥Ý><ÒJ÷¿nu<ÁßÅoêHïV¢nt•å>.ï¨MÏ ·ñ!˜ƒPaŠÇ{þjõ”^¯ûŽÕó‹ëýÁÏÍ5ž&ì‡[p-t3¶ÝË)ña0Œ‹8–â,n/cgÃ1ÇÚÖõÄQ±çU{å×Cׇ¤ËÞÔø0ží‹®ó1T¬ñý˜‹K›À®qú>ÌÒ“»é÷¶zfðA›&ZŒϬ¯k'YÖзj_Äïƒ;J\þ™o´¹îé g S°CfŠvØÛÈò‹ìsϱ•È"+èl(òÄØÿØT¿ÖýßÔ}È>öyôŸé™ÈøÙJvéZV¯iã¶&8Æø‚3ا›©¿ÈÑÔ–ë-k¥Ñ—‹†gY®L_À bP1^ÁAç€iÌ+^W8ÜWø¸ì_lvløC„á|?@øØ(í÷z›-…ûÇ óÏ’ =Kxõ> „çÄ{N+ïôu—yïf…þ¼í¥#bÞ:h¬ž·…t:i’°—Øq(ìjä9$ÞÞE×Í–S» €MÈXä©—zøÜêïb=~¦›x z’ÕþzÇ –ûÎ+Žåtÿ–Æ ŒGÑã• â>úòf9:ßñQµ—‰IßüÞr=ÇÈD ]¹yÆûGz/º{¿èþ],÷E∹Ëó-óMóá˜hië…­ˆì·°º¦Óíø— æÖv`aÿ3‰‡±—ŠÛªáDí'qÍ–²[ï¶Ìß(ÜçXf™{}Á2öóUÁ¶¨áw Žšâö•þ¬×ã þ¯žùˆå\°GôYÙ¾ÿÔõ 9jX=ÇËíUh*¼¯×èo¹&é*Ë¢!:¶Æ ]€ÜÚêÚ¡zj[Ëýyyï1¢ýŽOÆ'æ†ã÷úLÏzAÏY»Œ‰Û8`8r7HÏÇ_(zƒYƒÕö=ijí,ãsýÔ?p›>êâ§Y®uæwQ›ºˆ‡v´œ_0FGï&òNù/>nO‹è8¸½ôºYÆ•Âg&†ÿoñ?¼Ž3›ÿÁ}d¹_š»Yó‘ë›tXÞâO /°Ãª6yMgá_ÛrÎcÙô_†¸1‡]K›½_± t:XôkíöÑod4bØÄž”Ý +¾óXvWµ¡¿°t¨ÞOýu.äP©ÉÙF¸¿«ðy¦p}ŠôØËõˆãllõZùž¿¦.•Åï¤'ÆëÿqÂètІizþD…¥nã×ûÑ Ì ÀG˜ vƼ8Úÿ}Púç1.k½¯=t |ȺäÖÕØ wº #éÓê |HÌýŒG¼ßìÞB'_t²tÀD«×Àð1FÏb+cS¿_ô›÷?ýåÒ>÷=–—ñvý‡_ò©øçËxLÄ~Ân>DÇéâË_ˆ×Ðmà¶::k Úwúac\¯gÓÎoJ¶ø¼R÷ÎÖó¦Z®úá7âeÚ4Cm¹B¼¸›åºtûé÷b´û/tú¢jS½§ ¸Sµ×åYV͉ã:ñìÈXÓ v7qü› ¦Öë7ZÑž†Ÿ[ ;—ë<6úý–ë6ü[ºâaK»ŒlkÇÿPÿÅœQp¼¢Ÿ×Ößl9¯ø6éæ–Ý¥k^µzÇNp »wýÒÆOÃÏ·zŠ&‡7±™ÑóÓE?ÆjwÑ{+Ñ'âI/¨í_%î{Ü»•å:ªÐ2^mÂÆ—;Yæ2Vëÿ…¾õcaÇw³Ü°µåþíèóÍÔÞÐëíÔÏÖzǧz?q™MõŒÀÿÀèuÅ‹ˆ¿#÷M{›ãÿ½ÔÇð÷žÕóàͺ¦!®#ü&dîïâsìldüÇæA¾¨åç‘stù –uuÈr}—îÇVÄgXªßàõ?'è^°œXÍ|é„SôžÊ§ò¼¶>srwÕ3‰9EžÝs tÂIú þºiIÁPÇStþ*µÞø³0zÇÒ?·5gÀu]7õãBé~ïPèáúúrxy]¡—Çì_.:ÇïÙGôÚJcÊ=¿¼«¶Ðxûës=›ß E¹Nþ@|¯¡ÇÏ’«ßEüN¾ÿPñë•â;Ú‡ ³Èrï‰}õŸ½õ÷B çQâ„Ä*Ñ#à6±$òTßhz>Ÿ1×—ÜÙ·-ç!`oàOã#wÀ¾Cßa›ì¤ûyîžz<ŒŒ¡“°õÐcøÈ1€m‰Š}‡.…G×ÑùŽÂå¯,×LþPrNì‡Üë+y~½`¢†Ðy¯œ«óÆ«-çïÆ¼+bC¯YîCˆýfºg¹e¾áxé84ïÌm0?æòÒ¶w¤—¦ëYÈXÕµôÓ1 -z€•ʵõ¾h`õpÑúmk™Wß\‡ælÔ{–½Vú]ÇÉá‘–ûLDý÷—…¶Žj<"þ?Pïß_tzLýÿXíºùV: ÷¥õ†¨ÇiYúæ¾D«ëxë};×µzÍ&×+oê™=ÔŽ®å¼ÿFŽú•6;m9×Kc¿ŽeŽ»¯žaúŸ}KÜ›;e„x“x ñâ&à91{ä{ ìýƒå¾³à;6:2þ÷¦ëȱaÿcÃá㇭°úý‚•Ž×à2Œ,!#Èã¼òé5•ÈÖ3zDzIÏ´\­Ÿž ÿ¬þñÞŸïZ½¾›ÛäÜ3¼ØŽ[d—‚û“…yØõÄ鯒þ`\>–^ ?½)¼ÇÖsl"Œ£óø §J—Mfóû|]Û[ÿá«\ªïû©<{O=c˜úÎ=ÄàR;y×b½oÛÒŸºÞ_b¢ðv¹þß_×ÀWäFú¹/B›*¼ª}ÆùyRãˆÏ‡Í€.Gƒ}Z´"Ü@ôž\xÁkƒˆ•’ÿEg£Éc£'áå?‹‡>þ3Ö·‰ïÀþ«ÅsÛICα¥±]°¥¤ëñk–Xî ³DŸØ/ØÄúÑ—éÙà10K|O-ø}¦>O‘|c9'[ÌX¤ûÔï¨ý_ kö׳Tb¾!2¶‹åz¢Ä¯Á;ìp}€u ²×êØ >SÇr8¶€³ä"o—½M æIá)r޼·Ôó‰a¡ó|ož ¼B˜¤8BóàzôPwÙðĈý;ªxÁý†ôÞ·¥O^ÖsoµÜRùÏ“*wà1t°ªƒôRÌuêbõü6½¯]hàØGLe²åÚ:S¬`YøS³ÊÿõZÔOHp_Ìá˜$Þ˜§qd îÑûÁîvz¾jû½=ë‹61×"tKè)ð¶‡ež¶—詸|­¯5O¯žË×Åj;¿ÞÃ3ôó—MøßÙrÿÈV–k>t·´ÿÿ;è:ôŵeeyÌ s=|ºx|©ˆZrwÈrHìÙ¢^™ñ˥«tžx/±×¿YÖU gQW‚>ß±.—=ùYÁ€ÿèpd ÝAFö.Xáq‹µ¬Ž¸ ‰=ýa?cŠîÄFy·`¼ë‚-÷(ùªàDZ߳Ü7r p¨åþ&àèÒ1× [Ñ¥"' Ž‹¡Žsgµké• ;½vÛüÝ¿…0g¦¥]O¬çaz`þbé>—HwŒNÿZÏ>Dx=WÏëÑmQç3+u†ãôåÿz?É·¤OàÅD¯Ij{›òœzÿÍ÷Å_"û‘« üÇîÏ©+:Jç°á±ëÂoü“å|…oéäÛçhÉøöƒù?¶¬cF7€ï1OtñèAúo¶þç|5Žÿ;èÝØúä¡öÑ=´{GËø{{sˆÎEþŽ/²ÝÃÒî_fõz_×ÿX™Gõ/añãEÞÝÞÃ6ÿ×’NàœbÕn³‹!„ß··œË¥˜yÌ3ök¿ÔÿÔñÿ©èi•íçq¤¨?zQøÈóßöÄ<´×Ô>ð¥£ôLä¬#ÏÙ=¿»^ˆ\)Xs§£¦~üŸ&ºo®¾´³z¿ƒzïõE“:?UÏ@ÇtÒXPcú¹Õ{&ø=C„ÝÐ,$Ýû²ÚØZc§º,×#µàp[ѽSy¶ëÓèswµoyÑ[®4×£žñýŽ…ê< ×í¬ßýD— M}¾y¾Œi½ädñ:q}dƒ˜ z™ù:Ôßß!9ˆ\²ͰÛñŸÁdûí&+¸OˆùUÿÐw®G~±N*ØèXB<é\+²v|¬`C£ w‘elf¢lXìÓÓ,kê·ŽÅ|ªm…ÅØñŒ cBÌyÓÈAà“A×—Ê§ãø¾Âô¥Ò»çÖ'svÉ{þÔJÌfOµ‰ƒøÖ±å®_ˆÏî n@Tv‹ÛÝñ›ÚòàÔ…›§v\ 6ÌѵÕFr gé O€/€^ÚJ÷’cÞGÏ&Þ„­¹J¸ŽùŽp›gÃ;Ä\^(úÅéòr¡“¿sk=cZÁy× /èmEû zö:xì¶Â þž],÷XÆÁ1ùëⱫÄ_OêÙäI|LpÛy¬øŒÛÛ%òQØéÇê<¼…NÝ?F}/˜NmØMíØ·Ô†êüOlÛžø±0g ­‰ÿ´;üG'%ĪÁí}t?ï v4Çr}ßXºG½!ú|7b}7ø1†a€úNì[;>r¹ëˆøÇGå~Çî·Ó6uüCG¨¶0ö¨ç]=c¹ÿxÌ¡ë®vËO ÷9"ÿÖ¿o#!ÆÞRzêC{×rí1üÇvzw_˘/µuU¹¶^cuŒè†ØÜr>×ö–ë3Å;~o(üìhu|ÌÛ~hÅû;•6ºÏðŠ0øA[c_ߨ‡×ûŒßÛ^ºáŸ¥ÏúH×,S?εß0†1d„î—½ïcõžeŽ_¾ÿGûÑ{C,c@š‡P¯5¢é¿qâ)ô„âQ^ëƒÞùÀrÝô$˜ŒŸ{…xL#Áò¨‹þƒå:>à;zY#ÞŽüƼ.üxd Ýð¬d=l`dßõ}]GLxºèß^ý„‘5l)|²¯é]+-ëb~$ž!Œk°¹Ç wwFî€ÓØÃØWà<‰ùhSŸðÈ3FŸéyØæØÕ; ky?|úšå\€ CÜn{Õþ!.4N÷…_1 ´ÇõÌÛzÏ`µoŽ0;Ëø¾ºÐJǺ_Àï3„·£Ô×Cu¾s¨e~ÙÙÒ%Ó ­¼ÝÃ…åøÝKÜÞ£öáí]0ÞÏÑsÑwø³ÊuN3lðD¡›Óú}\Þã~!Çêr¸"ÿB¼ |Ã.óñ ñ7ñoÕø¼m¹ßÙŸõÿÂ|wìücÅäkÁll‡‹ôóøø Eë4®ÈÄ·Ä‹Œ?˜ f€û×Jf‰ñcûϱ\ç7ró$Ç‹%?ê7mÚÆrmm,süºb{=—ç„ ùGü-°¹¿åÿôYµ.ÏŸO5ÿÊñ"òÁ· “ñ§ÐÁ`v»"gŽÇš#àuB-uÍkEÔuŸØKØ–=ulm¹õ^噎ûNÔ¹^ð¥aõ<Øx¾ÛÉKWÝ ý±¢×‹žòøgMçCÁ?øSC4ö³Ô®î¢Õ¶ú?êñÉпãôÿPµƒ¾¯§vD,æ}=ß ­jº¾d9oú-éú‡Ž%Îu·è|o¹Çéß[ïaÑK#u0†m…ÁÝEÆè«üv­ B×~VtGF‰÷´‡ë’a:×Åríž–~ŰB3ç›ÖºNµdNË=lÍ=”ÀÙïé7ò†=„^ G^‚ñÈ,r‡Œ »ÄzbN%º€š=°­¢—Ç.¦ ßö-Øá÷#ãÔ V_:º¹ÿ °Ì÷þIع³°{¾’9ŸS»ð•˜>¶çaç† »°GÛ¼qü'~ͱeð³ž-¿=Ö5<ØäÓ„µLôuïÑ%­umØæ\sšp.‡ÓcX¡»cý-â…Ïô¼­D›É–ùqÆ[ÿ_ûâ—úýžÕ{úZãø–Ø"àqäúà0–Ø-¼ÔJN Û {$b:û뚟ŠOàâ¢ÿ'ÄFÛY¿¿/žûcþ­´®>'I~çÞñxÕ–kEò¹µÚÇ'9Fô˜ÿ£‹æè7mÃçéTðØå{¬d€¹s-÷”ì×uëe"3IJÖ/ºÀ±5êÿ÷Ñ+àüzV¯᱌Âñ/оðÚͤ;°=„·ù‰0ZõÕµ•-Wçî^iþ”û'Q×<%\}]úæS«ëYCÕë\rÍ@+ºp°åº|î+~Ä~…cn'X‡>ÂÒ¶ìnu=¿Ç±>×;ÛëÜ*éŸ ½“Ÿ–þº]ú ëݦ±Ðœß:¾4H4ï¦ö®¥þu+ãèÏï`õÞïõÚx+­^çÈõR+Ñsàÿ;ö®g¢¨‡åüæMø_ÝWÏI^Ïrݑţ?Ô˜"/Èú¹ –»ŸX<º€89U|gò1'àF]»Ü ž>¤±¨t…ÛßÝ„U` zß Y>KcO·ÖDŽÝí†ÝG 5ÛÔÈ.Œ>AßÁAÂT|í…u»ëÈ91ŒÒÐð³¢<ÖÁؽc¹6Û$á}{=óD«sÇŽÿc Æ9Ƥwò¹H˜¾³~c/й텋„×£uþË·ÔtÀźg¦0\ßMØù€™:é95]O úöVòÈÌ«½A:`7½óPµÝs™Ú¾Ù¹ºw¨h2Wí‚äÑÏT_àW|fâ4Ø3:ûX€w¯ˆ~aÅ/`œÐesÔ§©…Æg÷ï±5ëÈ1V2sÜ_z¡ðS½#ø5õ`;y%b8ø”ÈóÏÅËØ)`;¶÷4 O8ÿÁÇØçûèd_=s˜>‰!€#ëê;övøÿ’h°¿Þµ(ðït}Æa°s'µ¹C£sø¹š—åX1Z2ú˜dì$ý†Á˜ç6m: “ÐÏŒc7«mé˜ ìïyJøS}Äž^õ>7J ^}a9—vžúM±-Ÿ.¾¨ï÷©ÊAúûc¾6ôýÒ«u(–âøù߈G­kkÔ¹ÖqïÁê¹ ø;½ b÷O±ŒÓÍ´ºÞ±÷}áí»úŒùq|W]ª×*}¨s÷XÖÆ¾¡ïª,t÷ö祖Úq¥N¢}‡r¾®%n™çUíc¿Öëðgö~÷¶z.†ûWàfà~Kÿ0æ¦õÒõEÆn¬Ž-ýgôø¡’âøÄ~¨£øiáo¯%GV‘Ó›ôyý½®ÿñþ®Olpƒ6P¯ƒ}µR˜LL™Â?G·Œ)ô¬}˜âã ‹ÖÍÖçI°}…}`}'=;bõ`*1b0ü¨×âŒø:cþcW€_™ûÔ¥ôÙíOøå éŽcôNìpâ*Ç Á我0· ÷[Ëy¾»óÃWÁ1«×Vs]³£®›¦þó‰XþT½cª°sgá8´ØFß±Ï7U{ˆ‹1·ìŸÒ¿n¯6Dl =>Å7ÛIÏG¿ “Ð{øRÄ—v=÷†/(øéµVøyè|tÁë¯cŽËâ«zÏBµq¯¢q ˘xΆ|~&8ˆîÀî?U8óü.ѵðÜÁâ¥Å…Ï=žOãÆ|ðûú]Žƒ%ó$;IŽ9Àt¸‚ÿ`26UÄ*7·zŸ¿žóä#·– n­gÇStlei«®-Q[ÁÇ+u?öU4²JÇú\ÜŠ·Ü¾~Þr âØÄ)°U±]Éc›+~]ïη¯l6ŸŸõ¼ðï)ýf~×åÕQñ–ÏåúBxŽ=Ž=ZÙ‹öz>ÿ/·zþæ¼²×úÐÄÛø¢° ljSž[¯m*{¹ÎUà{Á?ؼÄþ‡ë¾Á—±¢?~ 6ÂTý7AßûèþÁ¢s£àeM«U–û¼©>FœèËõêî³zÝ!¿ï놖6l'Ñ»¶½Ž–¹ ð'ìþð9>³º^¨®¹E'H_ÕŸQûºp •XNWËùÙ‘SFWtß ’ìÀG`=v>ØpŸ¾€ÍÄF‰ÍƒØ_éó}a'òy™¾c›aÇÝ­g+Âö«Úå>>röý®@F‘wdû@áÃrm-ìà!­¿Ë_âοˆ%#!>?GxKfž7Ø~z?öúpK?¡wÑž×~Bý}Q:„çµ6Ç<Ñ…z/6,vö|½oãBŸ£v)|ë#,ÝHÏ_¥vl©>\*›\Ä>§ˆ\‰–µ<è“oH/l¬gD.b¾åzÓ3-×(bNØ: É÷ôLrè.ôå–q©…÷耳DC®8Í6¢ÃÒ èÍÕ'⛟]àºžï­ m}]ŒÎÒ‡©ðà“â쇕Â6ð`¹ž ˾Cÿ¿_žï:üÇ'w©Ä¦¯cþo¬Â3¿!^š©ïè꜈üC£þg]¿o“¼Ï–üÅœÍqâyp û¢?ûª-Ø`ø àÖ@[³\~Îj?ÀqW¶s¹`üíºö^á8¹Ê§u€ÓÏZîÛŽŽ¸_øO®–=µ=í|}¶×ÔÞÃÑ9¿xü'b@è[k¬\^°_É﮼Ëc/²cŸ˜¨¡ôóƒEwrº`¸æX¹úyS]³±å:«Ø®ðÏØB;×ãõ½CÁßkú|Ù2÷¡¬·áuÑšüKôüX}úÞ=@Ïù¢´Ë1ޏË@]·©úû©eîWº¦žã½\c´Rÿ¯T;VZúD1Çw°Õ{OǺÜõz¡èÊ®‹¾¢¶?±N|%ð¼'¾ƒÿýõc˵sÞ-îy[âœ+$_èd ù%îz·x–\@E·‘ Æ¿žRò|è#õŽv…g\—ÁóØcÆ‚‰•ýÒ  Ä'cÁªž_<>°D8Yñoƒ9a†aÃb‹Q;:Tz€uG«1'öíòâNŸ sŒ÷¶^/±ŒáІ‰Â8®¸þž_ÜÇy¢ôÝ1ì!LÞRØ öãÏÐß‹…±Ç ÿy÷×õ^ôIÄ÷wæþ“ƒÞLïŽ|öú%Â~ôÀR½÷H]þϲz½9ŸÃ@>˜9_ø.gX®U}˜ôÄžzï¢þO/¸{¸>ì/> ~Ô¦©­´±ŸhN-qsdüiñ9ôÐHÑ û=ð†åZ°÷‹W‰Ë€¯`4628Œ_þcW{óÁNô>è]e¼Ü߃ïÐ!ôL>B2uãsšä”ó‡ë¼s¤®ãš¯éþ},÷ÝÍ26…~:X²ýŽž×©`A]ƒÝYr¾<òŒ.@¯`7¡oúH†¿*ÏñãK[;;ÿEa ˜D\ãË=؉U\/}ð’~?*œy²Vç1lj-üGgo'šMÖ=‘·ý¥tÇï¤^¶µ:¶¾†M‹.|ðÛEøo0«i~ǃÔ>Çwâ ØØ-ëà¡×(Ðw‚¾ï¨ö‚‹È"ú¢Ÿåþ™ëê÷Zj˜O-`áö³–y€X'ƒv½¥ß·–ñp{ýM[s–ÖV¯#êã¼¶èû¥Æ9æeuÓ»U_Zçã¡iè!èu¿Þý’ÕúºÎôµÌ‘ȇ©×ŠúÌrí®CçU§Ý.¹DÇ¿,×¾ÙۭsœÎñ\ص:Ôžã ³°¡¿¥ÿS>=æÖDî”ÿ°Ý¨Ù;ÒÒWyÎØHà/y¼• j,+ä5,‡ ·Æn$Lç 6D|‚xFeÇ4°óðŽÑýtÏHéô1¹­¨Q£±û+¾òX> cÊØÁ‡QÇ4A8H§—tñíñÒàîþzOKa;m?]çñ?F•ç{.:ðœ9 Øè{I'l¯ó<á+9ÛÉú}4Cø}°ð|Gݳ»~ÿPï=LÏD¯à7E®b±îš¶¢×¡vï­çÆ|ꔢF¨›Ú5¬iF¨ÍÄXMÑãS…½ˆî_‰æ`!¶à*µŸ ; œ_QÆÇÛÕEã@\ÛØ˜‹Ý³›ä¼¥–3ê7Átlï½Ë³ê9 èlËŇ…Ø7ó,ó C„Óô_à<øG¬é2½ {æµ!ò¼\ uG<ä ý~\rþI9;¢rí|¿ãû Ëu?)k׸P®6äÝ1óQá8ýð‡ïÄhn¶ß¦6Üפî×ÿ×Ï+™õ5™.Øäºë#ËœñGjkÿÒ~÷ˆ©¼ŸmŒýQb­1owø`Ü{€ ¿‰y±þûà7¹x|©ñìþ V¯ýQÏ[C¦Ãf¦ç¬´º>Õéó²eÍÑeœ–Ë-çŸá/Ü-ú1nQ×¹–Æp{˵€º¨o=Õ‡ˆiiŸÓñ+½c™ècñ¸Î3{[ôŠZ¨–û/¬¶º¦·žÇ½Êr]äÒCç`·ã[²r˜Ž³õ‰?M\õ ñ÷ùúŽM…N»c®%~Š>X)9@X6:ýGî—êžÍ­®+sàUñz“zmêþ°m±“·îMFm&zeŠ0l”p|Â8K8ýÁâúÄ.NÖýØœXî7F¬1±¡åÓñ¿,z³è a€ÿYÖùŒîîR°ËqŒX¹Yìí%j#Ø8]8öô…· ›7Q?ˆç Ïæ ë7†NMv–^ˆy¼ê™; ÿwÒ»ñƒN ÏP[¢‡ë@ íø€©î]PÚ1@§qžµtßpaÿ`éƒ)ÒÐ+òòà46ùâë 8»‰ÆøÔx’Àw ¯„ —ð-]ƒ?€Ö’¬ÞUï™N<þdË|êlý¿[KÏYß"~À'E?|Ïr-vl{|Eâ û O;ˆÍã/œ {ÁøŸKhõÄgéÿðEZ®ßµ“ëIÞß(x]¯Ù2ÌÖ¬ýÃ?^º|<’8å˜JV¯ËìòßÞ„ó+õÌ[„!ï•s±¾™_ ¾Ü*ü¿GïŠydwë÷5úÿ aÓ3Â-=ÓsçÈ4¾{/ÝólÁ2·Ï{–óu.ü]í|ÓrÿxrŠk ÿ…mu-æÇúõ1wìEËyPƒ –Äë6Ö¸V¸\×bö·jjËzz‡òîNˆ…ÝEËûËwÇÚ—…ýëYíÕO>Ûiüàrü}tîíÂK>VèþšúðŽåºØ+,÷4x@:àY˽”G¯óãm„ù1GbõšGÌ)®ç`Ïþ_aÅ^Šù/à>¸~ d>Ǧ¯Úåõô ßûºÿœøPÌϤ^cmÉÙkÂìÀ|À,÷4ž[èâíÖr)Ú† ß),Ú¬`„ã&1„Í…1ÌÛÝJXˆh©÷žÍÔ=}„ÇØ¯3„—%³è3|d¹úXÏåÀæ¯À$êû Ó±e±‰ÇëY§ —÷þ*·àñŸí„ûª-[ZÎ)æ<ö7±|† +Üö7÷Ð5Ä‹VÏÖºp±e=Íþ–ëÆÍþo«çDN6’S^$:þ/Q;××=裃tþ»jƒjWÝF·±Ù‘{ì÷‘ÿƒÿõÝØ^ôgœ‘1ðœœøoz6#¹Kxú“ÂCîsýB×Vrà9xî¿ÉŠíÏgÔÏÏ.2^ï‡ó´"vÏ|!0¬¦Î‹ÜT…[uNxSáÅ–k>¢ûgêÙw°¬Sç,– ]øVèWtÑ9jOÌÐ:nûW¼î9Ý>ƒqM:€˜PoCŸ2îuÜæFOéÓ³ˆ÷¡{Ád°í}á=q¹ô¼­4nwŠ×Þlaã¶ôƒcþÏ6–{P ®ÏÒoìujÔð}ÁsÞ¯|“ÇtÀ ìÞ  Õ;ˆ!"àÝÿŸ_-9â¹ØEKôÜ…úÜ·éý{YêƒÔæ¨a9Lôe-Ëzœ—-cÍ7Üp]µHñº0>_Çrýå ?*ÏvÌä½gJöÀçõ¾{…õ`÷“zo…ïÿáäÈ!üGúàU«s£1w-Öªq{~\éƒûõ­-ç/³Œ¹ºZ7„ŸŸúù8ÏÖïå¢[ä+"ÿxû¡Õñ-׃Ðà)é™uÕ_Þ æ¶Õû7.øæôWí¥ë_ê­bFS.Üéô©Æ&êdcL—[½ŽF½>ĺ–sº…ûþûi«}oúš|qwp=E<Ÿ0ÖÀ¶'Þsx¡‰Ûü—ˆÏ÷É`¯½kY/‰\.—lp Â7$7€ÝF]èz:ñà2–ÞÇOJß}\"VJÝ5œÄ˜ÿÕÉr}~ÞI]&1ùîz.±K›ü7ãÀ3©ÁOùµäåDõûì§{뾿ê:ê ÿÐ5ðN56nÏƒÇ ¯û gw-ýup”pu¼ð&ꕺ kw–N™b¹~vø6–uF³õ½³®Y¬Ï)zÇÂ~ê¤N¶ï(ìÞKøN{NÒK„ýüÆwY$=CŒf÷&=Â3ˆm®ö(Nïúya ÿ§è± ÁâÕúÝ»\ëc²ÒR_·-cå}í¦káãÒ ØSÄëð¹Z‰£5D7t=€ý½«å|wdÌÝI²Î|«+¬Ìeä:jˆ+a à³$g@.‘ضyáØ@á 83NòöƒíQ#zˆxhoç±)ŽTÀy|òØQó-çü󹕾ƒUج›X®çØV²þžä÷ïöÿîÙ ¼buœ×1t¹¥=6¨v>ð«®=ä›9ìãô¾…ï`þÂwpð,á?¸“å¼$tÔóåpú£ßðÉF UÓí~Nè†÷„û¯ëþ÷-í资_ª[÷v޳:·éãŽ)Îâ¸ÇX‡ ÖBœÝ?¼©Äƒ¢æqHiã?ÏheõÞ•þüáÂ_ÕEÕyÙg¥–ëóUý÷œhôUÓ÷•–qŒêýî/=ª¾>Rúêü:Ft~Xï\¹Ñ+›hóºe,oUÓ÷¨‹•Ž Ì¯ãek[Î_^-ºŒ’<\ žÅGþ¶Ænžxšø¶Ì1âsð2r½ÄùÁË{%»Ø÷ëY®ßɼ¯ç‹œy]̉ú¸/qÛ¿ê@.Ð'†¹žÃÖ¸±ôÙÇmËòßß„¹º×?ˆ­Sê Ü€¯è36<ú•¸11b¯z\ŠØyº‹ÔWütÞ¹:åþ}ø9؇ÿ*xïØ£ºÇ3Þ{˜ð“|±ô1Ò Ç S¿e¹.)1pâ #„ç-×­ÛOÏÚ×Òg˜&²§e}ОÒû Ï÷¾G èD½ïá{ÄÿñÈ™“ó8]í¡çKwDü;áùýŽ:+|—M ½=^ö‰åzè;t/:léì=b¦ÄѰýÁ³Ï5î¯X®…·Ž®]îóÚÑ.…§ÜG ?cˆÆ`=}WÈkAñݰ!:[æi¿©q„¿.ü\|}²øÿÛ?r¿C-ãï>t;zË9F£°g…ÿõÚM¶¢ãY];YÏ}}7ÿw|ªübŸÓ…íÿmé„›…U_·Uûã¿?Ž·-ríxF{î·´©_#NÍù×,ëW_vÿS¬Ä"—O\Ìk/Z!«›é7¶6ú™ØÆ@+ëQ(þT×™~fõš×N¿/K[éóX΋¸_ßÃþü«âV1ßÖõ͵odiƒÓZáG1‚:ªËuܪ¶]aEÏF}ç2K}óðTãämlaéßÑ~éÃ5ð?|—ðóÚ”ñp]8X¼ Obãcÿœ"9—ÁEì_jað›#·u©¾c?›·[É™~XäØç'‚Øà{Ññewá2;»` ÇLß3†a+Üauþßc¬§•÷zÜc`Ñ5è ì_WúÑ[:lï±ÁÐÔ/á³àà›UìIÇvò€Ø?»è?ΑãÇVÅ_A§< ç÷°\«á û[¿¦ßg‹égwa¸}½©°v¸î=B:\Æ_ ¦sŠð~‰å<«¨ ®Oš*üçz­ÿźüÇ' ‡|€žîX¬÷nn¹¦Ü=‹XÌÆº>ÚÉ} š1ÖÔâÓ!Ÿ€ßAì?|#䀨4±7lÍ/ í“ÿ)¾yE¼óRÑ>÷ú≻˳cVÇý'Ë}žKØVí­ìyòîÇ›CÅÇð41»5¶`==¹ð˜bccÓ—ÁþØ´ÈcgÃrÏÔŽ’gìu°¼Þ[üÊ=Ã,×ÏbN)9-|˹–uGãuq(ò1OŒÏó%‡‡è“¶!£è°uK;Ü#£ÿC˹ºOê ÑÖÇž³z­øz½œ-÷‰xA«ì¯ëš„±Ð{Â¤Š¯¬â=¯ÿ¿Ïêõœ=ïÚÒrî¼ÑÙr}b>蟘CÆ÷¨giŽ¥ö+ï>IwK[u'Ëõ)'6mù¬Ç¶…—àµþâÆg½rÞÛ$ýäýýT8Cÿ™G·B}Š:Ê÷-×ß¹ßÒ#ôÈcV×·:ÏŒPÛ”sõ Äͪñö:s§¯´Ì+3gâŸekÚ¼¨±¸K:àYé’Ws<ëú¨îVç‹¢>¶®ÿšÿµ,׿ë%ÚÁûÄ~°¡*ä˜]öaÿŸï±Ã¯¶ÜwƒãŸúD–ñá‘-è‰ì#¯Ë„}³…ûÔã_oeí°…Vd›,bKU{êUäGÈ7“+^.üïZðÅmÂ:ÂÀR0ÉŸ  ?άáëÿF¿¿¯ïèºo‰G°ÛÐûîPŸÿ¢gý³`Ÿ?-Ëy·» óçZÆdbŽ1”‘ºgš°~ª¾ƒ×ØÚØØØáØígIœ œ>JX½D×€yØÿ_ÖóžæüϨxËóÈ¿°ŒK"ü?Ðr݆ÅÂ÷½ôžSõÞ™–{ƒíÛY½_±×áö+¿¡×bâ«'LF¯ÿ"Fö#ÈÅ*}’ƒÁÿÃ?\YÆÔ?Á‰⻇Êw_sˆ{ÐóÝÅOÔ”V›©Gº¬´ÏýWx™˜É.ŠãÄÃÄ|ȹ¢¢ž›Ûû›ú\Þ¼ð@ì‡áù;ø/ò¿\ƒ¯€Ëñ76ÔØy`øÿˆ½‚^ÁöÀß ÎŒ°@üöþAâOäf®ž…|’ϰÛZYÆIž‰ˆùQßBܦ­Õõ£¾v\Ìß°z ~«híóz+Ýæ9áÀ¾/õŽÐ;à?ø‰-¾ŽåZþ·´ŸŸÓ¡ºz× Ï[]{S×pb§Â±¶86¥Ðº^Sm„è ¢§;[®™Á=Ø‚šcçãÙPßß.–k[,W¿£¶s‰eŒ pSy—c3ºï¶òNoÇ «ó%õ~ò=ÅÕiû¹pÿ*׈†Øö7—g;öÿµ´Çk·VŠöŸˆ®/Z®5„ðX?6Zø÷Ĉ‘õËô¼ðù϶´°qÁì7üòÖø Û¨­Ä|‚„…È7öíÚÂÊáÒG›Z®Ý¹¹pq¶tÀîÒ»ÛÁòoZÎÍã‰QÛy°ðú}Írmÿ3¤NÖ;æ ç¯,´õ9Äß·Ì÷î!ÌßU×£wŽîG>¸c¯£…?V«}è#tØ8éòÈu̹àØMzc°tü¾QÆËñÿ"ñ|…HÌÇÊ8z þJ½{]ëž–ëoŒñí¢ÑïD{xoSaÅ0ÉcŽÝMv³‰8;8ŒŸ‡ßAñ¦ ÓÝŸJ2®ï¢{gè@LÑwì l|ìôLgµ¼GOD. ^œÛtŸdªežr¨Þ³…ä²£e<å5ا+^°zï\ǘgõîŽúš¶Q[Z«íÔÇ»‹î¨ç¿c¹?ËÂdžó/+q‹_ Ã*¾s;6j[Á™^–ëР‹ÁÑÑjweCÚu–9KtØ3ú\-}ð¹Ún¶Ò{b]ÞµAé›?œÀGÀÖ«ÿ ãåœë=ü7-÷Ìê]hPÏ¥îPpÖ1€ß¤§î&Ñλ„©-Õç†åÜìzÏ»â­4¦Ôù ß°ýo]¯ÎÿK¿o°Ü«í6ùð2V>¦1G,räôçS«×qõœ‰>°\k.æw ]"¾©åº´Çè ÇøOœŸ¸>y1ìßêÀžB€¡øÄŠÀTÞùY‘UÏ ã³Wït»òha×¾Â&ìÆ ¯w+ôtsT^±ºÁíºýÅÃø(äíÙ×Ô>>Áüµ„ðcŒ-yèÈu`6ñâþ`ÿ×l͵·QbÿÒnX¢¾Ý­w{û¦èA-Ð(Ä„6®bóW8àv5O'ê7Él#]8ExM¼…:Óõù-áþÂfü‹uŽøW…¡>7˜Øvþ/unWË}*ûÂçP#õ=Ñÿá;Ÿø(;Yî爟±HønÚIJ6i‰Þ·«ÚDÞŸ6êy{ Ÿç[ÎÇày‡½àñô0öþ%ââ†`m¥‡é;m#Vˆ~íPð¿Þ‡s¨ôÍvå÷á¨M#>Ìïˆÿ÷—|GŒ3ò³›ê;6:þ:“û–¼¾_ì'ã Ô½ðÞ±:‡>ÁFß9lúšdj¶ø {]1Y×C“íô?>D̯™.^ç:06ÉBÌ~K˜÷ŠåÞM¯Xí«8VEL<ðŸñ"¶YáŒç¾ÚY®q¦ºœz]ž}¯ðîï­Šl©•øÿ’×giïp½§‡Úcjº¦²'í×ú 1í<«ç0ÏëZ½—–Ûï`ñý¡…no+¶åöîg#êcrDï[Wµ^ˆ9vàbsL0æç‚¹-cm¼g¹ßKóí£ñE°]Ö³:§êm›¤q¤½ÌÀç¹Mø~·húoËùÖ7XÖä>bCÚX¼º¶eüN¹Ï¡ ïÝnÖ\¯›2özÎzâã uLµ\Ÿjµû˜؉o©sØÏ`ãt-qtôØVÿ.È#øOÎûòûÂâ?(¸çk¼lj¹–Ñí¢3ã©8d½ÍŽg]q€!` 9fx<-B=> ö²ˆm‡ J.ü¾TÏ/kâ° õ®«õÌ%ú™y³´ÕŸýµò>Ç=äósaØTé7p‰XvótááñÂîEÂ40tKa$ø‹Mÿua<¹XêqæéâgêüOE;b—‹–?”ÎX$¬F`Ãÿ® ÿ9}LÁ9ÇÙ]„± ôÿñ–¾ú‰8þ݃^BÍÖ`ËƒÝø9įÖÓû÷—ŽX çwÜ"šþBúóf?~à4ËœvÔ—îhYµ²ƒ-÷&€ÞÊnp}†%9ûÇ[Æz&ëàìôÍÅó—•1uÞV+Ñb Ñ¢«Æ3ðÿÒ§ºîe]³¾åzèùùeüÑéøè\åº}œöÓ¸®÷¯'~%Œíd¹?Ú«–õAš3ç:ã ÄZ{ìð1yUã†N½O‡î|Qt@§<$¶?¯qU¾ÚÇ2æsE}×WWå»+ÛY]gêm¯zX®ï?^<7C|ˆm²£åš¹È¸ÎcëŸë/×÷Ÿè;ŸÈ12MœûŸ6PSó”0‘xÇ\áZ¥|¶3,×ýÂ×ÙH|ÞÆ².9üª!¢%> v!rFÌ:œ¨Û&†~ÂNœûñ°éˆ_!×èí+Ô?|üÓ4îØDä¨i¯°M]žïñr¡Ø¸´ùÏÂønµ0ð@Ë(6*öõ|ËÚËÂ4ê=Çê°’<ò ÂØt€ÿ;Hð›øËDCòØ÷Õ=ØöÄüÿOØOÌÿ/Âþßë¾óEwôɾÂÚƒq¬þÿ¾žÏïÝ„éäSÖuà{+ÑøasÌEƒsÔtó¢ˆXð¤ÆëÏúÄ?#?ÿ¹Þ·±plŸ©vNæ*üâ9”¹V¯©á9h0î;–x6aÇÒ9luìvâíØØ`:8MŽ|žè‹^W|nk€ßÐà&øM¼óëE¶ëyào/=Ÿ¹±CÊÿ:EtïfÛz¾I§¬²œÓAß±5ãü|>ò?ã"]÷…ÍïïˆøØÛZýîfõÞ 7é,™ˆ¹ï# ?8ï,þ†/±÷c>øþ½2î._ð:ñì}Õ{:ØâÏÊŽÛM2Ln›uðqrøœ€ãõ^pà‚" Þþ’³õ%»Jv )zz¦¾ƒõ`5veÔ¢%Ãfã=é?ô¶6ç9¯¨ºHç.´2?ܯô™Ç’†êØBø/¾SžåsT‰W¼à±jâü£é$ý†.Àæ>Jÿƒ•ÛK̳z½|¿ÚlWÞáñí…V|Îí)|Ÿ¯þÿÊÊ:>Äeª¶{¬çïÂ^Γc©t û?ѰtÆ)Ò`;±æÔ¯:Ër¡ÝÕ–½5¦ðÎ}M8 "wïY®“1\´j)ÚõÍÀ®ZîýLÌîîBkŸ7ÒNú¢•Þ··tXžÄXOÐuäZ&Xî-ƒM3Ô2ç×(²ë9)ä}>ÉêZ÷à5ìÙwÕ&ðý8ñ<Ïý–®‰|îCâµïKV~ ¹Àt¾(¶ö*Ï­÷Hì¦ç­°œ;6éSÂì <ß[ñ˜×ú¿)lºÕrݵ·­^ÏÌmÒutÝ‹z?÷‘/øž[ŸÛÁŒK%_Ëþ›ô }ÀY-Üã¹QW‰};®¼£ž[Kþºs9|-êÐCuYÅÆÞŒ9 Ýû‰ôÕKŸÇ?³œ÷ŸØð‹æÂi×Ùß,mr=Ê5w ó—K‡`ó×yA}z×ê=·|,?·œÃyí"Þ·º<Ûï‰Ú˜#Ñ^÷´×{?(Ïu=Ö_ü4PýæÀÖžb%.ƃÁØ+ľÁNl`pôj]ƒ_D¼“¸øRÉÀ’á߉·ÁppxU9܇¿Vø‡ýôˆeÝ7±-r ØëäÁÛ1’5âŠè˜Ê¸ ›.re‹$GàuäÐAÈø%WØfçèÙØ-Ô^ªsØB§K6¹~É؆̢Ëî–aî*Ì$f3CØVcûû&ÙC:b+a¸s~Ñ ØÍÓ›ðlšð¬Ÿ¯0Q´ÚE÷“GÀ‡X,|æ¨Úåvýo„ë`ý…ëœÿ•=f˜#q³þÿƒe€ëÈTcè~ÀÉÒ§ ÿÒÿØÁ¨= Ïc~xñ¥å<¬nV¯íäãûVÁh×kì÷úÍ•âüÆÈ›óûf}'nÇ\l„–k¡æè]è’ñ¢|÷qÑ3î[£ßMüN¼€Xå™âþÃî{JãNãó’Ó%' þcO,ÀŸØ?Ò½a_ ?Œ\"YÀÇç¡:">¼{¬å¼ò½%kè+l²˜›Î!Û­­¶ÿ"öÃï¶VïßêXæ`³«@Øü¤åZf«-÷+kmé/| |Y‚mþo=§ò‰¼Þ§’«lA÷îž…JŽÒC˜Å·†½«OòÆIT´óÐ¥w·‰ÿ_m¹×À«jçÿG×_ÇÁRÛpáîîww8èÁÝ]îîÜ,hð !@ „@!@p‡w œw®î«¦—ßý¼Ìgwggzº««¾¥Ýƒ7m´º.ü‰…¢ío4r´µ ø`ÝÜÒ~Rü ‡^_6šm@¾÷Íè}¥×Ç·xÙ±}(~ß/-?w^ÆtnÖ–ç&–†è‡{¼—¹ø»´|ÄsïEËÑŽ%öÿ×y·Ó*t|càú6³ó7jíÁù\ïÑÖŒ*ͦ¶È҆뉤M _ƒ£è²}¤Ûúòþpùšëá=|'f{•2–Þ¨Œ`ßQϱ›ø®MPå«ä ±ûOW~ŽRÆö’&ô´Fƒ¢«å7°¹?Òv°çàÖyaG`Kžaß/plÈ+:¬ßØñQ¿DvŠãF>±óð:û©ø/Äç·§§«‡ŠåàÎ'⸿¸¸¾¶z"ëêw‹¶(ú„øøB¿D´ø¼Rôµ«ÅÞ^B¬ŸéÉó°ïÈÉ [À+•Ç!ò ¼ºgå¯ò^ç©ä¯äé#=¸†\ÕaòXp–¼sƒm?á÷›å÷_Ê7ÇùœCä_0»Šx˜¿e´= ³æ“ß›úÉM þ£G‘Wl]m»‚ ÿõ{Ö{€!ÄKôùÌüïªöûsé•zanñ‚<îNòÿ-ç¼·#~°´ØúN´}Þ­ã(ç_¶îõÁ#ò¼ñûšh{,| ½³n½x—÷¾â3r=ïg>ë=Ÿ“:ØÚ¡¢“²‹Úgl¨¬áaœä¶Ð_Ë{™‹7&Vø~GL]ç¼èç¬;ÀîX^Z<%}¨t)tBÀ{°þd¿c?ƒ•Øp—K‡ÃäñýÌF÷SmÄ’×Ã÷"Fð{ùÞÇ®ŸÅþÌí¸Ápâ ¹V½Á¬í'cFÙ×+/Wü,2ÙÍSÉ?s°gø‚.@/¡öTÆÎôê‘ñ«ü~­×Òö}Ža qlmÙ*—ñ×ÿ— ±U·³öÃ6û±¡gßf÷@OwÝSŒ_¨âT¹>÷xØI¼¾XqlbûèÙ;£ÚÿèYâò¨nûÑä :_©¬ Ë|1öæÀÕóÕÇØŸì#ùÑÑ+Êz¹)NìÉ…*_‰±ÜïØˆs]mý7ÄàÌÀÄ—ªsXøñLÇõ¦óõüŒã{ç€ïÏKßç£íÕŠ¯~ƒÝ`þwê“率ñ¦2ž1¤:ŸéÇèãƒE¯|?p_Ɔ&õ9èEÖº¬?}ÇçÉ“/ÕNÙX~Ý_Þƒñg‘_ä[®›¿b÷@[üݽŸ<2J\ü‡§Ÿ¶mb<øÊ D[—°ŽãÙÁ9ÝÍó“+?ù l$°÷çÑöm#¾Žà»ƒßØiøøää#.õdÝM†NwÀ¢G¼ýA,ê12mÌ™*¾—÷€¡>÷zp›߳˲¶mñÌ\KÜç7þùËŽ>ŦŸ·âGñ ÀøŽ–Å'ïfôØ+Úzà¬ï¿À¿^@,ˆ=7ëÉUw¶ÔˆO{®“­oS\«î¸ÄvÈ÷îá3vôŸájÿ³²Ä±¬·/v?ñ®éÄ{ò¾è9rÊð¹Ü?:ÞÌ£·•fä‹n—þIwט”Ø>z}ˆïAÌŒø¶µ`ý‹Ò,Àæü|ÀÚ l2âˆøØŠÄvÀ„å÷Ýå½c•ƒ•”Aþ±õRÇó!®þƒëØÙço+_{ã e»=“ñüäUŽm}6:ùÚ1Úûd¶–C¨9½âOÁÿ´s³Þ\9ïñb±|'7Iüü&qí.ñKL/ï÷ñ™Fqücˆ?Ä:þ-îeÌžø{œk{ÿˆ~ÆþW¹_ÃWbq‹¯m“¾ã+' ‡|YÔZ¢ŽK9÷7xÐÏôY^©ú ÐcHíw‰ã€8wÈúsbÃÎ?çÁ¥câ<èê¥Åäß)õÍköƒ|4¾Î Ñj‘þU±ºä"rÜ3õ|ÿ>ÏñãSbngS]òh¯â{1'û,hˆý‚NÃÞ†·‰Ãá;¼\i×ÏïHâ»õ>%¦ƒ˜Þ6¦wî~”ÆŸD{ϯ5DeŽ'”v )Øý‹:†ùä×äOpŠ­r²¿ÁEt¹\â³(ððªÊòµ^•Ÿ"È81Aâ/`­ÎÝbò:ø>¦:`&ûøóJo|¬Â«“;‡ÌçæÑÞå\žZ¯¡ã“bÿ!Óİ~+/*Ü๎ïŠAå˜ej‚À j‰ðåîÛæ·ù$—;Ný,ë“ãÃõ\Áµ¿9ÆŽoJ~w'±Eñ1õȺâ!5=›‹«àæ[Áü%|î^³¿XLí'6;1üËÄèßz« ?wúŸèYõÂ}êbEש;.ÿ‰óï*vãBouxQ|…_úLìðí?zqdéí?µãÛÓkð³µÇKÎ`%é0¾s½±“f¿—¿ð¥®­˜^ô mm/} öxE½mÇ%?0mƒÂ£wÈÉ‹Y'¸˜¼ÙF>„_·Ž†ÿ™ûÅ@wð^ð)mj‰‡äúÏÿŠÿÓ5'1àsG_üMì¹Úã^¿mo³!ѯí±!mužCLçyñø±ï7â?úàÉhï"|]üçܳÞ÷R´=+?‹ÀQó¼Å6Æ–¾\¼M»øbûû`´=;•&ã‰Ä?ð‰ñë{)ÓÔ¯,!íóÿU¥1÷ƒuØýØàË‘õþòÜíz’2ó:r´ýÀõ[׋âøŽ/óåÿðûýÒ }ùgÇÂø_•¹›¸Ì˜Ñü¹Œ÷"®‡s3–˜ŽŽ†©…³ÁOdmnçîËè÷Í.>¿ß¶­që5E߬ ]°±ÁUtq˜é¢½‡ây”Ø:öþ©Ê)±tì´•¬¥ƒ§±_зø ØKO(èðö*çÜî™ò4cý«4û«ýý\ÙXı-à˜éûöy»QYÃÆzËßôçxÿG ¯ÀürlDÖtô)µˆ÷G[¯FÁ"ì=ä›zö ª½[Ö6--;‡v-2 .€cèäêMSíÝYV0™ñmrœ‹ˆíàýÏ´u»¾—صèWˆ×葃Õ`,5üÔýºJìÇÖ~P¼ïú0"ØÄ:¸Åð<&Ft¹÷^(öóLâÿØïYÛy´:†ü/¾Ápûwp´wZë!.OÎ?‡ø² ¿ÝZé[âeKyÏò >xõ™<’´ÇWD§~-]xîÖê¤õ+Þ—} Àþ­ìÃ<Òû`çyÏhùÁ!ÑöˤÎ_aåz’h¶GÊÇ µ_eöp<Ìñ=ò×ÅþÎÚŸ_+ù ŽoªŒÁ{Øöø»‡)kkú?ç7ô;ÿcË®cŸGŽö.&ôØ<^´xë«ÊoøMœèß9òA´8û#~¾( F~-YúÓ8þ-G›ë.Á9Ö}áGû?]œ|/Ú~’¯WÌìßüV´}H³ŽèãhïIyË#×Á>%þçï»}ÆËÑë£bÿ£§8À‡%¤)¸ž À¢å¥ófÑbÜäúÑ˹¾nIé^ÿ!šÍ †Îm_êG½æ&i‚îúS½6ûÖ¯_xL<Ã×yNŒ{#Úû9¿¬ô(úläès:…V|~'ß2Ï#Fÿç~5:,œÀy…FèŽW£Õ‘Oø±¥-ìâ?èOb¡¹6oõèkD‹Í=U¥I±Ž¶·[â)8™üÌïs•½½x?cD—ùù€Í•‰•hÍ÷¬|w—<` T¹&k·Wpþx66üýÊâÏžC\‡œ z ÝA.š80¾Àñ^ƒ Ó62Î#¿xúŸŸåjß<ÿ®Å_\ÜÇÖ]Aü'ÏœB;â]`ÃóÕÖ-vñ^bØzâåºÞ»ª†}KÌeíÜ=ÄTò³¹6îH?9öùÿƒÿØôØøÄ{>û?UË ð7õI®;GìÏÿŽâ<ë°}ÏðÙÛ‹Á¹yDz‚ØÎØðÁ¦¤9‚É+>—kf«´/ùhˆíŠF<ÌRÚýºÎSɧàcCÿ-5ÞÂ8FóÙôcZi/ìâ|Ò—!ò9²™y¤%ýorqt¼hºa1y™ïwDÿ®™2§èÐåìóo£½×îK<°•Ð?ÉœÛZÛXy#¿–õ>`q ðß\dÿãGÿþÁó@>‰;`³í=ÁømÏüäÿq”1 ûļÐÁ䊿·3†ÿí§HÜ~]|¼CìçøW“Ó>?zà^Ÿû²˜ÿNô6héßñ “À²ÌYSy8Ú@OE_ _è’±}âî`?ú` çu1é¼ÝmÁ 0i¸ßñ ÑÁsVú_`eÇþ`‹L)¦>ç3—ŽV“ÊX3.EŽàÎhïóOÜѽ·y-zdÄh¶Òá}ÇnÍR™h8ûÿŸ×T礯›J>žÖó£8ù 霾C¡s®™àû\ƒ!®=r]È€¯G(WÄC°ç‰•$®‚ÿèì!ð %ƉŒM}¬sÝŒVO±ƒ²° çα߷8oIxž¸~<ú}yå |¦V ›‘|7xAÜ`Ÿ·§|N¾ÌÇç &Ì\a£S±ÝnóÞ]”?â6÷Ùî7ÕÖ,µØëÄ·‘Ÿ¯*æ=`ÍgÙÿù¯÷^#vÛŸCüÜN\'w_7V ¦nêu`¶4õýØÞÔàŸ%VON;ýÌÿüçÜ|Rü§_äJÑEÿÿ;_´ä .ÿÏÓé#ûQdügñÿÔhï¥ç<º‰:%jó×u| :ž…¤É•–àu‰á/çãKÿ«^(øz¥<…íÿTý¿ß?–Øj‡'%f†þ€oŸ‘ÞK ô¾§¯‹¶§÷<ÊøÂò<:"×»î+Ÿ¸^¦ØÃË•œ|‹^ßÁXd—˜ ¾àÆ•JÌøLeàLï¹@9à÷ò6(ú•¸4yE<Ö–÷w´/iŸòö&r;ý‚VãÕ¾œ~­bjÚk}œø‘èßáÕÛÙï‰[ÏU½P|÷¢­-z_Ìþ&ÚZRëLúwÝ>/®q«¹Øg£èãßyì¼'š-Ê3°‘Ó³®¦ŒoÊÚ¯¢o^ñÙØÔÿЦ‹Ü‡¢Äææñ@¯/}ýOñ÷°+÷wŽöóñ`i½œ4Nÿ}Òéç¢#ߊþ½2ý;…áYâ"“F¿Mc#Vñ€4ËõnD{gûÒýéh{rægÖz2?DËå¿. ^¾>´ßÓõKïûQÚíýÖþ–ïïE[öÏè‘þpúÀÔM缌:@ש¼]ÙaVÑ£GEÿ  ðûˆ£€Å`<¸K.=‰®&KÜ›,^ÏO|üƒ¹±Iâcê·ÞGÕ—-2ɽèø-œOž‰íEŽ÷åm=發mà?ú‰ßÎÿP1½Øô÷zrI0ñ,ôqb÷¹®ˆ:óÙ½¯ók‹Dw€OàØ:¡4ɵoh›Î]mÓþ½]`äJêbákˆ§»‰»{z,ª~ÁƧö’šÖt‡?Y0ˆÿ¹·uÿäw‰õtü7"u4Äÿïô¸Ë눯_`´ÈÀq˜~ÈÁö!õWŽ#k›–FŒ%õñ$ä°›Ë>·AÞ‚Z©Q¤-ŸäJ¾”¦×Ï’G@ï'Ã7§Nà3ŸÅ|Léó–•Ž‹û›þ`ãSoû' ÛË‹S(û‡Ôy.Ï™PÞD:[¸èì©‘ÅŸÉCø#Øèwå/rP§È?×È_§ ðÚ‰Ë[ðìYþ·Ž<½ùOgíý]\ùÃFÉ5¿ç»3žN_&Š>vUÎýYã¸[ Íq‰´§õ¿Äæ7ýž1è¬åüKÑö˜ãóŸÿ§rÝíûÑǨúõ¦|'Ÿ‡ß…î¶Æ%uF‰9O#&>͹'šÝï þÎï¼fÌ"ãÖØûkKK0à çŸ+cÒY[ –­æ}›8¹Þê«úlæ¼Ðè³è÷†ëß±uI´wµÐOtÕ[bòœ^ûb´½øõúW£ÅâS×±ò_îmYæñÉë?÷Úokõ{ÑQ®uîkx¹ç>ÛCû=˳>}üñýs?¬!uþŠ®Oú’ÈeêÖЭ`ïQÊ:e^yzké{—¼¾¯|~°²@œ;‡ùת”yÿ]üô}¢Ø+ÿ®}-s½²üÏ\ƒéŸû ú…}µ½ý˱»ðÝÉáWÀÓ;ù-µ;¬-B÷ýMÙÄ §AÝ9¸I=Ëx>û“o«ÝWl[|&òð ¸…Îÿ®¶_ÚÁ®!vMüÐhû¾-0€©|ÚQlÝGŽÎêµÄV°¿‰«'FÃÚ^ìvb7än/‹š¸Uð;lü´ù‰¿S zc´µÂWØÆµêìþ½ÅÿãìãºþÇs·¯ø-䨇ª#vqÇxP—Š~ÊX> ~¾Ã ¿‹MÝ>©r—kõŠžOl&7²†ØÎ¹5Õ Ôà#uxR|3||,rÕà6ùd컬mÃ.\"ZùŸauž &ïâØ•“VY+vÕ’^OðÑòØŸj?‹Ý³M´wáâ'¹a|c|rÜø¨¿ò9\ƒ½ŸùHì}tº&× oè­¬W/Ú{ G žöö¬ï{MzJ¬!†MËbÂÓ~bóŒ\? .¥M>‘ç3†ÿº÷äþc‰Ơ˽¯àUw;rÇ0§í}àù)<‡ÿL|;õSì¹Ù£½·àaåClœA‡€/Ä+Àlìvb Y[;\:B댿æù<2?¼¢÷no;Ã_®´#J|-õÚ´~‡öÿcãÿ$Ýs‹W£Åᬻéý õIÿNôö7Ò½û_iÿÇŸk#úwçúê¢ ¾~Ÿí2oŸù¬´û'ˆÞç*søõ@¾”¿ÆtÎ&¨c-ãC.smð&Ò3}Ô•©i¢­£ãb>`ò³Ò[†êCè}‰×`Œm]õòôÓ‰ÿ`ë”uþ‹.X¤>‹xB©õBÖÐG›Ú§í|øÂV§Ápæßøc;MžXÓk‰sFæ ò3ðøOÌzþj{Û•˜ëgÑê€Ð1àú Ä< ±™‰l+Öï"Þ“gÝ\±£øK|d5õç‰ë`ÿ“Å^ÇÆÆÖ¿8Z~ø?É«bç?!îSÄíßÙ4%?p¹:ä±ýWâþ~~­Þs‰;‘ÞÃq@û-Õ Dóiè~1ª£¢í´Y´=EsíØOŒ•ù|«Ò¸ì£´®´'WL½±âJ«J/je—¶_Ó8 ÙîÊuŽú}D6UÆW–o"FO{™¢þà`ùÛa²Š¥…7³\—|„¿ùÄÎÿ·;ÀìˆÌ/é-B.Û\"öÏ)¯¦íºµml-f•ØÏög~0mõ<Œý—¸ öþ³bsæ|ÍÑ|zÚÏ£­ÙzµÊa>§Ø÷‰A/6¬*28o´öƒÑÇ1Òö,8’ú–Ø|®ƒú¡Ò¶ØíÄR&«>ö®Ftĸ“úw›w²XÖÿ¾)ž+Áò¹Øû‡HWt(v>6çÆÎÏÎYê |;°ìÀ¦D‡à/ Ï—Ø×O|Þÿ¤Ÿ5žÅžU:CoêBYû|‹º€8?z ûõmÛøýs´÷ó"³Ø5ßj«b«3GØ ßø î]FìZX<ÛLÄ~=GŒ&þ“ÞF½Æz*ê+s Ö â4±zêþÓÆ>Ûã×búeâ?ãÈÿ+ýŸÿ.óùNüè\õÈùÑjJ‰á,vo!¾¯bßöÿ7ÏŽéW¶‡¾Ø[]±ƒã"žC¬LcÉñ¢;ÿ-m;Z–}#h÷¸h{Fï/¶ƒ÷èAüŒÕ*=KÜÈ8RÑÈ7vñl<°˜X$¾þŽâÁZ•/J¾æVyûoX´\ñdÊÀGòÿPyû?€¸ÿòñ¶~:H9€×)/‚yèôÄ<ÊØ2ÞÇ\£›à§…”5þ›Àº1k_úu³¯G_ ù“uÿˆV#î¼Ü®+6í{ ƒJlñ´ŸOD{7¹ë†úwŠÜí}‘™³Ì:pgÊÚn®S(ñ(â4`ÿ~ÏÜû¸þ§ö»ü¿¨ß§süST™/Øú¹ýy^ÚNéíè\ ã»IGt±·Ý•eŽãœÓý/ñ?sïÌ)úÿ ¬êp%k“2æß¿×ø/âѽҌüú‚ tî#ÑÞ…ƒî|©Ž%÷è/˜öt´uÔŸ‰»ÿvŽÞwβÆÿõøiþ:¼mO¼)£åôï,Î<À Î]çªßËõ³ÖF_ßôzôï](Xû^ý,s<™ó7´bþ°£°é³Æâ’*S…Þø–ÄÅ3¦‚ŽF±³‡×¶Êx³þ_ê?òà—cÈ5xèÝñZ_‹^§îâiåë/>{ç—ü-þ 2îÇï~ÕëîÓé/1⺇Ê[äÉsÿ[,Çe}×hÕÞ,¶=±læúÐ| âÿÔYÊ:t3¶6-¾ÂXõ¾~_MìèÄ3jb&UGp`ûcë¯'îíXíÚâ3+f£7ˆÛ{!Þò Ÿ#þþFÜ¿Ql—Oõ^ô1¤£¢íǧØÎ‘öïà>oYQ½€.Z_½°„Ç2ÞGÝê¾~'Vt˜Ïúì0 s©ïTúâ¿ý™õA'ÚŸ|ÖÞ>›¼ï²Qu1q6tÈ}uНr~¥o™gìùaò+ؽ–s f£Ϊ>{7¯áÜ$æ€í™kxFQvGQ®'©²]ìÇI<ƵO)7Ï‹¹&€ü'fíþ•²ý¬òýqŨ‚ÕÛ×'(¸=`¿:¹*± ôÀÍÑôk®÷úÆ9ž6Ú{xîþ÷D]œ1|¶[¤÷íÑr*¹?±¡ŒÏeMn¿Oh®œÞïcÚwâè“~¹6ûMùæýÊ%f÷i´=ÄÓ/üVe¾†8wð2¹®Yå{d+×É‚£ÄaȇboŸ íÑ;zßÜÊÀôöÝÚ´ògmÏìÃëý^‚×GÿТãÁtjìÎwÎèãÖòóL<ˆú›ÇíÓ%òéòþ;: ;·£W±÷ñ?©“g|Äœðcп¯º¦¯3œÍëñw©#br“Ë‹ÿ3T}Qêýgûæßv?‰#=-&4»m¯/®¶‡èrþæØBLÆ®þY´÷ÁPôqÿ”h{ý_êolã+ýÌÜoÚég‹'‰»Ç‹Áàî^ö9íÿm+Æ]ĸÐO]VêohØ 4½ÎöN¯×–w¼£ƒÁíyà…4cm:L/¯T·XŸ[|†\{1½ºœÅß¡w1û;T~ëd¬èš}¢­!N‰.ØR~„°ÓVV©ù¢¦»fñ(×Á,íAœy;¿o㵫*yþÿgûÈJÆt°Ï‚ʸNŽi4OSñ¯_†>À6q=cÉàÑÛÑö3¦½Å•­É£­åú¯šu Èz®ÃzVŸ8ZýÉþþN\Ê5XÚÎWµåkñ ¦Ñ>¶ò Ñrè‚•¤ãŒËÓ"ëCªì?2sÎèÇÅÃߊ…Œs¬úü¢—¡ýÎ8¾ß¢ŒCwâmëJïÕý¾H´½ð!Ðèjôñ’ÑòÊó‹‘àù]ŽƒÅÑöïD'^ê fÿÕÏ·+= ߌö.·\=²÷![`þ_E{¯Àß<^‹~¯\ãQìx¼›)Zn~ŸH¾žVÚm#Â_ä®Ð¹`(¸½æßàoô0¶ÕAÎ1ú¼I•ƒÂ#!_­<éœ\"íYŸ_hcx@z’ËtmT±ã˜Ç½ÿ«=ˆ§Ù6ºŠ¸-þ6àÅö•Z Uµ5±Ã𩟴ÿÈ1> µ3Än6g¬øSìÞŒëÏççU{f±½ãõ7ßR ÇþÇ®=Üÿ—V·ãÌ<ÏÉÜæ>âðpûI-Íöâ26;µ›çxœáq’Ø©×ì£à÷YñÓøÏ¹éЯ|Æ®k;~ÎÏ!N[Äÿ°ù×WoìêxOSO€}øøäz‘—Å{r ĵ:ù+ñ2xŠ:-ü3êl:.úùü²ÎOÑè}ò+Äq¬É,yâŒ7Þå$6ƒØ™`8÷ûŸ‰þ-ÚÞËðxŠý}û™r0¹|„±Ž¸ž`7.&ï'ß ø•ç(+ètÐÂÊ‘µ ÿǶËØÊߘÑÞÑ1F´ýñÙ¿Œþ½ƒåš‘½šmí½'‰ `ubÄÇbËçÊ!6ºk‚úöŸƒ¬)í×HM žtô+ï-P\ü—Øõe´÷ËÿFša'M熯U9#¾ZæfìúÚ-±Ïý†^Âß?AùD<[u?ò_âŠðØn¶¾ÜfÎÕrÑÖ¢â¯ýL¾X̃ï+Ô¹,úç^ñŸ±Q×s§˜üšt¡¦ê‘:'e=Ø¿¢ÕÈm¯NüׂXR‡‘e¯ëÎë×ÇAÏÇ|Ö•~…ÌÛûÑÖeÿ0p â¿ûT”ù¾_^3ž;׎A×飭¿ËðqlEäѬ ]ù8RþÆÆ!N‡?Åš›Ë¢ÚPçzŽ˜øßaW±°§\³^žÅÜ/í·hGªã ] ;k²oÄp©i™Ð>P{ –“ÿýƒ¿ñ)‘ÿ üCÜ÷8ûOŸÿ)¾bÿ÷ƶ@v°S±#¨Ï!wPâúÛˆYC¢ÙìË‹Û`á\žc­ïdâ÷Xê ìæõĨ£ÅË*ïÛyuøO¬|þè×F;wïÝ^üÝI: þÿÒ1dü‡g{ŸžoîøSìì¸ÉOdÎý·¿úƒ{±Ý—¨ã+±žœ·Ñ½oÛZNºSg|¶§½~ÔzMÉàmVûQrú—Êsøƒà ñºÝ+6_pmåŸO°›&ñ=ƒî¸S>ÙÐ{°%ñÀ©Yªü;ii¯ÉòÅ£­b èâø'Ëôï¯_G^Ÿ]ÙoÝg§|Ž«\ ‰ÿà±ýQðL#ú5\ýzäãêÚ^¿ÇB®—YLþj@/¼ý{ ƦžÁvý›r÷žÏ暌õ¼8€+7‰÷‰}Ø/|‰Q¤×<ŽzN*ÍN{ŦÛI:Ž&.`/b‚KàÔ$¶y¨ãć ¾†ŒMw‡¿·ˆŸ®£X×ùZ?ÚÞeÌÇAñÓ½ùŸØt'ß%Ï‹ûC4Ûû½:¾>7ùêÑ/ˆO䉖´?9ïJÓÅuôI®»¸Y\†ÖWyîöh{ }æsÒg˵é ~?ðû}?ŸÿsÍÞ“Îõ#u^ûýžñµ'®<Þ¿ `¦èßY_ü´©¢½'ÿ9}ç#œ»G•#òóÈ,Ø‹cDèêõÑSW9(ïk΄û¤9}"9·ýBV±1°¹é?ðÇßü?÷†À»ÆgO7¶ØAL”ùƇ}GLß\üÏX ˜?­:aˆ:€xÐ<µý’ëà3bE!Þ‹V·ÎoêY¨õÙRœÄgŽ!N‚ÃkyÝÖê„#Åcr'üüÏßOTÿlçu;ÛÆqþ>ÖöÐ%øä[÷8vVº·t ö³X´œÅº¶‹"æCîv)iDø ß•5 «øÿÒ‹ÿ¦–¦è@ðн*¨%¶³¬Ø?e¥e™[òÇ'9¯YW‰} Æ‚ÁgG‹Óï&ï‚רxz-¶ÉÕò݆âçðùˆi’×?UYζ±÷·Sul§…}ÆÏ¢ío/¢[ð‰¯¸RbÌó‹9ãU,)˜›u?F{ãUFJ ÿÀáo£ÕŽ»)zyÀŸÈßè’q¢ÅÀ©§¢_Ûô“:󪼕ëøÿ‰hqtòjŽí䦨¨Š/èmôv%¾:1‘·j[E!Oà7þÉ<ösì*7¯©EB“‹ÛÁklöM¤ï4ÑÞw<µ¿WÞ;z{Èšá~RJ½:eIûŸõ¢›:¦u<Òög޶slÿ”5»¯ôνPû÷ã<[ÇYpj2ç‹~¢ûÀ¿Ã¢í ú½øÿx´½Àrâä¨m%¾M¼ëžhû\§¿‘q Œß¥x7šðŠŸoù®Ï|ügÑö1ß[0ì%WƒþÁ·Ö)¿Á¾±*–øÛFÒ¹É}2Ï…½®/'÷‹~Ý9šÞÅöÎ|—µj½_‡üà/`ƒýÖvfŽöþ6×~ý÷]¥Oñwi‹¸rK¬_ž˜?ñlwlHìxr…Æ~ ¦"/‹aÄ"¦«øSlH0{4±ÌÁÖg± ò  ‹I‹©G¦«ÆŸÁ‘k›¥6túŠoeÀtbÚæb1“©l[ŸØþñꎌ“l#>ïjˆÝï)~$&S£“µ?§ŠÃG‹ýgùÿ¶bñ¶G[sîïâgb=ÇÑtÌñþÞ^lë÷-£½ÓægÑjSsŸ·EÅxpÿ8ûr¸úb~u 6ý™>8§4'ϲ•tå7ò†Ï‰­q|FŒ´›“b÷Á;É«Ä|±U°1ȃÁ‹DÛ?j/y›{ˆ[^ ÿÀWÈçÌcÖÎ(¯qPo€=oOyTTÿÛçû‡,oÜÏg$ÖLm½Ïâ§{¼}€¯Œ-6›Ÿ`(z`òhïNÄnžÆqMíýSã+»Y¿7J´½²~ó=1 »¾ûèñ`¾úŒâ—P1¾è˜y+ôZË{†)sàÆb:i"û ]˜/j+Àä¤õáÊã ~ÿÔkguNÀäQ úÝŽO[q¬`1|tÅüÞ»P´ºªUíü@þ¼Gÿç¥5Ëú+{~ÅÚÏâ3QׄÍyS´z¦9œ§7£_oéßÒ>Ÿþc,WéYtùSÑö¶û§sÇ<`ßÿK¼ïd¶äð~£½?Úú_îC'?lŸî­Zúðq4ýþ•ÏA¯\QŸ[æœ:ÚûOg¨ã+¾ÕxÎóûb.síš~ØI<—ôËñ·Y;y§ŸèqâìÈ!üÿy=¼zô¹®Ü£ä`±ð…Ñ'ÃGäcùéµèëc Oîù/åÕ½?[‹x1µwÄ}\»Wb sTŒìóŠØæ[ˆA`pÆž±ƒà÷¬åœÅc6UŰåÄ6âÖØîY+DN—|è¨õÙEÇLoûŸÙº#kzÖ©º¡Äû{w÷°4×Öo&ÆæþÄ[.ïOëOƒ8޵ÄvÚÚM}p¸x} Ç~~¦½¿ŸÇbñú>›~n( ð‰Ö‹æKì`üÞ\¬?Ôq+Îão ³:Ü,ù„õ¥ñ˜•^em1tfî±AÐ娨Ø{ÄÕÏqÎáG|û̽æºOôvÉòØæœâ½;W™ïkB¸‘XæK¶3’|:“2´bA‘uú@ "üušÏÇý­òpšÏ€ß·Q²î|Öþï×ÀfßÁûÄÿ™”שªÝWìiŽ‘íË8Ñr E[Wj-x¿wùÔ¾ðÅ*c¥jiÿkßFSÞЕ‰ã(³Ðq ÿcÀ†…ì+v6zq+Ï!£`úŽÒré>ãk}(½q×”VóG«g¤M0ÜYÁ>€¹›D³õW´Ýeü\Þó般ÑZÇûÀgü‡mmoIû¦ý_âe«I+x Œœ òA¿wç×ÑöãXN^ÿñéFçÀÿÇÅêWÅñ÷ëü•uÄØÈw|LD×Ïèä°ÄôY{ßcÑr÷¨W¾’>®¯îõ̵êlÙ\0‹t„çr̹7‡ñ½|÷p™ÿ ä¹ÉüDæÚEt8:ýwÄ܉áóÂóØP¿•î‰ÿоKüæþµ|>m ÿŒ}Íu‰ý(¿Ã{Ø:3x?AÞƒ9¡N—fgÁ_°“þ&Îl&v‚;ð>uEÔ¤à›¼U1§Ôñp³ ß‹]¿º8=TïŽâóÁ¿ÄªÇ¨øUüÆÂzctq$ôþÂâa¶7³íÍ)f$Îf=³‹¸¹¶ýÞ[ Ɔ¿Lüÿ™ØO »þˆãH1|ÿÿƒç™? 64ëŽW¤ý ¾†¿³ÏÀWA‡ÿZÀëNû‰/eßðöòÙ|žî3¸îlÇ5,úýárïÕBwl•wå'ðùêhïM¿ÈsèûGýï°Oâ:èdä—Ñê/¹¯ëW‰?À³Äú±1à«Kë<–}¥ÁgdÝ ®bÃÌ+N)ÿîd›ÇÚøOî‹Zð-}a®ËºS°b˜26±2AÌ ÌS°ç§W&fõ»kû<*6ÚU&J[|ÎSûVð?ëGªí—XÏóÑ¿Ó=kjŠ=û¢}½³ŽµÜOœhWå »›,Cñ­ðÁÁ t6˜ ¶,ë8gˆ¶o/çÑàñæÒ’9ÁnB_k»ÛöñÍÁqs™}Œ\Gw»N°–mõ:þ[ÞcEÿÃ'ë±]s øQÎ;í…èx¯ãï~ßl0ö¯ïÆÚï‡<¢4¼²âmÁüu÷(Õ^-øý‚øýoÛ"öO[žšb<Øúĺ痚ПGË-b;ÿû3/ü1ž¶_‰¶ë]ž{¨ê¨~PŽIœ‡É¥ÓZ•—ûXÒûÑÞ?6«s¹l´º9ô7ºð:y{‰zì¨ô¡±uòÿ#¢­¿£—ª|Y숱£Õ*ìœlm]ù?cy2Z¬3×âŒmÝüðä=ÑÞÇH,ÛŸ¸þE Ž`ÛcÓƒœ¨bo‰Q_ø?± ¾¥n»{q1{Ûïöü²õY¥¦ñª γ^€¾usSÞŽPW:J=ßïóO[ÛÚ6X·a´½õ±U°Å>Vß°–kû.³ßÃÏÕàkÇÏ%æŸõŸ{«Žðs/ñyqü?T½“!6sŽ˜Íq¸Ï¢¯›xl%n÷A¯¢GW´/ç{Ï~öçuþÇnöÿ4õÇÎꇋ¼_‰ÞRç¢Ðßòf±Â&ÇNc‰Ó;~¡Î}áIøìlùï¾z}YãE,Ÿô^Û¡þëÉ:o¥]ír£üð7¯ËOäÛ5×2!¹®”ûˆA‚Ÿä".²œ'†bãëï5ìgæ&PÀsðûv¡h¶7¿§öו%êÑ£GÛ‡eÛ˜@y™*úw€—vÀù½¢í¯øýÞ}¤ ï¢ñ«o’à‡ .`÷£×†ÕûóT%§€¯Ænm_ìG0šœ!66ر–m'MÀèE=2?γ–vÌÓK÷áÒoÙøéÚah5´}¡²Ý…£Õw¢ öôØvàsIÛ^»ê½‚»/‹ÿãVz÷5TØãTì/qòñíÏ âè•ãi‡©GÕÐø:qìü›<¨oép³ØöüOÞàWõùÿ¦^ _|çï·ë¢íëšuaè¤É—ñü>m´½øÐÝØ “Úÿ‘똊N·á{òh;IÏå¥71ò4Ä3ñ·‘‘S£½w ?Æ9âìüâr£Ô>üF‘ßý¶òMá_c:%¯ý¬t€~èÚW£½—†¶ñ²† Ý„î~]ü“‰Oâ'ãc±»9)µüø#«'¸ÎuH%^ìt6c±Ç‡ª/ˆåĈ×/U±¥`2¼IykÿËóžÏ>Tßì^±½äpÛ›_ì<\Œ>Q=Ž¡h'û‚®Àv¾J,E_)–-þ³½8˜ŸÛ‹Ý|?6Z|èbq›œÚ «Åþ3íË®>ûxÏ;ÿ™mæ>«ùƒêæ®ìEt¤ã<Ü~óÌ“¼'ÇË3ÈñŽQõI©õÚƒX?>&k È% 3Ç’ÿ°cÁÅÛäKb;¿•OÁõ¯ê3J¾˜æ5σà?5CYŸz]´÷Šc÷c Ï®—À†óϱ-ø[¬Çΰ b `hÖ@ÎÜ—µAYÇþ£Ë± ° ¦G¶_ó'ÒÒ5ZýiVZ÷µ”Ýœ”8 ±·óÄç“£½kóÇh{«‘óeÁ ê bö׊y`;yh×›ÿuÅ5öà®ó-kh­%(¾åè~fç”þ7‹s9uå­¾n [|_çŒêÁÿà3úbÿç:ìp?k«¶ôXÉsÃä—£½Ûþ 熹íð·ø¾ð7ñ—5ëïbÿ¿ä¸¾w\³Ècèì‡ÝìýÄŽÀFÁ‡Ç—HžKÛž3r‹l¾*¦§.˜Èk¾¯÷üFÌ*“ o»’ø»‚ØOžÂïÐô¯Ã.C¯ao¾YŸQÖ-¡söV‡`7ãO¬í]2ÇD{ç:×M ÖM-µ‘XLÌÿ±õ1÷Àh5?Û‰«y~{ŸþŸìþŸ'ÞóÙñ_¿ôIñÓ:Î3£ùØò‡zϦ^‡žšÉñ`îVŸà_¬åq¤Ïãs6õØ¿¦4ŸBùþºÒµÄÐ>’Ç–{:·éoÞ'ž€ÓØ.`ítÒìÂ/»ßv¸Ÿ} –âC°n‘bHø Ø&‡x€óØõøøÄ*²îáZy¬?W¾äóF?©i!u¤¼Ç&n¦ü¬-O#غiÿ£{æ·Ô•,^¿9ǰ'ÐKsVù-ö7ú¿~¹*«%¿Ëx#ÚÑ™´¥žÿÑ­“{?ô×Qn³Vç,ÇŠïúÖòëüÒ6í‚ÕŸ¯V¤OUè„~CÑ/£E«ûN¹Ý1Ñ.2s¢üùŸ‹<þ$¯âÛŸá\ƒ ä;ú¡óyKýJâáÔb 6&9‚IıÅr>óÁÞMüÄ¥n§ëZ±Uñ«?޾.´<«³Jná«úü²†é‡Š]ï6³-0˜Ò~âìIò9k ˆ½àc˜^‘kt3Ö&ï-o ¶Ÿß]]r´ýÞX¼=É穎8Ö6®~È5_™ïÝ*ší¤øcÿÿF÷‡FËOpý¢ö—6G¶×OwoÁoduMÏ/í}‹S\;»}XÔëòX,Z|~e?ÉÝ®ã÷Ô|ÏøÎþ&þ°’ÏØÂßóÛNÎ5~ë†Î÷lfü˜'+¾÷{ñ/yI\~E ¿ÝëG¬vk‰ë`«ß"Þ¿Sñ«´ƒÎx!ÚÞÛw‰ÿ¬`-ð¹bú£>û¦hï‹G—àKüZü?§áyî¿Ä~ú2©ü4ô"¯Í­h–hkG˜Ï ¢½» yB^.©t)ïTã°Ÿ°uÀÖ\ß î"c¹öf¹è÷-¹Žo¢_»\âþðÉ>sréðJ´ýE޶v:ñß›[ o>çùdû‰ÌýAþDf‘kl1ðg±k±{2ÏM)ž ˆý"ÓØæÐä›jo{vùècŽ%ÞCËLêôrù’±'r gJü bÌ J®²›§bëRσ=ónŸÃ}?÷ø¥÷bç_k¿rþþ?ÉG”ûNQ.°—Žöyû°§üš6KÆ'˜Wl±Ùåo0ýÿâ?ö1xþc·î-ï‹O€¬c¯‚¥ÔF Gñý?öNFë Žmmv6Xˆ/}@½/닯Íór]}EŸîg_Àmä˜xûÇ6™Ïç7xœ¾MÚçó:F0bÉhûÂÍì8fó9+øüåm™èc`ýû¾Ö•¦ëD«éI}°Q´÷y`ïoâ3vL‹z-v$zù(çûÐÚׂá`÷ëâþÓbëÑêñ?ó;˜õ×ú»è êvˆÝcïw˜Râ:·ŠgèâÚØ¸Äì©Ù!Ç@,§ÃÚÛùÏçÀ¸­ê˜¢+þáýÏFÛ3[\]¶ñHÑõ£E[Ó ŸÌÍþÈ¼ÓøÑbu+Kkø`Wy—1#à>r±—ÿcïà3#øé'l.—«<ÜÛ £É/âé#ì‹m*–|ïê°¥ïŸ*ïžb¾ñ‡Ê+Ø%`?¾7ö>r™µ"ä´K ½ùÛ‚ëÄû‰¿S³BÌq[ƒÜ×ýŒ*ÖÌ*ÎO)öã,mê¨ÒèÇj¿–k™ t:»‚XXæP+K=±\'@üƒv÷¥â7˜MÜÛÑhö ÿ#s¸Yk‰.8΃˜JÇË%î’ñzrºØæ[Šß™ÓÝUüçúŸ‰ñçE«:>Ú{ÀÎŽæd7ŽãÙËsè1lóÙ¤z…[ê¶Cì7ºf Ïcƒ7 Ö~Dbc_#?AÇoOèV“Ó½Úy‡‘VÀÇ#£­ÇÝY^åüT0¼'nôJ´z60€îÁÓÑà8vþ9ü†¢Õ½í§¬plWy®ÈÃaÑtº}´š¼Š­µ¥ò€¬,¦LÌ\åf0þSäsÒh5.iïã`öDʘöw± 3îð•8ñ½×g}5ò„l‚£è«Íl]6Ìi°ñÁLr}Ø“û›û±Í—TÎéÓd^3™ã™eà“]×]Þï5óŽ×ÒØŽ]7n4aåÚ~_³Ÿ¶ÿF~_-šÍ¿ÎÀ÷Ä3æ~Cl#óî\‹Íºƒí¡ËÖªsSl|°ùkqú…hû¾:`“[)¶-ë2ˆßàý\ Ã_óü¢­«~Ñë:ÿ¶Ôýðý4õĽê[ðÙˆ9aÏ<'ïcSP¶üþ¬üÜ£C°‰Ðé7F‹õ3ß§ø ‚)ë+cÈ1*ìlÚ¬[†§‡D[ë•1~ä{ Ùž?&ƒ÷`5ØÒd=×½¬=õ±øOî7cî_(‹´9½2…,æÚaú14úw¡½0®×ßaFóGõ¾¢½/d2‰ýÇÆO` õÑSâÿ¸Ž?kv“^:K8ö%¢ÕM1ÏËFÃù¬ëOÝñŸ¢å”9¿›mdxx´ºó5¢s‰E@Câ÷‹µ#4Zôè¨uŒù®ö²oëâø ~b³S·Cá‰hï¦MòשgÎT_\ îáâ>ß–XÒï¢íÙÿ|ôë“Ë^ øÂ“ð˘ŽejçaiŒ¾ÎýDv“f Tž(×ï&rM;6±l 0~?Ïaç`+áœ-~™ë­¹mlõå7ò6Fê˜aÑò`ëÊ—V~.~ê-Ò»»`9û¶p´µÃ=U0á|Û;ðño“Á$lvlãÄ9έ+î­6€Ù_ˆÓE‹õ÷§ö“Xq{r±3Vü(µž#«&°YŸ’v—J3bg` ØËZI zj£hùãÕè7ü'ô(:ljéO¬Ÿ,XmÍnùoŠJۢȭिpM´ZûáÊvÆ |/bƒè |ìÁη,ú™Á>˜Ì¹ÂgŽ /<)_ñ Æcá{œWûW|ôy€Œ=&þƒûøÈ{Éߨú[+sðþ"È0xþ ‰ŸÆÿÓÞÏ-Gæ{‰±`ÃÓWp=küFóŸW|í½²ðæ¨{‹þ˜È6GˆVž¹Bð, v…O€^BßÎèµËÛgbEÓT}Ó¿gvIÿËXsæoçr|3G«IÊx?´Áî³Á†m<ÀýôGÐI[)Z½bÖræz.>ñýÈe£;6¶ÿ[âÆ6ŠöÎ(Ú\»ÚýÞ¨àØëbÙ[ÑÞUõµ´3Úû‰ÓFϺÌ‰ßØóo«:>)¶}Öîãt2—ºÎaãgΗØÒ?ëýÅÖÛ~¥7’s]ÉÅ«›vàwÖì$/Á[Äî±Oª4){1-/¾c÷ãŸmÏŽôÑËY;5mÎçüNm=#íÂçÄÕv“–öÌ5¾ò¼Õ(öÀçòlÒæ=yp•:ežxn®±Äž&>‹þ}Æ/¡îûz¨8 ö,-‚Kģɣ‘grÌÝ3ÊÚÝÙÄW|åo£ÙÞĵŽ?Š~}¦þ.ëÉ%Þéó±#±=‰CÝu}4:á¹Jï¢cf޶49âHÔkžhßÖ¯:§ä•¿Rïld_vƒ¶ŸÃ ÔÜàXÑwÔM§½.cŸïçw0œø:è2Ÿ}¼¿»7·´å¡q"ò¿Ä¬Î¬˜_úÏzŠù¢íý³ºcLýA zuqõÎ(Ñös»T¾„æË{=X=¢ÇH~¢fªº¦ä°yÐ;D‹éb³€Ñ×6J]ð‹Î-˜ùMôï/ñ>Ú›VYøÆë¬ý/5CÝü_Ýy§äÁÔ󹘿–ý98Ú; çTF‘Ï\/Ë8†D[¿Ê‘±˜Œ™s˜=rÅðRç÷Ÿ?V<*¿ùÏxuñ»áaj>À|ž\_<¹²²¹}áüÂömÑhë‰ñ|îÀÂ÷íxƒÜ]±!çs à9¸»´Ï]S¹ÍµWó;¦´ù\5Ú»“É1 ™ÓŒód®$óÁKDË+p-¸²Q´=––t,™ÿeΰ?Áÿ­§¥½gh´:ÒI£§}¡÷;â¾ËgÑÞ›ø÷:'å¿‘µ[ÑV{¶änõ{ÖýüAÝp£v.öýmþ¾Füÿƒ˜xMÕ#eŸö@ÖÎò{!O&ýÓƒ¯g’~K:~x}¾»÷1·cI+p L#Lî+ëßv•g6Ž¾Æ«äÐGÔòÿ·òDy_͘Ò?ë…s?ˆ%í~ðŵÅ_ý Ú»1­|]Æ…½1‚s !ÛØYØwYóGÛçWÌ/{í`3×`'õþÄ:ˆS >‚M¼Ú|YuDÉ]Žm/ÊÐd.˜?÷€Y_W¬+í;@‡€ïà¸MУøOÄ ðSÀ9ü5ð {~RÛÄ1Uò²ÇŠ·³G{ç¶é\þ ߩÁélÑ’+Þ¸bqù¯ÓïžGì. ÀÔ½=ÎSWüB¼ç\Ön-O°Ÿÿm#®ãOeÝÏæçÂbúfÞî]ÂÿWô~Si]öÚ@£Cß–ŸØ6ôé0 =XôÊòÎÙ®•neNžªó\t÷¶ÑêÖ¯|Qôì ö{‹h{YŒXç¼Ä“>¾>¸ðË÷u~zß¼zRàÚË” âI¬‘ÂÎß7‹×ê'ø¿‹س¦r†>/Áõ¹<l'ðüϺ酣Õû0nú>š²ýÿŽ} uÁÿ×´£²Æsvåsêhk‚G“f3Ø:`ºè÷f/ÏÁîîxªàúÈU×ad1|æK¶ÁsÀÒ´ýÓÞßßóü?¯cD÷ ËøéÈ0²‹.Å—c6p¡×jÑr$ƒ5A3J£Äû¢í³½…Ÿ+H·aÑtɰh{™­ë9è°«}!n8Ž8ÿ¦ØÿŸ_KŸQ½†õ“Úð_E¿¬ø z`Ç?«^xÇïø¬ ¸Zöã7üU}@NàòJÛRt¿s2ƒ´)šÍ?‰ÇÜÎkòUæ^¦ôà¿å¥iÖøfMvÀÚŽ‹g¤åº¨’¤ø¹§JÛU¼wì:®ä­Â/W=Pæì?ÞÏ…í<¾¬ó  CÞ’v™û}Tͺ†‘£ÅÀòõØ ø;ø…]÷¿úYìö±*^\Cˆ¡`ÿf'˜šùÞq¼‡˜ôú¶þWôÉÅàÙı‘jÛ%.ñ|ý¿ÄˆÏª¿KL¬ ^@®ñÅè÷˜(q¦1Å8â ØËØ¹SDÛOyÞú¼²nl¢hï‰9DlßNœ¤6éH±}]uX‘5@à?¹ä¬1Ý)š-ý¿§ß¡M®MN{ïøéÞo«Šû«yýŠbúÑögC¯o»9.úqa_‘—ˆ§v6BÁTh†nüXºŒ.fc;|æüeŸó`*ñ´[¥)~1ë·6‘Ÿ°%ññ‰{¡«7Rol,] 1ª©m{Òª'R”˜ÞÌÎßö½D­6Ñ/jÛ}z§cKNŒg§ ö£ °‘öжÿ$4´÷-!§¹v; »mZå&óy‰ÿó+ccUY(ñpàZŸ‚ÿŸDÿ×>O{ÈòäÑâ>‹(KãT¹íãúŒŒÿÁ 0vL±Ûã|“”ýIí#8¿€÷ñ3}tž5‡Ðˆ|"òO|?¥¼°–ó¹F´½22ÿ±¨ßgóü¶Î±Cì­ôRwdýgêÔ«Yï¿‘m0Èë‘ÑöÆ{Yü{q õ…h{(ý×1³vpF1¶(q‚›«)xB-ÒuÒ’çêŽgfûç#'WACr oˆýs:†ÓÅWâ*Äe†F[ÏÆwò»—ˆÙäO«s=À2~žµ~sCumb·ïmo Áu^¹‚|ñþ³ÄüÓìÓžÑrÌ[Tü.ôœ«Ž¯È5x~ÆöW‰©ãÛ¾_iWôrý–züúÚïÌÑ|ÒÌA7k ævOÔÜ$뀱OÎuRבŸßQ:A·N¶Š®‚Ö3V^)±½Uìë ž›Ëù?¿ÎSÑWøÊiß#3ë‰#ÈDî±Â÷áʼIþ4Y•“ܹذ‰™Œeºè÷xîóy|¦í?w´÷~ª\‡X”6&¾'Ø Ž-€½&@ðß*óå:ú‚_ñE´÷ÝCox9kL¦Žf‹±>Ʂ¬Mýž^E§Ñ明g qa”Š­å}’k ±­:üñ¿U&ŠMNá›×q—ñ'’&ä-: ÇŽŒ¶vaEǺZ/l;Ðv¥húa³è×ú¼Ò¢_ëõ’:w4Çýïhï‰üV½ð²GÖg‚ßG‹güαSëB,ˆz!ò¿© ~+îSã¡÷ãK|* Ÿ®z çYüDŸæ:»Ù¥=º;c®hõ»è½-å]rl“yÏ&í¾¢[&—Þ Gó« Ñ"¶±víO™ó)£½?n$?g•®äÇð‘ò˜Ö~,)­—çÉä9èv¯úÝøzý¯Ø]Äx±µÈãàO ëÈ À0ù™jÓ;›‘xEæ=‰[w4‘8ü•â øþAÅýø Ò§Ø–Ôî¿yPÌF_d½µŠè›w}>ß_¯üÜ×,RwHnå©h:`L±Çú—bëSkº¸çø»~iÏ]¦~ &5Lœ\&Úž™àò6âŒp•÷ì3Àrb23‰Ñäw±w¶‡ÿb?÷ì£>@/t¼Yü tºô$iÙѽìñp—˜º¾÷£Cˆ¥SÇR0]x»ß¡/1Sr§Øî_{ñøêQÆ?Uô±·rnu úpçŠ9x¼Î{ñ-Ð+Äeѹ_ÕûËõôki;LÚflïËÊ3ž§÷×ù*ùÚ!.–cïcsào;SÀ°cuý}³|´½tVˆƒ§ñÀÎFž3ç ?¢2®‹½;…rÃod3ó~Їœ.¶)6é#Ñö þ2ú8E‘Ǭ÷™Ñg‚‰‹Gïw”xÑ·^Ï\t? Ö ßÇñ /èƒIÎOáøReí ÷§Þ!ú= ÊzáaØ,ÉwÐ ¼ÁfLýVÏîsçö“¾¯"s}óA¼5×~eìh£hk†síëúžçú\—½j}^±Õ_ÓöÄx?ú}ÿ‹ï5ˆÿŸ‰QOi§n¢ø»ç^ÃÉËË!Γñž?ˆyèêÿ©"ÄÚÞÎö.öïKѯÝ(í¾ m³Ž~Æh5’K:¶Éã§5¸3:'ð ö8x1}ÅÆ¢97Så“¢§¡ñÎ tÄN˜?Úû(Ö©óÝÛúSTºú¢+ÐÛzà/½ Säb¥:eŒÏKëGÔ‹ÿ’.wD«W Žˆý°üA\åty B†žÐŽQìß"ÚÞ¿Œ¶¯Y§GFìäºØÀð'òþøA¬˜¸&9ð›<;wðº{¢Öô€_è °ýy1 þS/B|›>gÀÿÙ°~žÚ~97“˜…¾šÚëWû9¿Š˜ÌšâÚãú › Œ•8Ѥb3×Ϊ® Ç»µø¿ía+“ÛÝ+Ú{߉±~`Ÿ—úáõvöM~_×g “&Ó¿«´+9t)q=x}H=%¾ÐDâ9z`2çÞýÁ6¾v ô}ºè뱊?ÎG? {wJsr ø`u¿ã:¶Õm‹«m+¯ûþ=yàâhûÝÜ䢷~-¦°§<È'±b°Ýæçí=‰ÿüžWY™2zü/ñdúžöÜôÑp>9£ß¥ß£1ýþQÅ ÇĘG<žÿÑÐoÛßþ̨œfoÃz]/kãÛ>ÏO¹:Ú^‘SÛ—¢é‚©Ú"Úž¦QŸß¯UÇq!C×:[9D–ð¹Ï—–`ȰJƒ~¿²\°¶t]Ï9XÞÿV‹¶Æ Œ\1 …=Ï€]yrüt/‰¥*»–Z–wÔߨï‰ìñ òï7PÞÿzôëq‹^…Çðýˆëœ+Æ£ ˆs?èý¿W/ /ð:Ÿ;:œ+ö1ó2¶í=m]oÖ[MfßWˆ¶|–µ\“GÛÿ<;µ<[KOâæ?V‹ [¬Ï,û±%-ðw÷÷:bŽØÈ3Eóû–¦›!ŠŒÍF'Ú{ì^®¼Úïåð¢ºóÚÈq}êëËSœ/âÿÔx¡›®õÿÎ_*¾>1bQêܱOY+‹-K`Uñ›âÍÊs%î¬[ ÞVc~!Z¼fÙ(1…Ã@G<-åš!ìPôÈÑbÜà|.¡Àâá³y, >M(¾ ãð[°Q‰Q/gûú?8¿£º`;±þçbq’…ü~¤ÿ§ß°¯÷òÿRÑââ›û‰ÞêA;sÛ‡¬ßŸI=Ðéæ²æšvþMñ%ð·¿cU•ú+äÌÍzΩ=÷™8Ï3f–óûdŒ˜Ð«Ñ¯û-t¤¦êµª vã? ƒŸóû>›XÐåÎãWÑjzé~5­ä¼±ðãþæü°NŒØö:ÿ‰—RSˆDl=q‰rsT´zOj£Ñ ©R/€KÔÍ.]L«ýîíu°t¶vôïvú"úzΟàÀ.}?Zìü„¾Yïù}½·`.¾2þ ¸ŸvaÖ_&Ž#£à<ö5ø<­çf¶?Ú¿ý»¹f‹ö~pa9Ï3&æm Û@Çmåu¹~xN𬖰àÿÖö>ñZl\ò–øÿÈþyòÉ1Ò:×r¸’9Þ\°m´ZÚ!škóV©±˜Wû´ÍKÿŽÝiƒƒ«#Õg¼ÿT<ûc´õ»Úëà;6DÙßÿqüvm]ü5rÁ7Ôç–yæÿ•ý~>ª<‘ïC쿃;cû cÛ,ï¹Éª^*: óÀ£:èùø…3t ±:ìVjC°±q©ØS°kªŠþèd¯äŽþ Vo[èê—Õ+·¯?D«ýœ³âk©yÉZUdñc±Šºtü„yëØJ^Û=6­:ŒÇ–?P\[±âZ±Ý‰Ñ%¾³¬XË}«Úq'â>ØôGDÛ3z—:Ž~ßkò%;K3| ÖP#ÀºôÌj¶•¹ZÆFüm<ûO¼*sÜ#ú~±÷i¤åúÎÏšöeJç7{Õ%§cn¿ðÁv•æEgßå¸N®óî-ñ­;ÏöLÈõfàâKÎùùòðaþG]'v%¸rºü SËpÏ=Þó™s8؃6ȯíb‡F[‡9{åó‚û£D«¹ãÀËŒõ€ØqØkäÎÀMxlÎúM° J|úÈãó*£%výžò .>¯¼"ûÈýÜ~Gç¤ o>¹È~æ#&õȸ͘þ—÷Ð/° k±é™¿ñ¢å³ãõÞ;§cÄ>Ç÷‡:þ,ºdÒhµý+ÚöÂÒp¯»3·ŽmxœãÛÚOpaÝhñÄü07σ‰ÿ_I|¥ÚÚ¯^ж—Ò[b4qÿÎn(öûCêôÂhâþãÑâ@Äó‰õ`÷?ç¹Îf*{¾ÔàqØÿÎ~ZGYb-ãØ/d`ÂhïŽfNÉí,ýºîâ3Œ-&—{„0ßä?àÙÓäø8}(h ÞÌh[S:?Y϶—íM* ó3Î7DZ’SF°“Èß^Ÿ]üTãde£ûäÑÿÕÏÜÓ¤äJ,ü‚ˆ b÷S3€¾ÂÿÆ ®€ßãóþ ·ØU ]X,s&sºù»üsuÏÿ«}>Wz€éPâ5ØÃ›À†Mœ›Ü{°YC<ªxœ`“‚ùà :«›÷¾îs)qq±î›z¹½A.“X9úñÛª§ æ‚Á¿t £¨vPìmŸ rŸ›I‡}ì/zqŽªcJÛXÎIÑê>Y‡Ìš.ü!Žý`¯ÅÞ§6u¨4˜Ó±€/o:†Ï¤óÆÃÅt|‡YmsAÇŸkÀv||r­;úüQ¤x‰-†¯ˆ? ö?QÇZꆾvžyzm5âVgHßϼgRyå&çæ ÿ'ˆý\*¿âÿ]ã/ñ+kœoê™Áðÿˆhu ÄMÁ’áÑâ@‹G{7ã,ÑÞ6A4Û–¼Ìºd.ãK(#{€§Øy˜ä;žŠ eœâÕ®*±„W´G©¸Uâ¹îж2^0ƒ<ŒÏ ~£‹föYÚEÇñz¾Oí}Ùç¬e¥¯£Û¿™lcFÇƃákûœE£ùSü?™mf½è„~§O`ºì&Ÿ™qmr¿ÄþÑAØUÄxrMØÊ~ßÁÏ´ý9R_dMÊ'•®§¾“®ï‹ÝæH }³_×Àÿ5Ô{þ򼯿w«/ÐØ÷–Eg§E×—·ã?l_|…õÅÈ7}&óˆßHþï騱`póÏ‹?“ßÁilÍy¢½÷Ÿ uj÷o.àú¥ÃÅ> Π#>¾f°ØñÈ6±tñÿñ¢i÷û†aOÞk;?¨ÀÀl3׳þ>Zm ¹bŸÙzgñìÊèß]Rô¶-5:ØÐؼÔî,+&Ž/.§nX\ÜëÑGäpY;p¢:äFï*ÎϬΠ€Ý¿³Ø?J¥ué7ØÿD´÷£kÐU[Ø7lbrät;+vz® ÛJZCOQ»„‚ÍoTÙû¡ëñu&÷8Øyf>ð!¨uÅ_$×MŒ}HœgX´¼0HŽûýZù‡øÑžëø²Äé¸öV¯¹@ž€ÿÐYg€÷àþ~ß]ùBް±ár¯™K9Ì8Pbÿ #ÇóG{§næгØÓÌý$Ê2ÒùÅþGæ©GÿHð½øõU•£ò p ßtÌhû€&†üιfÛÈcÆw'ŠÿÏ\¿±å³>svú & fµ¯“9ž“ñûÙo~Nçw®CLãXÇ‹ëàûôö{}UŸÍ'ñðLZÁOð~µhë‚ùŸ|ï~çÿ\›­P°¾«-jî·Ä¦ßò¸OZsîYŒ_Ôöß$Ö?¡~ø@ÜCëÞ†–w?b÷?-þƒûÇÖy+µ1ï:öÄø'ë ±5µe:âŠ_«³Þ¨ßË5ð.<žu2GKŸœðtyÑ:¨2ëÉÃ3Ú×Ïć@ǶveÏ“_`Ý0: ãîz]ÿÞ²ßI#ôëÃu,…ñˆ Ý*Þ”ˆ "kÄd¯–OÑEø‰ç‹qŒáKñbzñ\!&²¶1¿çáÉÌAâ; ·Ý\™&Þ…|çÅwÁ&§Ý¼ëV©)›Æ¨øXèz¬4E.¾¨×öï¢Gw¡þî¹wô~1õKä.ñÏÑø ì=ðhí_©YÇq‚äZv.¿öî/b?¿§Oò7u¡ú{õÞöžCg¿¥®µ›—òŽdü"ò²ä6N˶—Û¦¶ƒ^@eýRÆqVöÿc¼~áª+JÜ ýƒoq¬ú]…ÿ‚‡ Osx.u^Æ;¦r,È<8†ƒßØž`Øžöýúþã÷ô6ó9«E{?0ò¿·úq܆O=}¿Ÿòü3ê~¿"ö“»½×sÿçîð;¸ÖÉg±û;>ŠWƒüΦâýe~v}+±ŸÄlOðuôhïÅÌš±qå%óI¥^éGûþž´‚æØ§`|ŽîS3Žvˆ|½±¼›{ô,)ý†Ëk_¨掶÷ÆüÎíÈÎóþÎ×Ìòê’•§ ?>íÝÆOÛwäzùÊcEïþEZ=/}á³í7rF¾€º{rï‹/«Ší‹‰ÿ|Î-îƒÓä}±9ªPÖ€¢W²½‹¤~âªòÏÂþªz£ì…ý¾5vm¿÷ÿw·ôº öã¯à ü#úµå^h†Îÿ¨m–'×>\ÇXü‰…ÄÈoË.b'4Fo2Ïб§«ŽUïí*Ÿ$†c“¯%?N‰œ1}êù‰•“/øuÔu¬>G¬ŸKlƶŸNl&w@¬žXÒÒw'ŸI.y3e¼‚uÛªW6q+Uœ/kÝÆó'—Þø03ŠÓøGèkrºø øä.ðMÿ7ÿéËâ^3š´!Î4Y¿2÷èu°Ì^Ï9<ß9'Œ?p_´}þ#Nñ8^9ÕßÚN™!´Œ²€ŒÜûÙ˜&ÚžiGÉxOâdæf³–'ã!xßùÍhµ?àqÖ;~+o¥|Àfý®Ê[¿îŒç¦í .gýÏC_L­.5íþ‘£Åó'ж×À¤ãÛ¾N ã3gl[ÅÎýÁöò9ØEèê\/GF¯ú¬¯3$/‚ ^ëYç –gl?ëBÁz°é çûnÏh:ù'þÓñt±÷Ñ‹CŸW:z§-ÿ’øtô}Áëî¶^àïÿ‡ú⚨¶=yÏN&£ãÑèl„`ÍÙù¶EÍOÇÇ%œõ£ØyàÿhÑ|°Ñäƒñ|îûÒósTÜ,zlNçrQi°µ4#F¿J´µ¹{IÏ=£í¹DÌÄÆïd°ø7oÖ£ßwo‰hï@/Üä|%ýyƸxþWùó•z¾ôo¹* ¥®ö6éõzSÿÞ1òpØmÄZ®¿ÐüP›pñùûhkª&¬×}°¨×1ž¯<[â½à6º ë 6ÝÕþwo´wÃmÿftÓÎòÓQÒ’º$ü*ô*¾6?ñÿ{lgäŠE¥ö;ŸÜ6ööøÑ×±–sÔ0ŽãX2–5•ÏOlD¾>©mÌ\N\_±Ë׊¶/è–â-º £sÙç“ZžÄpâ>—FÍt|ZrÞÿO“¾Ðt1,?L€® þ´ƒøNÌ û›˜ÎVÞ³b´ø<߉×ïop®À!tâ¤Ó¨u\%ŸŽ/ùŽz|âØvPçll_·û§q~ ×üÒîi_¡7–¯˜¯Ý¿Ìùò<â=¿;°3Ïô þO\¿»Ýq˜GÆÿ·Œæçúüãyä{l¬i”®‘oâ)Ær‹ý†ÿ _Ï¡ŒM^å«÷óÿÖîÃN{2š>º;úµGe/û£íù–¾À¸>ìÏZGx~zÌ;æZìùì[®/†·sýXÖ†g®!ã:CC®µ}»Ú«%æ<¾ôà9ž¹ž/¹Ù¢ÅÀ1t¶(¹ÇÝ¢ÅtÐ`uGØ{ûÉœaÿg o{ÛYÛÿ9Lÿ—ºàéûŠø½¯óŸ߈)Œ^ç«ßó‡ÒïÅx°ÿà¨k\;‰}Åÿ_ù?5Bä„ÏQ‡ÐöÒey!×k<âÿô\Äb><ƒ^žIÚlèø˜|W0›|#—… ¾I=zj ?·ò<ù#ëUK^Çù.6ÄÒ~Ùh{Bÿ³ý=´òaÑãiÿ¤Ý0½s·¼:ìŸþ—µ3ÊKØèènr´ØãÈ*røoqy#åœYG¹ÿQ¼*†.&L+ž¢ï‰¹À.·‘ýýä¡ ¢­ÛÇfÀÃ>ÿB\†‡ÁöÃä£_ÈK»{ ;Áü bgÔ³üPŸ]êâÁžÿÕsÅ&ýo´=‰ˆÛ}m½ÀÊb¹UüìÚ]êXKÌâ=ñ~ìÚf‰mä:‚ÓÅÈ-?¸ÍOé*õ@§»J¬ìHêið¨+]W̦;©ˆ ±ö·›‹²>?ß"×b;Ä™Ööþmü¾¥ýaÎ޶F;sçÄy^s¬Ø}9ç÷9+¨?¶ß9çKÙµ®38Ï#I¯)ê¹Bkb;ÄuˆÍýǹ¿Þ9&„ÏFÞjGç=~¢ÿc €ûi ß±ù±ŸÀüÍ¢½3{qen6ù|FƒgY'3ÔOÆ .Ž-†2Ž÷€«ðÚ,ÊÆHâÏ{ÚˆïFo—fn.í¿bóýú®RoñH=WäxÊhúiŸ½dôõâE_€¯FÿnÙ‚E{íbU>Êzƒ±zFÜ‚÷Çè—ĉyíËbÑöJ}µ@´wBæÚŒÝ”Á¬ùA†Á>pÜ#Os¸óyS•¿²æó`ï#WŠöî„Äy~gŒÿ_~rŽ5`Ï;O¨s­*c`Çgþ¾w²SÖu]u½W'%ÖÃ9â=ØÆ7úƒü±ò«íÇÛGË÷km“¢û½÷æ¨ïƒYþ!F<­s°q´wúâ`Ûí½Gx ÷€aØ;8gKúÜ»¯ï¢·[JmëˆòÊ—¶=Ü#ãšÐ}~%Þ³¥rƒÏÞIz>WiÖ¯ù\ž`~©Ó&wÑñ"±ý  ÿÄ °C‰“ï¡tImKbÎÄ ð6‰V ®?"oL&4ë°¤È8¶ñ±¢í7±–<…n¬û#F†cþ㹫¼viIŒçOõ9%fDüŠúÔÙª]ZbsE‹õSw?µxˆ¾™¦Ž¹ßcyA±}]qp˜í¬¢nû‰›,*ÎNî}{ŠÅóyP”{6,7pžœÂ¾búñâû™Ñö–¦¶ô¸¨{AüÖgÌ%¶Ÿ)ö/-ýÉ7¯$þí]œ{Ú.s>dŒå0å“zt3öÇKꃣ/9ð[m‹1/îçUgZ_ìŸ4ú=Ê]âq’óý{Ÿy­<@Î [ç6ç’Ï{ë–º°;<—kPðs‰õ/.¿àõy¢í‰ƒýŽ=]4¯×-ª ô/sÁƒqqºÔÿ(–-½'.¿,6|?ðÿ—êds4qí!elRû6rfà{lý>¥ý£Ï#ööú'ÑÇšËØFq ôj¿ãc oÑ- øœûÿ£lÆô§­8Pè–k¶Vsž~moŸüŽß nckn-®ÿ å‘ß;9Çèó=<8ìïmÏV®s BËwMW¡å+Ò|›õq1øÑhk†¿­4)×ê°"¨-¢î“ºjû;|s‹Oîß&Æ’Sø‹¸ÿ{ÿ#pÇ­¶ƒq§zþç¨z}4e¢­áC^_1§ð*>-~ïÅѰk³º’uÏ’¢¯ß÷Y:ßÉW®OÎwû9u/˜¹ m2gÄGW·?ø [Jûe+o”<ËÔaU*~ÃL^KŽôj'ÜÆNÄ^ÌõlýZ;üïš(ûÉ`./ÞbCRÏH_ÉC¼SmÄþ½}ðº`Gy‘þa³¡‰màØ Ï­^@K±5¡=~ :uoy{}ù©ý'@L»}~û7‡˜~²Ø æM§›$ÚÞØQß‹y׉·à,ùÙ¡Ò`õÅNÑlmjc†‹—mJ.ïåÙc8†%£Õéàg£a½45 ]ß‹ý¿U´=§Ñz›kõȶ³u´}áÐ? :gô ;¡öûl;ç{Œ=ßë7®sVhƒïrj´¢Å£½G~RÇ“zÝ™u·`Íœ ì~lAìÅÇ¢bú…õyŶxÆëÐ Öï–ïYÓLíy®ùEÖ ûòòøÆÑö„›ZüÑ™;[@Þ{ÁOlÑ\–6ó˜Ú^àèèâÒÿ”•ÄäoJ±¼úH|þ*Ú{‘UkˆO—º¡‰äé>3‡:ºýE¹Î¼cÖ—¼ý^Få7}È8Öøõú|÷dÿè׊ìЕ¹F,ú€n¿A'çž¹–ëÿâ?˜³¿çÐçE«ódŽ‘u0=6ýÒk°å®óIýqe´wBÒÞ9â?¹€Îî)±¡Îç,¶gs•œº?êùhö2X†M#úuj%Nð™c=Izåqª´ØÕcßÊÇE÷?|N݃tX_bMGïc–9†掟î;o/Uy­ì8C´w9έÜdýØÑ¿¹ðçgq®á°?{u1“±‘«Ëõµ¯‰—«Ö£Äø_®˜\쿉½ï1ÿÿ¸ÞSâ:é'Â/è•3å«eäd½µ¸| ¿ ÐøR`:øð¼Ÿ—Êw¿°زwØŸQìË*ê-ðû˜\&~¹Ø™ÄÊ£í ή¨^@§-mð*^ƒ'Œ­ŒD7ßÙÃkׯú¡¬W±£÷—µÍìã.Ñö“¾ZܽÖv–›s]ÅÑÞ›CßÉ äý+ˆÁkøûÅ:ž‚½ÐŽzå•ahu•täþEÄúÍ|îêbsÍðŽÑö‡æ?üǽ¿g«h{¹¥x*Z=?¿R¼mè·ýý”ß3^®Ÿm½W'£%þƒøßѹÔüüÙãç–XÈo|Nç»”š!Öd½Ñßä ôÄÍê!ðÿÒõ%ùéiÖïS¹ûÑؼøWø¿äBw÷ÜŽ•·Šñõ ºï¿mûØ¡³ð@úàý• ì ñ¢½ƒ”sØÆky?ñ¦Î.¶Í+í ';ÚÈvð]ˆù ‹`v.|E=ç½Uî «¦–=ôQÅ…R»?DLÂf¤ÖáéúYÀkp  ÎYG7^(¿`ÿOåw°ÿ [ñzÛºRÚá[ùÛÆ;öýK¬~z± <#GJõ,q[~=qŸq¬)ÖÍ,Þ×qM@É#Ð6 f`3¿5ÞB-=±Ö S×ßÙ¥þr%ŸO콸„Ï$®Ž÷€õcUú¿cvû£¯ϯ‰{;E2VÅÙÒOÚ]JìÆ6Çÿ×þ/¡~˜EZcó%ÿ­ÔÝ`wü]j¾P§7˜;Z(ºf¤J‹ò¿Ï)¹”Ž…JÜk¼hë6À#0½î[þAgƒó™@nwÞÑ èí¿ûy—ÿûT9)6BÖüƒûà¾ïLòK¹Æ‰Ü9Mx;hìhïÀø¾ÊN±áÿm¿F« aݺc/ùv»èß·ÝûÆŠzü9úÎòüÙ•­%ä,×eYcRôÐh5KYƒˆŽæžØfà1ºú2Ú»ç?´/ø!ï·£à=úp<éGül­hïxëñEÀûM}NÚï—D{G0Ÿà÷¶ÑÞóËuøuè0½p€í/mد+õ{_.Ö§ݱõ‰Ç<ëgÖs>-ξ,^c‡ÿËñ¾ïÿØÿç‰Ñàx7_Å®gÝ:›Úÿ3¢Æoî±ýÇÕ—Eµ¹‰e^ø:y€¼À×û=ýª1Äß5ä¬ß'.’GF«wƒÏ±{‰í(/w´*¾gŽñ~uOâøˆu®û嘫V>+º}Eç6׈Á³¹ÖùÀ¾G’nWJ·Ï½bX´õôÌñdºõÑ+6™¾_ì°K¯­xT°`z±l]ñ,5GXöy¬Î}Áx{è<ù^°Ö“gÓ.$/ ΃Øû¿•¶çû?~Ôµ¥†…Øë–Áb"ÃÅÑÝÔÔhãÞT §Fp¼£Wü/ëñoÀIâ$èìØ?ùÙsÅj¥Èé?Y®Ž»ÔÑ1%büÔ|Û'Ÿ{rÕOw'·‰¥Ì/ ׋©5¥~(×ÌX1½ømè1j{åy3ÚîÇvÃîÞ@þ„Ž`ÿ×ÎÏF.ßr¾ˆ--)Ö_ZßöÆRL¦Eš#þóýÒÿ›¹àºà%çñ?‰ÿã‹\#_ ×±;®‹öžb|Qpgx4ìÄð [?×Àò}þhïýÊu]ÖÕôõcAóÙÈûu‹hõëG{ÿOú àzüßÞ¹Ú,ZÝâ£ÚäBñ-6¬×ö5?Yëóx¥yÁÿ»tyÝЉØá¹¿Á'â&spªøM½çÁÞ‹Ýßõ½ìñv¬¸~‹ÏÇÿ¨.¹Q¼¿Òó´uœzÒÉjñ^k—s\ØÞø{ÏGŸŸ.>(¶çäÑt(ñ/pŸ¸:u”´Ì¹X£Î}ÑM°OàþÒÑ×›#ýÔ7äÔå“E[c–ëôàd}ÔÚ§~Í {¡Cßò¹ TY(m¬)_òصJøã¬•ó°ñ{©™ÌÚÌÍ+NùU=ð²ÿƒwøÜÈþëÕ~,±ü#òûHÇÝý=Š.À~ØN^ºÊç` kÑ£èt¾ú Œ¸TLšO\œRœÿ¶ÃÖWìçA}æÅꆱk?KœŠç¼àoæõ}Ç‘ë•^¨ØWr »H‡ýÕ)§©OxæjÒažŠÁ¥/ØòÈį£íßŒÍ ~vý*ÑêmÂy¡~þïöëés»ü†ïF-xж±óŠßPã?w§²ÿÑWÒ c éInw6u úäPñ]µ˜´žÊvÀ>êdá_øêÛz_Á}r3IObˆØÿà?ºýFçÞ8Ù>ž¤¬¬Á'ã½÷e™c¨¼&-屘Çdѯí/±ylÿ×¢­‰Iü‡6ÝøJlgû—5÷SW™émÏG£Å‡ˆoe-84â=ȸFOZÛ(²‰mC½~´ÉúO>‰íÏmÿLðN\7æí=/SGŸ.c uÜ•l&ðû.ëegŠ[Ê<ÀÒÑöíÜ4Úº®M£Õýg¾ ×þ‚ÿÓ†n`<6ÜþÉŸé÷_^çvp?‡‚ÿÌ˧~ÇŸùXÌ[|…î‹ÿ«#'‹½Œ½¿­˜}‚xM^—XN'“%þ±çÁØ“ÅöÚþÃ=Qs õÚ[ç|Æ‹ÑbF莻ík®ý€·s ´%>®aÓþÅñŸêÜ“ÌåŒò¾HÖŒd ËO3FÛp”hµ£Ë;7É+ã9¿«Êg9¿ðÔJòñG•ïû÷[ «ÐÄîðöt7«ý.66#‚Öàý;…¶êÑâß:Ïúw¾&îƒãwÉÄÿÏ´Ís¥v Øõóhû½ þíïÔTCÚÇ=€½ÞxÚç… 6åš«ÅáeÅXìjbðÄ´·³ÑcÐì¿Ìg¡ûÐgèô'í?¶ë»ÑÞWL¼=ý¥ôaÜØðäOvö9è—püRñŸ\Äœöm÷hûõì­*m±ë'§ÑØ÷Øí¬Oc¾VÆ G®©>Ïq_cw”î'úûmÛXQ=ƒŸˆ-û‰}„/Þ¯t(x¾ŸÏ>ìýÑ…F¯÷û„øçKNE@Wâ9§G[Ä\ŸeíÿSåäg0g]xÌ_eà;v±þ%åwìnd ù[<ùŸxCL[ Ì}²Þq€ÛØ/ã·›ÿŒê3 CÞólÈØËçUŽ öÏ«\ߨKG{g#u}ðÕ¸Ñì3dø?v8Ÿq–)ëï‚…_ûßøÑöž!úÜA郹çRçÝ}`'–÷8£KsÝ´K{>ñß;ØçÝ¢ííÏùÌõf¾7sGE•_âBØl‡9·ÛD[#°…üx«üˆýÿ¸s‘zàu1?sÁ¯û_ÖþCŒÎØ<ØLŒûŸúþnLeM×vâ=µgy®›ÏRÇC­'vþ™~gîÐÿ·‰÷YçÃzƒ;ìÓ>X8X6Šü€.yWà„ÞßœSþ…fØ3`y®Ã¥ ¼‹ ³”<1¹¼Çýæÿûý8°ßÁÿ\ï5’ף׉%íí=žc:Øñ`ÿÊÅâÑ¿;©Ø=È•Þå™;Èóø'Ï8ŸÈéÍQ1g!›ÈöÚƒäy7§ÈóØ\l@îþ« ?Ã³×Ø2E½²O<…Z?bWK'®CW¢sÀ‹G+®ßL¹Ó6'ø€Ý¾xL\4N]p˜X k––§WS/`So-ö³w qâ+È8…DvãÏÔ)Ø[àÆÃž'ïÙÉkÉïf¾z~_Ç[tÍ Òýƒ¯0³GÇ«Å_ØK»z.'¦Na»Ä¨¡ù¼¶_ìpb3ÄafR7,Rñ¸ØÛÔŒ Ãî nr’DZÒ*1÷r¯}O=µlÕ¯¥wëù»!nóxWÑ#VT0}û²ºcÅFxÍþ>#혫—m“ïYÿB´ºAìÄŒÿ!_YÄ~&ŸðŒ¬ó³VŒÃH?Ý….¾¯+â=øÕß+§¯‰'ŒolÛÊ\*Œ=4“ÏÚ\ž§[Š/Š¿/*ó`7s?¦6ÕgÊÖ;êæd éžv5ú €<ƒõY‡ÄÿÝ<Y%Ú»»&®×æ:â"¯\?¥ÏžÆïSG¿}ÁômTl+ùá•§JcéF_À|°pLO0Ú!Úžž‰ý;ûûX¯ßÉñâ«açëÙÇù&Ž<Ÿ]¯ëß»õ¬øÿGu“ÑÞ ?í½ ÷û ÿâ=¬õ%÷‹MÏÚ.rÀ'‰ñä‚ñ÷Áþ¾Îù¡-| lú»Åü›¥óÓbä^‹îG&¬¡-¹Ÿ£Å߬ô.4…¯ÀäÓåkðí,yûǃÝÈ'þÑÖòÛ\òs6³ôxW>XÂyîl ²w: þ!CÈÏt¶MÜ1y Ù@¶·©sYbkF[ÇŒŠmˆÜfŸ‰%€ÍÄÙÿjÿèû^ÛÉr‰•ÏV±¾`?+ÿ¢bv±Ñ?ÄNþ.Ÿœ+=°Àt ±èŒUÜéq¦×ÿ^ìs}Q‰É\U¯n*ßÄA°¿ÁoôÇÒþEq5ëf¨‡ßGüó‰ÃY³bjñ3þZïïß ¹„8¾8ù¶ÏÁæë´_ÈúÙ%Gð63í,e[D{×ü Õ~/çÐ!ØÏïùüûœƒw£íц­N='1 b.;ynÄè×£œÅo:Õ9=>ÚÚ¸_JÿÕß3ÕÏ¢? ý£ÎñŸ¤'ëÎæþÝ %&‚O»†ö¿öøXÚ|å¼Þo[÷Ù1ž£íãðWyŠy¾P~€ÿö“Ww’ïÀ ðüL;9ëVøá˜ŽgЙÈáÈâõ¢½;*c3æÏúõUœC`CÅÃý­ÍWÎO$£'®Qüj|‡qÄh9™m“GùŽœe^€#÷Èœ0ýÑF+õIŸ ô¸6aîÄ=Ó;öÌ}ƒ3ŠK_Û§1£í#Aû‡Hß4E÷¬mß¾#SYÊ<Üé}دÈÞ†ÑÞ;Å\e=ãÞß÷ð?tº½°¿¼&?/®??ÝÇçñÿ¥è×ù–¸Ðï=~'¦SÏMžøO¾—ÚÏcÕ\{Ÿ˜ÏÁZ°¿©oR‡?å÷÷«n-¾ϾG¶aúo£Å±í&T'|n¿¯þ==Eg£c×ÏŒö•S¥üyµs-À¤Ø?kýìëzG”rÏŽµ£ÕLêýÔï"èxü¼íËååÝÿ©ëþQÇXtq¨U¼—øMGÓ’ŸÄFŽŠªSˆƒ È؇ LåÂÚ¤K‰³Ýõ¥rÔª#Š]Œ]ˆ-‰NÄ×?{€wÀ° %ž +§ˆWû¯6sÇ{ÄSŠ.!7@ž }ë¥-}£Àÿ‡Ä.lîU¢íwL]#¹b.âÅè7¯vx±eÉïnæ5¬§ÂG€>ó×þ Á¾\îœvÏçÝ.O]á<Ÿc›`PÖîgü#÷tȸøÂçÒgFá ìNxÞ˜xñí_®6Z±ŸÁr|jì"j‚ðUÁRäF¦¦ó¹‹Dÿ®"ÛØKYƒÁui{ísFÛG(e=’µóGÛ×9ã y€ã`?6ÔØöåâÎõ|±G·?Cì÷2õ|¹ç½è×!äú°ÞÇgn—¾ø&™óÍ?öÿ¡^›ùKxˆš%döpç› cö°í̧íOûË#ÇG{w¹ÙûÅhlð{Åcãè}èCê[>o×/ðôÇo=Ÿp…ØßٯŖ¿]ü¿Qü¿Áßà6±£7¢å‘Áûoü/ãP_W^)vò8òÉx•wÊ5ÿ‘ŸÆ‰¶ßÒDò(Ø‹­…þú»t;_Úf|öl?©m4YxrÖÊeL¯Ùæ’ê£E‡‰ð|ÞQÚ#³È_KsžA UŸ¸ä:ðyï¯=¡Îs±Uñ‡ÑùØdgDÛÛoyþWØ|ÔxNìáÞ=Ŷí|›ònúf=ñ?ìZl{0ã4Ï›¹èïÓÀAÚ™Eì'sº<·|´}È‘yô-v):,½¬Ú¤ùÎñò˜ýN,ˆø±ù}µ…×ô7~ õKÔ÷¯Wñ²Ô Q‡Cm>µ1Èú+Õ..¶1:üSÿåÜ[ÿRt#ø„ñ®cÅO@·áÿ€—”'Ð#ļÈÃnì¸ñUò³Ã›RCÄz­õ¥±œ1꘳—ù+:½C.yÝz}Ñc«IòiëÿRÙÄwítmñGùŽ­~¸ô¦Ÿy=ó‰×°˜üÑ}œÓ‹ämôÑyÑöô¹<šÿÇ|¡È9¿`&ر’ßrŽ9²FX89n= F|¬L‡ù¯çé?Šo¨gæ ¬EÞ‰&w`=¸ †cÿŒo_G³û™GpxD¯{§’i‡ØÊô¶Ç¹i˪Ҋñ ð7ðÿ™ÇQ}îÑbDcù{ÛŸÄçÎZÇPâ\E[lŸ‹¾°A36ÈØ2æƒL亞óåÑkËÔñà9öéÎÓ!ÑÖùòýx?¹.kUባ½·ãhù™ß_;ô:ñŸX1º—Ä&°?ë€ÀYüò²Øú—E_·Xìypòr±ûÿ&ñÿ÷búÿJùàOÑïÙßÇ ÓWÑöxE=3@?}»’+åÀþËy²f¬`kÚèȱtðÙºËòýäh>/6*¸‡ýƒ­v•s1¤òVrŒm±ž|ï*ñ¨±mÝ”õ=ŸÚ·e¼o÷'vuô$gñj{ùŸ¹N_ c±É.sÞ·v\è{ô¶2Œ}:º6*tú¯¿»kÊþÆÄ¸À8>Á¸Gý}²ã>ɱ?-ßež<…Îà(xùcÅÄR3rx4;1ë“ò<í¢_îï¾¶§ö7qâ@ä6ѾÇ&^P»Ãœƒß[»ýF̈Ú~ü¢_êOŒR1·¬[AùŒý¿'j~uJñwi…+Š]žøK´=nn”°ÞSm¦þ:Ðþ€ù¬C&.¾3øû|ÖmO¢xÌq®ä˜©="²|µç‹ÿ]-ïŠm‚o'Ã?Jãuœ¯¼¾ˆ™¡Oöô~ôú‘^wˆß™°`?Ï¥_|Šçv•ÇÀ{ä¿pÕhø¿šs¼X´½ÜÌ‘öûñæZ¬‘µé>÷ïcÀø(¢Årç“÷9ÀQä7ã4ðµù_ˆ?VŒ->ÀøõÙÅvšÃv°ùˆ»"o™— ž3¡cI}–õI<#×nŽéó§p\ÈÑ~Ï#÷ _sùIÛSÙ‡úé:´þý„iAÇ%½giʼ»¼×¹û@>L›/1žÛ_œë·wnwþs­ÂvÑö}ÿÓö?Réæ¼Øô÷‰Á{±¿‰Óäš+juþ!öÿUq»xŸçðð ˆÿ`ãS÷s±ço«s^žó¸¿_­t)ºàiéöDý¿ÌCÆò å‡ÑïóPb}“ףĥ¦þ}Z¹Ž°è¼½óþŽ›ù¦}d<ëÙsý ¶X{šü1µ¼9zôû¢–9Âw¤þaÁÊ'%fõž²¿t¾Añc8w†s_¸Þ®äÂÐqÄ»ˆ±uX[êa­[-¶ÊAöü°Ùˆ¥oêÜŸmŸ®S£áXÄZ%øÿsíΫPìÓkÆLl¬'îsu´w„`ƒ<%­ôZlé«ú•'¤/:uýhk·–¿N°_‘÷s-ùêÙ´«—ª>E‰©¯%ÞNQñ±¬Óêð®ÔãtrQöìïlƒ²g'vø–~Çž>ÒvƯíúTܹêŲ.ì$ûEÿ.”ô\EŸÞ"½Ð#äˆ3½eŸÉwvMYkL_;üÅW)9òŸÔy(tüOm»$&/Z±³´1¥Ïôžþlö̃áèŒ\_¿¶tã+±£ÑgkxmÚpËF‹Ñæøõ9ó§µýIü=z´÷@ê£}‡OÚd\ˆ˜> ¶*¹‹Y¿SkæÍ3&„^ØÚï©Ã9œàœëÁH]žñ­œË5£é0íwòCæöðºclïhïbÏÿ£­;‚˜ÿ°ŸÓïÓ‰÷_/Þß-Æwí—}ÈÿþÝù¾;šA}±&bL¹§߉á`÷ãk¼UéVâmŸWæb^G‘klè¬ç‚ÀzâÂÈö¥Ž,Ææ}©ÚÙ%'ú¥c%z¥sƃqgz/üˆq‘ç z?yרµ –òŽm§ï‰l#Ÿm ßØxJ¬âC1ovmòI<ˆŸSDÍêzâ>ööhúë#€ëÄŠŽ×þ_Ãó`?1¡ŸUl/1%üa꾯êÑ¿“û}ö[é|Q´œ´ &þ¤~ضÅ}ÇØ>}~¥‚ÃØ0·*[Ç;_`îâÿ¬ó¨ï†«ïˆiÁÓð qÆ_:/·9Ç{DÛ³ ºn-~p±×^h¿¯—7nö“99Â>¦ÍRüôÝ.´‰¬lŽçœ'ÚûGÀú¬Ìšwè`­L_Óø?Bôy»âëçZOd].2ö¬‹#±¥3~?²Ïç‘ý£½_2}‡Œw`c§š¶ðÒÑj>óXìÿóÚçI£Õ æ#z.óÏØª¯ˆWÔ©àÓl0ö¿­ó··|°ÇVß³Îý=<š~Ï|0öÃîÑÞßœ²N ¿ì!qú‘j‡–¹ú“Øô{±éwb8µý—ûûýA~€G¦­Úó7Øÿ£ß#¨`691‹±êg±å×Ùsª|†/ö]âxø}—Ï#͘Xõ¾¾cbý¶*>ÁÑÖ]ëýè9°åXÛ¾Ã>Ü\? †wóTêhð—¨k$¶s ö4r‹ž§v‰Z£ÅÿmÅâÙÕûˆïÄÒ‰uc*ñ!ÚÙ!Z‰zýެÅoYK»}—:žb§ßPç¤ßçø¡J·‚Ùs:ntÕdâ5¹ |ª¹¼<Åo¸Õ1¢WÁë¤ËSUWôût ß6S‡ìdŸ¶Ÿ`ßíÎå-ÎÙ!Î×±Ñö€ÏØ%糞íByùRÇt‡üsªüºw´ýžRdÌ ¿‹£2Οu=ëà;Ø ¾mY'ÏgÖLÃßÈËHÊ6vÜÑrzÈ$1SÆ«/ÿ“=÷lj¶'ÿtU¾Jì<ÿçùèiíã"ö ÏœõÖÑê±Áþ™¼<_Þ{2g;«ÿÍdû[š/ú=ÛJ'ý‘Ñ£íãϸ²†ìÿ²Êp¿Á4Ò.×ò®9p€÷FÛ÷š¯Àv¿2ö³i´šžÍ=ë}8²`wçyç^L=‚Üc›¨ î>#eíÏ=w‹ßˆñ`85œ—EµÿÁÿ3Åù;ðÿjÛá^übÝÏÙ&ø˜ûEÜm¡ïœÓ¢ÕÑ~Ry-k@{¾áÀîþÜëÀ©œ»´F«º¨Ì62ñ´ó‰ýæz"lTtñolû•䇌?Ž*?wÍbMBíÒÌšßëÑG‰ÿUº[v>çixG¹ÿ•è÷²+4—\Ýy̸òÎ%sÞœ-ŸƒlãW ¾tL`8º€øÃ×ò ø-ÐaøBè9lMltôxC ì¢J“’KýD¼^.úw°»’{ˆ¥";ø—ÄÑçûlúx|Æoü’ë}Þ¿«~*km§c§óX·ú.E/à‡\*þ®Pmýâ{‹¡æŸʾÚþ›‹ÿGTýÑ¿'%cíü”|q7λÙ_ýM?º¿Y‡ÀšZò-J\ÿPuÊ)ê lüg}óˆïÎÞ&?›¡ö/õf‰çR;:…újEû êðæ»ªßúöþ$¿¢Ÿoö¶›âB?Ï”Ærr>à|ð#±~H»0mà äkd¬KÁò´«èó,Í2`£Mæ=YÊÿ“Tþ.×C·ÑÄýÇ´w  ²:¡×Âkè€ôíG¨ò^Îb1üÝgŒ¶¾Ü_*Z<}û:‰kW¶øà>ñä{ÚhûVÌíý½G«ýÁgYßï(c‹*¯y”±N릲OÐ{|Ïõº|G€í`r®Ï÷s-ó‹.H[L_#Zì?uwúq\ vaonã¼æzô̪Ñö‰[Rw=Rq²_Ïõ'ñ<í~â;MRöh»Uì¿Lü¿Üï?ëYïEþ÷.ïã¿ûÕ‰7‹÷÷Û.:‡8È[µ…ÖS9‡|f}ÁˆòÏâ$9Š¢Ç[ÑÏ©{_¬º |’—xÜv©­»±©À0°þïÕÆ,µ”Ø´È~Ó9Ò‰x±Ñuä±É}Æ÷•' :ùDOú2?ĉёƒXÌyÆü˜zHã2Æ}_üä}u…‡–tnÁÕ¿ÙWä[¹=͹Î}°»Ñiwz-c~£bvÑksF{¿è>ö \øN¼Â—@&Ÿ²7µÑ'ÑîRq²Ä(xÖ±Òg=yêˆhû*ñ™k8e_ÁBrÉ`ø§bùU|&ôç'êðæCŸõ¤}Ã'Á6~@{~õc.V/v³fàV±þV±ü÷~gñ™~âwŒ¬Mßùu%€MÎ\‘Ûíä°Ä¦ÖQLç8XwÍ@¾î¾úYÖàËŒí}/àý¬Òq1õXê¼IÔ­ü^6êš·¯üü>Ú~=ð²A¬ê.ù^Eïœ-ÅÿÄø°öwž÷ŽŸ¾» ÞÉšþÄø<Ì ØŽ‚÷Œ)cý“E«ƒIüÍPê ®CvÁì‘=ÀÂñ«Ì?ð†ÿÿÓG_ÏW¾ÍvÃ'fíÔ¤öc˜}žÕ>¦]?™ü8V´ýœç¾¿ôÓ5;%æŽ,€Ó`Ì|ÑêOó<ý@)}\'\¾[ÓZô@Ö¦ŒÍ—¡/SJ0½ºV´}À6‹¶†šX r æo+?íì3Òà;øîgN#u7¶_ÆñöˆV;§ÚFÆ…r­X®ÕÙ½>»ÌǽÑÞ© ¾Ÿí'¹šÅþN>JÍç}çX×ËZ¯KÄ|¾w}.>ùìþ+mÿmÿQ“~ÅÓþ÷™|0…|7±ó3]´µМÚyòä_S¯PSü‰×}Py¦_·Æu?È7øÉØ `¶5öØèüÿ7i‡|?)W“öKÔ9.óM=L÷Qt>ºü¸¹½ó¹¨´f>f«ó\ò`/rxôA]òpícÿþÑÉåoúz†üƒxÆûiû"眘ËÝö™OâÇ÷‹‹ßVÌ)˜I¾‰úYä#ø€ývXG…/ñ¦ö-¹Ÿ{¢Æ?&ÐF«¶UÖ&K¬í"-µü…-Nóñ#°;Á¡“ü$nELûùýzœ\ Ò¿<ÛüiÙ˹c>‰eà;¼`¿ÀÁªœ”˜<¸9¯Ø¼u´÷ý26rÔèÿŃóçyÝ:þ·¹Ï$&ßѰ¼ž5ä.Õ·Fø-ÏPômw¼\ü¡Ûô&ÏÍëñ)ÈUÇà?-TíbëÃs_Igh1­ºvìªrÍv©‚þèü¹ÌÇ0ßÿ•¸4A\)oœ/ŸçzüÞ³¢íO»Šó‡¿ ¦-m?llp\vàÓZø‚­‰óïœ=Ú{Qõ½û=‘i|à‘¢í+ófm¯ÈzÆüÇóYú Eg<[1¨<3×gMcÿÀו½;=Œ»Í1€é`{b9}\×±/èèÿ¶Í1§}Ê8çÀ뵣Š õ&ÑÞY0q´}dxþ\^‡mÔÙ%E¬%Ýñë·‹¦h›Ü ˜¼‘óœ{:d½¸²’GÖÿ¥o€¼¡#¸o“h±ÿlwWŸs°}Jþcócû?#Þ?å¹Ûª][ôv<±zlú[¢íÕvc´µØý¿•0í±çÏ“Î7zÿyqûA1Ÿ\ù…¼ŽÚ‰œ“¬˜¼ÎuÉŒÍïš0~²ÆºßK œ›?’^s« —©?¹/ä\!Þ}|o•·òy¶Þ£Äƒ±#f¶Ý¤¹ð?ù¼qœWpù ñÑsM5Bÿ­÷—ÿ˜»EÕKF¿aáEk{Å÷Í54;Ëß·G[c˳Рèâè20è.íɇ+Ž=vŸ<“ktkßÓÞÄ]_ìý±ž+ŸØ©9»bZÁÆ^ÝI\ß1›:Y"½9Ô-eOÐIÄCú„Nx^šSCIÝÿÔꟑÅçI¢¯C-˜ßѤ䨫\]=õ÷÷ßQûx?¶=ö>뵆kŸw>^YýiíCYWpžçù~œßñðö¨}+ú z£×‹¶Þ¾Ó eÿÖ$`û³®ÍuneÍ×(ŽÜVšŽQŸ_âYè ò :'ß9øAèÆÏÕ]àÖËò(v~À_¢­×¸Á~À.Àv8ÕOâk ÌÇÑÖ½sÀ7à%xLÿ²¶q$ù|ž{àŒÝ3>lw˜ý{uÀHñ“Z~ÏÆë¯FðßõY¥¶‚ó3Ê»KF‹©OìÏ"[ÖÞ—1NR—>Yo]ìrú‹lð|‘¹_ìîi¢Ù: DŸ«èß5ÌýE¯ãJÜ~îz®ÿí§¶‹®\W]þ¿¾%Ú»^i‹y—3o¾­Çn~‚ë™Ø4ÚÚ¼ƒ¢Õ(¥>§íÏ9ü}bÕ[Ö~ŒßÆùäü5ÎåáŽç%uòŠÈ(¸³™mmçs÷Û^ëïò ^sã>“ûÅÆ?C|ÏØOg‡–ü/yß•Åÿ«=ð!¨mïx°ä‚ß­óPôøýÿ@ôïö)ñû¯œ«11»ñ+o•š¤O¢­­Dü×î/úì4ÚÞ:Ø+`ØO\»7kþð§É<¤¬ã¯ÃãøØ—ˆù¯ˆÕŒØ%ò:<¿„ôDv5òoG8çÓËÓÌrO\L_2ú}, -XƒŠ¾X¥ÊB™ï;úIL¼wÀûÃl‡OtÊ-ÑöíÿƒÇUÎ÷Rò%˜NAf‘±í+ôÆÇÆÿSðþíob=Ô=\ÿ+µöà!K~ûmKø@ZßkÿÑÑ)5VE¿¯OîíVüt,z>ñÿ!ç$ý€ä‰Áõ <ÿ<¿c`?¢ÃŽŠêSíµèÓŒgó™:~\ÝcÁhqÅŒ›çZج‘g Öq”û'VaŒÿÿÁÿÙÄö‰eülþƒØÿuÃýÑü‹Äwðßá¥Ù¢Õ@ïYªèךÀ#c‰•s9£¨ÇÁë/¢õ5ÀÐ{çií¼ƒ”}êHº¾’ ,¶äòÊÛb G{guÖ%¯ä\![ÈqŽ£¥ñ‰Že3çl!Ûy³ê»Âó#T¼/vÒ"µ¯…>è.ì—áÎ5øw¼í­âs˜ÿã¢íév¤óÐî'Ž=È gì@G|Vñ±Ø÷ØéÈq+ðôzu q¡ý¢Õðl¨Ï@Îa¿«ÊïN‡•xÒF~q0ê7Îím~à|ðy¡ó pX´}D®ó¾³¢­-gœ™Çß š-‚î¼·Ž¿à::ùݹ@~áotÁë^óøÀÜa÷cóg-/öÀÉöë,Ÿ}v´=Àð™Ðè)°*ã-ðy®uM,ÞY?‰.w§Š–OÍœòÌò߬¶ÃÿÈ úa ÿ'—šµÝEÃht@ÆžÀø\[3Mü¿ñdÒR‰!|}þ¹|çy#F“ÝQ•iè VFô±­RcˆÁï@¶g³~¬Aç¥M¿E´=ûÁö¬;]-þ¯#‘7ð=ó±™çÝуÿ°Ëdê`òTÄ„rîàð{þ:Îÿ ñôó‘µ®`˜n¤í¿OíCÛ?Äù{£ÅÕ.'öÿ·Ú¿‚½Äù;)¨}!Ãþïú\â>莃Êþðœ¶{Éÿï¼Dýð|´xì·Ñê<õëG+9Þ8°Ã?޶o>ü2PßUþËÌyý=¹cîÆRbÝØï‰ c‰]GìôQ‰ƒQ£8É+#W½UòÌJcptçû¹cÁ„kë5écÁE¯¾ý»æ‹oó}½¦ü^¸þ_ücæ}´z´½~À{|vìllÈÄaìÏgü}™sÍücÿ/Vù¸_Ÿ9ŸôÉ|ú_Ÿß¾`Oþ£Ú襖ˆ%~ñü(°Ý¦.ï“o$þD¼¹ÃVþ4kˆu£@f°_É¥'©]D|®Ž˜ >«ø Uº`þ<ÚÖäXÉP«Þ|c›·IüÖY­!†_ZÛŸÜC7csws3â²ê€…jÿJMÐúŽõŸÒ†Ü+~X}¥s Ýà¯Gì?óƒÌ5š»:vbxà3>ý©Òk?eñ*ÛG÷Û‡?À÷¢ùÿö¿Icj½°õÑiç_!Ïû¹†˜ïè0âŸy¢üÃqD´u`Xîe­ |’x ŽçZ]p%ý¡þ¯€5Y31S´÷?"+DÿÞ¯"»èÕ‰<Àèé¢Å'¡;:d¼hk rpÆq²)Ä–×=ÈâOŽý;LJ¿»¯ï3/°ÈÀ˜Ôg%7ñoé4m•Û‚7(û#Õó×—v¬ð3XžçÚ ä*m{®EÆÀw°¬ÎÚNÎmç½àÓÑbŠð ømµa4ŸâXçö„hë†7]=ZÜËïÿÏzÓ5Åü‡ßßýþÿY|Æ>ÇöÿRÝpޏ¿—Ÿ¯L•ÜÀCb±¢\ÿEévÛ‚Ž¯úL}©òÜÌÿ‚ÿ£G{oÎëꎎç<÷ü3a´Ü©5û}L¯ãÛâOÜVù£Ì)¾ò[ÆΨ¶eÉ)n þo-ÆÌ¯ýyAôï†)5@÷V]E_úú~d cd ¹Â¾³º<_³Ðˆ1÷ø¼ê´¢ÿáïIÄþñ£­ýdÎÐû`39ap¬xØÏ+<?€kÈ9öG殱݆ÈÛ?Øgh.#ï+Úo0L~,ú¸B‰»|®ý}»tYªž+6åÉò*¼ù û^‚SŒëyIì‚ zƒ|ú!ë—ÀTð›÷ûúÜ’/ýÄçO¤^žÝ|îæµ¼ó±ó K ÑËŽü$0Þ€¯AÌ\2¹Íô °‘õ§ÅtÅbê¡ÕÏ):è)ç÷çà’h¹ìelÆ7ýŸ_®·âH;ûH¯Ç.'÷‚ì§ÉéËEw½à3àSì}x[ãþhñžÛ£ÕÑ&õ>‰ÿ© .Œö®£SåÉÃìË)ÑÖs.kEÑUYcž{å€Å“Éxv~@Ú–ï׌V[Êù¥<ÇQ¢_lÑØØ`>~|æ‚S_pÀ»ÌÝ”ÿçÿ³æß¹ú"Züþñ!ýë/ì_Ö¤òl0Á_Äÿß© /vAÆ>ö¾—ŒCý[ÝñžmÿÇy„Oæ—Ç\;Â\?vôïcNý^d9Eßtö_©ÑžÁÃiâx~Á§§×ù,µGsÚ—å?h;‘2>düçšè÷*ÏÆ7YZ>DŒ/o]Wõ^©ÿ|.Ú;íñ;°i‰ÕîèÜ"“×;^l¾{¢ÚØøg`ï¦òºÙEþ²6aruÏÓU·†ë¶ôšc£Ù´Ø•ÄÐ-ØÇàq'?¥6e2ã&<›öbû?ÿDî×¶/§Øç¥5øäD¨´/±%|X0Œ˜5ö5óНEŒ§ëj‰Å½Þ~`1ýµ#ô%¾§¡/±”7´õç0vÃ<‚ŸÔ¹vøRꇦw<Ä>Я³^SâV莕«ž)|®c='~⃣¿ˆaÅWÈ/¿p^gdwç:ÿ½Ímí½±ÿ‰ß€ÿKÿÛ¢íÉq“ô濣ŕ΋öÞ'°þ|¿CÏüÄnÀÿϰßèƒÜ_{ÜßÀ¾Á7‰ñ|ógж~ Û9ëò\æƒ×¸vØÀµÖ€»vÛåÿ…üœÿg޶÷þ;ñ —û5Èà?>í/ú²?[ô{E÷ûôð?z<øÞ~0Î-ýœ±µ‘ï?ìãE\›µžÈîüöŸØ<ÎÃ÷øðüšÑtr‹½r´œðÿçH¿`ÿh異_ƒëïá·AüǾ€ÏÐÛè‹ím›ùÜ1šÍ¿ŠGæ}3Ì9p¢“Å>ç Fÿ]üŸ‰uåú.pûhñ˜ÚÇŒí“ÀÖ'Ðõ¥ÄþÉùÿ¹Çë²6¼C|ÿ«zàj ü[Ýý^ũ⫡×;¹ïk˜‹Ñ+~_àëh¹~ðŸ|Ì´•Nå9?ÚæU×½ßüÏ×(ïRS:?VíÄ’³c>^‰jƒe|{‘WÖtΗy<<¦MŽM‰½¨üôQôº¨\ ÏYÇUôÛåç¬3ý:ú½ÅËúfx¹FîÑKà˜v¦ôAç ‹¶ç¶ Æ`ûLRy¿ôÚ"SØø ›Ë`CêìTð86'1!ê+ǨŸ%î¾¼¹üijÑØ•GÛ³˜¾w/©ý¤~g鞟èô±ðž~¾[ç§ÔŠ"Ç?ˆÙøh§W=Rj8¹÷{¯Ï÷mÿéËeQýâJä!à'òîÄOÞ1VúÄXÿW}‡þ}ÃÈñ’Cr‡}–ù—k£ÅúÁtté¹Ñj½¹¬5îÚ¯ÑÂf„7smëþèïì_âþÝÒýû€NÄ}æ.} ìÿ“£Ùý§Ø?bSè„\3^`kb € àvÖó Û™#ÖÏmÍì O€MÝÙOóÁtþJžãúE½»-cC yžOð~†hþò€­vƒ¹¹.9s¯ó*+GÓY‰o“øÌ¬QQûòSñ?]4£Ïb›Èº€¸ziBÿ½âIÑKC¢Õ{¢×áûÕ¢åƒùŽ ¢¿=ýÌøùAt÷±Ñêù±ßÁxäéWb²‰ ”ø¿a4¿‘Ot÷~¶Í}ðØvÒ!sõûIý¾™ý#®A¼žXý­Ñöíù£ø}UÅͲÎiñü×b÷ þã#°þë“üÿ"¿ó?uŸoVü)kθÿ¥èmê‚•Ÿ9£Ö£øßù{ôhûŠã <ë\­ë<,.ßTÛê×X=UÇSlø½½ÚˆÅ–Æ®ŸÀˆû'ƒ»Ksh ¶¦nÆ—?ÙçM-ŸA_l¶½ïxùz41þ“ª·J,ùÚ«EßýW>GýÚÂbç0nì*l6ðá m_ÚF߀5è*°f“¾K>]ÆOäa\é‡/3m4â>ì6b؈ÿ´=hþa—ƒE`)º†x9ã_V>-:(Ÿ»«c'.’µÉض“Îäˆ/©ÿðOhÛ­F’ÿÐo‹ÿS¿Á®§ó}50ú˜b+ýÙ¾?XcVeßñÜŸªN(±$ì»G¢é:ü¬{büè×gýqž/ ·à)x9<ªÌ&Àì+lëÞ“õûÈGÌû~B{ì 0}f_ ÿ‰Vsôé’ø†_ÍçÈ>ò]€rB´÷_Ÿê3Ða™H{lWÐSðtb{ÖyÂ+`|Öæ:10wÐw±—ö{bñ²þϽÈÑ$ÑöÖœßsØb™H½° ×1àô,Ñb>úµ“§Œö®‚¥lsÒh±©£íÆ0·` ¶ 2–ùCÆ4“}˜ÅþLå5™gFWLlŸ‹¶çPÚ?ƒuÿ9¿iûgÍgâÿ±ÑÞà  ÿÈ$úþÈ:ìßvñSügá!0-s ‰ÿZ7~ÍoéìæËï±í©Û¤¾óB1žOlzòµÔúåõ`<ñ~râw{Ï-êˆNþKÜçP±?¯½Ûï´EÍæ¿Ë&™cJWâ7o;_ŠßÌv!1ž±£÷Ù ¦Â';ŸcÈŸÄ!ÐÅà©ëŠ,C«Ì9b£c{3ÈÁ¯¢­«E`»îësÀ½%œßóêÜ•|Èçê,lðà0ÛÇG׫}*1Eúƒ ¢ÁÅ5j»¥æ]t´ã‡F/Ê›èudþ m‚+ÍKbë^,?'Ï wþáäa¡è×Ò”Xú? »¹ß$Z|¸Í¥Žÿguœ¥‘±ßbßÿ$?þ]zb7#O7K¿s¤!y“ßJ_bH÷EóàYpá$Û%¶CY€Œ¶')|?þAíGY@|Cö_ªyB 螃•ûù½u¹Ï á!ü'tæýÞ“öGÖÚ^îxs\Œç1Ç}´4‡Îä5°±nÇÂß{Ó±rmÖ\o%ÍÁG0œÁ ì¼óµ>?s²èWøñ43íß?ÝÇœÿy´øþqÎeú ÈIÆ>è{Æü3~“vô ¶ÏmÍmúÛ`]Ö>Ö½,m? c ýw°tr£Àpä}þhù^|.bAÔ×€µ“D«“‘ûѽvöhkëg²OYG:¾çhw‰zÁÖ¢ãøÆþ ñ:ƶ|´wlÑ7ôÓ¤Žwqû>­ý1ZÜgÏhùàõ¥tŒóìíÝ_97Ì/|„8"Ú~^ðáÆÑp}˜ÿÁðã5ðÖ¾Ìó9>gSÇ:ˆOüòUl‹¹^‡0šM¦ß¥.¸T@ì‡ZFb;ÔóüÚÿ‰ýU|G7\ Æ?é÷ËÄ}òœÖ•\òíË‹ Ï'9ö÷*MËÛïœ÷¢ã•ØùXžOû9جÞSxjÇŽÎ=\:Ž)@lÁç£å@·­÷ù€ßÀÌë=·Ÿô>¯ò@ÁΉ¤´ýú´R+õ±|AI°n»Úçbû¿ëõä=©a?S¾œÎ¾1GèéqÕÐæ#ÿ_Çç1ÇYÿMÀÜC>÷š#Ó)ò(4YÍqíý6Y«ÀxÁ¦M츾kå±²æèTy f~©ý ¢CϲàîÕÒ ½D¬ ,½0š>„÷v”†zÏ[ÑïP0q?!í±ç0Lžæ¨ê—õýKèŒfßïñ™¹î‰g€Ãè–cú%ãí|¿Ék¡r†WA.÷”?ùô½Pš¥mw—c¹Ö6ÿd;Ðf/éñ€4Æ&@¾s-6Ø0›?BšgÜþ7Ñäý`Çš±Ã¼¾;hàGÚƒkû ís€]|væo9Ò˜)Zü'ø;móÌëò}UÛÙÜÏeÚáûê~¦~AV‘707u m!Óȸ‚¿à}ú²Yó“k¼¦V®æö}Ë=)&ñykØþ¤Ñ¿s¬¯çþÞgÑâ¸;;ŸÈâ¼Ñ|ú˜5t³G‹ù,íÿû_G^È=Àp½~`´=}öñ<º¹8Û¹ÜÒsÔB^m-0²¾?×¹?%Z=WÎsúxGz=6ãŽe ¯9ÆO°ždÝîýâÿ=ê׸•˜ùŸý}–ºá/â;¹áÛêõ%Fÿ˜:›xWu¹Í‹<޶›móWÑö}T=ò^ô9Ÿb÷£Ÿ³^‘óè|d=þ™sLŒnEy‰¹ß*ZÝÅpyqëhïH†.·ªcˆ¹ “GÁÀ\þÌÀüm.—®ÏíýÞ5<·R½¿¯/KÞ@®µ5ëïbwºðâøiž»$c*´õëh¹sâ/à8òß¿èñ®yÙ1ãßs€ììã3¯ˆö~Ÿ›¤65ø.ÛyÅvïõÞv>z:cég;¾¬ï{·Ž¶W>rn,­orLĸîw\Œ¹Þ+Ú;¨rý²ŽMï®m[)ëÐ÷Üøé{j²–9_#šßÐc0æË`þ–ô_ß9»³–lN&׌ðIìŒëæ‰ö~°e}özkG¿f¶ð6÷ç:`ÚIûŸø'¶<Œ\ƒÙÌá„Ñrà;r?™ç¸gIé¼L´ýß‘­oÅsb¦C¢íÛ°¥ã^"ÚÚað$}ü`dvsçs=¯E†‘ÓÅüŸ¾,-ÿ°m´õ^Ü—µ>[D«ëÙ6~ª‡‘»C¥ïÎ[ú¿øÆ—x öyäÛ»Y†ˆ9gÞhgg`Ûh1$ÚÞÔÿn°?:ζùïDq¬¿/Z^÷ ߈էúIî÷—ž¿ÑkÉßRljOÐõ§Ô«.Éã,ŸóbŸK"×ÌÚ³¬ñüA~êð°Ät&¶§±·ñøe¬:—ÅOH¿ÞÝI Ÿ¹†e!Ç¿œß¡u¨Cãv%ÎÄ9|I°â¼èß‘YâøðNÖ ÈÈ•®EWMèÁ3v‹ËÛ·ò^éë¶ÑöÞÍ8áäòß³^³£C‰ÿ¼f{ÈÞüÑÞ¯ÎüÁë§o×–~+Ip ,}I>¹\¾;ÀgÏ%]¥U¤!<²Y´šxåJÇ€,Gà2¶9öí­ò¶*¶çÐ >‡—¯ˆ¶/ÙQÑø=“~8 þb7Ÿá˜Àî݇§}&ñPj‘Ø‹bãÿ؈ø†Ä˜®“¶G9‡¹® :¡k.¶]hæ?kÛôtºÿ±h5°Äô:°þ9͹ý¹<°›s†"¯wI'bEäþà³éúœßÄy@¯j{<'çþBOäºÜ£­áå;| ~m*ó”68X–±ßáÒ~‡OÀî墽}yŸlm´\K4·¿áÁE£­ X5ösdŒaíh±Gìy|p𘘌ñÞÏG¦3׊®˜´þ_pYœ&þƒË+ÛtöÿÚ‹è€ÿEóæt,Ðs ÇÁy×!”ò¨Ž~Û3š\ à{®[Xze?<¿fíÿo-Þ¿‘ÇYgÜ3£÷á-ø ~GލÿÂv;ßÿsÇÏ¢áÿnÑöñJ}€¬À›ðÅŽÞ‡-‚l£á¹£½ž¶~%>g¼ÿæü¿Aÿ•篷Ïðü¹âú}êÎïâ5ü¾TÌ¿O[–û­: Ä7¨+º½Ú¸¥.…¼X8£¼õÇ“úü77Tr»SÈ‹Èxm†Ý ¿ï'®é¸—©¼XðÛ>«ô§­:¨œÇFÅ×FN‘—äUüLôÆÓòÞþÎ%üC-'>å'òé&¶•¾–k- ®á±}]Ú6À˜1+–å¿¥×3ÒdéÁü½d®;á2Ï ¯ìnû`þàҧײÆž+í2—5‡tXÝþ0®=¢Å+÷‰¦gá¹´qiŸx9x ¦‡iË£?Žòsû€ÜdÌLÆöy$ZMýsÑÞ#C»ûJÃû䄵øîÌç·µž§äFŽÆßY§“¹6Úÿ«s›õñô Cg÷°­G¤ñ5_\t >ÀÎ=úýjÛ?UZ­ë<_è\3ô²Œ®D6÷òž\ݳ– ņ‡÷3F„s»—tÜÑ9†ÇÓÞLßžãØhëÊà½m¼‡¾SË8ÇØðÔœÎæv‰–ÿÍ8þPÿËuâ­áûJÑb@Ã=7Ô>¯m ù¢ÕãdL‡>`Ggü‘õšà6¸ Oíç¼ÑöõœC»œþ;ºeYi8¿ãÞζéû4>sáz}‰Ð7äumŸ·hôûõº`µh±}¾£ãáø ¿²óÀ›z¿÷þÿ86†ÿð üüÆ9‚oÎó8Ùùä@¾ÐeÈÏáÑêwtŽ™‹«÷ŸÙ~ÖÁèä9$'wvm³ß×3cÿà69Ú[üMíÊqÑö>Ïã‚hùKÕ7‹õèr£WÛV®) ×K.÷ªŠ£å“g¿Í/ÌZâût÷¼–9]æ Ûd"¯å<ø>§÷Ðgd4ëP‘»‘k[¥üm»cÞÙ>ðÜ™íkÆé‡:VŽÜcbòhÃ5Kû\°}h5¹N7ëzv˜»ý£½Ïúg~÷ÿÛÃÏ|F¶†'–#?78¿»9çé­~˜ûŠöN±ŒóCóÝ£Ù(ð{Æ2±Uê Æ<5ös›XNçÚñ×é€÷wˆé‰ÿÄöðÿ+Äöç¢íñC¾ø×Ñö•~ÙÏ뫽_žwO=_ô÷lò<—ñ ôwæ^˜‹!òJÊxê€¬ãøµôw®ôÜÂÒtçã@i Ïb·¬ -™wðr/uLè´[í ºdû1KåÉ«YKÚžíyà(vܲòÉXÑêΆE[ÿÿÃßÖÅš=é³ß–ÐüÂoκÌ?9æø"Ç|h´ØUæ é²€MLLŒ%:Y´ubKJ׳KÆ—÷gÀ1âù`)qp{âúh1žcíz›ãBûýK¯¹"ÚÚ©ûõI°ë‰›ÊœÅÑÑö@g<™w¸Ñ>P#JÍç7®IûÔ¹M Ø7ÚûωŸî3ÄùÄý¿G{}¸9Ú{©G¾|Úk8Ð ØSGúÉX×ñ™YNL~„ÀìÃ/xŸà*Çp¦÷Ó×]¢å3·Çxà'äöàhû¸Ÿì=È{êÊc½6×øžm>—V«˜±?°Þ‚ws¿˜¬Í|À^þ>Cç`kâ¿‚•ëIüô6‰–æ;öö¼ž¹\ø9Áç![`ûÄÞK_àËÅ¢½‹~^ïCNƒñ¼~Ñhº Û1× ,ê8׈V»A;`:;(e¿a‡h{6g­ä`¼%÷\ÈXÏþæ¿\†þ9Îù`.Àê=lƒùã¶ó7óŒÞ†ß‘ËÄÿýk>w8²î,åzuçnh9¼¬/¦ì1ø™‚_‘cdèmvs¹ï9¨ç$ŽOÞv]ÏÝ®-.Q_ß·ÄpÐY×Iá‡âë‰Yßõ·hû?PÿÿŸ¨ùbürÏ/Tû¶ÄЇF˱®ãÏàœ,â¼Ïmªm¼šäúu>á{d‹ø-ØúsÿËÚClÕÓêø öCGt¶2‚ƒ©GHßY긊ß1›} ý£×v¼YjŠÉåvcf?±2ßðؤòWÖ­Žá'±äâiçq‚aKGꪕn_8öŽËþkؼ+ÊoiÂ3Ä1ˆŸ€)?óÈxÍ™õ{©•ÁîB O'ð¹`ÀDž[G>JÞÚÀçÐ>úô7~‚ù7ËKðØz²ÏÜÆûó:ðþ,i]›_¡&†¸6ñWžŸ¢enè÷>ûz¿ƒÝÈ6ÍŽ3yüŸ¿–ss²ÿAŸ”‹C£ùè0r`:ö=Ø Þ¿`ŸøŽnÇ׿ŸvŒ¾B¯ƒÌÚ~ì0äpqŸ{®´Ëºí\‹ ^ƒñ;E«ß·ÓG͸½ëD~¢ÐHGäùŽƒ1#`Fd,L;?c;é‹bÁ«søÿŠ~æ}ЮeÜ?óÌY_‰Ü$¾nè÷¥|F抱çÓvJLçÙØQÈr1ƒ×eýMÊÅÜÒ5ãñŒ¼†g¯‘Fø,ôx±|4Ÿ~eÇ¿p4ŸìŸ<ÚþsÙϬå\Ùï¹–;íö\Ç…À8È9ÌZÏŒËAÿ½£½£qhq‡¢íÑü{‚ó ßÂãYšu]»GÛÏ=º}-iŽ¾ëæ‹æ¯Ð>|}€Ü G·‰ÿØñ×hë_ª-¡ø¿¯ö}g–½𿮟¥¾ó müÄ+òñÏx<¯ïÉÑ|m¿··<°¿•˜ìixrëhõaiK­áüd.>ó^Мÿ¸®‹*ûS"·È(؇¬€çD³°Ý°Å~?À?Ð(mµœ§œë)íÿö‡ë;[‘÷}ƒµj_:ÏO;ï›É 9ÿËÉwð>0úîhû‚B½SˆÿøI¯G{'0|ØÑ“wóþò‚G{f>ýž£ý:r®Ë5«œ{Äõ³£;.úƒmƒ¬¤¿k6×à±£íiycå›rðÌ;zýô¨}À?¸?Z]+|ƒ^çÉ72&¬"}ÑAÈè~öûgòÆñÒý¶—ýÚÞïÈþÁÑÖ w‹æ œmÿ9ìâ¯{Žk7õþ•¢­ÃZÀ>¿à0ö¸ ®“èúÁ}cVà~ÃË`íRÑrYº|´}° ÚÃáû‘¢í雵ô Ù öÌ+±°ð>ããEÃÿÄõ¹ú”rÑökÈܘ‚þ˜ÊÏŒ“¬n[<YÚ~d|?×pímŸ}¢Õáä5Èü†­s¾sžëíöw~6“îØ*¹.ý¾óg,3ýȬá9Ãs™[ɘÖìÑläåÚh2q~ôïª+9­Îw*µ—‹ÿËÑÄpº>D7–ÿ¿Êë°å‰Ã!æÏÚ±cµÿ‰ ÿ¿SœÿPÛþOÕ>î÷è-úý JçøÎË Žg†h9tð›â$ynžh{ŠóÿN•~#±>¼£5ïó(ö¶Ù½Ž¹¼ Z=î!Ò›¹ÚÜy俟Kç#ü|]@FÞqç½£{c'–Æ„Žú…ó¼ýæ9»Ûxn"øpŸÍX°•¦Qo>ªn¤®^¦Þ½ã˲_ zæAù„9&v^a+œé¸s}y®9›kÉi€­à<~Zçã”÷Ï<çqk½àÖö‚sçH[Ž´sÿƒ‹¢Õ̳`,v@úãë9g{ʹÎýOÎáéúÌ’[&§òwϽm°ý€/q«}g<ûûz¿Ó>62˜¤Œ ¸‰ç 1r nlìùäÝKÃàž1?“†™„oß7¯Ÿ9h›±ãýœãŒIÏ ÿ³®r6Ÿ›1ŒMŽ\ß”vï`\'óÔðì`Mü“kqVtð?:!ó¶ÓÚ‡iêïRûÇï £¯,Ø‹ÎßgÐשíï ¶“kÔ2¯1Ôq‚à ²…‘:)ó‡© òÞ]£­ÁYNÚÀC+Ûs˜ëk³ö&튬ф'÷˜/d¾8>Zl\XËþ ŸácüLdl>Çy¥Ý ˪ž?Ò~ò‰,®WiWèÇL!Ý“ßÒ†…ð™¯s>:Û¥¼•µK7Šõ¿Ö¾¿Îsøg©~¥Nû»¾•½ˆÿ®_pL´½ OÓæû©ïü»ØÈï*þ;7kp3?³~´w›Íw¿”OxiçŽyÞ^_:,ñÀj÷—÷·¼¦.XZú_­ö6õ/óF¡KSw'Æa“ƒ'èotgÇÿ¥ÖøÚøKy=rö”×À3`öØ‚Ý Že½ø Žmayj"¯‡—s?p ™˜D¾Ds"?`§>-¿ü9Úû!n‘×À,bà?¸rr´\îÑö3€ÝÏ#[SF«vsу‡øð>ÇÎÏJ° ÍÀo¥Ï?0ÚÞ ´ƒlÍ—À®Fw»>`o¶²Fq [»9+ï_Vß8Fìtdá(ǵs4ùEÂGûTž(ò>_ôyœ"Y»Äøn÷û£Ž_æßÑê?Ñ©Äõ¾’ÞàÿoœÛ̧eLëVÏ1ß7;çkIßM¤+ñA|,x~ËhïãÅ>Fìâ'ú}oÃçð+²{š<@­ë3þ¦þiÝšÿ(û1'{úÌœçåìÇZ>\ËØË0¯Ý1ÚºÐÍ¢í™ùß]þOŸß³vh­sðϪŽù·Ž›ŒJÛû ™çè÷HÎsæaƒç~ ×Úßy¢­ ÎõWÈv;X‰~E†´¹§Db}Ö"£iû¯îø·–NÇî¸Øï™ËåÀCV³Ntk¿ïm/@0p‚¿÷òÞ3¤[ê˜ClYiõ´Ã¢­çË5N‡FÛK݃œ o§Ôºé£Ä°i¯ë±ÿ»q”úÍÓÅñë]_êQ®ÕÆÏüÿéçñꉎŽå]\CÌçõ ±ŒW¢Æ„ˆõ€mÄÀvlÎë#q>ôÂèÒ÷<çmjç‹9YXâëc—!§g+`å;QßýÔÑpÄN¶G\¾Ž»´=Ÿsxl´=y³nbOiÅxÑ•àÄÏäGÖ¼U}žR»ü­}K^£ã8&è‹ìó·×¾õv8r´vm¯¬sWr­âTŽkÛ\&Zý¸1™}Í:“Œwcû¢ÃÀ'jT©1ù£}`\¹Šïào®!Ú#Z=Ýäö}RyiÓÞËû~Þ{„´áø}´}£¯ò¸|à3u¸°¦ãËu§E³ÛÓ–ÿc]ÛUö” ––šŽ/=°ËÑ}8°=½¿m3ô!òßü5Ú»^'8µ}úS´÷å\æoô&¹_ðóycSÝóÊÞÒ̺]nEõYãI™¹Ùké#ö¸fIÖF®.?ç¼n­Þõàh±~úó’Ïc¾áùëìÿÞs¥×m?ásÖÑ0Þÿr-Sê'ú“:`—hñ‡Ásƈ-@“ECþFWãÇ0¿´›Øþ/íg®óæœ/î¹Ô9ð߬ÑöØç!_àzch{øäº¯¥}.²–ëyù„wŠ–oL,ÉÜëÑöqΚ c£å²­­½.ë÷³¦“¶‘ç_{ ºûgŽ~Ô‹fŒé‹e9×ÿÒ§´Ù.ô™Ø«ÈÓÝõ%÷{µ˜M|‡µ^ÔÿüÞOÖÈüÜß`ýeú' Øÿ¿ô¾Î÷Š/KÁõK%_@¼ˆºøxTù`>û»¨ãîæ§¬øJ~@ޝuÞà—ÔÌ6ؙƲ©xÕ}–Òèðªìá_¼©ôÕùf~²¶ÙËüôGVðûN‘V»8_;×g““-{Ða#¢§Æ’§ˆýÿuý!ýEö¯¶ÿ'ú|xb¸<ÆO£_„½ þŽm}#: ÌÏ583Ùÿu¢Åûö•?ÐWà@Üâ^ÏåÞ0èÇü¾‹ü·Ø:ø"SE{ÏZÆ à'dwSïƒ/mŸÚ±ïïÁÁ‹£ÕýVZoMìmÌä=m‚mð91 ðÿ;y•zc£“»ÊSÖÝ%ÍvŠægßæõË8¾Œoëó®ðÙçH+0ûAèGNZt¾FÙšyÀ@G¸n²ÏI_ û¯ŠVëÏwx ~C‰?-­î,Ká5°vÇhøÏØŽÆÏZ }Nöþ€Ì'®å}ëIgä œÓ°u‘&àDÆäO®iåÚÕ£á?<º—Ïß%Ú{ó¿Ã£í#¶ Ï\Ýßë½<Ï<ÃË`øxÑê@içÎWÖÑ1?ó igol_Àö¬9åÚÌ/æ³¶—kFó]2G½¡!vØ9¥ý]Ŷÿ3þ³œíæºÞ+¢ÅÜÀnð6cr™Ø!ZtÚû¹Îj7ï?ÁïGy>õHÆ$™ïC<‡L\2ÐVÆÎRo¡ÛÇŽ¶·s‚.óáMüŽ˜k+áôÀKþîl¨ë¹YÛþz±û±Œ¿°bTóĈ.òúÌ Ÿ¬éÆQòy/9á›´û‰û?¤/ÐÉ81îB¯®Ï%~µR´÷?C'pÛ`çœù7ácdàÖ{/ï¹O~z.Ê;]Kl™XyÄ3¢Õn!]‹¶F(ëpÁ¥½üžó¼o´˜ëâµÏ¥ÿE¿·\Y×ðˆ<Å=èVü>ìÀ‹=r½sŸ‚I£:ÎÅË´ÇÓögŽ'ô¿YGæGàmô&vö×rÑlâÓåæø†hïuÍu!Œ‘˜Èx¶ÇýRòp3Û>2‰¼!Ó»ÉSGúÌÔà`â~®ý=/þ_]Àx3¾±÷@?–Ö``®Kñ+°#Áptê?¥%øŒOõ×áýKËÈÉöõžâGÐwl‰ñ¥_®¯Ú?Úþè’ëêþBe j‘ñ™ÒÞ&Öƒ_õ_ǼE´ÚºSçåW܇_s¼c¥_i_&>m'Møÿ`¬Í:¿\Kž=Bú'Í8Ÿ6&÷fì4ã]ØYYƒ¿€‰åkzd­~Úù»ÛÆxØ@Ÿ†GÛGÜ„Gá[l0>uH晳~>ë:²Þ“ï«Ù_îCšX(>.r:Ôÿç©ýëk<áÕÌÀ£ðêÑÞ;}Ö†‡Ãlcqy`¶h¼½n´5oÐ)ó$¹÷CÖñ¤Í9_dg›h1²ÍÇ‚~î-Ž}qó•ëÂò<¾ïQÑð:smÈÇþÎ s»§}¤ï“x,(ݧöæå£í_·s4Èsá1ìx¾ÁVÁçíä·Ô`¾(NÓÇ' ŸIn—šÐû´ß/Ôî¿J[ÿØh{ÿŸãàýùb7¶’Wèì©’ >Ývžs.àƒC¥ïÄÚÎÔ|édfiŽžÓ1Â?ÄøÑÝOê0>0»íiÊ\¬í¼®)O¡g·ós—¹ûý[ì¥xæåÀ’ÑõgnUGþUûZ½¬oƒÜ“ß & >Ýè‘1—í£ùôg¬h¶ÏôÑö|ž;Ú¾+ÈÂØÕ7*cYPú+%v+_¢ãÁ]ð'×Ñòì³=Ÿqx[b.ljì#'èò3Yg—þÈjÑÞ®aW`§À¯¹^‘g êƒ\‹MÑ»FówOˆV Ý~50ØÙø¿Ä•°ÿcß9‡Nø‹ô½Êóë:ö­ê¸ñýÊúpQÿ¦Ä·–wαÑÒàyÈ>üƒ\€uéû_墓À{pxçm[Ï1Žë<.sþs­ïÏìGÆŽ‘ÅŒ¥€­YÏuÏûJ«£¥3x‘u ‰?´•uç¹¾FÏ®äÿŒa½h5'»F{Ï,ÏÏxÄVÑê¸çÄhëų¿7ûgeŒ?Çk(ÁflQøeQé“kJf©¶E¾“£ÄwñMàµi½9Çÿ;Ú>CCm¼Ïê =‡ –î¯æXwuN6pŽÀ ps¦èu 1¤"gY/o à÷¬›Í\û¡Ò8ãiçg]×pi‘ò:4ö¯å|­í"‰ÿÐþçeóhkþ6w~”×§t¬I¯£Õ/eœ`qé”vã¼¶»·}†‘Ïý¢­/9BÛÿ^±þJ¿ÿIÛþ&õÁÄpÿ ±œ5`Çhÿ_ ¾¸Üÿòÿ{mƒz ÛŨ)å-æ}ttW‰­Œ¤]qiìûÞÒ6Ï3Nä¬E>± Áðâ¯ß2ÚÚú­óÎÙ¾ÑöÛ=ÁùÈ| üü{ÛÏü©q²W?ë–ÉußUy+ßOƒÿSž‰½¿nWø&‰oÇDóÑg`R® ˜DÚ,]ù'ß\Öäš°ÚXj‘£œOò3_È7¹¾/ãYÿyt´wî'_N.¥m:‹ýÿDzO™*?%à§´GÓî?;&_àóNŠ–KŒÊ:ºcìÛ/lz£Ó å=Qmsb>à3¸ >Ï"F“q–Œ…#sëÙ×Üm]ÇŒÒ5ù¬9Ìë·±/^ܰ|ÂXñ#Ém£Àuté"ÑÞñz˜ce~/r®±ÛÑ /Þß±ƒ·¹†7ëjyNƧ§•ÎØêY¿ ž$Æ­=ðß ÑjFw‰öNoÚÃGNÖŠVs¾a´®8pÝ´ÈÜlU•>§ ë ÿ3n¿ÛÀ¹­£ÕwæzúÌ{ÌMÿåù£ÕžûÙFÆ„Žrθ9Î=r>×cÆ™gu\óÙïÅý½ óµ¨Ï_~`¾y&¼‡|žd¿x.6ƉñÓ=~.Š¶Æ—ó¿ÖÞÿ6þÚùç‹çÇ‹ÿl–<ïÅÑâCÔÊüÞûÑÔ+ÁŸ†7Ó'UÌæÑqè≜'섌Ý,ç<ýËckÇM;[IÓ_DÛ›y‚OsMoÒ z§íµ|‡ÜæºSð-ës-83rµóK]æ{öþ²ú…¿á°‡ßÔh¼í½`:yYÅ9¢_ÈB‡Ãeýð4ŽoÚú›ºÿ²GÉÜòÁØÑâ»\›><3Ÿû8¾ £å‡Á'09s–ðöÉ>Çm¦ªc*µN¬Ñø·ÏÔ?)˜^£Ã~æ'|ÎÍ/83Z<Œ‡Ÿ3W¶“|y²×Ÿç¼ïùƒ¥:ÀZårŽù?Ãß×ûÿÝÎÏAo ¯ìj?Á×ÙëüYçû‚Ž{ÛE¯ ¯ÑÛÔõg.>ýÑuh—GÛ ŒGÆ“n96Æ惟GÛ6ŸðÎî÷Ó/°¾ÍêÐhñ]tî¤ÑöAÃÖG抶OÇŽÑ0ÞG/¤Ý™5P+GÛGtëhy—í¢ùºû;^ðÛ~Kû6þ`,hwûœqžÌ%§ÎJ`¡hkk‡FÛÿN\æX¼¨×£“‡9†Äß-¢­¥fÞÐËÚFÖí0&lž¢åÙ—‹¶_´ë|÷¬;ïëFtþ§’æÃ¢­õbNs]WÆë–‹†ß+ÙïÙ¢å¶i{Îhï?]5Z­êrÑp?ãùù ž¹G´x4Þ$š!Ï=Î9\¶áApî\qûJ?±ãï–ó‰ùŸ¦ML´úŸ³«Í^ìü‹½ûÿúhï¸I€5Àœ–8xF“?ÆùùZ;úÕ¨ñŸˆ¶5×yë›P»w¸|0‡4^Ù9ÌÛvÞ‹>Çÿ×p.­ç)4ÏuxÐ ù/o†Èù1òxFÝÅÜýÙ¹øµ´\Øù‚Á/°l¯À6ì-äÿ(çqÂÚvñ‰ß×G¢æetõäÿš(2†¬mßFxDï%-ˆS-* mbêàÆONõ\ÚÛ`eÚÆ´k­Qñ;Þ¬ý)¹ütÛ¬òYÆB·µl‰#£Å2OŠæo?@gð*í›í¢½³.×Ãäºh¦cï99Ú¾gÇù;ó­§:žÔç¹ÞaÏh±dŽôe𣧖fcÉ87ÄÙ‰³e,*ã9ø`¶Ÿ8O~å`i ßíí/{Ih‘5“ôéÄøéÚÏÅ£½7}¾h¹ý9ÎÏ-O¿ÜÀÜÂsàtúnèqddîh5ŒûÙOÆ_fÞ!mYŽÁº)æž^&šm»Šm®m/ˆ-£­YK¬_0šmÂ}ƒëŽW‰¶·ÄòÑÞý˵KDÛ«g¬á‘: ÜE–‹f7ñ¬Õ¤é^“k¶ ù²Ñ¿²Èk ÈñŒ.§µ_#ÎõX{F{‡K®^-Z}ètÑöÄÎ:ê©<·V´½¯™“ô;õÚÿ=Ò?€Ö³?ÉãŠß9+JûÜ,ù•s1w4^\Oú&€yÄг\×J<‡Øqû[ÅsÖžR³…Ï5¿P€ó‡ëœ f%Þ_£¾ø­vÿbþ]ê”Ëõˆÿce^s i×Éb¿(5G£F{'<:I4?Ý ÖÁïóFÓ‹àQæ´R7ëfœmûhõ"T›íL?±õÀìçc¼{ÄgŒg߯·_×xläx˜sl*0þ̵8;G«ÙXþ[Éq¿£Ž|N0vÕ“eOQü0™Èuõk:ß×:¦Io§8‹>„ŸÀ*ìZp-ã'¹æ~¹À~@KøöRÛ)ò‚ðEµŸJžzªhûÂì,Òþ ÝÏxOŠ¶ß Gæ7÷ˆVÿ¹Žm¬'½ù?ñºæ\ G­&›úÄhµ—Ü‹ÞÙ!šm‹>ßÇñ+È c±©à¥µ¯cœÿ´ãñ•ˆ3á·uóSjC³vïTiϳá«ä%Ɔ¬om]BÆpÒ?=Ú~¦ŸžñÚ£a>ßçq^R>à—u£½7b—hë ˜ÃYœ»ÄÚA2¶¹¶×#ÿ;F«9Ü0Züh´wB¤­O߉¶çÌ^ÒuÐξƒYkDÛÛv­hïX|à;º9}€AüO½üÁ³À‹Ù£Õñ/ ¯™ÓÄ~æa Ÿ ÝÓ§vã]±ˆ¸ìÑbæ‹x 2µi4Û!móôA8àâXÓD‹õ¬nŸfŠ–Hû|YïK»4syl=𜠣½Ã#é2­ö!5‘cE{—2cEÎ猶¦9Bçdœ0m­íÿ¬;KÛÄøk‰Ó¤ý¬?¢í~±XN¼/ýÖœm-À=Q÷ø³ºàfÛú«Ÿèj¶çµýçÕßTVæ<ít{‰«ðlr{`{®ÝsÁ…{¤)òƒ]–õüóeÎÁ»óœ÷¬1]2Z oÚ7™·Gbï“ïEb#cÂÛ`eƯÿâÚp>âsí!Ô v~eYïĻû(>Á¾Ñö–€ŸŸFª6vÙƒïªKL Ÿ€úÞ¬[Kÿ6íø>ã´ÓFÛ“t¯%÷f‘Ÿ¼ÖqáÓ€qiÛ‚)Ôþ]DžÿkzõÀ7öóÛÚ·ò¼£é·ÄÎs¥çiÒårç+kÙ÷÷“ëw‹V“þžaã½Ï šåšmx~{Û=(ÚšŠ=m+kO²®&ëhoÝ#eoõï»ôq;û}åøø~¾ýE×!sð2ºŒm@ˬí]-ZIêžÕ¢½>ÌXä Ñö§ÙÁ~Óî²ÒzÂhïPY!ZÌp®hõúÜ $îç|lm@°tAiO¦/p´s°¶tô/žŒÆß¹¶zÿhû£md{`>²<¿Ÿ G˯ç¸ÿ9†Ã¢Å3ÿùzïG^ÆT>^ˆún¨ãðhë¡¶.ü°±ý[I:®]ÿ/¾,õXŹ||éûò¶³“ýÍú¦ SÆI}ØÒ~Ô±® ïWt¦óÿÕ¢Ùñ+ÚîðhyøáÎÜÑö+B~GvŒÌ9úœÍñ,mÍÃfÎW®ùÚÁñÀØÆ»ûú –`ÜÎkg–X=õ›ÄxnÒvÏ8Î-âø©~?I»½€ÏÀ¹/ÿç½Çy {A°nê?ÕŽ-XòµØ¿¤ú†|ÃmuŽûšÖÄ2øòXßï¯îmÊÜ;9G~‡DÛÛœ±åšxmAye)ùA°ßζü,vþOÁJlOjÁ búGØ6þTÖŸïáwð¿ã÷â?a³fù{ûw>=t˜s8³vIÆ[ÞQâkÌ.ŸÍí}Êïð%¶îþ^?£¼vcç¼í¸èç1Ž÷ìh¾r½|„íbþ½è!ê™Æ«óÐ×ߡӯð@FÁ°|̽4 u§¿‘n`;zœ!VŠã‡Ö;I?0qÑhuœ[D«9M,g¬é¯ÍÏN ù?ð`NOŒV·’9×áÑlÛ¥£í³Ÿµ÷ÌÕ¥ÒŠœ0zèÈh¹<ìék£íKÏgl ë³–|Ïhë>3÷Lßôú5×AÑÞ‹¹‡ÿe¬9׋/90ïðú"Ñ0cÍh1ù]¤=<øV´½ÞŒ¶_ððøé» ñ)ðyY§ŸÞíÜb¡Ñ}§;ŸÛ;NƳ¡ã›SšÌ6ЯÌqäz­eý̸Ò,óÊéƒò ï½Õ®¡%Ï6Žc`NÒ_€Þ[I‡ƒcÛÙõ©÷VòXÞö†ú}BY?ëa¦óyiseþæ@ç @ö¨[?á×mwnç¾,>sæ|Ž·Y³K˜¸þÚó§ˆû\ÓéÖ÷Á†'®s–׺ÙóÔƒ’#H?árÏÿ½âxXÖߘܾ‘7}Õsiãt?KŽ`~ÇÖñòˆØ«ÔåmmO¸yå« ¤WÖ¤eLhµhySÚžÞùÜAº!èCp[ÿ²hØñ„õàÈ õ;ð?ùFâí›Igp!× äx®s.Öô;²ˆÞ wÀš„ã|>¼®íê÷õë<—\ÉíòésòÎx È‹KGó!àGrYÚeÅN_2ںƂœîmÏx°ë<û’¹áÁ¸Ê–•~e?uø;$ã®Ó7]^x¬íý¿èõ꜕s`é^¶KŸn‰¶6ètûpJ´½&Ò†Kû9ëµvðþ¢aÝ*ѰŸ±®ëÜìîrûE_л+I×Ì sq ìÖéœ-¾—¼>‡ýÚj`ÜœÏ5eüÏfÌ'k‰yü»D´÷É/é5kEÛ‹k€à04sâSgÌÄÆÀÇ9mwKÇËzÒ/Åû!ÑâhÓú}Çø ^O-_9jtuø¾#(i‡md²¾ˆñ¬oßæRÁ£UýLtU?¡Oú`ø÷yµ¿J ±ðql<«²Æ%kê%ä›õy`—hþuÖãÃa§f|–|/±ýŽ/Jüþ1 Â8ÓÏ“ÄöΆ-~çÎSGdŽ=Ñ=£¼û÷ï^K›wiS~¦îé´Ký,ù\ìܱ·qç’o„f÷wXŒlüNÚåšîô¹f®óS°~y¹AÇf}WÖÌÂgÛF«w€–Ä[²†>FvÐ5Ì7õ;çÅ~²>ƒwÐûŠÿ°ó¹Ü‹ý†ÛÁ>S³HÍñ˜Ü3™%6î‰Ï¥†ü'Çz9ü.òŽ£9ÿY²°¼°råÙB?žuI´ŸmÀEò²}™tYAšŽ'Oæ³EœË¢ÕÑpL ^Ž.½ÊvÁâjøØ#»û ÚkðCÓ'ðpú2ÉÜð`Ü!ó{<7óÅã½ëp—hûN§^;,ÚzÌoÂ?k{/׃Y»·{´ºúô}vèˆþO?#×pñ™µóù=cæƒu4Œý¹4Gg²ÆŒzVt ˜š1öÕ¥uê¼´“—VŠÎwÖ“N?¶Î ×|có'G³ÿ¡ØÁSƒkSñ¨£…çÁ”“øíŠÈµÑã‰ãž-<¸[dmÉѵÏeOä-öôx†ÆqHÿÌ\škÇ4MǛ뎯¡qã¾ ôß&j«m(Û êY®K<0rïÕ&A¾š¿•"ãgýu/m²­X^áÉYõÝ­¬ ö/¤g-é/ƒ>‘'}Ô7°ž…ß'¬|\ôBx2=osÝ;e4¹ËcáûO*¾ÿ‘s-¬×s8¶K,WzbÁh©o}gÁª?õ\ç G¬ó§1ï'ôÂ×ãDî‹ÎÏ™º|ëíImFV…t¬W4¦SEÊhæò,Í…én@¤>nV!Ð+#XE×@Wð2@k‰=óÂæãÇÁÔ¥Róuºôø‹t/ ïÿ8É ê_/f¡ß/r·° Ã÷qÚ…»ìgõ›vàGÂ7…_Oãþy4¹0å˜Qôáù9"ëí£ÃF\]cÅŒ*]Õ9ì¦Á%E_Ð >Dø€àOxßÅ•uíɲ¶.ùþ´œ+»míô¯ëMt:[hñÙÈîÛ5îø“OV_y^¬#š¶ž`Zïbf‰©0OÑâ¨ul{ä ö×ü:o~+Àî gñŸ÷C긖¶œ%ú9Sÿ'¤5“ÀI°ûkl½Wq€BóÐ2šYsîݦw˜çWÕ\Ü õ;Ñ#Áø9¼gÎ}Éå¡ÍGDb1såœÅ­"ëq6ŠÄ xÏ~SÇ¡oðlµÎí\›[ß—‰Œ+¬©Où]ÖÑÚy­ŒÛ‘6Ó):çk _ç еÈí#å€óÊì«2²N \²oܶìܬuðœÍ[ïp~}Ý[ýaŒVÒ3Dî=¸C¤ 4£æiCÝgàƒw#7NÕýëDê0ÌX Í¢wA# ë7´ˆnm¬d¼·â^dÙü‘{‘-­kV×=sëúùôüœè‚Ãë0./Fæ€ÑÈøžx#~dø:utrfdüÚ„®'Ö}Ÿè>è~R=Z›¯ÿo’îºpëóÄ®’Óþ?g6Ò5_kž˜ ò}°u^."ùðnµŠÝ>G£k>ó¥4–SèÓyŒëÕ¹.1Õ¯E—“iÌm¯Y¿„& çtxj^u̶ۦN÷ùtï§Õ^r\¾®û°°ÿK~"*0îÈAâÆWjÞ˜ã ï„o«ï.ñhþ²hbÔ¥ïi?Pÿþ™{:v‹>ÀÛŸÐüŽ®Šì¸:Ò¯CÌbF]½œ¡vqØÆÑ+i~&]þ¢ñÔgyü:·®á}Ä ÁÔûQ¯Öúø‚6ÌD79Rô ¦Ù粦æ†9†îÁðÌùêÜ~Í=õxÛ&^“àd=Û¾Ÿ%#÷S±ß9ìœTcä:öÄoc°óYDúTœ;ºeäÛGÏšgÓÔN‘ñç\©±w-£såçÄÿ##sù|l®c§ÖøñLã?¸¸jäþH¼ßqCûÎæÑ\¯¡±Ý;RWØOã`Ü€6×ÕµÎ1´.N>Zd—ñÔØ -¬¬¾EGXTóÜ/²f‹çϧÿ¡ƒÅ"s+áIõìå5ŸöÏóÿ¸µ…FÉ© gy*ý÷w½g2µ‡ùú›ÞÅ3gÕ#Õ{‹Ì@¿œ_íMïçys·Ž9ô çmÙ§ãxt’È}Ðã `ö˜2AdÚ3Âÿ·Ôn¯SÀ®¶8'ž~0ª¯Â¹Þàÿùºæ8}ÂÐëvšKäú¯:žΜ$;àÀȺ¯kuÞù¡`ÿ•úïlÙ]±äö®² ÔgÝ¥{þ¿Tǯ`ù#QýB`Úˆ¢Éꘂ_hhßG™×Íd;Pñg•ÅFb,gŽÜ³j8Í|åòK¤®:c¤¿ˆy]&²fZ‚þ׋ôç2~ø#Ðù‘•´ [òúºOUÙ£}èÅîç8¢â¼¶sˆtûÞanö×ÿλ‚Ïcˆ’ Q½f¡ß[5ÞOT¤´u¬HÛ‰¾S+F]X On_ï/´Bû‰Y£—ž(Zù§Æi‰È½!ámç8žªß Ôñ+í›R4:Rd-šóóÀhûÝ¡{h¬sl`ÛÈ\ÆvmýÏ6;žËçj‘kúh×oÛ¶^:r2æyÞ?2À\:Ökÿ¼cÎëFÊÌv-–óM³EÖ#p/Øé˜êi­ëŽŽÔ¯öô©ïésÚ½õŽí"ׂuÞÙ¿"÷k;62ÿ´ëu.~;~@ÿÚ¶Àú‘ër¬¢k\#Î9jŽ¡lÿµßsïè¹F±keÖÖ¼(²Ãvþ>:?ô &Â_c‹VÐÍÚþŸ~ºÏ9ûëGæËx=‰¥#÷qˆù‡Þ /ä4 m"w&ÎN¬ÿͨ~‡ou¯òì ÓFh—¸‚óõiûÌ‘²‚>,¯±EÖßé+âýølÀðtü-r_ú¶B«³Eúûi+ø4š¾s€ãEå2nèx“iL¶}ئ…GÌ+ÄÇL¾X£×Áïçêó µÁq6òÓµ· ßÁ|ÿø~ðûti Øøöññcpí=ÒI±®¨˜_~8=2–€¼¸Cvoäú`~b)Ú?¯¥Pbøþß–ìx¢b[Y[íÑ5Qøô~Œ‹Ž¡¹£ÎyÁG|þ¡95^1G¶ÙÀ çø÷–‘õ*Œ·k¤VÿO§«CtÀ\bÂø”ðß*:Ù'rÏ×=5ÆØføÀêEëèZæüíòJ±“ÈõÁ´ˆhu4ÉÑ%/ï©cRìheÄÈÙ¤‘ë[n w$:aί-ƒíÖ/Wˆ\3 06¯VŸéX|‘ˆ'ˆ¬uÞBߨ¶øFzæ ‘¾QóÞ‚¢cÆÆ:08×/r¯gǬ׮™¿°ZôÜÊú»} ιYQï+·ŽÌëuþç­ßÎñan\Èa¹àx.òzûÖÿðÖ¡­û÷ÎùÙ.Òž94rÍtµS4ÎÊ¿hü–YŒ©eÉÆ‘kbì¯ëÜ—þ‘õÛEú–vŠÌãÙ8Ò>@çµžêø¸køÜwÝœó¼ÍúúîØ´ /9—Ñy׋EÖzá?™927×ù¯ÆÇœ×Ôáº3ûƒúi®mc€Ó®‹žªb@¡ÏQ¤3~•'TQðÑÈ=íйCƒ^Š M¬v¯­vn¢qAÆo«þ.­¶Ï ,9²nÛ˜_ï[¸u¸†€6¡ûO^ï-u•ŸUݘzצÞ›ÅxjcOÐ$´„L·‡œ;|·é€ÇOÕçåúÜEó‹î Ç’»‚ßaôî["÷8PxOþÇ Óña/ŠßhOá×@aÕz2ûàbÉ7#÷Ã@FžïPå]Éw¬kެ1y¶ŽS±-¾–œ0.).Zä=ÏÁFø¹ÊˆÆ'4žh;Üùf®EGçÒö8§êøßÑu™q_°–¶ðü;õ¼1ëgàëÚ¹øDvÕó\s¿¿¾CãŠgûˆžÆ©m/ór…ðÿNÑ쟺gÜJãÃõÑ1…~¯¹ø¢y?OíA·ÿƒŽ/iùȘæj’¡¿H|ª±ö:$óDÖß;͘¹¦úT×ö‰ÜkÐõ•´¼r­)m\@ÿm‰£®kâ=›G®?³räú„¿×\ßÞ9?öý8ÿÜC‘¿»èû®‘þ|æ {É> ‘{³8—”£KïEfÒ—5"ãGöÿX¦ì¢wßÑ nÓ»,—÷S;7´A$Fo¨ñå=EÆe·Ž¬w= ÕFË€­5>먴 šØHÏî¹—ø®š?{gµ{çÈ8Æúê§sú9œ¿oÉ:•ëoñ{Ì)VÒ<ƒ•K´îgŽÛ´\$þ/éÿ†ÏÐÍíë%VJÊa <òUÕËSt>Ú¾!ò>OÓs/ѳ^ž­X^d7¾ùƒ5¿ÐÄj9¶ÅDmØÂûç4n?´äÄ«’Ýgyo;°ïßÊ4¢™M"÷?Ct±~¤¼p¤oþLCžw±¡Ó½§_]¯q»Ts±V¤Î,Ù^xÿoäž$ȯp‚ί.:FæãÇ_ýýV2¹¸[c†-ôˆèeŠJ3ÅŽ¤Ÿ£‹¶&\Øq>ô8d:梣½D“Ø˜ãŠææÖs®ï/4ù®Æy4µè1K÷n¬¾/ ±3¿Ó=3ˆö¹f±È¼ð ÙQó‚îÆ;§Ã~¡5£çþ³¶ œïï8¦ã¿® è§vØŸ¾—®_$2Çy{•æüß)2'ß¾*0þ¸Hß¿¿»Žy==×±£"×Öä:hËyAà/4cÏ®¢ãûR­ïÐ]ßÈ©kTKÊb?œ qTÎUãë™Õ>ñwÛRàÜ~‘û[¹þÌúùF­sícóH?ÍÊš¯9"sô-/Ö\ÿ`µÈX|ûŸÛ–çkë¾ÿï‹ç»ú_áõ%t]Gãi_nWÿƯP|Âà,º?:Ô<¢‰5"ó@–S•§RrQ>¬ºWщޭï.4ŽÎ5ƒÚí\âu#k7бßмÀûè¼£ªí¬‘pƒž¶Þ£ó_ »r­ÈMx}§H]†yTkâûÁçoß?ld®0˜­’c€îo¾ÆWÿ_þ¿ôþ+„5gK&€óÄñ ýSØŽþŠä‚m„cuï’×Fîýò_º?> âÁßT\/ò˜¹ÀÞéö¥ÄzÝdÆóšã÷% Ý~—ü¨tÝ’ŸÔ1+÷} zÀgM§±`®ÐÑ‘ÕóŠF]ë bŸ%úŽ1óÈ5×IÎ7_«uxskÎQ;fÑwë{Ì·kÄÀxðxHžƒ­w¤köÑuŽ› o›çWWŸh#øo¬çù‹Žø¾uä>Þö¯x­ã¾}SêÙÎuá78p„°Ñ5×¾‡ö8¾në»ñÞcä:èœ+zîsî\+ü·]$-ùØ\óo;Í1×@Û¿fë÷j‘ëq8.cl£Ž£l¬y£m`ô‡îÓGØ@Ž$<¾T4õÂEï˜H÷Í®ïÌ;þ`ôAëë³EæaÎY3ijÆ?ÀèaOêo_à³946ØþÈ A‘{gZóFÊ>v—×9,zïϵÝÿ¯>‚‹7G]/ 5®Ê{ ß³D7FÊkÆÙ™žö“K†?èôÈ5™££t?ñ |àÿ“‘qÝÛÔð=þa<2ŸP׎lö€çç×/×êÛ~ohyóûD®™êzÇRÁù•4?›Fî›éÚdãðfê'÷9—h—HÝ~¹Ö=®ûpŒ¤];gß<¸ç<–Ýôþ#uâÍõßÿÿ-¿=ÏmÛÀŸëãðüÑnÛnÌ%´5¡>»tYìVx[uõ…÷N¦ù…Öð¹C{£TÜ-÷ºÎ¸_dý/ô‹|˜´¾£` ~Vô«õž'…ÍÆœ·uÏ´š·×µ_ôàHÙ=áo½RóÞ}OY{´#üzUÏEÜ#\Eçú®bTÑ«_¨Géתš÷åÕ—Y4–è£Ø±Ä‰Ü™ÊqRäzíØøÞÁ`|ØoÓÁÿ‹%‹°E®Ña¢£ZràAÉ‚gÔgìšÔÇï£Éß/~ü…-C%^×ñ‰þÿ¢Ê"“ÖØOPÇÿ{± >ÔX'ÌÂß„ÏèNýÎ0¹èšÙI󵬸ᑹӋ‰þ­yžÏ'm‚©ðv×åãùDóÌÙsø ¼ïœ‡üX£õ^æu&ÑÓ4¢‘'„»ÿU›° þ ׈k€oK‰6ÖP›«ÆÛùôÞC¢êôÑ~/ÕH”>uÄ+¯©žØÌÏÑä]7ës©<ÐÔÚͯûÇ©÷—5=”«UÎͬ6-¹&ú•×XNc¶Cdm’s^öUôôW×úGæÄ8^º\dޝŸeLa¼¬÷-¹ž&ã^c¯ÉÎÝLßw‰ŒƒÚÇcŒd>÷ØGuH$þ;GÔüض9ì›wÍ€cö,¹¿÷‘{fÚרúÎX8ÇÈqqža]ßy±Îò¸Zî Pûyžkç¶‹žk[ Ë—ä笹&“em¢vl`ÉH›ÍñÛ(ËDú+œ—7Y侎ÝÁ'#EæíAçø%í£»Ewǃ ­A‡¶1iÓôõ9…ÏÞ¶ Óœ$L{T´þž°ÿ&aÈ«SŠn3©žïœß½ôže#é} ½ g ñ†j‰‹ëgaÿ á>î¯+~9縶k–'ÔXA{^·Æ5Áä{ÛŸy˜Îã"7ÝŸ|ž ÿ>X¯/~ª° ú¡°û0á8:öuÂqÆærx¿Åv~¡.íyv‚ð Ùq°úùŽîG¿Eü&2ÏÄq’áõÿCÂù/%·t|K~¾Ê‚2OÈŸêÿEO&fü®dÃ#Â~çäB/ý"sfà;ðù Ø\ÿЬõ'Ïêß‘{ {ñã/=]Ÿ¢½¢“¯Wé¢Ðàü¢qä|‹Îxøc>½šC´‰ÏñWõ »r¢:vM.¦s/é‡}Ú«ëÙö%s,¤1][>‰mõþMõ®ItÿÂõýe>^-B{à û?Ô8¾NTøqÑÈúÇÑ#÷rø<ÒGŠóœíX™c·Îí±=æ8¨sö3`XìøpÃ\×åþÊ‘ëM®‰S³EÆî¶‹žy;[è¼ß¿ud­ móí»Ú*²f ùJÞÅ?#×çr<ĵ‡è^Ú2 ÿެ58@sèºß}Zýnç÷pý¡‘ †ÚFµÞ¼uë~û$lÃXVzl·×÷£#1ÙùSÛEbõî‘y¨®+u>í­çn=åñâÑsïÛ&¶·lÏñ,ÛgÜ­ƒŸàü =÷¦id#¾ôaתwI¯ÈçýÏ©¬­yYçÇÎoÄ,ÑÏ®á¯@¯Å÷Š?ûnáÙSÊý´mF½g±úÎâÃÅÿO¯öV1¿è±ø'3éÿñ%g1O K?ÿƒKÞŒP±­¼ëxÍ?…¾æÃÛø¯á©•¢Y“²ìƒM"u=Ô­Â÷ä.v߉\(ºÿEÂläÛ’Æó{„µŽ€¿WU\*˜ðšÆ½ÿÑMêǵêÓ©ú– Ö¹G£É¿)6Àä§ê\9|™ÆepÅ“"K‘—ÈÊW…CÏ«mƒ+‹]áš_Å7‹ ø®bj³&ŸÈÓ¾¢5×-/:9<’‡ Uô³ÕÔî]#×Þ…‰ÃcÓƒKFæÊ˜æÕ3ÎoñÉ>:¿´~?¨gBS“©½ïkŒ¿ªŸ¥Í–/\7¦è †¿¼f€ýÅKEîKÔW4á: °Èº;2C¹ÒÅCŽ~)Ù5jd=Þ³ãw+4rtÒhò›Kœ`¤È5ËÁǾ×}Òç"÷ÜHç§ÐøµsaŒΩÜ-r¯Úþ‘2Á:äZš§­[çlðl× »®lãøk|tŸH™°`ë¹öƒl¹G sf|8î^;¿È5k¨¿{Dî—s€æmݳR¤Þ¿UäÚG–>xžó[×\¯hãHº¾¯)'³jy·Æt­È<¥í"eE[6:§Õ¾yÆÐ±Úþ­ëLö3­ÒºÖvÂÖ­g-£ùß"2§‹¹BW[LÿÃÐ+ö1t×WÇì:B8ßwìè¹F¸â5Ó)ÕâÂ×é †yaäÚ–W¶°y€ÞzŸx^tÏšVÏ·ôSmOi'º~$tß·+_767| þ?,Yóˆ°ì“hÖ?(õ`ø•ÇÑ»lcvù´èV4×gE椠kvŸYâ|vq{¸·…ÿä°w1™P°þ"a6>|ýøoðõàãïâZñ ѾQm“tß ‘û†§k“„,u|™òÑÂl‡W*Œ™´žË vO]ÿ/~ýë"× Å¿€Ä/ugÓ"[?ר¾,¼üCÏaœÇÐ;¦Êö(xeýÔ¾âÅESŒ-¹TÈüiWkLÑ3l‹îÒât“Dgà~Äo4çäOÂÃÈ<ì×ý¸vg%Ñ7z4úÀûF6ˆÜSÄv6‡k~VTŸ××±d•We %wŠ ýMsú‰æâ)ߨuœËø+­ØiŽÁÀ«®rnϦâA×Ó,¹¶²cƒ+·~·ýÏÛjÌÛ9ðÆ¿Å5‡ôݹƒóDú0ŒOíøgû=öë8OjMÍçjÿBš« "q™fý¸Ý>ÿÖ‚ÕàüŠŽ/ gM¢w͹ö\÷Ã1ƒÂËãF«ý(¶ò͹;[‡Ìy²Ê‡‚}ØC£ªßÌ—×8UtBáìƒ[4—ëDî‰G\‘_×¾)ë?üS˜}¢0ü|ë>§¬L¸K8“úÅÝt­Úy±äqðö"“ãÈçê¹Ô–]¨q™\çÐ-‘Q÷ /ïªýmr°µð¿ÜPû]Æ ¹õœ°æWás_n~M¾@ñcÏ\ǼÈptäÈ=…¬“:Žå¼óY5§ä°€±‹ÜW’kàCb)—‰äÓ&ŽSÎýW¾tpß›mgd<Œèß~üô|ìäÒD‘1íQ„Á?‹Æ'T›ðûG «/Ø`ˆýÊ|?Qt2œhÇq=DëéýÅ#ÔýXq¿èÎ…IcüŒh¾¢^_ðž¾N¹ ¾–Ç#÷ݵ¤èFsj<Ó¤½èÉkëzÇD}¾í÷±njüw.(6²}bö+/) Œ›¶áœƒ¸Šú5KäZÓê»sE\·´sdü—±´oÈô£Zî¦N,=L÷Xßw~ÿü‘{•Ï«g,¥6÷kõaiµu“Èz~ןY÷¶àÚc×+ï©ÿ;Nà8Êjº×ùµ–Ñ|:ŸØñÞ­Zÿ;§ÌØ>_ä:ÿ–«Æ|ç{97~»HìÿGä×Îé]D×9¶µx¤àãéÀþœ9ã¡Ái"c$[ª­ÛDî—5S¤^²±0è9aܣŸó#cœDÖ¸‚g7ˆ/ñ[Cû# ‹†HúMÿ¿¦œÆÇ¯Œ©ÿ‰„îA×}J˜¦°•߯W¼t¾{á³)ÕgÇÑ5À|‘è ÈÍK#÷#]W¿Á%tPòØ©z@r ¹Gžñ¯ tH ÛïŠÜ#ŒsÿŽÓÎ:.•œÂÿ/Ýs¶äòÔµeÿÑM¨ç`O êþ¶Ïëõ:¯gnUŸñ5#¯f×X=¢9B ª«>§1·/è·È:kc%¼ÕÑœÙ6þï+š…vá»å£©é.ïŸ8²dݾÁ[iLwÍ.ZûQ0æj­‡„ pÍ4 ¾¬ïÎK›«Òf¡+|=Èá$Ï~’l¢~ÿª{ì^82o¥H_ïwÀú‘#}6éù«àÈájÏš‘õí3éÚ±k;JýËW’§è!ÓiL§ÜCr!]Ïwd ¶k?=wãH\_¡5öŒÉZ‘ûàùpLÛ°vdnHÛ±cd¼Ñz?å¸À"Ñsã¡ãüsD3ÌÆ'l4ðj×H Þ/2Oiõ×ùËG®uÃ5®Ýr|f~Œùô‘¾Bçë0·Ëµ®_TãàÚ]Ë2Çhw‰žk_Ÿ¬þZ&´c–^ãf]ÞùV`ÌÞÑ3«m“Ù—×®{²îïºYç„öký¿[äúq®Gœ%rOÝe"×åZOãÇxn¹/ ´ ¦Nª1´Ž?ŸÆnÛÈ|­M"m¹é#ãBÝ1+¹%Ð5:,zëM®C…ýàÞÉÂüBgTÌ*ú.ö7zÑ/‘þêÇ…×ßD“ÓRpˆ8îD’7E®WñžpþÝp—sè¿£ ç>“ܘ@cmÙ¾¥úè:háˆHðäšw0¿B÷âÿ?K}zT8ýºú÷Dd Ò#ê;6Ê ê'×ï¡óø‚ÐßïÕ³Èù9Mý†Úþ¨îÿ—þ¿C×ܦ±~T˜¶PëâcÓñ㨮<çûȵ‡xòõIÉ éÿE ©×6¹ßè `ÉßE/³‹†‘£kœ Ÿ©D;G®­ö\3Ò:Ë ¢ãÃ4ÞØt`²×Jè=×£tΙóPàkd9Xöm úžFmœS׆dÛ»êïËÕ‹4ù,`ˆóú6‰\³Ýà(õañ}…¿± °Kä tíµâ§â~°Á²oCõiµmZ½{¾HÝÛ|ºr侂Ëêý¦É5"ý¾Ž{ìoXXíߨõI?‰ÜKÛþãsÌÁ:âb`$r÷øÖoÛ>ÎY\BïBè™ÇÓ[×Ý5²^ÌÇG‚Ü<;r].Çs·ŒÌóBÎ9_‹9²?‰ñ€&‘³óêÙ›iìOT__p¨c÷ûé=‡h¼\ç·Qä:¦ö{]‡Í#ëB¬ë·s27‹ÌWÝWsÏûÓ˜9Æn“sH qÍ纞£5Îÿ²,pŽtàxÌ,:àçæO){í´¼^YsæZÈ>CÆsU]ëÚ:xjq︚è<Ü_mž¾òzÑGÁ7üœ»¯ÎF¡£ï"NÑïÇ…3ŸŠ/ÁÎÂ8d:ÓðuŒ Ï>#yð¾ø™û¾‹ô]<¸S‡~LÞÅ/u,ÊýÔpMƒáC&Ó®¦±D[N2cŽÈ:û ºcS|3à)2?~tõKÕ–!êãrp¹p–ƹx¡úFŸnæ_¢qCŸïè¸}ñR=Š\;OÏà>çóΩñò81¶ÈçÏ56–³Oj|ÞŒf¯ár-rò‡H?ÊI¢)"×’óáMlÂ"ó…áÍ 5ΪE+cz`äúÐ6>|tz0c!ÍÅ2¢Wž1‘Þáz,ës·îÝ0²š<]ü5–ÎÏPûRÆìõóFùÂØCè ¿ë}}4×Ö›x':Âñ‘û›:ŸšïØ‹àFý¾fìÄ="1rnõÃ1øvÅÊ7ÍZôÎ}wÎ c~,¹_õvÆÊ¾ëå´¥]s䜠ÞxæU×¶l‰o{êûVê/2¹ŒlÛ_¿Õ'²îXõ{¿ÈõiÚ¾mûáwÜã…çÔ:,7O‰\šqÛRãÅØ‚Ÿ+iümoØ×Ñ_cÂs®Ò;x9Èbhÿ.5%‡DÚ{Î1ÚWÏÝ>²¦Ø²Î¹BZ‡çuCÍÏNzípŒ½[qîÐvä#9ÜÿQ{À\â‹×hl>Óùc5wŒ©k¥ÚuaöeõÎËuM.4†,hרW·Š®w.\Û?Ø?Òva|¡}èºOd½!4ùOçi<Èͼ,š<Á‚_è¥G Á8bÄÄ<Ï&;ñƒÈI|ùë}Ì?ú¦dUñS\飯ŽK¸ÿb½¯<ç®hÖº,qÑ1"õ¶ñÔ/äÙˆÂ>ûNT£\dãæÜ(Æ<™Zcéz§MÔæK…Õ§g¯ØWôÙÕ¿{u}?Cccÿ>ž;$ê÷)µMEwu}×#’ÔžÍP禩%z³ŽEiûpÂ÷w…ñ7èÛhªùnìk5vòM”Ü”Ôÿ…EèLè*#DâÿD:ç®Å5gèo×wŸÿXz˜¶…øÀyÌ{ˆgÀ”ƒ47ðèÚúo~Ñ%Ÿ³ê°_Êüçx ´J|ŸÒ„u¾ `ÇËY4C~cÀèwjlŸQßøoñÆÆê;¸°ƒú°¹Æs=!íèÎ]©W;À;°l®HÌù¥ Eò$üïûæSã\’‘¸oŸÍ^‘¾ˆuõLû ìGYXßÁgðݹ0>|ξ ë㛪íGhL±ÓNŽ\ß ýšüÛ½uý9‘k©3s8'žóÇê7Žj]sHdM®ýì–iN]oüµl?5²V‡qCÁyü³èÜ©ºöÖ;·UÛ-k\«`Lß7ãO‰\×Èv‰sœ‹¼Uäº[Dæc®Øú]ƒ–‡“›´6ú÷jÿãj/óc]Ÿû¬C,3fÞW‰\#ÔùAÆ|ëмfrN׊ºn×Öá¼ Û)ö r­ã¡‹k ÖV?f«xW°÷6áØçÂ¥{…e7 ïoîü¹OãW‹×%;>Ž´…±ýÐÅñ'’ßò¾0ÿñí+¯ î>Uñ«`üš‘ë‚ö‹ûíjäÂÔ‘û‚Œ]ßSør¾È=.ñÿï¯ïÆ*ôr{®RŸˆYN&9þ‡®ùTãrS¤¿ÿ Éì‡ õXü´ÆËveÛSê3öñÛjû˻ޑŒyBXÎï‡4Öø9°9©àüËÂÿÁzçUÑì#\ðÿ]õLA¯ÛHãµ`}_ÁHì€>‘û: '‘àÿ’1ŸVš-õÄ œW‰<žIÏd,רºþ]X4Æ=øÝ‡ÓïEõ®q"×€nÉ1"g ¼x&rO 7„÷ä4Oé+Ù°Îuñ]¾SdzÐÓïµÍE~Lé‹ß¶ŒÌ{œBÿ;þ _"\cäüð¹tÏQê#ú>zÔ^‘ùÝ«·®wm:< ï¹ÞuÿȽ­G[û·æÊ1FçíÁË{·>so™€¼°f7g¾ÑÁ]ëÿgF®ßÌç¹jX~~ëÆöÃõi? ¸R¤>Îï[í1Þ;ÏÞï¼ ržE½ óµÏÒ9øŽœª+ô›ç^)oNUÛ\Cfì7Î#_]‡Ìÿ·æÚÚ^ׯ{\¯d¹±ªÆÑ¹D®çr±s2WUÿ¶Òçj'mG§;Om?L×ÀƒÎÁ´€°þ¹Jëíº_Ç÷Wê7þ¿l79OuçH¿Õîj×®‘9pÐù†­cÝ ÝtñµøîŠô·8–È÷û¥[9;(š5Ù‹Žþp~/ú8¾xÝ1l>ÁpxaŠs$àéq#×­üTç]§LÛ‘QKEÚ=ÎA.¬\iäÀxzÆêšãôòñY̹fìB‘õ»]|/ö<øˆÿ}_á<òá›Èý\Ð÷ïÕ÷«Ì(øˆ Å6"ÇÓ¶ÁMWð^ñb<CœEÇ{…oiìoÒ{\3p©ÚùždÏx@s¯m,]‡lø^sA<œCן]sý‘Ú0F41šB›®¯±}&ªGSï:j4ûL›l„ÁŒCÄ[Gîçiœ¢ sˆî8œ£þ­9£àòõ¾"‡‡×œÃêXWs;gdì™AŒöyÑÅB-Ú±-¿„èÆ~›*]»~3ì?¶‰\/ìYFýt{i;üf~Ü­×1 ÷­‡Ã›`¿c±ØÎ!\¢5VŒ«u|ã²#ýô›GúÁ¹½÷îH9EûÁâ3õ6¹»ý'çiNÁ’tÐæÓ"swÏÕ9ç0Ò·M#k½Àfüxëy|R#ò?CsR+~‰ÖŠáûÙúÏsôÉõИeΞê߀ȵ¤÷Õû÷µF«O[¶®³Oh×è¹æcè_ãrÿȽ‘­—ï¹ÐæKô–SuÐwä¯cÆà½ó€ÿåºÖ|‘ùF޹Xo¥¹ç½®i³ÿºsmÎÑ‘ûàÀ7»D®3kšŸG}ØJ÷bÓcKã[™¹òXÉu¼6š=Ô Î|™swcdMªrãŠÞÆ87pöH{l˜Eýe< WpÝsMµÙ¾(縡¢ßÏY/éüæÒþTû%y¾rZ žŽ¡gqh–ÜIpþ˜!2.·‚ðÿ5É5òæñÕàÿ¹FÇ ‘uiä'L†·ÀFÖê~”¼|ÎC9MÏpmÝm—‹¼c®±‰ð±#wÉI2Àxþˆî{4Òßÿ¦>íãwý±å5õ¦}"k>”ø»Îᙦ¶µY{uÔȵH™»)ê¼Ü³þ_äÈcU><µ¾øÏ:qgv׵ȋ£#ý?ÎG¤¯Ø Ž®éß·^RôÔÿ-ønýüX]³‡Þåœ[ÇÚþ{¿ÇHùd{áÐHÿs‹¼€—ÎÕqidN ý9Có¶ÚqN$n[oGÎ 7/ÔotEòÚàÓóuþ }·è¶SNÒx G,o¶Œ”;mÿ‘6¦ÿÛ&r} Ûàæ‘v™ÇŒyv½œsdŽÌ#ÝJÏa7‹´“.jÍ%ô똺}AÈäÓz‘y°Ž=;–1@ýbL\ãaÜoûi|èº9Úý@wË´Úïáù+<×îjé’§‹×¿îûG.ÉïÂ#®Á'ýAÕ9 þ#×Ԝ¹×“u˜9¥_N©ö8oÍõМsž-üµ¹ú~Tëôg[ýǘºV:G·sTëZÆÿÓ•‘ü‚žãÚÏÅ4gÕg]z°ÆÝŸº7±F|^øû¿«c_p9‰>¥™2^ÈEëûWê™à:ù¤—éóI=ç*õ{Ôh|5Å×öY¤þÎçÃz8ÿƒÆû9ýæÿAÂÿ%œ#ý2ZÅ÷â‡ËÁÏ™ë¹ý§®Ã.)š=ÖKÞ)9 è%È ì´>jûí-š]W´ÆX‚ð"˜@ŽÿÕ‘þ‹¾šËiôýàÈì¢:l×A×`üƒŒ?Y¿W¬‡_+r?vð ÛöT=‡>Ž/ù†>@Ü90‹ž³¤xf@äzÌ+ˆ.ŒÖû·Öçú¢Uh”<æ½ô¬£"}ÆÎ±sŽÌ!:ÐÿŽŸ¶ñßx˱£Æuè¹Þ³ý;;è;²Îùˆ<ÿÀÖwhÝñR®;2z®esPë}öÏ;Ï…ñp=ŸÇGÆPŒÔ£l ï^éGå<ôÝ50Síß9&rOþ§þf“H¾D&œ§Ï³"÷ô;UsŒÝp¶¾Ÿ­>ÓW×ï=×’h»êó˜HLµÌØ,r/Ð]"qÝÛÛÿo|?½:?Ec`Ãò¬w Àµ>œcjÿ]»vÎþûåÕ÷½ÔŽ ¢gm¶ckDÊô™•õ<èúû±qûk^Ôa¸rpìa x…í=ª0Œ¤~}õaÕçz÷­¢‡êÃìÑä{ÿíTú9v^Õ®#ƾ¿TóÓÈ4øs1Í‹cΡf^»m/{g;Gk/Œä;®["Ò7»HäÚ´› {ïîß(9×ÅÖRê˜í@ÉLrAÿ«Ïg4vݹ‰nÛJ€"ê|YË`Lá&×þ*¬Ç8N˜ÿS•!«Àù{[sq½ÆÿVÝo¼2šz¸â âœkël¯‘C4‚0žq'ÿÇu!ÐÊôuNJ½à{:O~éG‹OD[ÌÏdõþâSÇ_ä|Dæ} ß­q½9àšÍ "ý­kî¹×uYËFÆ=¡dù‰š7äñó£"÷u\_ÏÆæÐ~ü®ÄÜnÌ­¹ú¦ÊÀbs-*:øGäZ1{ˆ..Ðóø¤6¹_×?ë¼<ºX´ƒ¯š<¡C"ã»;Dî?µGd<Œr®Œñÿ¸È}­?Z§qžá!‘¶øqldžk’œãhýßµGFÏýÁ ã¾ó\vôQµŸq`ëüÁºÖù=‡µ>ísFþwù¢Ô\b¼ O~£‡ÁçhþOÜSŒã,Ýoysd$ö»?gGú…xŽõìS⯘oŸýû¶¿ïå¼ñr3}2¾öW/¨ƒïý#c¯Dúf.S»»t×A¯¤ö£k£ëX–Ã/ösZ¦[žÛn°Îa»lëÈ=hÀ¹üЮåÏÑ:¸î8̓ûË3  psIÝ×e…—|S|‡}=Ò·‹þüCä$]ì+¸?¦+3 ~ã׫âM‰ßÑ÷4>Øh—GÖéA·ÄbñÇcC|!qŽ ¼`›Ûþ2û²,–Ñ\,/:€6ÖŽô¡MªñØRç™K|G«êÓµȰÉ#k —Õ;Ö–â·'·é É>hŒ$oóßÏ îÿ(Ü?¦ÊŠâkF×§NŽÜÑIœ¹Þÿºœ¿TcÜ|'2Çô½‡ØÂ•zבû‚óö=¦ÏÁúD†(žP°Ÿ6Ë&(óµZmgé?óÔWs4»Æ±Er…¾ý™WŸ:ÇeAÑ·s€ŽÔ8cÏ OÑ‘è…Øô]™Vø~…{ÇwÓ;l»îÉŸà žˆl§þ9ù·öîÎagkñ¾«wô?÷®,ºHóu¥èüõ•>-¬ùïÊ×N÷\_þ¼ÿ¨Íô8™>Ánó=xˆ…¿}=óÁ\£Ã!?‘øE.ÒûçÔ1ud»ó §u#ã‡ÿÔ˜ì®ï{FÖw]¹‡6mÛÖx§±;Fϧ-Ëê@n}# K‰wXÌ_¿l&'õHÉ€S…áà9~üë4VäÀ’_rŠp}°d)6ñ’C#×°¸Jø¦> {ø<0rl¯Ë"ë Îþ_¦g<[1«Än‹Ôû]÷ÄûßÖsÉ?÷ñéH>—{Á¼™êü–yÄ^Ó7šõšÊ¼ÿ ù‚m÷Md¼ žÞI㺠Îíc>.¬Ã„7àoøýýì:}?L¼ì|>°lÕÈõ ]´¿æ~ æýléê0îüwº<Òé¾§³Q]—ºCÛ~ À·ð]¿J§Å®"çê•Jû…ŽéºB—:‹i_Ë‹u{„,852_Ã&€×Á*ðôsÉ r­öˆÜ'a³È˜È)zÎ1‘>ÃÁjÃò‘uPð;¸áXÂQ#×­¹&Í~‘~¦m[÷8‡“±sn>0þï¹^–}ôÿŒôÛƒ_ÎǼRsÀóÇwŠ.®ŽÔÝO×ù[ô¼74.è÷GÚWˆœcO;Ð.Õ1Hm=&Rí§q ®oà7ò™ ëÏc½ßÈú_ú¾edn|ÿÈ5>i‡ó>íçÁçã%j+º˜×ì‹Ì]$ro4ÆÿD=Ï9kjî”gX|!Ø?Ø¥È+ä8`ü?F¸OîNW(>>o‰ŒyÖß*ŒFŽâ›éòEñù),G6œWñºŒùɉgôýFÉì|mèýä ]«wÜ$¼¿Dï¿îW;Ázlâ/oH6¼¤ç~Pç®äaïÅŸï>hiÎH}ÚÄ·Cï׺~ vX»²æ}`cͯí»yEwàý±õú2·Ð%¸çzpœø¯æø ÍéÉ:ì3ÜNóí¯.úù—hìRÝ×óNWÏètÏuº˜ÞéŽe^ìòLô†®½AmÃ>ˆÈý2_¬ò­ä™õÝ€OWªÝyí@ƒàÜÅêm^/²Fátõ‡ÿýÚ¿²‹Ú}XdÕU‘yŒÎç9D}]?rÍ1Û\ΣlÇ x¶ó÷oö%홳b_ÿñ­16Vœ ÿOÐ5W¨ÿ—DO¾tÎå…›GZ:=×_¯ÿŒuÿÑÁµ`=>Ù'D|Þ¥wØGļaw:J÷^¢çmª¶œ™ëɧcÞ®9°O ÜvlsS»þ`È\Jôûœl{mÉȽÁ¸#×¶¾Ê˜`ÿ óü+R÷t/ï kVˆŒ';¯vØÎ#±C¼ž„×ÿÀßn2>ýô.ê‚;GÎZŸÚCç_Ðukë€oáOèA²¡øÀ3bšøˆu¢ãøQ:ÒwâjVÇ•>øU•ÍÚV ¨ÏÆtôqdúF¢èî”H?"ýE¿A÷Ã7‹Œý1`vo¿§s¬'BOàú\ѳ¦p@¤z;Ðû‘9®¹àÄ2Ç×ý+è:­ƒPp»û® Ì8uu‰R×»¯Æë…Hßû³;드G·?V2ä_’ØWj,Ámtõë„×§èþÇ5ö×èÚË…íHŽœ­÷;ÿv°äÐËÂþ·ZsøT£·G^#¿‘ä]‚ÝÈøýiÛ2šƒ‰u͘¢â3h^öÕ-1èr}Ý»†è‹¹ºTßWҼ³j® ÑóZs¿À;ð‡å8u¸è`•È}­çÒvpⲺ×P§Ë®ÎÑY]ºXÿîѧû?¹äòþWíï#‰|ÄÖ!ö‚„]owï+üú¤èŒœç¯ïÐÚö¢1ž{þ§Î¥ñwú~d$Æ"‹¬ÿºÆ1¯ë°UäZÇ´ÇøåúÇúh¯ñf=ß2€1[¼u ãŽlB‡ºH×ÓFpâg}¯v£¹r-˜sql<¨uÔU_°+‘®¸R¿oÔq‹®¿_çxîu‘9BÆûk¢'Þƒ‡–•öGé§rÝóa¹èZbû*ÖŠÌåtŽ/º#ØýâgÁy輘;Ò_býÒy3Ìô ÚŸæü¤£tž<{ç×<¥yÝ0ÒŸ®¹×»ç~…Èõ!8ÀLx¹±¥æ Ü¿/Ò®¶žòo=ßù?Ëë˜Gçî]/ü_îuûRü׌s¨ÏÄ‹ÑÿÞ0#j¬ðýÓ¥ÎÖuœËk\ùgÍ4ìõšøÍÈÚ¼Õ#ׄržŸsµœÇ NÀÇÖŽŒ•›6‰ô'C+[GÖò°lüªÏ6ëý#roÃ.ÎE÷e]Nryº²:ºvc‰çâºKøû@ä:EÖ°i;ü[øÏg·íÅÎzA÷¿¢çݤ÷9~®_(piä^2wH¦àº§þ[qÿ—‹ma»À6Û˜u‹ÿËþÿÝD`öñZâð~TÑ협û–O¹gó‘{o­¹/÷&šæy€¼…g°.ˆÜ Ö¾S×Ù8Ûù€çêÜzÎVšs縯¨yÞ´>§ó·jwºíët¯íÀ³Ìñ[•Þ›<r|UËæuÅK-ÛØ¢Atp¾bŽ»öVÑíS€Ï.‹Œ/ÂoW«Ý§è®ó‚¿×‰Ä‰½Ô/üà×Dê±öa¸ÓrÀ¹öë‚_Ε[½õžví˜sz\ÇÌ9ä-X ÿÁqj2_v æ<¹ó5gÿ‰žúü•‘2ï2qy°ç ÇcÒºþN¨ñº/2ŸóÍÑ•zï5‘6#cƒ|x(2ŸÔØïøˆkžì£‡–¯ézÎëÐ3ºô=oä:iè…Ä„àè 7þûûŠÑìiÛÄTÎS¿œwŘãÓúj hš?Xm‡æáŸõZs 7›\92F°ž®‡ É½"cHÈtøßÈ‘ºž¿íï«ßDê¡Êå+þæ³…YÇW¹Pü%}5Fà¹#ØäbLÚ?ü èÓèPà±`ôMð¹f£Œ®çØwÉœX"VˆÜÇÆõ{Ö³À‹Ë4ÇÐÐv‘¾;æþð]X_p ŠkèçÖÜN©¹fΗŒÜ¼Û—²ÎÿÉ}4øNN+^tì!¿„ÉWKž2ž%Kñíà¿ÇWÿjÅýâr÷]ƒ\8/²F˜÷?¹ÖôÁšËê'…ÿ/D³ÖA³ÿÌËU>•øý£ˆ¬ZL´L`b!c~¾æTµVÅ·¶RäÚè“Õ£à?ñä‘"×\=²ÖtWÍ'c öÀÃ"óXì³6v]¢9;=2nÀ|ß {ì÷Ú‹Fæ1w]ÞêŒ[ë†:èqä:aƒ _‚IÐ,˜ÏÍ\é·Èml€?#ëÖ}Ðûl–oÿ™úžf¯*׺nêõÓë9ª>é—¡¿Æ+×öÚÞ58N¸Eëë÷|ö¬1vŽ"˜à<À]"ýÙ®£ŸÐñojŒ­å×·ŽÑ[¿>ÒáÛ—cŸÿ§i?’ë¶Îi=Ë~¢Û#ý`íš.Ë×0ð®7¢g}Ã!7Æo}õÓù2à(˜ãµìÇG—ž_s<Žh½¬›Ñÿ‹GêÞsDæ¶Þ}˜Æö_‘øãö¬«ïŽgóßuä6,ÿ8oÆÈzĉõ}÷ȵ²WŠô³AGëè»ý%ÿÑ;?ƒN¬Ã×]ý®è¾#F®ÑŒÞûé—´wB½Ù‚ô¡æi‰úŒ"W—‰Œ-[6ÑopÜÙWí7·Ãiœó+6×8l¹Ö5m·íoómë\™ƒÙçÇ|Ÿ ¹·MŒ´KdM÷új?m!é'Åôj3õN‡k»cXüþàÿA·KýÕPé¯ ƒ_öz-dvÕm’#ÿž##ÞÖxÿ©ûðý)Üçû‘ù¶ÈÇÎW[ÈGzL¸ÿ„°ÿE½w°®EŽÇÁ?3f¥Ýb›Ñç.vËkL˜ß™4Œóg¢¥¾OÆá0ìŸ ÒŽéÚÅF¤¦`>Í›cqó‹Ò@Èž#ã—kë?ôø¾‡¯Ó|3Ïðü¼rŽÒ¨jt ÎÍ ûiWOïü]´>£Ç\ª˜}M.DñgãÂvú¹ŽYÙ‡»pe=ûµÃ~Ìc"k‹ø _ƒý`€yÚ¹ñ—j<ŽŒ¬ï‚>]÷ɘ9.è<~çqn¹w±ŸöØw½±hÜù›Ì׎‘6}A‡FædºÎ„˜Ë —«ÍÆðÛõiœçÀgcl?>²ž÷jñy‘ùýÛDÚx'¶ÆÉ×ðy™þ¯Ð—Ku>Ï~Ñ3çó¤^×ì­9ç¿55žÐzŠsã-Àªé4¯àz庀ËGÖƒì¹/X?wäz{»iŽ.×5ØCèçë}®%ÛQã6Ps±sä:ÇêÌ{Š?~h¥Ã"бȽØPó¹Þ ]œYóD›Ù®¡ß*räÖ–z/<=KÅ;ð£øA^ö_.Ÿô[?Jyßîš§¥ë=E§£¡¿EÔ_¯-a?%íÇvq~5rE¾Ž¹~ëöѳ r­`tebêÀÿƒþߥßâ¿?R¸þPäþÇȃ;"÷м@ø}½Î©s¯E³–±!ð= ÛãÅÿ~Ÿðž¹¸4r…éy<ë¢hö‹,óf™3XòàQµï5aøöƒèh,Ñ5kF®?¬_ÿ+1=ônü-`òžû‘ù“Ôù/ÏPã‡ý±ÒV¡IËä•ôý(ñúÓ|¢—~:6}l™Ã·Ÿî?Ró¶¼hqjÑ´µ€æqGÍólzõÝq背?߯z6ÿ‘ÞìRÛ×ì“ÆA®ì(â¿É"ëJ–V¿Ž\/Ùõ˜§D®Q»f ,E†©v¾à¯õ•½"ó‘ÀÛö¶‹Œ}œCN®»„ç¶Ž¬™tíçŒyëF® F[NS;À_°ßù?Œí€k5ïGæ¼*.[ô{dòàTõûߺþ²Ö1Pç§ÞØï¹í¥³ô f:çÈqqÆ>v<¡mYwíßÈóå#×ïïY# ¶ƒW`´ƒÍ‹î-/«q[Uó²ed>´eÃú‘~¯9±»æöOÅC.ÔÇDúî.‰ÄzץѷƒÕè`,ñzõ6èTÃWú,ÿ»îpëÈ8mµ_ã(Áº~Vsë7<מRwô´ðñðãÂ×ñ¢Ûóš-²|?+¸–/¤±µï„±ÞP㵡t)ÛÑ FÖR,«6ò¼í#ór± ω¬6ý Œ¤©G"åÀ@õÙ¼¸Gô¬åÞ2Ò±Y¤½½¢Új ô„ýÎÚgŠ^µšhàNÝKŒ‘XüxJdž zªòµÑïKí³cøÔnÍ_Ç¥ÔIÓÎ5ÛFú{¬Ûí*sþ&4 †‚­'Dêà‡èzçé³¶/ZWg=I×8Gd—ȵm“=÷~wM’ñÏyŒ®3ØWír]þjw†hÜà-xѾG#m+ÕÆÃ"eÛ¥zΙú½d>éi‘±Q¯qQd·}N‡Eú3ìÛw¾‡óþìçß¡u8fâܤóô\ËG>½FÂ2‘yüÌËJÑSÿpý›k!ÐóíW8¨5§ÎQãrëõc=Ó6éúš?ËIžyVkþ¡yt&ä:1º>ɤóÁ_Øíزð-ºÂÚ‘kþøWÑWlƒ¿7Ò¸Àà?z:敱„c ±ë±…_®ºcѵ¸²¸ÚËXC³KEî±Ìü,¯¹¨ÿñÍ"OçÔýëj~ׇEÖÆÛ^fl‘kj¬9œ÷}®®!¾ÑåÕ¢³ìi ºÆvôVêû9sæ\ZA}B—÷'ÑŽ;^•YgOÓ':÷¿%±ðÉàÇÿ~«dæ·Ââ+4vÄhñáßÜcæôGÉ äÂ=’ IFpvy¸èøçèÜú¤=gèúç+V•¹|Xçö?¥ÿ­×þPfoÇ¿G®½0¿æŸÈšæÀ1w×€ýc´Æj¤¨vý bgOð}-ÑÀ­²%˜KødSýßf´ÈúÛ}5_Ž¥Y7e¾á-xÌ…—@sWésqµs õ ÁzÖ*¢ÓõŽ®<-±Oû½øœNòóÛ:neL Kô#0bõiÿȵ%â¸.rý°Õ×3#s€vYÛÅyç×¥Oèô®HÿŠs]¸÷ˆÈuÕœÓí¯e€u}ç¶ÛÖØ§uï6ºü·/¯ãÑ{ÞÖ9ä#¾^ò‰s=ªÏKÔÎÕOžc?óèNÿN‘kÈYÿ?+²þÃxÈï­#÷l96zêù[EϽ àqðÔöçwÖy¯à¸øê‘û³ƒ—Îï½e½{YÑÌVz/zÍö:ÀdÕ­‘58Ü»‡ú±cd|Öu?¼ÿ {ë™¶éOjýw’èö¬ÈZ1°vßȵy8,Ò'olr´ß{|¤^åÃ:ùê㟓σoï-ù5îŠÔuïÑ=Îuç9ÈpÀ±¸ý#×tnûŽ\_ˆ1Z7rÍþ]õiY}Bƒàû°ðßöý=yîr/Dtòm°ðÅŒ+#w{4]/ƒ±è>ðÂFçÓÜï¢ygàiô`l°90jŽiɟ쾿øY¨é"=ûñhö°/zÿGUfÐ#:ðΌAø}¿dš»Quß‹:÷˜æÁ9ž7I&ß.¼G]©ï× ëÁrrRï‰Ü+,~B÷¾RÛUÖ§û¶Ê)¯ïY|5£k,.Ò»ý{äºT®Õƒð¯€ã`cGøÿ…Ú|û¿~®ôSx¸ÛŽ>êDÐGú‹þfíB ®0ÿÂGø­g¹wøNºÑçàkÛÊš³øº-Øø ]|„ègjõú´/w=5IsE“^ä ±®EEóøæ×8Í£ñ¡Ý›G®»{BäÚ2^[`³H}ò`µ1µßÈu’jß;ØZèÒà%|rF¤ž?Ü y³?âäÈ5˜9iëÛTŽE€]à~0¯¥€¯Þ…×Ádÿ`í_ò]=:ôí|µ ¿þµs#ë¡í7qî ßwŒ“ÛGf tN‡ë¤éÿž:¬ÇÁ³è°à®}aëD®Õ¶\äÚmΡ_Sc¶i亲ذÐc"àÒ‘{Ãs¨ûl{àûrýƒýOŽ7Úµ_äú çjn.Ðx¸.ü=ï õãèÈœÚÍaS£›1ÎSˆgÁ~t{ë8øwÈ×ùº¥kÁ“èçÓE®­l™ÎÙf_\}ŸR}g ¦•îF < NSßYâ Ø%ã«]ÎEX3R&ÃWØãý4'èýÐúºƒCÕÆ}¦Úöò55à¾éã"u=ì_çC¿àú>ö(ô²«>ÏkíÉ‘k_¸Ï9ּ˵дk= ýœ¡ö¿àžsÚ§¬ãWì"ü>Ý9/¾øk…uE“ó_ŽÁ‘ëß½¹Oå#‘ñá!ºŽšÇŽækŠÈµ¾ÌßGV Ô»Áû[tœ£ƒöàÿ9?r­týw$—ž”Œ$Ù‚ï=½ãsÑ ß‹¬Ý…†ÿ®±@wFFÏ­ù€n׎ô‹}Þ’!ȯçõ®»%·ž«çË8nRïèÕÿø=SE®O`?+º¢m×S5Ç×Eò½ãœè!ðΆ‘ëÎVÛY®ûŸÖÜ/­ÿ–Tß}`[ŸH,F~àïCmçáÕî郹&ÆWâÍ©*½ôد|•È:^×Ô> :Ý=²&—ïØ$^3ÇùÛø5?ká³³Z¼@ßn‹´‡‘Çj¼n‹Ì­çËç?l­gãëÎ]ã‹BïÇGˆÏ‹üJrººý,ò€g¾YkÅ|¯6í¹®Ú–‘ú»uyl¿Õ¶ƒ#åà®­ki˜Õ?ro4þÛ!²Ž—ÿŒA©_»è½kFÖu"——\ó3knœÅ}‡kÀëC#ã$α5¡OûòNй#e“ýÍÎûÜ;2/ yí®i#ñ~ø †—N…ήAs_B_ð?œhð­ŠýEÏcŽÐ¥¦RÿiÏqj ïDÆŒ¨q±=D{á›iõ¼¡Ò,[¾ªï/µMÐÿÂŒQÔO|çèPý"}9Ž1ŸÇ« ›kìÁXðfõ:r ‰å-cåzoh [³]#b¿aÛÞu>^Û7 2nì\ ÆdçÈ: øßXLŸÆÜ#ßÏ»-ìgñqß'Œ½?²^Ý¿ÁuÂÿg$^‰\çç½ÈÐÁg• ýNóöRäšªð ¹ øG‹¬%çÞÙÕ÷ÑÈÁ¢ën=×¥„†ÑUŒõ|· @—ÄþEB7§®Õq¹ÆÕ~ŽK"×*²L¸YïuŽÝ¦›Ãô¿ë\à{ÑÏðý“Ïõ¢Î37Î{´Ê¹yè¡]ÞhÖM[Cß·ÖØ;N_"W]·¼—>ñ¯aÇ9§•{·ŠÌä€fÀ80}M]OÀ9ð y.ÿI¡äýXškä¼ãµ¼sO÷‘ûû¿C#ý9k·Žm"÷ ذÕOÆ܇N]‹ê¸¤ãÐ/28:t‰4ƒúýÀ“!@£Ÿ€±`?¶ ú ?†èŽko®tX®ãäE?Ùz?t3‚ž Í*®[òÿL]¦øˆ‘'ø ÐѰ'Fmèog«½;hþ¹Î¾×wn©9ö˜-¥>Àãª}ŒÅ9‘õåÿÔø9ïÁù_è>ÈôÇaxv[ï¹.2÷ÎzE»6ºG¦[÷ï¹ïØjS×(þì„Í_ kñ¹£“ß.\}42ßìÃ÷þ„0ûÑÈüÿ×uþ±þã zUcþ©®¢g½¤ù¸C8}¥bç¨-çGÆ#N•<áÀDÌùAý¾U2åi½ï'õkH¥©òûûÈý„Õx,¦y…¯à›M4Îè¿©ê}®•-8ø Úütä¾p¯ˆ~§=®¤ÏÙE'sGÖ;÷å°H_??:?œyýO‹NÀ ø=Ä6©}‹Fúzí£k7×üŸ ºè#~âSó?TcFûÁrø.„ÿ/E®©D~ךÇo5†£ëAý›Y´è‹]#óÑL›Dâ=˜ãØ-Ø~“h_ ú¹±ß±qr\/>0oüWÇñ‘~Þ ÆYGC¶X/wÍîS‘u½øé=ð”s1í ßW÷ýðáz‘kî®ÝšÆÞñiçXoÞ[sÈ8çÈxp|]?2·Ýu:+q#t”èyËh®ÁSd„s¶f‰¬A§ñŽ Bg´Æßy»G«Ï|ß)r½Ð"m×§ÒNËÄc#ãCÎ]²»Ed¥s2w†¿ðK¢‹Z7ƒ'•gW®ßÑS&ˆFW-¼޼[i´äæÍ¹Ž%ôrW·‚ùÆðà3aòàE÷ëkj¼±,§à½óõ}Üz”œÆwZõcµs9µÕyW‹èši56ð ü|¶žyj¤ Àoh l0]Þ¹s-ºæ„Ïó¢ç~Î'FÚ£Ì<ﯦöLYÊ→—ÀÏ„_ ÁÛ³…kƒ„óO ãÖÖØÝ©ûó›xëk‘{´³äe}(9rWd?m8\Øîß•ŸE.] ÷_¾/2‡ÈuawDƨ‰Ý>¬ö?!z±ÞÁÃw‰± ÀÑ¥êEfü®þ¼/ìû\8øˆžû–þ{§~–˜Ñ•öŠ¿ ìŸKçF×÷õ#urçÇÀ‡àºñ@Í}wNŠ/½Á9`Ð~ø|ñà wvMì¨ëì›=W4ÃýàÁ•& ö».ï õþDF,¬cRõõRÍss³Æ¹ø^å¯&–æ€Q›Fîóáø%¼²_d½¨×ˆ°ï’v‚A΃eð­:ÿÒz’íeçí÷Û¶38ïœXp Í7X¯n­÷8ÏîRÝs¤Æ×>š4~èÌ×êûñOßCïü·¾_¬ñÞ5Ò·–À›à"x¼¦ÆÈñJçâ3~èñ³©­ð,¸¶¼Î£S€“¶áfÑ'øþCk3Gîƒè8¼óŸN‹¬;gì-{í3vžË‘:½cÏ+«Ý΃±µväzòÐã&£¥"sÄ΋Üïâp÷VÂô—ů`ìØÂú7¢±5 /ÂÓ®ûùEúÇ8¢?ƹÆm¬ñ;š=YŠ~C|Ò9%÷é€gG­×˜9r­jp{q=³+k‹¿áÉ“*”waÃ%ĉ¬(úblvÓ¸9ff›Øñ_ôÌÓu\©³¸ÎrßHŸmýÄŽ櫓ÝLtý¥¹s.ËÆµ¿ÍÞøÑFQ¾îÞ"žL˜y{ôȯiö¦¿Mÿ¿(üÇ>‚ž7$r¿—7ôüWt½k½Ðó&®sUìþÃÏt¯0ŸXô±’èþg ‡îV›î‘ ¤Ã:ùs¢‘ÔŽE¯¨í¯ªMŸ©ÏOª?ÔžŒQ"Ç”Ðìñ“®OØÿŠÞÃï¡¢¥áDÃÐö8x?¤m `ǯ¯9ÝOŸ`!|ê¡sÃÀ=0¿õÛškhâ8={GÿÙ'‰þdý]ˆ2Ø9&Ž“ï¢þ0àˆs£íÓãX?WdáŒjל‘öÇšc#¶5:óRךM|?½]q¿Øç?‹o_ô1¿¢kÉÛÿí·€ogÐ8Ž\Ç¥ð,<ý¸°ßÖ]ðm_Säî¤õeÜ\‹¿‚ÆU¿ý`Ü8Þ7uƒƒ›Q}GÞ÷”ÐÙ®‘ëÏ2öÈb0ð*ý>BŸÎصEoü66X'9Ltå²mD#K©=Ø!ëh®TgWtÐëQlø—Ä»_DîŸÖø=éÓ.r½Æõ¿‘ko¾SŸQÆf¢:åú;Zóö‚0žq¿ª%„ßéÙHYƒÿßÏ©:NÒçš;c~ò”ìÿ¹)r}jÚˆÞþfÅåÒNÞÿˆÞCmÑÈCºç“Ša…î8'È ä¶ÀÇ¢»¯t훑kG¥ö¿èÑSD®ç\†Ù#ó\ûµoäšÉGEÚröÿàûÀ7~¦!÷Š—¦ÝA‹ ‰Ö:_ºËE>8²îží+¾AgœIíÇnM}vÞë¢ø[ëja[žÚú¢ŽUi׊‘yø[ˆþiÓq:6ÖážE®täêè¸#r­á3#k$Áwãÿ­s—é9Èу"}íŽm‚w–AiNÀ¹Õu-˜ E?«gÜz/sa9p–ú¶‡Î)—°UàWt¤çôœ-#qsNÑ ü»DäZ¬|âO± ö/ךwlù4ÞÐX4e=Wä¯ë‚s802æÞ®I;Bóäš„ƒU¢gM™sFŠÆïYä8¹¤Æl}r=t‰ƒ O××±¶ž=}ý¿è÷Š÷ÐÙÐí^ý9'ô›úY|“¶hîsá2výØjÛûjXq£~ߪïƒÀ.Î~#§ÑÁøÂèjªÌÏtßé4ö³hÜ'‹Ì£¡¯Û‰–vÐXaoo.º1Î[ ëÿ{·¾oýÿ€È5ìg´?Îr€{vŠ\çnÑÖÚ‘¾1è;e©u¶÷„ÁT¬+òÓqÍ·„qODî­þ˜æç>Ý󵿾ÿIx_éeáë;ºî=ãÖÖñ‘p›yÁö°þÞߎŸ­ãnaн‘µdƒ4§ƒõü—Dˆ6¾Õ=¶|Í­zß×jûo‘ûÀ½¢~£g¼©‹tûÓÔ–®¾Sû[âëÓF®kò›xq͉eñ âÍôi½h¿Ö¼;,t¼”ù¾L¿­ÛõÌ[µßƒw {ƒ—ø³Ñ¡FîíÔ_m„ÞˆS ŸàÏ&ÿbO›D}@§WCéç{ç>½XǪؕ¿Dú[¿ˆÜkuE}ÂŽ5™—¹õ õ}úÌÈõáäA;þ;°u\¦ãâHÿÏ˺v7Í<Æ®ñ¥¿+ëðéjjc½d½íu_çtºžËï'&Œp¢Îóll–»5‡ÿ”§´ž ÎZwG–Öûû×k:]yÝáü!Qõø5XdleœÁûè^ú€.»}¤çPÑeçÉ‘º¿k—÷Rßžµdýõ¹¤ÞÏ»­§£³Có3Gîï]O¤ëgÄ èûe!]{‘pc¨øða y ½|úJ˜ýhßx¿bdž}ÃwÓµ¡Êz݈ûM"Þ~;Òžý(rO(øqYöǪ>3¾£GÆ|mßN¤ÿÀ‚¿ës.Ýÿ¢ËÁ_È_øÑ1ZǦŒñ®Dæ"ƒw°Iäú§GÒõ‰‘6‚cl¶ÖÓAŸ uxjó:_=ŽO Ç™»Ñ4vÇ\ÂpçT‚±ö« f"?ï¬sVl@0e:Í£s/-W>~¢cã;¸FÏÃ&ßY_Œoè’H[_ó‚ Ço<£¹tÎÑKÂí7#×¶yO×ß®6¼ úq ûNý=W¾82¿Ç~$÷ý‘JWEþ¯ÿÌ2 Ø?è<ðëô¢}xóoâ‘Ù#×__Tô¿Td-É‘9‚ð*~ôç¹C#çŠ&Àÿtß¿#×z…‡±Û7/˜>\o¶¼hÜ>°l$Æ|Þ«÷ÌSùªÈwáR™·K#}nÄà>¡oLPi¨ŒÙ :oßôLz÷*‘ë÷ø€gÀþ££çzžE®?)CŽÍŸ¹î»ã»®ûw¤¼Ø32‡Û>ÙÝÔÇɶ\£˜ñƒwíkÂw30r½#Þsuô\£å>}¿¨uSJçÂȼü`®ÿ0F8~¸‘æuwÍõ“7ª}à:%¼Þ9±¾3öÐtä|_°ªoô¬—>'2ÜŽ 8G”ë¶×<‘ÃàI|˜öíC7«FbßÜ­1åÜ:ú½tä~Fë¨^×=ǵ¨ä…£SÁ;Ñþ¬±…õC…!ð¸} /Ecç—gNR±§ô¡ûµè"Ôgìs¼dtýoœJtÏ + 8†;†ÚØ'ªÎÀ,PÛÜè¶Ù–ݸ.œñ†ácho›ÈX­ý†àºóúw\ëÔ>Úõ³ÓåÅÎx‘ôgÿ볫bÞÖÓ,|N8ýsd®ý%mü·ÿ«û>Ðx®&zч‹Ü;ù3Ýsð,VXŽy­ÎÝØÂþ{u½kÁ®Ò¹ÛõþA‘1jûŸmá¾åÀ«­ç¹/ÎYz 2>üÚþc·|¬ö<©ûÃãøF~©|QlœßDsÐïÈõ(rt^ÑÆìu<Š<˜Yü2¿è#ÑÝj¢cë»EÖÃòéú€íÅ;gé:Σ'ì¥{¡c¯çâXï¶¢EôÝG"óŽ6Ì•æ^r_À4üD{‹†èËç•V M\¨>§±ûLÿc¯™Sí¹~tþ~•ƽñÑskŠ1½ó3°\v~_óx«¶:k³Hýr³H¡è,`ôªÚXçá4ë-\®~,!záùÈ&ËRlèoWµw=ŸñÄ—V¡;Ž¡Ï4 kþ‘3!þ[øåxÞ’äò"—&¾ÿ!Þ$†‡<OíŸO홡¾«àzß{ú~KÏTÿ9×µQŠÍmϹévõ}e<8àqh ú‚ÏÒs ‰®~[t*Æz…÷ŠÜ¯Î9·'j¾Oלì©çwç«Ó»ï<;RwØ:2ÖàZïEDØWS©M‡Öq,8=a¥™âÿù¤ÒH³6üú`¤/ÅùþOFî·b¾¾S¸û¾žÍ<}]ÇÕù¼Å/8w¿ÆÞxXxGd~èËúî÷=¹Î?×ÙWdþv½ßu`Ïèû=ëá¿ëž~}Ò:7D×AC÷FÚĈ5 sð7=¤Ãþ/êc*2Î>¦ïu~4}¶cDÈ lüêó·Ž¥Ä|:ÏúÀxôN0¹aœÛ¼ÒC³'É©úï²È}KŠ#äùÇŠö.‰ôQï,zåtþOD«ð5|¼t4ë§[úM×ó»ß*ÖšZB}‚OTSVdèꘕq’Ÿ°ÉW»6/ìYË6ƒÞíø›ùî8µìFï~\ãv¤~3ØHÈ”"kV·Ó{·ØçSèû&sÆ{ Û=2'Y–“¿Fl‡øË¥­1Çs£®%ßÞu à}çº3#×óÚBm9;r²êÝÛGƒÁ¨Áe?HÛ9‡G®) Z•2öà<؆lñZ&ô ™°ˆh9ušúç|5ôy–ÞËwäøa¿ ˜‰í‡¯£¯ú@{o׸0FÇjüVÓ¼-¬9›4rü­tþ?ºï†úü’/CžÔ˜´y9X}‚v§À˜ŒsûR4öPÅ›¢w`ƒ»N{ÛkÃmXÿ+¸÷]ʼn¢“­qpý5²<_¥¾»Èž‰…,¶.Â5ó«í´Ï¾2p~ãÈZnü7EúÜû²`.œ£µ’¾o¤¹€7Ñ!.\SðX=»¿îU¡åµ5gÊa*¶ÎܚÄÕäu˜GË2DØvad=mO_ŽŒ< \Æ÷r—ηk£øtÌ}ñÈ8雑ñãýsjÃs-l¾)Ò_¸Jß™çk„ÿ÷éãÿa|Û°¼²îú³Úàþaèýø nÔñt¤oŠÏû#×åý·D³^v³f¹ü\ûG«tUò…”3TdãŽ<€ÆçÒÑWô½’¾/Y繕æùðÖ'ÇQ¢ ðƒ˜¦ó ïÔyðêÚJï…§Õ»àÙD뻉ž.mBÝyê ·À8ð _õ3ÚGìwñâèëïÅ}ÔV°,›Bý{xÖH÷×5ªtQ|b®ÏÜXüeû™O|è\rh=™„®ýŽÚµ«øÀ¹Œë½ýûñcŒ K}:LÏÿ‘`08æ<%d*ú²ý<ùc\?IcNî,2àšH­×?€_½NÄq‘û6‰ègÇDÚtûEî­|†ÎÉûÆRøy°Žæl¿Vôéíéïa¬jój¾À~d†sL±ãÀÍé"×Þ\DcÜ¿ÎzßÑž¿¡æ ,t Ì&N€Ÿ³‰6þ¹®Õ˜‘6*µ:Ô @ƒ]=´ƒ­~nTß_t(⣩mäŽü(>…çñEÌ$>ÿ%z®%}ð’ðàÝz”vÑoÛÔÐó_ñ»'ÿMcÝWc Ï.£¾º†Áq¥þêÏzzÆ‘û2n¯ƒç»Þz€Ž­#kƒÐ{úé\}¹G2Ïïáì$äÛ*𻣯Pð‘1ŽØ1Ä{‘yÎOÇÖš¶¶¹ŒÕ3ÂÈA‘ºôk½ŽÁ­p›ð×y”_Öñ/ãõ“øœómì'_Öó¬ç¿‰ÿþϵ\Îu-ò½‘6íxUøË=ÎíY—5DÏåûê«ß…‹î@¾$bšõ›Ü|@ÎÆ†]ä|Sî}K¸öŽž~8\49be ŒsÐë„:Àbd´sCçÜ—9`ÿ4t~%Þà;º“ëÆ÷‰Ü¯üNüzè£`:º™kŒ¶mì¹æ:2òÛùñº·WgùiãCuô±ÎÚOfcñbfÅΛS´ëö”‘2mêhluç©èðäבkqÌ ^¶?~KÐ%çÐ{í3_IýÙGãFÛg†kŒÞ_üî‚á7ë°gŠJ›ïi#ñÕóÞh…e!ºK&]Ç<7•æØq€•4×èrÄláóK"kN¡#øßþkpÞÆþ¾S{¾àÃ!ÎH-+¸„-}–îÝWïaÜÑ»mítÛÑéŽy§‹}®|ét1«Óm_§ÛŽØ Nï*ZÞLíY^tfÛWt¿¸Þõ¹ÞM|Ì›P<3¡Æèz”:¼‰5²Š´ˆèìq]óâð,…OOбAdN\;® Oƒ×èMààžj·ò” 6-¤çbŸc¿cgï¢}«È½Tѕ׭c^|N§j|oŒÜóÚHî³ý#÷/Ë7ÑwÔ|ͯߦ¿I"ñ¬7 Ò®¾šKç(¬¹¯¦óbç×\/+þ}W<ý«jœéX8e4{À·…Ì@}Bëp“·Û•ðÅïqCk¶Œ\/iaØ…þ }ÿ]tBÛ%ë‹î1Q4qMƪèSjŒûDÅCÇ›œ³ïšøð¨­1rޏ¿ŽÚBŸÖœlªë¶ˆÌƒ&à¡="svѽ΃]KsVà—¸¿bM‘a‹éÿDÐzßIš¯ÕÔß%up9š»UôìUd.r´]çMcC›è:pvµÈØ6²¼oä^ôÚN<ÿr¤/,w||¤hÖ+üI,¬EÆ¡Œ_q¢Ðã"úÏz†óéÀÚ.>ù†úí5Oœo†LØ"ro‘×Õ?æÃyzüoÿ>®ø_üT´yRуm› 5‡k\ñç,¥þoUÛPlì1„ë­|˜>꟢Y[¯Ämå7*×~¹öå'=ŸQ0ô­È54˜ÿ÷#k¡8÷£pÖqÝ·5ÖßÖuºôßéòr§‹çû$ž”þõ‡ÖcþHôM<à"=wÜu}*ô3°ÌßÖWßN?@ׯ© EãÃGÚjœßÿué¡Ä­:ºæçÈÚ°³TÙÂóÁ4pyÿH½pñ›}(è¾èå»Dú¹gÖ<(G­èX´ë°È}Žç]Ǫ/È‚Y"s@Œ…[‹»zVd­ì¶‘ëŸ:Ï}Íö®êïB®þªñ;ÐÝàç-#ssìÚ¦5®‹ª ]ž+Øéï>;Ò–‡ÇŒÌECA€ókL–Õ3ÁÈ~­Õ÷M5¾kT,-62²n”È:Î.Ý\Q㠽૷ØYãfÙ&¾™;sadÌ»+ƒ:èêF±ì¨¹û$1¬Ùkq2½kæÚ×òÿ;‘õ<ß©oÊÙ.ø_¬D@?@^b _y¹øœWÃ\€áØœÿÔ˜‚ãØðØÊ‘{02kêÜ*ѬãÓA·ùAÏX[ï‚þº༜‚a£Y#­Ì2Ÿ*|‚œ^GsÃç ¢pb}!²ÖËù²ÌÇhÑÔmüÞ©óVpÛ:ü‡:Þ‹ô¥¼ÜÂÏ÷£±ã½þMù´ øB‡ý>Ž<)GÄãe½Bû |ÞÇ'j£ã¯·DSsT0ö­Hß×¾™÷o`[Æïµœy.2¦ð@dìá«hö÷jr‰\gpwdìÂþ¦g#kÎ8œÿþRå‹&7Ôë*ø˜©uÀ“}¢êJKDæQî©™OÿA[èÂ`z'~Rtü-w‹W.Ð'u«ð)ø½…è;»;æ…û/ÊÿÓ•®nÓé>»Óå‹Î¸âÍ}ÔòÙ®×;OU¼à3Ñ;íEߣˆÏž¯¶Û‡Ã3ÐQx&x<¾_sð`¤Oy]sñrä>S‹ÇÁê¡ñ¿ï¬cƒÈ½)Á)üö`–cm»«+©=ãèNíá~×8?½;½ñ½ÇúðzÞŽšt00ÝoQõ•k­ß­¥ÏMëØ•9‘ßÈtÎm5NÖ—Ó;ïµôôí¨wÚ>à7þBç ¸®Â>°?rpßþ7d÷¼3Šm¾Cd˜}BíG‘Û®Ÿ¢ïè # G‘§ÐéšÛ)įøÀû%Zm¥èùäñ“[w¨ÆäTõiSõ‡g­£wÑààèõhr;~¯xQ°¦ÈýI°ñ&¬í+íÜBý¥¶­9£>‘ëã¹f$m> r;hå°ÈýÖmûÒÞôö£Ðìš§õÔç½DjÞg«ã_|ò7k`<¯þ:§ß>KÞ‰Þ¸Hd µ’ž7q}VáûOð¸Nókõ­#|üM|g]ÜkGÍþßqo£Ùk±ü6¾ú?ãù›-œ~­õ,ßkœ},zÚ ö僱®{_÷‚µ?¶ÚÃûÞôóø°/È2eh¤=ñBëÙ®Y927¨]ûût¤¯ÿéÈõ^Õ÷¡zÿg­ó?‰¿F¨üRæäú»èæ?hnñÝ‘kRó}ÈÜ¿Õ#íKôRð úzz9:$º¹}CèëWˆf¡90¡;¶ËºGw:Ýçtº×u®¨{—•X0ºšbEÿç^0Ÿ5¸ˆÎCÜ ;\ÿ¡s"kNT[œû½ï¹®X;§æíj©sô˜_׺veìÈý{NˆÜý. ï8TÏG=B<Ëo0,™I㮚£Æ‡µx=¼ÂŽ@WB}D߯Át²çôÞÉ+ÏÌwlß9´ýu`#€mÿÑ;v\+o !:°óޏÌX_Ï]L4ðw}î þ0¦àúûJº_°sNÜwv“Èu»'T»Ñ=ÆÑùáu0&èÓU,(íÃ>CßÂϾO亼׹¥`ÿÜÏÑÅo`ØÈŸ‘"m'ü£¨­KGæzÑFdø¹™¾™ûm¤¾ƒÝª‡+øõ¡èèÝhrT VΨ1Z±Î{ÁÖ!Ù¾bwι_5òÒv:úõþ: ¿QùêdÍ¡ó×èÃ6‘µ˜[kÞWÖû¿v„ίª±[¦¾§ØP¿ ÓÀçž|«>N#ºZ0rOA×d0wsDîkò·:…Ÿ}»ŽÉBosýüÙ¥ýÆÿÿSd¾Þg­ïGú4ãý^íV^U“ô†þ{VÇ÷º÷.OèÒ‘Ë=ïFÆu-žÔÙ¿ÿ²Æè«Šé^[³Üc’åmÇ ^já´kɬOsMòKj«sUý¬;"óbŸnµ™w¿)¯ˆ´]Ko|nŸi,íŃÓhÎ&Œ}:§Ú‡}¦è!ø@ˆ5â3Ư‡m÷šè¾$F€\8S¼³¾hýýe°b¿¬/ÐÅÎ…òA›`;z?9dø@É—~02ßrkñ¶Å"c™à%r ¹ƒ\šG´óE¥¯¢³A»‹‹FÑx؇ȼX¶3—O‰†èºß#}¡é}û(_ìD·#ÖN NÏž©q²hjÍ2½°«36ë칆â4ŽÇ«ôNµ=s õÝñÒ‰"÷“[8r- Æ LÛ;rÝüLÈ+õ|æŸ~ž#tϲ‘õpôœ÷爞>á¿ëÜâzfXöwi²ƒœ/Á*dût•ÊÜÀCà¿ë|¡µÔæQu¾{®èhn?ÑÁxΫkÁfôö•Õæ9ÅoéùÈ•±êx>áü„oŒfŒ·ÓÝ,š:,’öŽŽ¬Ï@¦ƒÑãë9³ˆÆúF•_Óÿ`?8Žmæ.ÜùEmî¾®×—>N©±dŽWŠÜ7™¾ß¨Ï}ÔÏi½w.µ¹eY…Þ…m€îó”æÅ5ßÓ©ÝèZØd#«mäãßSñ¬©þCs?©Æ‹óÓhœŸ^ý®ñÆn)š=^ Îw¢‰——wMTŸYôë®ød°ç~лG¦Úçñ­ðѾÙ„m/ ã°M`Ò‘¾÷Õf× 8ÎðDôÌ5ežæ:ÿ•:_=lÎ?#ÌýTsú‰ÚJß^Ì+çí»¿?rí¡ûÕ¦v^é3¡Û"c®?³=à¸øÛ‘ëŽ)Ó?‰&ÜØö 9.€<˜$R¿[A<» heQñ<Îá‹AÏŸ±Ÿ‡Fõÿ€ûȇ“Å+àÀŠ‘5Wè^ÈŽjž]ç¨îѵ»;]<íl[cùknh³úý¢óÃ"ýéĔѫ±åÁLû¿ïR;WÃUÚ*ýY)¦Œ‰è²Œë#¢=Æôçå­ÿ®Ó˜ÿ(ž†7]@ЙÁ|°þ¤È5>»¶O§OTߨÜêÿLšÛÇ5¿èàúÄâ+ôaç¢:~͹™kÊZ'Ø`™k&ÔÜ-(^F§]7rï0ÞëM€ ȯzöÍ)ÿߦ>pÞµœÈ’Å5~«‹&&«|YÆÂ~áIum½c1Ñ@wÌ: ‰~¼Ï$¢‰>•^›gÍ¡ÿù\èè<}çÈbIÝùë€}è®)s ƒóÆ­XRöØ…¶ÁµësÍËeYÇy—È'|_5FÇŠÆÀÛ]õÆùægèš_VmYB´ç:æ Y1þû‡Æk‚hÖÃ,úˆt‘bSácÜ)2gwÇè¹WÚ¦š“ÔŽ#Õ¾Í"yŽÃ9l‹GêÿôsÑÊßÕÆ)5/cV:/¸ó‘hô…hò]Êœt¢ñ¹5{ÝþY×…\CGGøùK4ºh‘Ó^€ëØFߪ=k©ßŽïý¦v=!ÚyVtó¹ø¾ì£>|'ZûMsiåÏúÍ'ãµ€øx)a€óÀTÇGöÓà(²ôTµ1ÝZÏØ8Ò;ÖV»&UÛ¦Ó8Ø¿2Yí[¡+0{1µ‰çÍi7`« [FôÃ~™+Π›Úßèú­åÔÎî8tºmíðNð’x¾?ü~'é>ì‚ êsKÿû‹ö&‰Ìþ$šõËÐøŠ‹<¹Xïã7ø¯ ¬Çµ?¡í?·_ý=kÝ;A¥‰¢kþM~lѹ8ÿ‡èutý6æÛ×óA¤/¦íãvÝÕÛ‘9.C#×noFOìVŸð÷£Ñì;Uì•…¯¨?÷ ži½ñ¿·ŸÇ¹@ŒÑû:~ˆaã¿ýùþ‡\Ì÷AQm/Û/«¶ÞÑ<™¿ŸÆ‚o"óR¿ˆf»Æ_æÚÑ"ãqÆ~ÇúèXDt»œh #¾‡OæZ+IŽDñƒàûGG?Nפ{6j=gñéë5ß³äýwåE‡k~®<ÝÁ~ÄwŠ_é~ñq„kÄŸ¶ÓO‹ÜÛ>E÷GF€Åè€k×ñ)z sNüüÍØ~­Æ@u…¦M~ª¹Í%ï„9ÂV{ªþW®ßOx€Žµ©ú ?¾ÕíKwn:Œëš‘ë°ìT1 äÈ}!úz:{²ðØÖýÙì%ÍñX¤îa›X1È¿ø’¼®ã>í"þ^"r-HâœÈoûûñÙáoû‘_Ø ö%ͦý»Ò[³ÎA?]g?ðßu ºï¨µe|gÔÿÐëßjÿ ¯¼¨ùq> ô†Íékà=ÈäÑb¢'tpôð~=µyOõ—w ×ÀÉ4/èÌÄ>GÔ|~¬6¯™Ç²ªh }ûæJ£Íú&èà0ú¿óZwý!7ŒÜ_ȹgD‡+FîÓµ—Úƒî=¯úýhÅ•2®ðÝè¢ÆmCÑŽmúî8¿ûF®'‚Ü™)r­<׹ͩ9™Y´1z‡â‡’Ì-ï•O¸ÙßæÈZRé‹Íº“Kèy£Wz´]Pp}¢ìG“ó¡èaL=Wq×*}ܾx0óHÌ62æ îÿ¦kßÐEæ½ø;õýC#u¸g'›üÓEw +oºÞ 7þ·ãËÜ÷ºžùºŽaéÿÎÙiëÿ^ÈøÏïAzßÈúbž©ÚÃÂ_¶é±»[ù¤õÎO¢Ù/±‘±ßD®áµ!0þO¹×¨ý èÿö3‚a/T]½äë@Û¿G®AŒ/¿Ã âpÈ:èâ ôt𾫧tÖVÌ÷š×SÖÄ÷ö“?Ô‹â3B/úÚœ»nPý&¶þ(|œÇ© ëVš/cx­ÆùµÈµ;þŒ&G·Œ¶éÄ-ZV.ô\æŸþ ôƒ{*ûiñ–s}ÐoÁˆ»µ¾Åæ‘ëfÁàÿߢY/²Ðä‡Ñì_ThRuCM ÉqÏ#}”_Eu‹Žoƒ5àÔzÂx»n'c öc³ ÎÓ¼¯±åzð{pVÑãë\JžO p‘ÈÜ0èEyßM­•}pôw,㟺îS̓í|®§ÖÖ÷)#s¶!;‘£Ð˜=£ÚIû]CE»¶PÛ\—»¦Æc‚äÏ"¶=—È äöÃ+=›z=EïwÜ{kê<²çBÑã¶‘{7Ó^0ܾÏm#mÚ‡®ñ~å×b÷]ÇŽq*²ùsü[`«ÈµwæÖÜn¦wôJ‹óë<¼ú³žköóÆ52¿a^˜ôA½·ÙÓ½Û~ ç¹ð ¾ß÷tk[ßuÇK‘˜kÜTï0¿½¹—â[â«…ÔÞ>¥kzãÿ{‘5ʶ%jŸÑç1lüïíÿwØ9Fþï…Ö;žÒ;ßÑ|-&Z;Cô8’úóVd¼chT?šs„ý%þnü· hûÓ³^· æoýÈZø‚\Kò+^íEOGïwý:åzÆêz¼y¸øê9éü#«?Øó×óåÔƒWèaÈlrô~ôWba/DÖÀ °K¾”©¿ø¡ûþF†[F2¶à祫. uÀ¹Å5f¯hlˆSþ¹—Ïé¶§È|…èx¶ÒÛp}¢Ù¯£Ôð@ï+ˆ‡×\Í/þ“¿¤É °þÝi_ó®[ô÷°è]l?«i¾&®üUæo½ñ³cð§·Æÿ2)ÏØC÷-\ç»YÇxI}ŽZ1£¼ëpõut½oìÈý >¬1GfþVi·<|›Ksq—èÿq¸¿i¥õ2N;‹f.‘ŒCÀ`pz"áê»êMK»ÐG#ríWõ‘¹¿Õ{Š>n?ËÚêÿé¢=üÿÑ]ï™ó‹_ ¿Ó:›È¡s"÷;"2?›p^ͼ6Žæ}ÜÖØcWÌ­~p½s²7Œôá óï©1B†-¯Ãþ§™D¿Ó×±hüjÒû›½¸ÞÔï‘¢ÉÅõ::ežàËáò\ã§sͬ>mW”1U|»Ñæ©G‰ŸÑ¦QtͯzÖ/‘þ»­ß¹Ž2´GäÚÑðãM‘¹ôƒt<éÿyI¿y¶ã±‹ŸÛXkü¿.ÒãüЗ#k Ú:¿‘`°kÃ…+ †;ééÈ5ÞÀü["±ßqà["ó¸ÿ©H?>Mô)ôé5¾£'5þ"ÅÉ›52¾Ô~‡±hòÈœ çr³èpí0r`9ñô ö’‡ùoÑ8ü²äÞ)øeˆ•í"º]1r/ZÚ.ìº*ôOjÀ$ô}äÁÀ¨qÉ«t™Î»îYñRä¾[Ä¥‘=àYT~wœËu;MýÏÔš3Õ”|#î]_ôëx多׿ ¹3ª À\¹–Ãþ¢Ÿ#kÍà‰á#ë.æP;&ªç ­¼(z„ÞnެO㙬 r±h²UYî_³¶·Ù;ðh|Z%׌t•q?Ec‰¿‚Úmô~°¶pÁ:ÏSâ1ÅÝŠÞþ‹ú3ªèû7±rº .üYÿHä^oëÞ¢öñ2õ±ú±ÎWÑa°ÐÐõÁOpöÑØVoª>~éóý²5®ßÔ6–qa¾‘}ÓE“·b\*º8‹Ž¾žÆápÑ.ôx¬Æé„È|è=èÐ>þ#ä¸üO=ãlÑ8ÏíE–:/¼ÌÇ"‘û‘ÍYÿ/¶ˆí5°¼ŸŽ¥"÷pš_4Ë;—׼ΥC>–ÂãêYÓFæÒ8·þçh0¼Äá'ÕØñ\ûó'ŠŒ t¢‰U»ôÏÈuQm8. ö¼ªë¿¯Ï/¸øeäŒö'Á§Îë„¿ŒûèþmüHâÅßÕ¾W#k$~ˆ¬ °ø,Ò®³ÿÇyÙí\ÞÅ/Ó‰_&×û–o¢ ñÈð;”œ°}_mà=Åö"\g¶¹øß(8„,ËÏÕŸ—8ó@G€ó7ê9L >pžø·k§4¾쎕E×cêûæ•gÊXÌ*Þ|Mí‡×GÓ,^ù³ÌË»‘¹Yλ½3r¿j¾ß¢y{Uç ÉûtÍšw°þAÑ sýŽî†ÖÜn}#»úhœ=Ö/}›£ÅÛ®šD|;jís³Ž0ó8»pĵ Èí 4—ˉ®B´ûˆÞüy\ímçóM þXØ€.÷L¥Ñ’[eûݬ;¦e­+úÝ¥‹èÒGìYß.û§èš·Ôñ-ö4Þ£O?(YRó±–Ì¢}0é{á–bìå;8ˆ9327ù¸h¥2†`+¾;לAÃGEúÉŽŒõ@¯øÜ﹟³óöÕ'rÂ5kF“¿R0œ÷bO©»/¤ùCGÿŸO×1oKWÚv®Ns=÷Né·±~7adíÚD¢“Ÿë¸Ø_SÚƒnŽ 7RËÆ3Aãfç5ê…¾¼¦ý ÖCí;ÿ¼ÎKá Î=mŠ_£gþýÐȼ˜["õc‡¯o=¹—Šë·Ï]/º2¯>éw]ò°ðÿ‰Èµæ^¬tYtjp÷o7׆9ðNäzȼ/Ôoðö½È:²ÁñWü·Îo_Ðc‘:“ãÀoªÎýQÜ¢Ì í±OÌ>­ç£Ù ±´ãËÈüŸŸ¢§þ?ad]æT‘±¢É„ÎÑF^ Ð1ÀLûeÁkpœß:rï7¾cOc·î®Ï #ke·mç:D¼äÇ}Å_#×9£‰ cáëGǺQþb®´?ÔÂê‡óñyþâ°q&µ=ØuZè|¨Ǫ_ÈüsÖñjêQ^ØG?(ªîqŸŽ »GWgŒƒô½+Û¢û¼²Çxˆžq•>ïÖ=_jnÆ×œß©kÏŠÔu õOÔ?dÚ¸‘ø?µ°dÔhbˆ…fL?OE®Ç8OäZiô ò÷ÈÚLÓÑs¢iùí ÍŒ™ ëüà®ZlùE{wFêý]¹ݹ‹ãºGwþŠþÿ¥xíß—®‚g˼ ƒsè }£âò®úoö- 9/²6w$‹óL‘{ëh^«>:V=¬W†f‘7`?y±ûEúË ¿ÝZtë‡s"kĸ…<Ý1rðmÕ|ì«éÝèK3¨-#k<'ªsßÔØÂ›ø¨¦ÜÃY0y¤Ÿßºÿäº~´HŸýøauyΤ‘ë3(¯¬àøuþ ®ŒªÃ2¹€/¿Ð›åøb·ý$Fî§y_ä:šÎÿXïþI4jÜþðùiñ¶¶ã£èB7D®ÉÿŸHÁyô7êš{#}ÿÖE¬_Û·>,ü4rOš{¢Ù¯ÇûŽ49ÏE®÷ÿEë¿/¢Yk¸ÉÇy-²†àÿÏÿ3HßïŒÜæEçãzßÐÈu¯y>ò~ý42îý¢®á×~µó€,Ú±`ìÐùD—Îá;R>@ä€1Ø®ýuHŸ.ü¶šlSì^é=…‡»æ5JÐÍ—Ò³æ‚ûèòØàÀ¢‘{€ólkd> °Ûy?èò÷k× /)>t>=ü»†ør@½Ÿ5 K­ñeâqǰS‰µti±ƒ ›°ÿ±f«¼ZxƹœÐ6ã•Q÷ôéÊœ‚Û]Û¨Ètø.fD÷ÑňèÊÎØ!ª>|~T¾A›1rOè—#õš«"×3ü6z®/ø­hìýhìòáúèp.4<8rï´_*­6X!ü/Ï"Zú¸ö­àêš÷Yj VýMø40ªíkáz9r9€lëÎ65í)Ï%þŒî¯]é·àFÍØìšçé*­—ÿðs oÐ9ÐýÆúþTý¡½S‹† á9k;K›~Ó¹ÙEàè‘{Iî©k ûŸ.šÄqm-Ç6‘þŸÔÎ#SM›Dæm¹ÏöŽº†çõ\÷Ô5c3Dâÿ˜ê rkÂÖx£Ÿ ]ï͵ãGb¿ùyœÈ½F‰\ìµJ7MÝv¸hrEÊsÚ¾ÕOºÑ}û¿Šôo‰¬ƒzU׿.ürLôEÑׯ­~‚ÿÖÿ‡FÏ.|„‹>ù}…ž?\ ž°ßzþ‘þc¾e¿]?5¤×á\údýç™ÈºÐO"sa᥷õi?–óï¿«|ØÔ(»îlXøoùf¿Ü¹×üSjǃ‘q@óøaäH_Dâ¿coŰ×$ú6YÞÄ‚ÛøïXÑXâý +–¹SÐ]j›]f?ñ+<°F¤Ì{·¯¥gøÀ^@W(^šM|ìÚ£uô?z~ôvòñÿ8ñBä~zØÄ®»Ál×ötõõROî 3º4Vö»ûZk ¥]Úì ³œ# ¯#§YèɿԹ.xöX¤þŽûoÑì…šßî{‹\@t± ºcQö};Vó…^ß§ÒGágËøÆúÆŸ‘ùÎуÎ>1¿È‘™…©ðâ È|×ôüMø!Œ)2ÍtÜÊM/40‘ð†ùžTÿ¿®ñ3šº›¢O‡ÚÄxœUi·è ³ˆölÿœ wÌ)<À‡wšæ™ôßú®¢O€«sh^·\#ooµýáÖX¢›~µ/ßgWŸ¾ÄQëK‹FvŽ\³ýØ6 vÈn‘ø~cì®ck]³]¤ot€®ßr¤Ï·êèsñ縢Ëy"׆2íY^üCÿû`Èâ{û_·Ï\)š]4Ìýèj`8Ø€å| |´ç‰ÿÀþ7ôøY68~H^‘ãOÉgÔÅÏÎò5µÔÿ¦5Jg¯¹©e/üíÄ›É+ÅG„wL¤mÁÖN-^Icþ¼èñ©ÈÜ0ü9Eµeñ‰uÿOÚ½zƒR[àxîš‘ëc½\ç®ØôÓ‰Ç=ý=c:æÿN¤ŸÐõ'ÐÁ¢ä¹ññF¿_XsÅw°Ó9ø/Vѱ€hf"Ý;¦xêíH|1+¯µØ_‹iË¢wðßxy˜ècdÝ7Xüú»h¬Æ&\-rݤ}¢Y³\G»§í¤ßóô;ÚâÚ¹iõÎÍô,lÁA‘{Õsìé×1Γ³ðOÑÞ ¢lÅ]tÍ¡‘û C¯à>zÉ^zæŠz/×n¬q•Ÿ±È¾ï…MȰ.}ڿЬ!kMy·EvÛþSžMáÝ*]¼{NÏs®é8‘~Íïë;ʼÎ^ŸÛÄyŒÏÆ›+]5¹¼žÛOu>tîÓ>£CC+.–~Ìåä»uØ[¢§Ü:ò ‘yB`ûÑû;Èxé{ïŠô±<io¸†ËîXÂàÈú7wþϰ°ÿÃaŸ´û`-Œ÷×GÏÜÿ‡Zýt@;ÕyMŒ)¸Æ8•±~§uÞ1Œ·"±ÿèé볿ԾÕá"mHâxD³nœç¸ñ·F¤¾øu¤þÁë»cJSF®…^.. AvL"þ…¿Î‹ŒG®¹î çî­¹v¦kò¹f'ñØÓú¤ãëÝ3è=øŠÀׯM^s?;]9ÑéÚ*.žt6Ö'Ï$”ÜSôPl °9@Žä¿Õ6øü aü=3]}ãe~Ñ{î]ì(¾Ÿ®­R|F¦û}k×kÌ*z"îõ æð—ȵdß&|¡±+Ræ®&ìA_ÆæšE|ÏÜý¹vÜÉ‘ñz®#ϼ_/r¯¨õu WÒm¡±ž=šºÏâO¶OŒ>}+Z¿—\Ñß"ó¼‡Ôß…V>ל­Vé£<çiÑüOIïEfMSç¸Ü3ºÆ›qGV× ŠÞ&S¿ÌUu. ô Æ!K¿¶ñ˜Ã4öé€Óý#÷?GÁþ8\c¼‡®wì—qt}Ö6Ohww]¿ h|/ÑÏ.Sì¾i#וÖº–ªøVG®{üzd®àçâÅïêdVÝóEdžã³_ê·ÿsœöãJS%0RdÌË>áGÁ•O£Ñ)›öü¨v¼¹N¿sX¾Ðç÷•Úw]oÛ]»ëÜyúm|¶žîÿÆõŽ ø÷£úþ²ÚðZôÄôaáÿÈ}~Û²¢7þ¿×ë×î8WÈþ0Û#àîtyµs¦Ö Øµ{teJ§ûœ2‘þw80ê^ g‹w‰"ÀMltëàð-Ì ÞyAóì¸UW‡,1€ÿŠÉ7²6­ûçP7ëÔ ¿?XiÊkæ>QÎM™ÓÁúþ]äš:ø&¶‡´Lì§öߤ>pÍ®‘z~azö†Â+Çx ÿŒÌ‡wnúôdѬ?Upâ‡ÚÞBsGås×ÅHn,y¨ÒjiûT¢WódwÞšu¹ðCãû&2× Œ?\x >cÇà·óúÛê¹3ë^°ï«È½¶À^°}€ÆkW;éÓ¾ž-õýh>EâÈŽ£ç~¾k\'oÑ÷êºv÷Èý¹ðvmœfÿ,h×¹”®ŸEßm×9ùx_×þXiÇñ»2fÏF®kxÆz¨Î£^]½Uy¿È€ˆÔÙíKøZ‡±å‹úι'ÆæÕþôuÞò)ZýP~b³¶ÃÐHßЫ‘yö¶Þ3$2æü`$®;ïülûXìOrŽåˆuûaùžŒ”/ǰñÿåÖ3Ú2…¹s¾Ðû­ö8ÇÉvø6\éºKÿ¹âÞHÿkŽŸ‰Œ¯<)c_Ôœû\[Wx=RÀ;íœ×ýµs´¾ÑÜ~Vy¥Ìÿwzzí#‘ñ­ƒáuÒ35\ñ<¹¾ø`a:þ2¢}øëñïúº¾_ä¾ãö9oóU,)~ÄUÅ{Š‡Ç«×Ýp½=}_4ú|w:çjêî;:ÓVÌ/kP`g¿+Ÿr’< r=l÷óbèüäá"qµ0/:Ý‚orƒ®â¿D˜C‘{‡DÅÐÑD7·‹~ëè÷&ÍqéÊÍ>x¿E‹.|…<Ÿ$rÍÞ¥Õ&çÛÒôÔýtŒêº¸¯+&YóEdÞàw‘{ûù?F®óóbä:”¾Æ~içÆX^Ø?mŒç]DÊ4úh[à%ñ…å˜}ßÎåy%2.`½ž¹1Ò÷ïœ!pô½Öµí£­ëÛ÷Óë]ïðy亜Ò Öý0òéÈWpžØ ˜ïXÇC:¿ÚËÑöe9~Á3{ç/½ÞkçŽ÷}û/vÝ ‡u}ù’Ë÷Ï"iðƒè¹G}{,zÚKŽ«ü=÷žq¾ÂBÂç2/.žÃ™R¼Ë®Ó÷§ˆf/²fœ±t?¶ÃŒâ%ó%þ tÁŽæ½sÍHÓqÊÚ›jý!jºøÚÁÖèòTÉ+êêebà+úy&².þ¹È:ýW"ñߘêºÚ#ëÎí3ÖѶÞŒž¾×ιÖýÅ„‡ôzÞ«¢s×Y÷·`9åö"®i]ãÁ³ñWìoÇ^Ñø>‰÷>Þ‰Ü7Í2úgÍy ÿ{ìÃàœAÙËMcÛÈsà¼Á/#ã‘`@oü_Ptnÿìì‘>'®›'r-u0tfè“®Gt|”g¢ëbO¬™c.8™èéýÖ³ð‡â9¤‹‹Êç¯Py¸¿¡ûãÇ¡õΨ¸?0ª¯÷á ׃÷Ä…±NÑ5ü|AÖ,,ÞÀÆr­ÔßÔ†Uêó;}¢¬“\üQ`ÝÞÑìæ½JKþü JÍÚ»¿ l›}™{ðKÎa‘¼`saÚ€H½OôþÕ…Eg©_·¨oà*ïú§pnÿ¾!']ú.rÿ·sgÖˆÜ/êÑÔ©5ë¶¿WÛ]Ú×—ÂëUÞhÖŸMs-l¢v»žv!s»zKgAµ™|aäÞ gi>ŽÔç‘{dB'Èõ#u”1*Í4ë\ð®µ5N¶™œûãOä'2àd㑺¼ãÇö9VÅyè¼ßZs°®æ½aÖÈZíéë{#ÒüK䞯_Fæ¿+Œ±ŸÃþ€7Åó®Ç=_ør\dþ1<ü°xû¥ÖóÚŸö;–‹Þâ_DÆ,'¬Zçç{ü‹Ÿˆ\ÿ͵5C#cÁ>\Ãj<}NmÆ®¶¯Üq"ÛDÆxÇ[ÿ·h|†…ÿ®×ixÍ×^‚ýíú‡v \û0&Ú>p¼Ë~œ¶ß®ß}ZscÜ¿&zÖsͰðßµ¥Öûí²ÏͱwÏåôWñ—5¢›ÜU׎9iyÎ3_69-»¢èô®#AGŸ3r=¡¾ú={ņò|ů N¯&~Ø@<1’ž‰^¿Âð‘ùø‹ svѽUþ.mF/ž;rOÔ>º=ñbñ¨kßÐaÑÁýë:Õ÷÷Õ3‘[`=uÂØüàÞ¿uù¤`æÃâëÍÕo°Wk2àW(5‹W[£³žrNÁ[âÖè¯]}´ƒ}ðf—’»î8Áä-| ïsÔþ4kí¾©ù€.ÁØ_t=ŽuécˆŸ y»0 ßz=ùŽ`û¦:ß?ªÌ;DcÖïÍšE¦n§ñ?5rÍüE5?]Û®È-hIù….˜pÖõ†sD®55ƒÞ{‘âï](¾vì1â2àý¥ZG šºUm¼AópœÚn~P$ó{+!45†Æ}ùÍ ½˜¶6h[ë‡è9Ø[è?ˆ]tÍÑú͸»`ñÈýÁþåÔb Fú£f¯cSøÛ1EÛãҳʆÜß‚§ZXÀùG"1YÒ¥û’ÕÕ7¢;—%—¼´«Ä‡ŸDî‰ô®>?‹\Ë¡í?x>´à¿¯Q~p£¢=ä¶S'c?øÓ‘:¦òšõÿ?nýçÀ›z·õk×k=™+ÿ|ô¬#°-ÐöÿØÏô¿ôÿvLÀ¾ûs>ž1Þ!ñóÿ´c¹÷«]½uËÅ+#㽾ϲí…6þ?éów   j™Ý¶<ÇG}bŠŽæÜrë˜GOR[†´p¿Y#f¼ÈÂÞøO~ɼ°h”hì‡ò?x‚ބކ?k$Ñ«‘Ê,xï0kÕÈ5½àŸ‘*]üÅo4zäþ D®›6¿0 žÇÿó ö/Á°”Þ þb< ¬qÎÏYÂ"ps›HÛUsÀÏîØvöÔ¾“×ßÅ¿ô¾ú°¡î§Ýs‹î¡‘Oô~þ[÷1ŽsÔ>¾ûXóò•èôÅ:¶Å·6ÆlµÈ}ËSlžE¢É“/˜´zd]ßf‘{ÓÓlì|,ޝ¯qcÎðÏ€‡`->åùÜޱ±LvN÷yÝúŠ-q½âȧ5þä'Gg@>à{;VßÁýs#íäšq˜ù}HT:£}Êg+4:•ÞM¿‘› ‹6–Ѹͩó«k,™ÇV6Ü?{µÈš“­46«ë=bq=sq=׸?Þ±”Ú2|d^˜üE_í»ý0Rç³üZ¤/ÁÉw|ÎÔ P—G 5(øbÀr̨_y@ï{1Òÿî“w"ó ïÆã‹õQË"t%p`âÈz&ç¶Û¿dü7æ[¶AC£Ê-ÛŸFîÒö…[繯S[¿n×¼Üꛯ³042þövd½ß¿Ä÷¯âç„¶l†fŸq¾ß­ƒ¾Û¿åú ÎcŸ Š*‹]÷Ù;ÇuXþÿÇ#ëü}XþÿvþÓV_ù?DÚ5òC^Uy÷í­ï;çŒ||9èç}„7`¶ý?胋‰×ƒÃj|^©ó]0ñÞÜ‘9'ËDúŽæ‰Œ#;fÌ'¶þzÂ’£t²ä\@ç£.) ø›Ú;–xØ~ý¾âýi*–þM">>ZXCŽ º(øFâ꯶£b?ìY¯ïà‹Ç{G¤ß×z÷ÂjÃ<•ïË<½!ÿɹ$.¸ªÚîÓ1Ô¶‘5Gð úÞƒ‘û«0o¿Tº)÷®­>ÌMýz#ÇÖ81/3 »Àý=ÔVÇ<FõY¤þñL°ù„ ±wdžî~uþ‹O+4÷ý4ÇGGÆšÐ{¶ÔAžÕÅu¼Ê:±øÁþ.FuÐ þÐoäC×(¶Çº:ÀžºBÇEzs‚ì_·QÛyÖ¨â l.d"ú7x¼‘Æ~-ýFFB·Ðå|šÃ­õÜ]4?®WÜM㇜sý¸k`è Þ˜WǬ:÷:¯½d½Œ11rbçð)W¿ØXö‡ƒö3€øÀwü‰ø|¨?!í8áŽý@w ×ïG#slžž¾…û"×ònû÷ïŒÜsé)]çQ®Ã·î¡ÛÿívL¹í«æpŽ’çÒ?¯=NÞ¯þ‚'Ö©_Ðÿ®x@ïw]îàøÇŒ‰®¹µÏ¿m+ô>ÜNûmÇmš‹'"e4ãæK\ ñW㯑6²±Ÿv’tYÞ1–æšBWêò{Á~|ô{ë`¹ë›¶V9Gî;¾.ðyà|Çô¿‘}ç+i³y"÷皣4~géûáGûûÑᑯC•—Õ¥çR‡>‰€Œ¾Aíà:äÎ^‘{‚¡çŸ¬óí<ËMêX•yZ=²¶±O¤­=@£3GÊvú‚mÐö×`'ì¨v# ¶\ãð }ºž}% 〿 :Ÿ^ÿñôdÑèj˨‘ë­þ\ç¬Ô¹}Yïá9#ûûÈõ 8þ ásÉñ…°IwlJbW)qá«ô_w~K®ÐmÂã;øÕÎë´niyÀ»\oõld.ÿ½‘þmþ{P϶ÿÙk™_Ú9õÆYúðZ¯ÃùšÆò'#sSž‹Ôë9ßÖ¥‡DÏ|LûXÚ‡ñßí°.o\ÿáû¼ß=(r]]Ž»[cå|}®#çNÏÍúþHëhcºñßXï|ZË€Þ~¬Þv ãü~¯£¥Ó7ëÜ8/¥-ÚßÿŒÔC'M£Ó #ͪOð`IÑÿú\H|6\¥ƒfÝÛ ý"÷±[­uÀWEæQÛw‚.í¸2:,8?¦ž‰ –N$¾ÃW»†xßõ®´sÕʛŦ™:Kñ #+掠¯-Œ9$*^¡ïöŠƒ«ª´³+³J}qPìt!ëuúY|g¬‘ðÞÇ|}™ÿºIäþ®k«“‹ÿ'‹\3Ч¢•·Eγ+Òžeî±-ÖÒóÁ¸55Ž`(ý›ñÃ\Ýú~¼úF©1—Sî¥Ûëy;ë;x¹˜ÆüÞHßüiúνØÈRdä@Í9ï@ÇÇ'‡Ý„ @ŸÇ÷öÿ«õ we_‘<|GßVmp}4ˆoœ6r drßÖ¬Bçß[s­lYãî¹­ôlèr}Û4rmPû’–Ò­Að²æïjËŒš»?[ŸÌ礑ûr×ü‘x[{öȽÀ¦‰ÌÙv½–õAôLçØ‚OüØé³;÷M}ö=‘ú¬óøó³çñÈõjì·vÞšcÑ®qz(r›[„-DÆT->}ÿÁËaá;&<¸u«ŸÖaì,zÚG¶Ú:sÿýlãùøß˜ß>ÚµÏE®çÐn«ãºw©mÏF®èƒñGܦ1~%r ã½kÞ컲0,üï} ÿí×±þhý¾e4qp磌¹þô½ø ÌŸ_øb\Ÿ9rshX¹n«ùm¿ ׯªÃ¾°}rMñâªú½šx˜ç‚ÓèÑÄO‰M¡¿ÿ®÷Ù÷z¸øf<µgìSŸQúþlå­2æØc¯‹Wç£vy¤à¡±Ãþ#tTtå>êïš¿+4§O´èùmуý‚؆·×9-˜éÚQôfûWÒ±„Þ»œÆ{M_HøÃýø>ÑX0gƇW"ý{k×ü'öô,xH\ƒXyPw«?g·têõ¹©îaÀàýuþµuóȸ2º0uxÄqwÔµÇè^ü7] )ØÍs§Øzÿ¬ú?$Gü¼ÔîuåH‡¶³¦‡ëmV›‘Öõ÷Í87iß:†…†'Ô8Y6l¹_ý¬‘±ßÕ4Î+´hl™È5¯ß,rm ç0pí¢;lЈ~æÑžîÏ kìw%y«Äþ± ¦Õot3ÇE]ËîÿkäúfDæËÛ×⨱˜s`ÿ}¢½®íZÖ­úw$þ[w-¯}ÌÄ–º`üPô}›žëß7Gê²÷E®ñü[ë0Îp8·Æ2àÕø+öÿ/ýÿ±H¹áØê È5tGÊDÿ?,ü·oÞ2å¹Ögﺱއ׌°­à˜Ìk‘ö€ý=µ~ߪ±3ö3VØaØcDîÒÎwz©×oŸVû½^Goìwœ¸—o¿Yÿµ™ƒ‰/R2 Ø¦Ð(ø1gä¾³è?`øÒâh~>Ñüäº] üw šuÿy£Y_¸`šóSàómÄc‹E®³œÚ€¾„_Tþ”¢WRûPp™´žžOQÛÖ72¦J"¼ôBÅž’ƒ¡I‘+´{Iµ,<'rJdú­k™ÇÔõkNá­+Å Oin_ø^<#rŸŽ!‘öÒ*êû~±"s÷9[èÚäA¢·ß¦þ)‡ªY#ß"ú:òp 7ïÁ¯Î¼ÐoƄ؅ënR?ñ³ƒ¯`3>›íõ×Á¯Ol"pìÝKív;Ù°“úôo}ò ê¬Ásd'2g}Í vº=öú?cƒßÿr] =®÷`K8÷þ@£ÈzäòÅùOŽ©X7Y;²` ½e}bGì {VѱLäZnjÎùíxxïºãDî·¸ˆæ93uä^¯G£ÿ\y¸Ù›Ýøè¸¨s>­û9oæ á…c`Ìõ¢1d€×©£wtå~Áþk"ý?Î9{\CúJå«&'ð©Hÿĺ÷žè¹–²Ïy „[Z}lûô­dã#þ÷íÿ ²& ,µœ¹IÇÝ‘ûvÐçßxmÞGÛ^p½“sÞÿ_øo½Î2 yŒÌºú‘uðƒ[s@oŽÄþ5n—i ‘³ƒ"ãí¶ÚÖ ƒaáo_ÿ°ð2 ÄíÐÏ×?fô¨.º:Œ×³_L«Ö?pÝô‘8=™èìÈuk'à³AX–€søÎ¶Àó+T:,ï^*šuìŠoå‡È5§QúŠ?áÁçÅËÝG{»ï4ŽèûÈü±#ªóGlÀ»¸ð…ïëD³¿|SÃÿ~¤Lþ´ÒviòèˆúþÂOà6òômáx ¶«ÀÖ@®kD<ýý^µÜ%®æuy½`#8¼¹æ™pø?ŸúÍøvy·s˜övFŽ+¸DÏù¯ž‰<@OG vÐ;vÕœŸ ëhß•º–qѽ÷-€Ç‡éü!Qe×Iê¯ýJ–k|.¨~ºöÔÑê/mDvÞÏÞj#þA¯åà:AûchÿFš·j´ƒÑè(àõš¯M5×kéüŠºššWmÝJtÒO¿—ŽÜ/™ù€îæÒ}®?ÀÏÿmÅÀB'àÞo‘k~ûŽ\“Gþžâ?åœó ù| zú ìS5œ¹TXóˆ®u~:ϸ1Òp>é[‘y@·EÖµuÿu ³^¡ï÷é}|:Y/=²ð~Yô+Õ966ÁW¢ÙaåÙ߬WŸ}Ø5(*öƒ¯WEO?•ã°/DÖE;OÈñá!­Ã1„7[ÿc­ûÛ¿ÒŽ!8·õåÈõ),3_ˆô±=®±òøÙ–ò8?¹ÖQïxoûp\»=V´¿]y<~ŽðêÎaÁ:pœtM€ò^ /ÿ^çµèoŒç3•_ >ØçÄXm©±ã^ò^ÀydݱÂ$ëÈøðÏœ¨ï`&ºø úÍûÁæ#5þÄFgˆÔÞרÌ!|ÚQ×vy¢ÓŲNwœ;]®3ú ÖR–߬¶ui¶`ñéjx{¼ÚKÄY:è`0økLÞMí§}ØÈsuî|=“¬Ý¹Že¡l˵ôìõ¹¿Þ³Ÿžs@dmÛn:ç¼"Ú°ÆÙñ\ž&cû`OºFxKµ•8,zÍr‘~GǸ¡§ÅÕ¶¶Œ@w±ßÒïêÇrN4ôI<~&}‡GŒñ™f=aç€+Îåx5rí´Z˜ðjä7Î/ćyQä^‰ø{ì«s,7Œ÷–÷‰nã}$zÖµsÍ­‡Þé[±®ïµ Œ¹÷GÖ‚#}¢ò"Ÿä'Xö¹¶ñùÿýÙ¶|XÏ÷oú~U¤¯ÕuWþnߺ}çíõ †DÖž=©÷:–kü-zú‡Úk&|Y_g]ð™è™ƒ4$2g `{Ìþ‚ç[m})R^½ð?Ëž6혮Óv®¨óE{áSGŠž2Iäžñ¶¾ƒÛ`9x½®xì ñçɆmEóÊù)×O§ûgÔ3xú6s¢ûGÕWFà“w–¿NÝjר:À×)ô>Î/ºZIü¨œ÷“Kø±Td.èd‘9R¯Õq)ýEæ fàk&.yŸúJ›Ð½ÁJôôgôî%ÕGxØõXK¨=[hløD/ÇÁ@tîc#uå…»Dâ+Xœ°l@÷&Š|Ó-KºãÜøo¿ÖØÒž94_¼ï­ƒÔ•mëQú¿ç µù‹B}ÕUšô{ðùpŽ~ÓÞ£4÷×´ú ~ž¦ÿyòÙ··®=Aï;BíÞWÏ»NsƸá39^}c œOt¬úÌ\®éw¢»F®Çéܬ õù»‡ž =ö*3\ë€î­®¨±Z\c‡_háÈ5ÆÜ'.M­£kþ©v,¯ƒëgÐuÎu˜GïÆø³Å£Î9èDæž¿™;þBô¬—µï÷¥ÈµÁ¬›ÛÓŽ-ZÏ}A¿—Ï}ƒ¢Ê‰;tþ™H¿„mÉ¶Þøz ÿÚñV°öÖÈ}z[yøEïÇVž(rïã9êïf_­¯ô}hüUÿ7ö?×:†¥ÿÛ_c?×ѳîê‰ÖoÇPÞŽžk‚ÚÔ~—íŽvX;gèçÈ}ÀŸG"÷­|8zî[l9õxk¾ì÷¹Oç¹ß1uË*ö>^ŠžëS·ëØ, è²Û>çÜöưÙ>ÊIuôÑáØX»˜xÄx2Ïw‹Ÿo¸–žCæcÿŽ,z˜Y×Ù~^Wßѽñ¹¢‡a€éÓëyóéàüä¢'Þ1ä>ã©}+%–úzQcHäp¢7ÎÝ.:À—ôYåÁ‚åø‚Á/ð?48† Nƒ‰OÕuiÊ฾½ƒîŸ@}ÚRÿ-.,à·œsßå—‚[`o—ž ÞyÀ““"k±Ài°ðxGÿ?G×yj¬™¯±ôŒõ#å+x“ÖÅ@ß}Qk+0ÿ«_g×kŠßìc­wudþÌ¥úÜÇÁãƒÕÇ„±OnÓ5gè<÷âÛ9Mÿ_§> ß·ªoŒ ¶²vo=Ÿ÷!‹WŒÜ{ºCFnik0Öê{g½ÈuxvÐ5øæÍl¯k7Ó9Þ=‹æ¬ÆFt"t캀Ù4Çkè>ÆyÖ\o¯wc?nªgp2mñžýÚ¶×Û¹1ü~%zú)ì €ß‡êhcÃC‘y†íœœW+Ï—öΩßÏDîµ~Gdîá5 ×|ÁßEÖzýcñíãÖH9rkäÚ÷‹ñÑN$Ú4¾pÛ ø8þê¿ÇÀ^ûä‡ô:œêø€}@|o¯«ÐOǸÖXmßµq~§eDÛçÃáø…·ëó-Gî̵MÅ9d¾Ÿ«õÙ®óz¤Õ¾Û#e÷Ã8ž¿úÚu – ÿ?þŸ‚ÿ¶Ñìû™¢õÙG|½‹]Y| ^tÇ¥¬q~¢×¡wíèÚèƒ3k®‡Ó|;Ž -¹†¡k#±·Á{0¼¯Þm{{6=wfñª}Lð2\C`Œ¬¾2~ØWÔE^ТÆþ„:‡…ç‰sL)~^@}›ÈÑÁÿL<lFgFæqß òM¨¥C9¦í|¥¥Zýå<òn;ý?P˜Á±J}NÁ ×: ³¢ƒ`!Ø‡î æâW9NxÃ;&‹ô£Í§yb íkñÇâ7#þûXÝ#§Ã|¶ãïAty±ÓmCœ%—ä Øøˆ@6œ©¶`§üSkêÝö¹Óæ‹u/¾Ýtþ4#¸}ˆžÉ½›k ÖÓüö×ï-4fŒ—ד@oY;üÝD÷lY§ÝOó°‘Æó0½“v¯ ÿÁyËd6º´1{了ت;kLèÀÖÁ^ÚUïdþ¡Õî8—xü—‘ëõØ^·,0žwFÏ5­ÃZï78Öè(xqcôX/¿ðþA|•ø'Àxû„®Óq‹xä¾hÖpS{úŠþw,Óx·Ž¶¾‹ÿ…ìBè =<_Àô@Õe4ûé~>Œ£ÿíx§ÇœoôXôÄU;öq}dÎPÿms8ÏèþÈ}eŒ÷Ÿè M`ìútÙsâ/—ë}®Ÿp¼÷ ÛÏöT¤ìò\³†u86á\©vŒ‚ïèÎár|Xþðo4Í> tɉ#ý?øŠg¶ôÃ÷/+Oï'ñ6xÓW¼¹l¥ÿf½ 14÷`4úê¬zæ¢:xßBâ™ùD3ÓGæÁO,¾œE‡ëûèsLÑú<ü?Pï~“ÆŠZ˜ÿhŒŸÐù#õÞ³¥xüÚ Òç ®€íÈ6äøµ•®‹"²¾aaØ´œÚ6UdíÁþÂÆo-áÊLú.-¡÷ÈÙÓõ‰®ëüüã#m’¥4?›¨ÍKkKøÀ¶¬óÞx´}cK ±yÐ.Ó{xƺú=°ÿñœk0?‰¬e²?ãaF§'òb¤_þñH9ÿ¯‰uO…×v©ãU0¬³ƒŸä*á÷;ÖëøÑÔ‘uïè×ÙÞÚ:µÚ?HxŸ¡7)¯©‰-:×b”Èó4>ð¬qÿÃèp¨sÿýÛñ Û|ÞYK{Gdn(ßõsûaÚë,'_Œžñçü| ùóÛ9­– è¯DÖ"·×~¸»u´ÿ¿Cóáü%çúØ×Óöcµcö Ú_8´×ñFëÇüÛq¥k?Š=rZѸë¸Ð_Ç/ Í þ‚__QÞöpÂ0Ñv8<¹¸x|÷Á:ûpàçxÂK×{ÆÍLéóŸX¼èu…üߢ#ìÕß#÷°~A´¼»Oó÷Ñsû•0„>;O†~M£sè ögƒWéû~⩱5>KVoòHVÑ'0¯Æ’ÿ#/Á´„GŒ—×+S6‰ž{“€/mý’ûÐ;·Ž\Ïgk]îã}àžë ÀOdÉ¢º‡¾ßèÒ[‘Èb»äb~£ø01¯÷€íƒÍC|æ~݇gýÏ'r‚<°5~[ëØQ]z/9Ÿà-òæHíqÞ±³ÆcÍ7c‰Ü]GýØTã¸xäºD›¨ý{GbÿÃ}t~wåñKð_ÔZ'y†Mƒ0«èÚŸ!rýŽ©Ô·yÔ>äÁ‘µ{k©MØµÈ Öy Çú‹hÖñ.tú]ä:ôö€ßè¤W ŒÏ>¬Ëø»ó^n̼4zâòÛ‘ñU׃ߤûý\°}Ó1Ol[ç~Ó^çé 3ÜsÝ漏9\§ÿôŽ&Ÿ^¶Îo¿ÏŸ­g­ û_øß®Õ² lí‘þ5ûßÛ9žÜ÷€ÆÀ¸oßÈ=­ßÏëþvüyýnOï¯Ûä09¦o9m;Éþ±‡Zób{éÍÁµúÏçì÷£û®3³èZávpïcXkDø»ñŸv“{ NiK‹†çÝ#»Á߉t€Ùèw£ÆG‰à£v^]ߨñ2øwìÈÜŸIôýb|=ß13çQOY/Öµ¼¯uñS¡Ï̦¶YLÚº~ôúìRSƒ¿õGµ{ÊE$úCV,+L¸¤Å·cê>þÛ\x„¾a½¶ŒÓ,¢ktØêùøÒй.Öム±…… û ŸÀ×5sÜŸè½ÎQälð \×À®}"õ\dÑ™º‡ûw×ܬ¤ñdl±ÒóÀªôy¸îE¿¨‹ƒó)FÜmC9r¾Úu€úIL„XO—†›üŸƒ5v®VÆÒ¼ì¤5Q»úg§+K;Kª ]™pNäºë¨}kª¯Œß"¢ðö„È\ûëgÓµk×wyt²æå¨²«T™±§Úº‡Ú¾‚/ œB¦]ª>î¡çõS[Ó*o¬ÐÝx‘yqöûͤÿ±ç sìé‘#×ÛýFXñµ°Æù,` ¶¾ë·þÓÂc¾±ãø4/×u>ië÷¹‘:°óæoÕ3ÛϽCï¾;zÖ69ÎùZdýªmçû#}ç<ã¶Èõ \…=ˆÝ/œ4î7ØßÆìvç-Ú76,ü®uþ¥H\uŸˆÿþ3æ®wvîzâ3úíù‘þ'Þ;4†ÿŽë;¾k{îÍÉz¯s˜lGÝ v¶ó›ìßã]ïFO½ß8oàÕ^¿ÿ— =×ßnãÿ{u.†ëUoé¹Wøt¢gpÜž0r_/0ç\áÄ¡â͹t<;£îAŸš^¼ìzžiYÓ7Ò¯Ïûð£`S/A~å/ož5™Þ?§ž?}¤ÎެC¼†x™înQå껢Å1ô.ðóJáÄ2õYe0zÈ5€w¬8Rxù;µ}üìʈÏ»]6¯¹fõ‘y3`¶åÞ6z.ø{œ¾#7ñ™X·ç»}ðØ#{E®wÜ_ÿƒyà±ëĶ×à—sÒ9/ý]·æ ~0r‰okïdÇ\÷Ñó/Ó\Ÿ‰ý–è9«D®/‡=×Å•Î,Š'tû×ébxg]éÛ_×ÿ‹_ˆ¾lVÇ·©Éò:OÎ;Æ¿‚Œ8D×8vÄø"ËŒÿÿÒýýÕ>ûθe ½«ËÛe8dv9¼äú‚ÿÈNpùƒ=€Í4{¤ƒlW¸ïÌxú#r]t}Û_·0ÎøMÚwoœ0þ[Ÿµàräyž«O~ƒýg¶î¹Jÿÿ7ãïÐù‹z{îfáãq. Xïxðm‘ù¡öŸÛ‡áü×µr¯t߃ðäè‘k 8æÛ® –ºYs³íçïÿö˿鷥mûüÿùžŽ\÷î‘VŸiÅ“‘käY.‚ŸÃòÿü¬69'Ë>&cýí‘8Û4(2Š>ƒ×ÏÆ_÷>nëü½m~íu´å…ïþ+y¸>‘û$-&,c']sL™ºbd®=z«s㌬‡‡of¬…ÿ{d>ÜÄú,ŸZÿó\tw0xøÈ}è-961qdnÆLѬ{Vr‹¹vJµ˜å2•¯›ñÄU×`;l%Œ  EÖ–M ço,LX³ÒtÉY|¿©pjïÈuÀiü#kÈQD÷ï#éÿÒº¼_/Õ˜9qE½÷daÓµ‘{ \ þƒïçézú²‹>/ˆŒ­â“s~¤âÖË»ôÖéÊáN÷¿÷=™„~ŽOé\µÿ¶XŒo Ÿ˜‰Ü;+rÄíEßV?{tºýít1¢ìǼ£ÖK…æi7Ž\ƒŸ¾CKèÖËG®7rpä>:\Ó?ªfÛ‡v£‡ ·§‡DÆÄ¡gç1èØ]?Eú¦Öí ñ¼]×AÓ3‰¬ËŽ)¡åúY¾£Ç~=×8¶ÿhdþH_=: 8~i¤oÆ>A›"õý‹t-Ÿ]ú)Øÿ/ý•þãÜÕÑSß¿J×XO6n>)̺S÷8ÔXèßè÷¶SlW Š\ÿÁ²C8Ýøt»r²Y_`ôø«ÿüü,²vÉyõFÏõÙìûw,»¿ÕŽAÑÓÿC¤_e¾·ëÚ2>:ö6ý÷Zd¬ð9µåµï‹Èu,œoÿräšIƒ"ížól¤Žïöz oÌ[å]®Õ0¶»îõöãô>Lc\ÿh¯ß¾ÿãaòÿ4>­xÏy7SÕ9,ônb× s®óš4rž¶¢/¡ŸÏÍÞ°M Ȥºy2cäÒ ë=øa~ÿëѬ5Î÷1"s Àéy#ó–˘Rô;Í~…_§¬]JC#×Ѷðî0Ú&Fd­öÔâç×K·.z/¾ü1ð ø fާûù=?Ñä‘1cxÏ>S°y‚ÊSå:çW̦÷ޝvýò×£¼×~űõLÚ–ƒ)Sè¹´mŒÈر)üzðïzÆLÂ*d΂j+í-šµyKÛºý/<ÿg÷¢¿àßSïã]ÎÝL˜ƒ®N‹ßå8á’ë Ðq±±œOe¿öš‘묠s`þúþ‘ûn¹×,¸¹\d6 ظ€ð ÝD&áo9Víáþ.½¼'çsÙŒ?ñ“Q±YæƒøŽ?u¾ÿ¹zæ®z?ø9¯Þü!fÐ¥ÁN‹:Ýyèti¾ÓÕá;³«o‹k—‰¬»âÜzÆ?ô‰ïÊy<ëDÖkm¬1ßDã t=‚sòirdÆH¿×F‘{ü’ÿÐÕ Škÿȼ¯ õ^Ú6FäZ5`ýû:œn=ÿ ]ï}¹fó«‘þ€¶Ïߘ>·õuÇ€oh]c??Ø~޾Û8926p®Îý«õìÞø?¨…7÷Dâÿ èYOk E?¾9rÝã*Ÿ^û]úÞHü_Aôÿ£+j=ˆf=èo5~Gb¿q¬´nmЮoz92îéÜÇOEÊÇNÚþ3û†h³ýÿÏD®Åi{gúç|P~?¡v~=×0²½âõ“«pݳѳ~Î2àŽH[ÅrÊ9½^¯chô\[èÕ„ù?۽톡1l¹áõ+¾ˆfÍÿ‚çÌ™c÷Ìþ˜?¢§ÜK~ä¹u"ôaÅo˽£ë9^Oh4}ý7¡0àÌŠee}tðï†q¨–­Ù›ì³±3œÉo°| µéRÑÅÐhrZKûDµM= FÖÀÉF-ÿƒæ¬¸TÆê‰È½‘>ÐØ€]«Fî-B{Ð[Á_磸޾Ø-R]@ç8Ð{½ÁV´½#÷šµÿŸç­¹ïÈ‚‘{¦q2¯>¹ß9EøIlж›•¿Õå©ffÆÿÜH¿cÊÛ¨]`<:¶môü£Ô®µÔæµõÉu÷Öz2öÜ,5hÌ7²gÉhöÄiüü´×u¶³GÚuŒó˜—uÿ’ê±tvb)^ Œß@ß9ð5N§ù[ôÂÜ"?vÖ±žA^±îãÔôVÛÙàudçðË®üKÌÎ>GÇMÛ=z‘t0{ kSõˆÿ¿í»ÛÁú³õ½õgFO»àòèiGØ7ÂwëÌ|7ÖµóýÆ&¯Ws»úq•ÞÃgWnÙv¾cSø`áÈBåÿô𛃛^;Á:?Ç'‘6eÀ{úÏqjë¹ÆÿA‘2Ìý±oÅch̽;r?³;5þ^›Ç>0ëëíõ'žU;ßÌ­r ØùŸíZéö}íµ#캩×ñ@ô\»î¡Èu7œÚŽ´v.1¿vžhïÃy­m™ö{ôÜà×È\-pÿËÈýã?×ï¯#÷ûü¥>£‰ùóÿÇ‘ûÏs ‹ãN´ާó´ýÓa_Dî'Ä«ƒžNì\-²î|µßõCu­Ö*ï{°ðƒàç™\ÏG>8ÇsºhÖ0iö¹UN3ŸòÇ9€>¾ƒpx³ÈõåÑUÑ'g›Àÿ¾‘k¢.¹îûªÂ\ð¼ïé÷óÑoÁÿ‘ô\×(Í'Þã™ó ¨=»DÚ`7y0Ý1*y\¬qß=ÝŒG/Þ¦ç!‘ÉD®1;që"/ç],­±"€,pÍœkMújL‹\߇Odïz?º?ïÆFµ^3…h`.sB^è}j?¿?&¼%r¯>xøÚÈøš±þÑÇõ¢¿‡"ug°œ¯/Öï+õÉo°ÛyžÖù-ì㹤õÝØf¹ÑöµsÿlÇù~od>Ï è6†^­ãšÈýÆ®Š\Óø¿â±'¢‘-…¯Ðý)ã.°è‘¿FÆHø Îë]¿Ôö Y.8lÜ{BãÛö©Ø¿v‹þ»R¿«ÎÏ4æ>Ylû‡k>Öó_‹ÌMãßQÛ躯×Wp­U;Æãø±k7ìgêÅ'ØÒ®ûuîÿC‘kÚµc¹í£7®Ëÿ?¬ûèÛ»êÏwêÏwžñ…æÈvÛgÑÓ·ùA亓ŸFÏý†£õ¬ßôËË倌 ïýŸë—~ª9Àô7ññ¨âeb¦Œ£wÜ!zxCïý¨¶¥àµãà)Øÿu¥‘òßDÂÖ¾QuÓ)4¿C4wCj ½=WûZÞ æ­¯£¿°³¿ðv1a2öŠúDWví\ç–ô‹Ü/ýÌÈz,û~Àб…uÛª½kE®K‰Ž¼ ðs‹È%dú>±ÏÛ#c £úMö×µ-j :çºã]Ö¿0zêÕ7Eú{ûµŸÀlØÕö÷Eâ¸ë™îŽ”wGbb»>¶]{Ìÿèÿ—è½ØÎ1½VÿaÜÜzçâñaoÇÖŒûÖ%hû{ÞÆÑûtëÇ#ó.‰Gée*Ç5‘²ËóØ;Ó8ýXkœoÑ€7àÿ§‘±g¯ñ…cþ“jràùÈÚ\ð½ÿi½Ù}gdÅíúÏ1‚[#×ÓxTÿÙž°?Ÿv8—gXñà7"c ÃÂþ7"×°þ(RÎÚÏcL¿Áxðwh$»&ñ­È:>åëllûÇ>‰´ß^¬™û¼¾¯ÉßT®gyÆwÑS¶¾SÛPäŠã³ÎËèè9céÝ?i^L×—¨íÐß÷õùÅÏÅ;ǯßËXÞ©6Œ¡wÙ†y+RÇ»]Ï»AcãªQ…%`üªÂQç­¡sK×6Ñ90ÍyR“ë˜]ÏXJØ»Š°{aï<²µ"}XèÆÎ+Ú<2®œ[H×s§k¸–\bÔ8`_ØŸî\$×eôQÛÁRtmâäÉD|ŸQÏJ]ñîÓ…½›è¹üOιDèä3{±±&6Ø÷ˆ\ÿ»î#~þ˜Þ¹täZ›‹i—‹Ü?zqãü‘þ.î[Yã@_&‹*ÿG«´RüMŒIÿÈ= 1ŠÞ>-}¬ù7Oú#Œ3·DÚÞà¨1èÊèéËïŽyuOˆ“t¯½°u½}À`Øu¶hŽ÷Û7ãœOÇh} ðÇ;îyy¤Œp^L;?ÒqäúÉ^ƒÂ9©—·Þ׎+[–\§wêÞ¦ö·•óÓcÍcË—ÑS×7N|ò?Ž6þ»¯Æn°öñè¹0ÿÙ×fß—ý)Z«¨ñ­Ø×r{dÝXgÝó­Vû8¾kõÅq ׊ iµéM=wHäºu×DÏø´mFcÿÝ­¶¹ÍqˆÞyC[‡}@C#÷¨l×uô>×þ4r]ä_Õ/ôá"1Îñ¬×"í ðÿu]÷q¤ŽýE¤ÏþHߨ3ѳ¦ú½ú®Æ?o²nÊzÆ;‘5y¯èó‹ŠÏ^[½‰EÏ ÏáÕxšDϺRíûC}DžÁ×ÖAè#´s›ž;Yņ"‡ìúRóçÚ|÷ýñȘñðÂ%êI¿öÌ <3~¹.`Yá•ýÜ3 »Ú2a =£ŸðÉ8ègñ?þŸE[¿nÖ“­ÿ"'°9VÒ÷-#÷Vß^ï6r¯Ú>˼ð<â Ø¬„]ž81WdÁ~Â]bö]ͧ6 kªß£çy¦ó®Þ­Qäñ\ÂdäqèõÔþ…5–Ž“/ çƒïsD®··‚ÆŠ±FV 'Ò5Ø(ªŸ®íEß±ŽžqGó ˜ÒöÍÛÇc¼¶\àÃýv œã™Ûz*²Âsøyd^²€øîºÿÖýïD³>aÁ ám¡)çè€éŸªŒ±kïRœŸÍõŽ_ÛVàÙÖw—çþ=m®ƒÏ‰”yZc¢è­`ÈØÂ(°ú@a÷bžM#sÐç†ÙÏ=_ä}"×Ý›Sÿ­#L[8²®˜ç.­÷Ρß3èþ¹…ùsëZž1¤ [Äë «³öC·_E&,+lžAíW4ᾔûøXðõÿÅ/eŸÐNzîzzöÃl‹5„ã£F³.Bñ³ü*Úú¬þ.²~à»r-ÂÂê²Ò2r¦Èý!&Ì#C~Ï#¬Ÿ¥ÕÎMMmR“ï5B‹6Þžq?c£}ÅÆEûÓö­\éËq­òäü¨>ŸËZÿ#ŒýÿÕá|ç¤8Æ Öß©/‚ÆãÙýúϸ×öù»>;½#c†…ÿ·DÊ:ë¥÷¶ÎÿGmT¼£Éù%š’aâÿçuÎÿ²ùÿÿÛ5ÃÎ×t…å›c|º~î"Ï«‘ëèÝ=åÏó nØNù(²Àkz|©+ü/üw®’óxžëñNãÿµ‘u ÃÒÿÛ5Ö·ëƒ} Æñÿ‡ÿèÂøE¦M%,†Ðýí±ÿÆíà9Æi×S¿¥±z«uþÅøëšJïi^üU4k4|ø(z®cÊ3¾Žô¯{¿Ôs>ÖõŒüâÜ´‡"÷Oû52Oi´Èµ¡i+üõ©æõ—H¹o[†û½NÈGj#ùƒcwðe,#\v-ÝÂQךÙ&è¹Gø|ó‰"×cõº\³Q¤¾»rëÙ ëºÙ…õÓF®ãäü¢ÅôiÝ<$~@|ý_ùUÂîþ‘z´Û>nä*Îk¥&À¶Ã^‘µ¸ÎWr|bZµÓùQŒÏX­ysÞmÈï#× aœ°•Q{Œÿ3‰N][Î1Idm!ô1£Žé"÷e™­ÎwùŸ>Qkòg䞇¦ÙÁ1ìœr×ìcn]ÓÎçkÚ¹úð6øOŒ÷¢Ö5Øê?púæaèøÆtû{[‡ñ¿+¶CnÆÑ»^Ê1›"si†…ÿWFú¥Ú±×/#®‹ÆgÞ¬õ6b4k>÷ÈûþÿMMðÿÉÿÓ»>à%µÝ1Æí¿‘1ê+t0––aFîcã8ë푱ìÁ‘u¹`ø÷ŠÞé:€O¢§ïjXøï\¥§#ñºswŽ€s¶n´%Ž”OFÏÜϹûcßO;ßèÿ…ÿC"ãÊ»*º5àø>Œ®Ž>¼±õŸýøŽ«‚]íõtl ¸&É9$öï<YÇô|ëxQ|fÌ¿£õ.Ç;E®c¿Žý½ñŸ¶;'©-ãzû’Z6‰s¿ÿ¢óØúnß/ öy4ûÿÅÿÓö µóŒ±–[ð÷` ö²ÖùG×28®êœ.ã¿c Fî³üx¤Þú”>9|=×-2¾9GØØû´îs.Î Ñ3ïŠ1vm…çÆtá\«—[ϲÿªíóidž…õoãpØ[êÃÑøEË|€kÎiå:hë õù¥È\,ËþoÛÖýÙÎ5Ÿ9·×²@:@ÑëÛ±ä×[Ï–O¦ÙÃØ5ù´Ùú¹c·iÎÚ6ÒKñ×:¸Ç"ýùŽ÷ÈhòR&fص­ò[«´},a±ýú³ ÿç>[.³î\vtb|ØŽmL™ î¯Y'k½~Saûò‘9ó³ û‡^^Ÿ\»mä¶Öå××9üóǵî[)RßnÇ%m³DîÅàÜÛ‰t ±fdqUì–-„ã©-‹k<ñßͦù„î~ŒÜ“søÈµÇgÔØà»/rÍUûz&Öy×§™ƒúÏÏéþnrO\ƒdÝÆµº¯‰†ìwuNÈ¥‘ù™íÃqQcãå½>Û¾|øÖþ{"ñ>Sœïç ëùö9\éSÔê+GÛg~}ä¾µàªuhι^Š÷Z/íÍÿ½ñÿ“^ߊÜòÏÈ=1¿ýG[Ïþ?­¾9wêÚV=Gîð¨ÆÞ˜Ï¹[Z× Š\ÈkeX0æÎ 2þ·ãÀ®°ÿ¿ÿÏFOÛòJµaPdP;ßöîȼ›ëu8ïßõaÆ7Ç^îu +§Êyž¶Ÿž´ÅoçõØcYóadž*}ª¶Yÿ° hÛÏDÚÿ/üÿ½'\x«õÌö_ý(Ñì5Qxø™Öx@ŸG®™düï}<Ó:Üîï²-Í:ÔÄ)7þ)ššèƧ4œtç°p £¢·ZOå\ߨ~ ×q!–¦*ÜBÞÌ)¬_S‡õvΡ»ã‹'æŠ<™#zÚóµdÆÂy°]üÆ‘kIó‰Î¾»ð{)á¿}-}#eÙ4‘~Û?ðøš‡‰Ôú‡¼Á®8T}\ZížDÇBšã¯"k?˜ßï#÷£˜Vø?°|$}öÆýÍ8vô]dˆí—ˆÌqpŽ›ñßkѼ™ëë|sëÂàÿM­ßàL;ÜÎ=·Æ~dû$¬_߉Ÿœ$zî[{¿ŽÞ±¾6­šßÞ‰\ËÆþ¯CfýßvÌ H{Õ5õ¾½ñ¿]ÿûƒæ‚P§u½ý@Š6v€ïuÝчÑÓôjäÚØŽÏØžiÇÚuVö÷ÜÛ÷5'—GÊû‹ôå[ì©C"iêIµó¥ÈZ`ûê¬;ØÿsI¤L~²ÕËlç8/Ì~—ÞµÁ/´Þ÷ÿçÿ9zÚ oèÏëÙà¬yâ¹Ös>ˆô©<¡û¡6MÂCöÿðû©ø?㳆¢ó€œå¸¸¬üŸB3¢£‚ËOEêæ ·Ñ4új¯Ã:Õ㑹F_èý¿Gî16²äAD®G1Rd.êH‘¾Ï‰"÷Só÷i…ËèÇ+Wçæ¢sï!¼•L)˜åXÁÒ‘õPÎõqîˬ‘¶ÂÂ-9±•~¯!Ìïß°ßù¥`42fÃȸ„ã óõ:f=¦ßD#ßjN:uìÊ5SK–ð¾DÊ.ûïgÒØŒMmv™ß¡_|6‹\ߣOëzaFµ…­Û[>;¾ß>ä«kðÅ´õ•hþµHûš·žoLtŒ¾…W‹cÞþÛ½÷E®fýœÏA‘kþ>©KYw>‹ecÑö·u:ëñþÿºH¿ŒÛßÎrü×zþ­w´ýþ–m÷Gî;Ó®m³ʱµæ£7þ·ôûrÍ7uŠ­ ëÚkF7±àÏ㯱ƒaéÿ^Ͼ9×b´cŽ÷ºžÙõO듾á7¸H×´óo\“ëÃ>ð6žÙ6±ïÿÍÖuÆê‡"eïÝ:×Îÿ¹»õ._ã8öj3Ÿí€1ÏöÅà^ǰbÂÆ¾[®=¯g9/´÷ùFd<û•H›Át`ÿ¤å@oÿÏÿÿ?j}Z÷3ÞþÎ(½ÚÁ§?ÃÿOEÒ*|ö_}ªÃóÖ>†å³²¬A Fˆô)è(¿{á{_×âÏwNŽc³|ŸF˜¸¶°Ÿc½hö+ýaÜU“×ì£=³ž·@dî#˜íx‚ãÈÎ/êi7¬Y7`ŸÓ"-Y°®ôtçùŽ5û½óë]sTÜ.ëæÍÑÓ'ozE´s‰ÄxÛFÆŸÑïûzÝó¸žíükó¼ùÏ::´oe¿?|Î>+×óZ8oÒ¾®["÷—0rÌ;u8¾êÚªG£ÁþÆ?jlGÇ—._øö›ÈÚ0ÉíBŽËY^Y»ãœmæÚØä¼Ǥ/Ôáß·G®}Oüoü§ímü¿[óâzÞ6þ»–Éú¤}ÉŸEbð‘ù2Îw‚ëÅÚvˆë+éœûLÀ¡ÿ¯½3V‰ Âðt¾‚beai)¾„à ØûJ^ac¡…•ˆ…"Xœ ‡"XVÚˆ¥g£6ßÎìT°½…Ÿ]îvlrù3™ù3Ù­gÆ)õ¿wó¼Ï?áë¶/Ëþ»io ÷ wæºÄhOØ·¡~–±”µo§¡Þñ‹1Ç:õ©6{HˆšEâH*_Ë÷Â| Ÿã s‘¨ë:©mÏG-Qög¯ä7\þ­úk/Qƒ„}•õŸôY´GꇚۉûÈBŒñõ—úŸÙŸïc{²†Cm|h¾Þ›þC…˜Ž®o­=>²¾Ž_ nè÷ü¾éÊT8PܽdîóÀ_³ZÏòó¯T~|®eDo&[vjž[{Þ\£¥xìpÙò•“£æ_ÏEq€­Êÿðþšù~ ëæšQ~#Î6ÍýVËo¥Þ¹jè{›îµ{§rÍ…„9óü0Ô!Ú,=+›ÿÆk™§Áí׿qäÜs|¶æ9Ûžl˜¯þˆúº¸>݈4&âaâ£âúq£ zî(alß÷dß ßakŸ™ç«×ç ÀéânñöŽ ÷kiA#2ˆûŽÌsÜÇõ à˜ëÅÙ1;þq|ÿîÄ€ Astro-FITS-CFITSIO-1.10/examples/bintable_read.pl0000644000115400000360000000216107453375472020126 0ustar rpetehead#!/usr/bin/perl use strict; use blib; use Astro::FITS::CFITSIO qw( :constants ); use PDL; use PDL::Graphics::PGPLOT; use Carp; require "check_status.pl"; require "match_datatype.pl"; Astro::FITS::CFITSIO::PerlyUnpacking(0); my ($fptr,$file,$status,$ycol,$i,$nrows,$pdl); $file = @ARGV ? shift : 'bintable.fits'; # # open file, move to proper HDU # $fptr = Astro::FITS::CFITSIO::open_file($file,READONLY,$status); check_status($status) or die; $fptr->movnam_hdu(ANY_HDU,'EVENTS',0,$status); # # get number of rows in table # $fptr->get_num_rows($nrows,$status); # # find out which column the Y event coordinates are stored in # $fptr->get_colnum(0,'Y',$ycol,$status); ($status == COL_NOT_FOUND) and die "$0: could not find TTYPE 'Y' in binary table"; # # make piddle, read data # $pdl = zeroes($nrows)->long; $fptr->read_col(match_datatype(long),$ycol,1,1,$nrows,0,${$pdl->get_dataref},undef,$status); $pdl->upd_data; $fptr->close_file($status); check_status($status) or die; # # create Y position histogram, plot data # my $hist = $pdl->hist($pdl->min,$pdl->max,1.0); my $y = $hist->sequence + $pdl->min; line $y, $hist; Astro-FITS-CFITSIO-1.10/examples/match_datatype.pl0000644000115400000360000000437007453375652020346 0ustar rpeteheaduse Carp; # # find appropriate CFITSIO datatype for a given piddle type. # Can be passed the piddle itself or a PDL::Type token (e.g., # float() with no args). # sub match_datatype { my $arg = shift; my $pdl_type; if (UNIVERSAL::isa($arg,'PDL')) { $pdl_type = $arg->get_datatype; } elsif (UNIVERSAL::isa($arg,'PDL::Type')) { $pdl_type = $arg->[0]; } else { croak "argument should be a PDL object or PDL::Type token"; } my $pdl_size = PDL::Core::howbig($pdl_type); my @cfitsio_possible_types; # test for real datatypes if ($pdl_type == float(1)->get_datatype or $pdl_type == double(1)->get_datatype ) { @cfitsio_possible_types = ( Astro::FITS::CFITSIO::TDOUBLE(), Astro::FITS::CFITSIO::TFLOAT(), ); } elsif ($pdl_type == short(1)->get_datatype or $pdl_type == long(1)->get_datatype ) { @cfitsio_possible_types = ( Astro::FITS::CFITSIO::TSHORT(), Astro::FITS::CFITSIO::TINT(), Astro::FITS::CFITSIO::TLONG(), ); } elsif ($pdl_type == ushort(1)->get_datatype or $pdl_type == byte(1)->get_datatype ) { @cfitsio_possible_types = ( Astro::FITS::CFITSIO::TBYTE(), Astro::FITS::CFITSIO::TUSHORT(), Astro::FITS::CFITSIO::TUINT(), Astro::FITS::CFITSIO::TULONG(), ); } else { croak "cannot handle PDL type $pdl_type"; } foreach my $cfitsio_type (@cfitsio_possible_types) { return $cfitsio_type if $pdl_size == Astro::FITS::CFITSIO::sizeof_datatype($cfitsio_type); } croak "no CFITSIO type for PDL type $pdl_type"; } 1; =head1 match_datatype( ) $cfitsio_type = match_datatype($piddle); $cfitsio_type = match_datatype(long); # or short, or float, etc. PDL datatypes are always guaranteed to be the same size on all architectures, whereas CFITSIO datatypes (TLONG, for example), will vary on some architectures since they correspond to the C datatypes on that system. This poses a problem for Perl scripts which wish to read FITS data into piddles, and do so in a portable manner. This routine takes a PDL object or PDL::Types token (returned by float() and friends when given no arguments), and returns the same-sized CFITSIO datatype, suitable for passing to routines such as fits_read_col(). =cut Astro-FITS-CFITSIO-1.10/examples/image_read.pl0000644000115400000360000000175110506004051017403 0ustar rpetehead#!/usr/bin/perl use strict; use blib; # # Read FITS image, unpacking data into Perl array. # Display image with PGPLOT # use Astro::FITS::CFITSIO; use PGPLOT; use Carp; require "check_status.pl"; # # open FITS file # my $file = @ARGV ? shift : 'm51.fits'; my $status = 0; my $fptr = Astro::FITS::CFITSIO::open_file($file,Astro::FITS::CFITSIO::READONLY(),$status); check_status($status) or die; # # read dimensions of image # my $naxes; $fptr->get_img_parm(undef,undef,$naxes,$status); my ($naxis1,$naxis2) = @$naxes; # # read image into $array, close file # print "Reading ${naxis2}x${naxis1} image..."; my ($array, $nullarray, $anynull); $fptr->read_pixnull(Astro::FITS::CFITSIO::TLONG(), [1,1], $naxis1*$naxis2, $array, $nullarray, $anynull ,$status); print "done\n"; $fptr->close_file($status); check_status($status) or die; # # have a look # pgbeg(0,'/xs',1,1); pgenv(0,$naxis2-1,0,$naxis1-1,0,0); pgimag($array,$naxis1,$naxis2,1,$naxis1,1,$naxis2,0,400,[0,1,0,0,0,1]); pgend(); exit; Astro-FITS-CFITSIO-1.10/examples/bintable.fits.gz0000644000115400000360000004557706631304507020112 0ustar rpetehead‹x›Õ2hsi108158i0.fitsì›{õ}À¿>I»¿}È ~`c/ØæÎö=´Ò½ýB'í„u’öÎwô¬“öîëÅjÏöešé¥a¨3¡$”¼hé$@h§“–IHC&ašÇ¤™ d‚&f P˜â”§y¸ß]éºÛ•dÂxò‡3pËj÷³ß÷ïûÛý‘ Ç#’ ,†,tÓjV2¥$¤ ùé‚–ô‚0–“BIOå3)-SuË@XއÇlx½ÈËÏå¦M(L Sª^ŠxœIé)¡¨žV²«o‰úÇÂIÁ†ç©â™˜Ôi”´ÆÆd)¬¡¯©š*)ºKÍjë)5/(§u%_R ù*~ 6<,Ee<2olÌ*§Õ)4Y8—šQYKåKÅ‚¦ Éù’®äö † SºQ¦Õ¼’ì/éZ!_ÈÍ hÏ%žyº8;_RÓ%!9W,f•œ’G¢©¨ãÉÎÎŽ¢¯Û×Z9êñ¨Ç‡G]} GÝ]íK¼€¡GZôY­šô É´ªäÓŠ›žVñZ0YñhÉD•ôl¾-ÌÌB›÷­Ò7h¨¡êhŒ‘ôœ)à.Ñã1¼E+_§æËzã…íU&úeI0ýÛ,z:[*äÕT~¹‰SY!6UR´“)½ Í/ÝŽ&åÄȰ„¼P2,¬æ…Ô™Y!YTЗ¦ËµZчò $¥Ä¨”@žœ8Ö ¶ÆâýÃñXk2îG¥ÖD²#!õýÉf„ëJI703—F±j“/Éè#Q4Ê`,1ì—ñh½ðò0¦Ûª|=½b—Q´¹¼ f¬nµƒáˆõ›þè0²´ã´–žN•ûz<"ÑlI-ÓUOû4Öö#àÈãqI°õ/F†:¥•OŸ/*uä–üIXöïd8Øl …Ú|Á6Ql÷øÄV!ýÉt*ï ¶JyE›™ï÷´÷x )sJª4§•Ó¼ò,i,.‡‡¥*ûõtö¶{Ì÷³©|¹èÊÌ‚œj¤´×B>äÅ’# i5Oôöz‘‡%b“¡AœÆ|3D}=¢§ß#ö‹=ýž®öÞÞîfÓ~ÆÆT%Ðäüi ¬±‘D@j8¤“‰ÀB¼Há¸13­ˆ—RaNÃjÚ@¨,ðB£ÂÊüÛ;ÅŠ+¼Y£Ìœ,ducVi91jéŒ2/0’H¬âõz«yé9M3¬%ç·C-êëO ú*m‘”­¾)m'ÌFôÅ– ^RQ„±dRÀf¹Èʯc-­[OHÉä’¾žJnHû«ôM™}BQSJFŽ -XPµÕªÇ¥è?)ØËWòy5?³ÀIÕl7 Þ ù–ËhÍ«%#ò’‘°,4Ê+eU]8¥fôYtunµ¾C ¿<¯¡/6h6³ µ®? ^$Vƒ—-œºXV,{Þ©X(•ûú<À¶ö[àÕ3\eøãRB6ë©)_IŸY!_ ͧÎ<5«`ƒ»øŸ6š Gƒ±cá`…§äg°MÄŽ/_áVz‚Sj>S8ÕÀĹԯ…°¼u„$y¨#4ô×»¯>¯4;§cŠ–úsª¦´IÑ÷ÇñâZ!ÝŸUKz çÆV±?àïêÀ>©¤—dtAI–r,Ñà ‚—Gb?Æ_3ö)æ©êzšQtÅlö²…tª~@#oØŸWœÄ™²ï„2ÚÀcY¼$ãR <\L7} ä3ºà‹(ŠÉÎ![ÿg ºɳ…L# ‘‹âfý›Q i¡Sôµy}m±¹ÂÓ E¯htÍ0“-yÝ ¼©‚®r #1Ù/OŽÙÏ¿cBê´Z´‚^ÎÞi éycñk4Õi5c®¹[2ÊÌÞ%Þ¸=oü“ð&ìyǻģ¡ðPHEdÿ$$%³A±èßD¹Y=Ä®%ÿ*Y¬ZšƒZ*WÄ®ÿoF…Žª…Á ‹^,'ã¼%yaª`ÁóŠ+ÞBgžUsØ´ÌU÷çȵáù<–¼ÅEƒåš! Emí×mðÒ( VùFígðììWƒgk?äÙÚÏkÉ«m?äÙØOôõtYñjÛë•ýDÓF½jÔxžýly¶Æ+óì쇳ŠWÛxežý¼]òÕ6Žd(RÛ~F*ͪJ6Sßx^Mû­äÕ2^™gk?q¯®ñÊ<;ûùVÊW×x—~”ë³Ñ„ù£A)ˆGÑÁðÐH¶W=ƒÃ²ÍûvÑø¾`¾6R®ì^:&¶âoÆ_ÏJÍQ9lxFþ]µñ6pšæ»{­`ñYa‰'"²Ï|¿¦pI˜Ë)A9ix7]˜3+Äô\>mΠ%3ÜxþHd4bÍëíZù>Ñè}³ˆÍ Áë%Ù@ØŸ4€V¼¾òzÛ–)5Uªª 9²ã™ó[ÉüN!èš:c¼Ì®D‚“v<Ó~æz¿­ŒÉ¨¥´†É‘7^²[CGìyÞ®®…÷óp)-‡„þÍa;”›Ë ©¬!é‚“Ë ‹1A«Á+¿ßÇ0)hC2ÅüzR™V¦²©ü c1¿È Õá•ß¿4Ì›hL¾‰†yÉ×0oW¡F=Àlšn3c|‚+Í|Ý]•h ò5Λh„gijõ[ókƳ’OMe•kˆ‘Z<¹f<[òâA±6¯¨fœ#—é¢pRÑ Ö0“ç½8ž·6ó­¶ý–çWMRyLœ=¯ìÓ¶Å@3>\hªa>ãA¥•xébyÆgß<ÿXûòÙyÁÛf.º¬Õúú#ñ d/ßR<猫¶õ.ù(÷þ€<â¬hü²`~y¯åùrx•¾¾vŸ×\/T¾GÙL›«Z£Ê|9¼’çiï½=K¼•Ó¦]…݆!Þ*ù<íݾÎeßË,§M hY[+.Ï{—xöe¦:bÃëkïëé^&Ÿ}™©æUêß*û™c°ùª#r¤OnD¾j^¥þÕå5Z+õï¢yve°RÿêÚ¯Ñ2X®«óc%¯Ñ2(}Bž]¬Ô¿ºök´ o}†¢A‹ü­Î ÛðŒP2öÅÌ×X)¼¨Øµ‚×&v¶÷u{–Õƒ6±k´>­Ì‹¯â ÈëñöŠK¼ýÃëZí®v±³»o¯1Ü¥åz/¯ä“#¸*LŒ×¾AŽÉi4j±þõuy¼æû}1=–Z-楶£þHІ×Ù×¼“8q¬\ºÕà ú“²|^s½šÂÉgE…ª'bCÖ<¡ÎúÒZÈèÈp@N ®äyû¼¢9_VCÊ[7PPs£Xð#Qk^ï²|SN æWž:Däê&­üÑÝSí’±ûÍš¿¨»EËpy\—Çåñ© c;p—'‡„æpTöD¤êï—SXäµyA7z•¥=À¶¼ºûŸ{Û¦T]˜š×kïS^5÷?ó¥·-ƒÓ Ëh•´¶<цgÌ—å–´0]a`…®)«ÉóZñ*õ~¤hl×Í,Ÿ×k)ÄF¢vï‹Íý\êg̽ʥ¢’V‘XÞõ­))kÞP-žh®Ï•2Ãè(‹B‹¦Ü>§j(ð eþTAˬü>3–"Á¤5ÏWµ}Úx‰oÎqJ*=+h…S·ÈÆnBÓÍ SuüeSS¸$2^©™ö%Xïz…)ÁVüõ\żëz6ôÉ.úC¸†8éwa3·“a'¥°O#¿ƒ¬0ûeÇ×a/aè Ä;ˆ ë¹ÇÈ÷ÁËÌ’­0ᜡހ«]þAàIÒŽ°Ï’CpŒÝJñ}qa29ë|Úެ‡aî6r#æzÙ7¡“4£ ò6ÿ¿À8„~ú}”§Ûñ÷Ï';‰ÒÐÿ‡˜W©Ã°þ ÷5Ôý.ÂÁ¬ËÅþv3Ï1¯£Ì7à•÷ö<¿ìº®än a¸Åñ¨Ë-Ì­d Jr ¥J?ý1Ç9?\Om`[)Ýá€-ôµü‹ð%æ®ap‘o;Ã…H:ÞDËsîû©’ÀìK’5x>M(”j÷-‡=ä1ô…HuÞ#Wˆ멦7Áí¼–Ú„~bÍÏà:ê/[Ñã¯1ÿŽÇkø§a«û.òpñnçÍp5u”¡`#V‰›0®6âÓ'ÑB˜.ðà*¶Hâyená»±Útþ:N¶ <·’=„À~´ÒyØÉåÈQˆrEÌ£6æ)r=LR?¤&0ž' ŒÓc•›r‰Î\ãü:¯GÖb6’ïaüEË„a3¹ŸÞãz¾éfÌè3è‘uÔ³ô,´»÷;ßš¾€¿§Ž¹ï‘{$°‡4sÆg7=I? {Úp²é úó ‚RO®‚½ÜFçóh“ ü °‡ÿ»i£ü:}õcØN^c~¼ã«®¿ƒõ­ ).ƒºlçîÅïç®À8ÙæzŽ¿¸¯ÛÁÏ¿KN =?ƒç[ O¿‚ùõg(m½k#Üž¿ýx¦¸§PÎ=¼‹>ŠÕæCôøœù4“VŒœ$“%`¿ŽEÙïÓÿ†µå,áaš{”DÇ#Ì/a“ãöl"ŸG©¢®—Ù[`+u?‰27ÓoÀ!.ŽJÜ_9ï€è‘÷ ÆÞÀýÖ6dÐÛô%úA8@ÏÍ=ƒ³Ò^BC‘ýO"b5´”"à<õMŒ|·} eÛKÝÜ;ÌMX‡±2_IŸwºÀ‰òŸ‡ëÙ7±.m"^²«ÖãH;äìvLbÝ{‹þÎö0(®3ä pò_d_‡ˆó6æ `hâ†VÇkÔ̈óK× _(èåŽñÿ ¿‘Œ¢5~Fž?s'» Ú8£z‘0ãf¸mćѵƒtƒ›ÛGBpµó¿ù.ü0º¸À 2UúV‰½ô 9޹ðÙ }®Gœ[1Nþœžš;ëê€uÜ´[°iŠüãóhó#¤ =Ž—¼Î-ôC˜Ë·“màr~ÏÂö»(ƒH^E[Ñd=ÆÿÆF£û³X÷] k™ÇÉ&¬ácÚIÖ¢$Ýüi’a¼þ´¹ ¨¯‹ÛLn@­ÿ…{sycf”û,Vi'ù-•…vò_˜ 1Œá>ˆ1rY¯4„Zq?Wò"%×ôûSð7>}œìÃÙ§—ùQSÄá#´Æ¤íc^AÝc.âêÇxvà\s€L¹óp5V·!ÎÆ\ lf_ÄJ5MŸãžÀ Üéðï±Q»n¾gü;ȷу0ßà\¿¶òÿßÎw¿gQ¦m_ÌÜs×™4IHï½NÒ+-„ÞA@TÄÝoÝwwm`Y@Q¬ØÅ{/¸® »bÂí•&½çÌ÷W|DZù!GŽ'Ïs—«œeæžÇvÀ ìTbÆ"zµè»vª±ãœ‹1ã‡`? §i•=Sg‘Ö³ôL|ö WzãÐû Ð/ý•Giò¤N!üžOÂ)g’6ˆÌHU =Ð$C±—²õ6ÉÝ+—S•þ3xÄ“ÙV))§Ãê=b_^È TD®ú3þ=6UÔÑœçÍNb7:÷S¤ž‰×Ûƒ8¤CáÔÓhÝZš+?G ˺Êuû”˜Žu8•¨õ2ÎCw”Êͨð1:³7WËàÒôuŸ‚œ&ñKÌ­ÀÛóØ(Bb÷4`?Ë6Q¿Ñy‹Æéd¨ÄF÷-žˆ¸mfÏb˜e³—K…ª—»56ÔË4ãN¡b:9^ꤶ‡•R$f9IóQ'šd9”äPæm¥yu}+»•z]Ï]Šz{ëLô²• }5{ì“ÃÀ×5Xst G^’ø9d-L}-ShÈý¹Nb,P3Ùdd<ÑÈR?[?S»Þi¦ó2>;øv€8 µ7¢§zPáéÀ´ñÀŸKœÕ”ÌÒùý¨Þ'ÝÁô³ÖH¨ ©¨Šoª˜T”ˆÕ0uti©zÒAñÞǺûzXÞ‹®,ð+¸q’–È¡xg±Yê¶“ëÉ)TUöòù!0ê»:g4>ÕiçƒÃ»d?ª+9mSÏÉ,*R7ÊDªð°A½éM›”ûLÊmþF+B¯õ¨×ØKÐóäTêE|ÑZ9)Dmœ :^*"¡Õðž6Ó™°áIijžGJÔÛQ#› žMÑI¼È߃nŠÆ££Ïîõf•겜šÄ>K£ûrçÉŒí’k(Ú7ÑT` 5Ëv=ŸÔ¨ù' ( %SGµrƒ³ ðë.è½éÎL‚ÎÓ+(Ú\‡ÿ¶˜tJ¼u±p¡iCÍʶ÷˜ïP3“‘D~ÆüNWÈ\D¦»ãÔì9r)>5[Û¤Øqë8ŽÅx}†þÑù‚B˜f_€³¦ þ¬2ë*߸ð;£õ;Ð]ðA¨Ò©ú ù;%éÛ¬JT¡Óg{÷êµ”§â÷ÒXk™ó)êm+»hyسÖ\„œ–ðdû¬‡a„“¡N`ä¹àYH~¨Ö¨åQTÀæ“¿(Cl›QQSÅ(þ%Ã_Ô]Ë1W¾|Ì›.¯’ŒÚt³;•?'ÉÝV0¶µQn_&¨ÂŽÄìõì‚5´€³$êd˜ŒóÝœ3ÝÍ¡¹Âl€¹Ì<~y«ÍÕs˜î½nkªüÝï(·s”g†X·R›Hpn§p¯ßù5œŠlŽ– ¨Vö³;ÌûÖæÛ¿Äß¡øTVHµ\DÖ|çI¨Ó\ôc†¸•ë“I~_‹T¾£mÌØ†Bu-‚Æžä´Ëï€'Íü}Jç'Ø èŒškîÑ)T"+•ê+÷änX¾]} 0Z–a=õr:¼ºãtÛ“¨ÞIʃæÌƒæoª”YyÀÌç røìø¤Mצþƒw…«…N;õÈõ Řzpw¤nÕ t¹<1f¯ n‡ª$pÇD• Å/·€Ñ²M¡ï)°ÂsÐI|! +L·³õß ‘î‚–˜N9†ÌGze+§Zçf³8¼ Štª“|kjýC•AÑaÈþ9ö2øÿ9úYM&ÇùA£:ue@‰é2:­Ç܆=3€87êßPÉ^."à8³ùe”e*P‘R€}$< ¡ƒV¢þ‡ËpŒïÞe¿TÜ)ò¡.8˜¢*7h?€O…˰þZý/t3eøT½Ëà [B²ä!ÔÆz}'j •6Ø“òmjTå0ê2ÇŠ]â ò;W¯q/E#>­êû-Ìò«ûª´C߈½XÓ ƒ£d;"9΋VEdÔçÎÃ`º â DuÛHùü߃~&ÿ†æTòwúÚ¿§´ÕÆÜöé‡ ¡j½Oíæw£ËÚøòG(¨nÓLÖp‚f¡N¢ªWà¿)ê~ë&¸üIöO è»ö»ÀÕÇtxM`G¡Æ&çåZ°ª|8…<çW35…(MA§„79ÿ-’˽ ±ß°7ÁÓ½ oRmo—'Á_iÞdzQýŠÎªR›ù)RÞ$v^ÏD•fº]Ø»cæA?§èÁôȵ¼¼‚î;ßnaÕTˆJhFÅf Zú埅h3ùÍ4/XŸC~(— ¿üë-@­“àPÇ[E®Yüï’;]ýÿ|÷!±¸ä%G«{¡¯ºå×n/"œŽ—·‰¨ÇYæE@ñvkÝ\‘.X‹‘‡»s« îµæ `f1úq¨¼ïYæÍT”¨ˆ$g¿x ªo4о˜U°ïá[÷ÛG(ÔY„1gªg¸@=»È‘/xÏÒh챘ó=˃»b?4à 5ÿýª#VŸ”£¡íçúª^|á}‰J°ðzš|`ÐIrÅqì´ú¹•ૈ™$OCQGA͆é^ëJ*bw¹Wƒm ÜÑÅ Ôâöq𳹆/P€ l'² v†²¡@ŽQº~ÞkÛ¾ä §ëeÝ }»ÉÌÄìÓúÞI1˜=A€|5ñíòu(ØI~6ƒë x–Ä>Šôêä£pÙ„Ú/+пãØ÷p”F>mçRˆ3‹¯ _'Ër'‚¦8Û¬Ùx%Ô{.ï^ ^’Cm÷`„ã`1yÃx”UˆxŒ­î݂À_—«¡{§Øgá1;Å•ð_r"6:,¦Äåtl°æ“´?²×7‚„û´ŽWZÍJtãCƒÅSÎO4\oðVÐ`uܬ‚Ígd¬ó8*d‹µ•RL(»Šôtq:¨‹*¡Á½–¢f¹üŸÈÅN®€faè»±âAd0(q½ù; y¿Y(n¥pµ¯ë³èëZd¡ÊyÔî Ýâuà•N¼’ eŸAÑÍ‹³ßY 9"Ê ÷¼ìPj)£JŠKœíT’©")Í€#æö¯r IáÁËÏ·zP±uâÖg¶ù×:¬Qüø¦Ál=åØËÌ4™yúcJt²œqˆm"¦ÏÝh$î1T—ònÒëà²ýkGEr?ê§Ò)÷4Öé{„Jv-PуiÃ難ÞɼHÝ ”> Ίuïö°ó=•›WåDŒPÊuþ¡?DÆàï+ØËƒø»QÎÛ™èJ®ã9Øiúu8Ó&U6!× DZKD.ÕòùV-ªås3’¼ßÀYŽ~Ϻ™Jã”`¾µ3Qá~ü{Äï¾vÒ"ЦɑˆpQpU¹šÿ>è4Ôû$Df úëpo°%R}f¢(ܹR„Q–·nº@î’¡4E_êc‘½•ßL¸5ÐÁ× úƒÂÄ)à‰cfc×9ºÎÝGqú1¨ÁJµÊL ̈õþµ±”bÍb P¾”è—tûN'”.E£iîj{ªâÖù6ȼ YdžÍcì3¨ ÿºw¯;ü˳­#”å,F”VèG1K¸¯¼¦°Ó‰âY¸rGv‚%{ÌV6-¸&y£ùJؘvº²4Af£ÇÈntb øt?I+ëd¼D~‹ ~†ÌŽ—¿âÓ¥FÄ*U7ÐDàv35š>èÞJù-*p$—æèˆ>İÛü6Ècò‘àJãQt±E¥Ì<ƒì—È"teŒ™…:]º¶ˆå6"²,"ÆÚ¿Q¼}†¿×°£ ×Ó¥:ù˜ºhy˜†‰³òyŠÐ÷³ãä2¯§ E‡S£È¶P3û™o&\ïÇËjð~àÐf³°Ó¾ÒÚ€õ!V 2 NvºSÏÛ(ï?Nî•n4´%–Ù)l&rq£u1œø\¬¹;P¡f&ê3Îݯ]êÖÇùÙr!òR'ö#zsTv:“+ulõ'Ì&Ž`–LqÒ¿ cÝ;€?yˆØ8u-œéU‚zNsöèw‡d$´ÜyˆùX¬– „}ô+¶ÃSDÃñ•êOÅÝ´Š=lÿ/e˜§Ïvû ½”¹ž?DÕâ´é£Ûp”<»•œ\gëT»õ×4Ý´¡V§™`´,kŸ¨B·^ŽWR¬¿9ø]ªk”¢T¨?žÆÈ÷0N£¬Ä‹‚»$=îb9Ÿ¢u94´—)FU¢rš™õ¡ŽZÿ'r…]¦¡ZrÌUÈr\à³ÄËP’y,œGBá,Å1b—ø¸Æù1I@¾ÆBËAueãSeºÜ:Qíƒj*Ƙ†ry›ïŽáËš¥t Mœû!dÖÜ S—kÞ¡2k›\…ü£.ÀJf`…9ò§+ ŸÍVƒ½ |îEU—º?é±T­^ƒ h€ÿmGÍ·‚‹ÓäN¨Ùz71Ì<ŽŒ¯@F¾ðï‹!w‹Ì%˜=Z–#ïÃÍü]'SÁzód›z#ßÏP˜Y«ROæÍ”­2}÷6ú":|,:Ô¯Ï2•­WQÅÿ»¾í=ÊG‘ç¤ AB®ò¯óèÃÈB¼ù‹õ41• Ô­Öµ¦€ÊàˆR²{!¼ X&Æ~yt£ø‘‡Q¾ã±žs4ÃŒÀ~kõuÐØC Œ•{|ŠvwÉÙ¨¨‘â:JVgQ-r>öÒ"ãô ¸ïµb5ë@¹0÷{ý •8æ[TH¤-ÖŸS”â”ZïÁ†øù²Îˆàíëc¬§Q-0½˜wšw•üJ”ÖªeÈc®i‚6–öDl»Æi¤¿AWŸ VýôpœÌÁhM`ÿJÆþ£¦ å»ázêX¥º Ñõ™¢(T÷@Uf°Õ¬‘ZT„ £Vçõ0ôÿÇúBDÀgä Õg¥"nw˰í)ÿ:»R.†…š§ž·2h0tT5jé5pÖX9ŒVÇo`ÏR½¨”{h‰—,vÑp1Yï@ LC äªbd¡€ïóŠH:/©ÄÝ‹œP™îP`×$18ã#y¬ÐxŽŒÀîú¡C€„ѬŽúx—Œ•ŸË«à•Θ°ßÙVÔãó)tã/jxç÷ß”‹~< ­{³õ aªqŽŽÙÔ«ŸR¹¨dpe™ú›ôï  `®ñê%Ôðp~Z@J [ÚÕOè r™î.¬j¿CtÁoæ¹õªJÏh!»Ùú*.ñY ÇjpþîµßãŒ4›-:à/B_Œ„ÇOC-=}žo†š¬ÿuð²ÂgO¡þÇ#/=j.\[·z^¾ êÔ÷òUè—H÷tY곋ºìCìfŠòÖòàßË*sdÙèÖvT`©|Q…SŸm_Ažžîäamå•TÉ¿b=Øé|ß•ˆÓà²pþ%O%î99¸wšÒÍÎ0ª1wRdâS)k°£ öäN³µ3s‚¢Ô}Ž‹~Y¯ßAO½âV`ïþ½­Z·:ë°†8ñ ûf™@Ó€ä]4Ølw³ÈñNó¿#§¥ÛM‡{9 ¨&àX¾¸a4qþƒ’_§&ä«HR‰wη¾ÑV±½‚ÒÔûˆp4ùYô‚ïFËM ÞÙÄÇð0ï:Ö ä<8è( =Úi¸.~À+ïc ì.{é`äFg¨š•ä%&ÊFD 9¸·ÕÊÞ²|¤ ´Ì7›€E¥b¯>U°Å9ŽYF«lèCÿjL8;è¾ ¥}#t¨PhìÉ|Öjn±ÞFÍ5R™|Ó}„’Ù7z”ê•êCRÎC: õÏåv"zÜí²(VŒôMÔ©^äôbÿ$€}ш–aîxá>»»ëwwÐ_ÁG#¡9æZªgCj ¼%\ìEŸ.n¤8]Ö0{Ø9ÑJÉTãJ¨ˆbïk1¢lxfÉ ú ùí@•(ýº£Uæ»ËVÿªŽ|Š¢cž¥~è«'€Ìe¥¡¬ß¾›BÝDÌRËSìlb!¶¼3¾TÉäÏèGóe¾ÌøWWºZm€–¥ˆX­3Ÿ=úlu¶RÔ‘MyÎ'Öpä:Ò?"×aél=Bqv¼þžk;?‡,¿dæà=s±ë±`ÒP(º^ÿþ—~¨[¦ß†Ë+ î Æhxçc`®<ù¦ù';èš¡ÔT­þ.1wœì§l§F’p¾S(Yl1WKçâSó…ÔÁu' \)buqKÇÈEæ¤ÓÕ´JµA×YœUãAÛ£¿!ûÏÁ§{2Eo {¨´2•D-uމËЃC¬…äÚ½ú'8‘KàóŒAw”©çQÛåvªÚF“X±›‰ŠºÛƒöÓ8W£¶d3”y–þyO—£ÕÝ´ÕÛŽz8 T,2o›Ùˆùo *¿ý8 u ¤í£Pñ‹};øÚ ãÕÎ+ºz¹$?¦ë’Ÿ…Ë'fÉØï ÙŠ*±†VŒF¨±aâ7J»UQ^pgªÔyÊ™œ‰ò¶S¸ÜæÞÜ8h3_GÙÁ/XÕlñ„†Ó„÷<…5kGêV»Ýщjlrž¦ç++—†òEV4’‡–ŽJ›¨¬ðàzò¥ê *j¢©eIT­rN';ϼ"¦ ½ªf¦„â¦9šÊÓ¬80E ƯԵà¬~~…˜CWç‘*õëðG®MØNüƒ€/x}štðÙ.÷G¹¸z•ìÚßîû\¯S.€ï«B¦’Lø"…‹ç€· Xa»”ˆóHý'+YxCö<ƒz¸©ÂÚ´’;ÉSËì_ýkËÞPºl~Ž*Ô(h˜D9Z *1»íXDïv™„˜wZë¨KU³ Æ7 :„L­F–óL¶ø’©³2 r*ðsÊqšå>Òé¥ò"ì7ÖÇ"5Úê%ů#w»Åò;ÔðWþµ;Ôª•ÙŒ 2’„•œ¦F/J®¤¡ªü>O¾/C(Ù4€‘ëàhÆ€…G©·€Baêhû+å…ÀXóŽÑ+é4ïÕëô*TE#kvó(^½¢ÒµD¿ÇÝgøï4‰§ˆÏHˆüŸ@ËÐAÿKƒÅn°*“Uˆ^¾8âûhÓf–Q·ø^øÄ›­gÈhò–ƒïü“Eõ¦ÛÝH!î5p íð¤M4•yÙY`ÝrÐ?1"Ó¡ëMªNG÷…cw‘p…§(ÎYö«wø÷&‚«»c¡»Z¡‘Þ„JéÚ'"¾¦š'g"2K¤m•ñ@€yÉVÛ­—I¨Ë¡CÊÌÅ2÷Og9㙄Ϻߤ ô¬*GŽA<«ô { ˆ3öf(áÁL nkÕùÈZtÅxš®ÎX™ˆÀ3@×±r€ÿ ¾»ÍsÑe~‡Ž³îQ ï¬Us-kìmÈàõ–¤{«@$c}BÑj˜:Nn£œv+F´ý»¢‡Izß9÷BœgÖ¢›²ÕÓˆÏ0Œ9ÙŒANkM±ðJ„/I6§ï ¡{“‚ÓqÕ¢@G€£áï•ò7ì±’=ÍN`¹ˆI¦œw™±ˆd·ò¹¸ž½…bœm²¼“ŒÄèóÙÈÝåÞt*‚Ö‚J­Îþ³Q„zõöΑ…4ÕGu ÝpY °­üC„IYª9-qŽ#CЕZ·Û÷Ú:QìD×øg³áNR‡&§`…?JèúƒhÄú·»Â3ÚØïxÙá¾ÿðK'þ1Š ±øe¢3X&¥Ê(Tàw‘}5‹2k?…²MN-m`£œÃÔ¤ž±ßG/ŒÎçê(‡Á¦è{ð±4Â\"Öq–Èbj†ž î¸ÈöBëÁaÍ6+±¯të¾ìsZ£fw2ô-×ÿú×™ F`¿£e=v4ÑÌ@LŠ5³B Þ‰Xø‘B^Mò)ÐÞë¬(¸†oÅ+V8ý¨Š4àÉVèÌÁ¼»¡ç+ÍÈH„:)/†‰Ñk B}2ÍÜõ0÷¤£ Q+ ™ã½»ø“ð °Â"sµœÌôϘ%˜fþté%z9ô|“WŒÚðGP»\ò#‰NI ¡Ñ;HÓÄó:ñܬî/|¦vR¤=HåS”,–WnˆÜ›ÈU÷"2½îv9Rt©UJ9úÿôˆfú íFžiÈzžzLÇþuàNs±û*6kës7A÷2q7ôj´iG.råÝÈlÌÁ ÇË_ns•~‚8ÿ=â@ŒÖ¥ˆQ?Iþ= ÃI`éns Ç¿ö2F–cåÜYÆ¿öï##]PŒ5”®ÓoiÖüu œºTÿYgr&гÕ^àÞ'çR‚~ ŒP#G ƒ3¡ Ï “1W—pÅÕè…oL<¥ñ=f¹À(EÃô>s¹|* xwžG‘f8ZødàdˆÜ ^›*ô2Eè¥ÎÓÔ(›³È¾dŒ<ï…aïÅz¯Edý«"j%üÑ,>IŒÆì½ˆÛbtÖ1ªrvz©¾£GçÐGcåÍîè‘s`½1æ8ñjyþ[©¦Ëµð8qˆç• ¤šb¯Sc¡УM0`ÿŸT%%ˆ=ÇɃö*‡CÜ2¶¹.V—/b´~ý+EÚ{PFüã‘Ùïc^ îv˜bäç} âM¨ÃÂà¾Ï,¶ÐŽƒß95O5¯£¿Òÿßs“ f|º´ÊúY¤Òënµú3 !ÙgoO¢Všñ­JOÁû¼§ÔÌk!×ePAçèRh£4žßÂQ“îL9•ºuµÜ¥çßñl6ûÇñ@Ñ£4½-Ÿ‹MÚ׋Á|ا᪡‘€6r *¿Ä[È÷‘V©¯ÉáwÉø\7ú¾¾˜s:_^,¤™ê~ “¡¨Þ¹jº‚˜ê•è/U/£)•¯gï€Å$vÝgÝ$Š¡ÿ/Dÿ–©µØo·Ú W8Ü܆­„÷à—~Œß.Q!‹ ¢ƒÍðþ¿½Óa}¦ªág_á×!GþÙ¶‰ÌÕãí=ì^8šZ'Õ~‰zZì®ÁÈ¡ð¿õˆp!ð|Žû71@ì±D¶ŒpÀ«†r(ƪæò¼G)48'#ç ’É;Ñw­"ÖOÅö³ú~d¹PçÓ/ƒÁãëÉÐlIú"½J©Ä¿bTl¡çõšo»˜é>.Èœ§ërž„*JF y‹íŸ9÷ïDÔX:/@ý[.¡þ ”ðr¦ÅÿÒ}ò)k=…Áï´@mzP§žzË,¡U`¨**WgÀk‹á;Êi–8ƒh,ÒOú÷˜À‘¨sÑËÖKá[åÛƒ>¦Ä¡ úä:èá.¹óÆ:o¨hàvÜ–£„ŠèÝ"ž§x»BÞŠ^ÎóïÃÊlD O0áTêŽtká8„8@U®k/Doî1c)ÂzP­¢|Fú]ì΃Æcr ÆpëX¢ý!˜n 8{?„-‘4{Áémv{Ѷ}T1c°‡/±¾‡rž%ý»K+Ì@pöÏ×ÿ_[OP.ÔÚXTÎ Í‚sõuæßðѲÃ?Sg¦CëŽNð–kî~m3 Þ_Š|ö4ê¿¥fÕ/8 …–»€”=Âù Ýz…ÈþWÉ\Ê Ø*I•£n]tÖ 0=`«* hÔï·²½ïßÑ.ÎböZ6UL¢x¾Khÿ¤º:e@³M_«@³‰&ñ9œ!ÐSmÐÝP• æddjCÊ©èÜ~xù\ðiÖßÇ/²N‚Y[áWØœ„]§Ûäï² øšÖpàžš0æ$¶X¥únH| -៲6÷É÷0ï;V Ôr”8Š|%¨Ñ^>²|™•ˆß[P·³T†Œ¢*JìÊõÂ¥rû e“Ná–ºçàjäYh¤4(j ŠÅ@9·AÅBñ¾e_OZwºÏ 'Ðã9|;I 8°Ÿ†ëUîMÀº ŠQ¨ý®ë@©Vb„Tý€s>äwjÐMµbž½yFÆÙƒÄì!z2ÆO’áTÍî·¾¡Lk:"Ê^Ë,D`)”X·µPb¸ž#´X+Uð¶¦$+óé&³Ö¿g$¶{ÿ/ô¢+ëø0‘ý2Ø<ÞLuGAÇzÈi®ŠG/gç(Ü(<"%0d¼hÕ…¨Š{¹FþhýôðPiõü)µŒ8ƒˆÍ¿ëÓÀá"Ì5ŽÒ¾wVèÄBµÙ\| D-³ ù‹P1ìnªÖwj›"ø½"=ë?¯Ô`žsç Ú¿1µè¸;øy”mýʾFd rRœåÎ ö˜䟴÷À9òऺ”¯°té~ Í™'/òï"`¶ZïÝ€ÿVg«Q±ØªªO¦!_úvàö_T °kˆ~:6Zî| G°b=©Ö@ýv¢ËŒ>†|ÕO ±Î~¬êÔU©é÷ïÇ©&C-l’<€Œ„¡sT ê¶"8§1Tmp¿‡sù¯Ç,¹v<ÂN¨£(Ýå|¶]ã¸øEÔüP7]ĸõ\϶!nEöÏŠ öÿìÜäúønËF¦Îó=£5Ôã^Ì ÀË ³ž¹S Ÿ>58™ˆÑ¨_ Xq1vZëÎ.%wsݧäb* ®%ªaò ÿBñ …뻬 èˆ3â Ôð¿ó:/Ë´P”×*‚¯¯7 b_óêÉÏA‡ÔÏec.ÿjj8þÁÝ·>g­xÑ6Ð3CàƒŽÐH¨Özʃ·ÂÄá£eºfÆaõT£÷Àw,r÷ÊYPDþŸyÌmÄh¾ŽÅ_Õ‚ÒÅ ³€¶t ŸT¯S˜ˆ‘ÏS·(õïJJõåsá»D¾Ù+ãÿælAˆ‘æßPÑ^Õ9qüS(¨ m‡s›ÞI®¾ ÙoEGB6÷X‘à‘±Xg-pïjòv½€mP··c±Óø;‹ze.Ô{†ÙbÆaömð =úh‰J¯B”Ñhhïߨ$8ÿ0ÕL ÌÕ¿ sù¿ppÊ“¼†Úç§°Bÿü^Kp]7ϛ϶’Æì Ô\Q™©¥OcBlþ7ìýQÏ ¿›€´áz4^6ÿMl P^` ¼ÀJ|ªF½c}†þ/)Í]ÀlþîEUGR½®1c€‰ˆv•LDvf˜LŠ÷Ì¥´ÜÚ"w!/{tÔàùXÏLñªxîØ¿»Z¥âX&Pñ¾A/泜vŠäYnb5ßìNHQG¡mÆèX§g%£¯7ù—^ …óoÝÈšB©ÍcaÔÁzy:2Ò H2“€åÞmêE©í2™zù ~Á|ož"¡òh‚~ŒÏÊò¯{4#ž-¤í ]Ü„z«/Xo"…üAt_»Ì¿ûOäaün0NvÚ!çBùþ ã{ÿ€:húi¢<µéÉmÈÂj} Ý.>G•îtÓ@¡¨íTï­g§ÁõÓàšãu¦í+ü•æ8¯¥ˆíx} ò¾PAá"U¨öZ™1èr N™¬ö“«\OöÏ]ž ®Àæ©p.ÇÁ_3Á¹¦h•MÞJ¬=ë ŠÑ¹OíœAÄÒÙAðþ=Á (§tÏ nCÙbø3à¦(}ÙoÓ½Ø{“Ïýçþìà™ˆ¡ÎóTàíw¢[×b9nŒ›GáêVðB¼ü øŸ¢ßáýpyc­×ó €!Õª 0|zˆRY>ûþ²LAýÜé?É躬u»PEÒ$w“ZM±pâ'ànŽ©‡ü9˜7Jæ,\¶ÅŠP«ñàú!&DÖQ¶LB§©:ó´Yœ³³DùçÊœ/¬8pßÓº}]íᮎå§é¬#üFø ûÁ¿7»žú‰bÕëþ© =Ê'FÆ€ZÜNM1¯º÷‰„¢wšåq÷ tài÷ x%ÿ<ÏYÙ§Èïy/1ž`lT…ÿlW›óOö…xmŽ Dj–F¢ÒÎÒ4ûfh<Á³Íôþ|‘OkM.°b*²|ަY¹Àm¼r©|¿+½85yïA½ÍR“ýû¶êUÔóPÓ‚Ù õ¨ëZù’ó317Ùýö¾=ê}¥î%¡¹Ì¢yº7BÙ:f%5ñ=ŠrÙ€3…¢dp¯>$S%¢»›N]Ö)>ÕŸË.X–øÏ´š_T \Òdü·Ð´oÃe.^¯Ù<=»Ilºú UŽÚ; L¾\Sƒ¿Q›'à¿ÊQEì ûþÎöŸ©d»­§¡¾ä»»wÝEÐxy¶}æOìsÄÙg“Fdð$ð?u8ŽÉ†¿„ì’©˜+MÞ€þm·/R¢E‡F³~{zsŠßÝì2ÿôµµXþ@ æKÙ ÞlƘ±b¾×G1æü7ÍT»@æ[ä0êcÉöLÊsÇA ÔÂ/ ¢ ö:³ˆjUŸLÅVx¶*x–$ošÅËèÊirzmp¾‚º<’‹(ÃìLCöý§*&ÉO¢ÒâQiæœÂëŒÉÃЇ‡ä…ÐÒ¾J·pB_@ĺÌmö¤àæQxçl€ÔÌ(Ê4÷¸ÓH:³€cÙz°ê n^ÇVÒ4QƒÑüxŽ6ú®v‰,Á˜Eú2½h0Áì¥=ÒɆ²òïgÍ3B0Zæ:à¬÷#hø~ÛMmÞ\½,@côšý1_ ïæJøÉŽš­æWÀo&£k*í1ò8°ÿÿ`Þé{óÅòz¸°2ä¥À»H] ‡˜ï</Ölßíô<ŒÆøoðGþ]¤0×Qj5ßʉÈCeæˆ!ÀÌ¿ç‹Ù|ùŠ5—A‡t˜\✅’Pƒ­†`UæRí?™èßgY*ÎùχÂoV¡bw ú+fŽ”[¡¾šÌçΊÔCô˪¾‡¹Up[#uæÍ„ö«DŽú|®JK½êKV\3;d–ßéb°¸•BÔz÷5Šƒòÿò"¿6äFlŠs;úz ¸ %Pq£YŠýõ³‡å DÀv/>Ìî5°f¦½;±¶ó“/#‘¯\­ß zõ–¹ŠÂÝó…°ól‡Šu‰†Ï5gM ÜÐm¨ÞžÇ†“´ZUEó ê5*RK±æ"U¥7Ògj8$Pûãä5OF¿tÿ.U2Iñb¢µèú-¼-ø5™¤×E.Ÿ®·—lÿ=C=¿â¼D)îj òë@o²*·ÿ Ø­vÛdþÞhÆy3¿Xê;_W»×wKÑDÏ5ÝÁId޵,“¹˜&ºÛÌÕ4ܹ¹PÎ]nùks/Õ¹§åLjp¯A扫õ¿ÁžÑÁs‚³âW!§-PÚ.4ÉϲãmêøßMÃÕ¢à šéj€êô²˜Ô9š<³çºäÔf6¢®’ù'V"ʼn×Ðju ^&õÖIÙÞf'É?ŒªhUfЫð¼%æAÐü`^½CF“2뱋,q!ß‹÷4Šgàܵ³‘_õ"M*Pn‚øÕ? Š0ûl¸?®5{”­k¡½sÄBÿ¤7ŸæŒB×D{ëd>ßAÉð&ÙÐá;Ä*1e*:ù;0r¿ª’¡PÔ»«1sä$(„2oÜG!>;EƒèÕ‡ý'J‚ç£]•ƒ5´€ï?Ž‘ip¾“ Ê†ó—,ÿiÍ_äR*sŠQ áì*½Š²‚:,—íì(ã3ÌØ£wOrôsîixüÍ÷èÓå>豘«o·ß¡ró˜ÚDFÍ—I@KÇÿþ{%.8ONÇß±ìtÄðàþË -øÔM¤|ä±Y» š­“EÚCÝÍÆ¾†ªëDp&O$SuŒkFãS)êQ™@õ6³ÿ h“Ê›U. qö³7PcU¨„>tq|>p²Ê­ÖCçBí7ØGíçñÜ1&8÷Þ$ŠUÝ VÚOs¤Ò‹(™½$©frºo‹þ„¡u;À8þì|æ–£ëý»$ËÍn¬g¢Û+§Qµ{“ÓGÜIqgƒ+ðÎ ñ#Äë_ËùèŽÿcïÃë‘ÈH·)g'Qiüv êuâq¿­Mò4*dœ83LVS…^Ʀ³;©Ø™h-‚·U“쾬.Ÿ^('ûAwD;[Ý$í…º=ëŸØl4#Å T¦¸–,8!6Xýή¥9æO² ¯ßw_i_Ë6S‚7\¡1®ðOÁÉs¨«9á0-‡Pá=î<]DkÀq'—v¬¿*n(2¾ÉJ#íu°UÀÏ/äyÈøf¯µqñ#-CIØÝ Ì;MÆSªØg·SRpæ0è00\D¥2ú¡A¼Ï¿ÂhùêJ·>Âÿ>óÔÕêrRn5¢êÈùê*règ¡x¯ã˜k8Ž«"ëv¸ƒ 9jŸÊ”ûEÞï? Þ5”’ÆGÞSíQT­ß@ÌûÝ~àO´œ‰¼7©°_ÀY½âoµ–æDY×Sš…*gº íÛìÃ:t2RÏOzþiçDÿ{'Ø6ëK¡š4§h÷*~7¼Û|ý-´–-±É}–eaã£Ý ð\ž9ÃÎBÑ •9`üÙ, ½ÀÝAY,˜®ø‡`·¥þ½9Ó‡Äbï3êÔûý§áÀ¡¾>ß nÊ êÿ8Üñ_xs»>×?IÅÞò<†w^ošÀwŲ +ožXŸÇÏg¾c]NYžÝGEâòèˆ.+3ºN#…©=Øûw\Æ}=ïЯ€q.ð»O—b)º«JvcåÊkߊŠÚÏŽÐPý k§\UmôïH(ó<ë>8è§ßɤ$ïŸ<‰IÖ‹˜×?¿Ôf] ~äf’ù†Âø§v95˜'© 1ö©Ì„ûߔ垔K ÖVØàœSPËÿÖ‚‚ß2í,ç>ÄáC¹…8ö8%™z Ìx¸’‰¨Æïg`ÝFtDºþM~@Iü´ý U«b;T´ÿdúXøý6*{¡êÛõõ¨ó3ÁÕ¹h䢜»‘9î_Ñ5¡¨±6Y„¬ôüïVV‘+‡ðu´L_íÍGû¾¯[Ý+¯¦(· gŒ1ë‚g²Õóè£g3T}¸ªàÿ¡ù|‡5=> R©Lþ•ßšÜÍ\#6¸oÑç7犞…\«™áÚÐê-úWµœF8)Îzøñ±ØEbpÚœ8†½Dšvôþp·³·ê‰à¾Áú*hÑ™€ÎMvžÕ4 ¦{ À„ùâJR7rT Ÿný ä?ŒŠPozR˜ìSs(–wX¡Æý³ý)Öë|.ÖsŸ\LåÎn*MvËt/x6_Ö“ÐÖÓH³/á XðTr§| H[®™„ !y±´ÉDHèãWNMðÈIP,籯bÁ#ƒÓþEv‡úxÒz›…L…â:Ê7Cçø§/’dxˆ\/×9Œ}¯y–§3\? Ký§‡íCŸ¶™üw4F«°¯Úä»ï9÷ä;àÊ+ùz(±{ ´K¼ÿðÀy!–Pwð](‰â ÿd»¹«*2&øWK²Í÷þ÷©thÎhZ("ý 4óP¾ÛzñY¾h±/fŸAÏ<‚ï¬`£aòtÐTûfUÜ; ~Œ¥BÓ‹÷§cýa4Œ}÷«ÛŽ÷¸øÛÕóU:%Ía”<û“…_<“•&¯7kQÜOã”"2)ËÝ ?nŸ@]ÕW¼g‰æ™8¿ÙœGúZ•Ø ^ãö;|°ù'“ÍFûEdd¯žŠº%µ†<»GýJ®û‹%eg;k(^-ÇÊk9·wCqÅ[³ C€o³Àþ'ü—£ç«ëM\gv:!øæ„d5RñŒ~Ï‚C©æ*Ì2<$R‚…Eµ÷Eè ‚«¯úN“'ðïiÀt£Î“y§y}à•ó|ø÷pó¶OY]ÉŸú¾•„s¡^ì&ÇQ ’]‡8gƒqêÍZ¼Ò%N9÷C'/B”2õ^ðu–÷†¸Ü:SúÏûT£;:ÐðVŸùWÌ[r<<Å_gß.œQL”Å ~œ+ å:0Ât³³dÒþûóߟÿþü÷ç¿?ÿýùïÏÿW?ÿÊTo@’Astro-FITS-CFITSIO-1.10/examples/image_read_pdl.pl0000644000115400000360000000451510506004065020250 0ustar rpetehead#!/usr/bin/perl use strict; use blib; # # Read FITS image, unpacking data into scalar. Make a piddle and # display the image. # use Astro::FITS::CFITSIO; use PDL; use PDL::Graphics::PGPLOT; use Carp; require "check_status.pl"; require "match_datatype.pl"; my $status = 0; # # open file # my $file = @ARGV ? shift : 'm51.fits'; my $fptr = Astro::FITS::CFITSIO::open_file($file, Astro::FITS::CFITSIO::READONLY(), $status); check_status($status) or die; # # read dimensions of image and data storage type # my ($naxes, $bitpix); $fptr->get_img_parm($bitpix,undef,$naxes,$status); my ($naxis1,$naxis2) = @$naxes; my %read_funcs = ( Astro::FITS::CFITSIO::TBYTE() => \&Astro::FITS::CFITSIO::fits_read_2d_byt, Astro::FITS::CFITSIO::TSHORT() => \&Astro::FITS::CFITSIO::fits_read_2d_sht, Astro::FITS::CFITSIO::TUSHORT() => \&Astro::FITS::CFITSIO::fits_read_2d_usht, Astro::FITS::CFITSIO::TINT() => \&Astro::FITS::CFITSIO::fits_read_2d_int, Astro::FITS::CFITSIO::TUINT() => \&Astro::FITS::CFITSIO::fits_read_2d_uint, Astro::FITS::CFITSIO::TLONG() => \&Astro::FITS::CFITSIO::fits_read_2d_lng, Astro::FITS::CFITSIO::TULONG() => \&Astro::FITS::CFITSIO::fits_read_2d_ulng, Astro::FITS::CFITSIO::TFLOAT() => \&Astro::FITS::CFITSIO::fits_read_2d_flt, Astro::FITS::CFITSIO::TDOUBLE() => \&Astro::FITS::CFITSIO::fits_read_2d_dbl, ); # # This does not take into account BSCALE and BZERO # my %pdl_funcs = ( '8' => { 'pdl' => \&byte, }, '16' => { 'pdl' => \&short, }, '32' => { 'pdl' => \&long, }, '-32' => { 'pdl' => \&float, }, '-64' => { 'pdl' => \&double, }, ); exists $pdl_funcs{$bitpix} or $fptr->close_file($status), croak "unhandled BITPIX = $bitpix"; my $cfitsio_datatype = match_datatype(&{$pdl_funcs{$bitpix}{pdl}}); exists $read_funcs{$cfitsio_datatype} or croak "unhandled CFITSIO datatype = $cfitsio_datatype"; print STDERR "Reading ${naxis2}x${naxis1} image..."; Astro::FITS::CFITSIO::PerlyUnpacking(0); my $pdl = $pdl_funcs{$bitpix}{'pdl'}->(zeroes($naxis1,$naxis2)); my $nullarray = byte(zeroes($naxis1,$naxis2)); $fptr->read_pixnull($cfitsio_datatype, [1,1], $pdl->nelem, ${$pdl->get_dataref},${$nullarray->get_dataref},undef,$status); Astro::FITS::CFITSIO::PerlyUnpacking(1); print STDERR "done\n"; $pdl->upd_data; $fptr->close_file($status); check_status($status) or die; # # have a look # imag $pdl; Astro-FITS-CFITSIO-1.10/examples/check_status.pl0000644000115400000360000000103507453375513020026 0ustar rpeteheaduse Carp; # check CFITSIO status sub check_status { my $s = shift; if ($s != 0) { my $txt; Astro::FITS::CFITSIO::fits_get_errstatus($s,$txt); carp "CFITSIO error: $txt"; return 0; } return 1; } 1; =head1 check_status( ) $retval = check_status($status); Checks the CFITSIO status variable. If it indicates an error, the corresponding CFITSIO error message is carp()ed, and a false value is returned. If the passed status does not indicate an error, then a true value is returned and nothing else is done =cut Astro-FITS-CFITSIO-1.10/typemap0000644000115400000360000000441210433123126014556 0ustar rpetehead TYPEMAP LONGLONG T_IV cmp * T_COMPLEXP dblcmp * T_DBLCOMPLEXP fitsfile * T_PTROBJ_fitsfile FitsFile * T_PTROBJ_FitsFile logical * T_LOGICALP byte * T_BYTEP signed char * T_SCHARP unsigned short * T_USHORTP unsigned int * T_UINTP unsigned long * T_ULONGP short * T_SHORTP int * T_INTP long * T_LONGP LONGLONG * T_LONGLONGP float * T_FLOATP double * T_DOUBLEP char ** T_STRINGP char * T_STRING byte T_BYTE signed char T_SCHAR logical T_LOGICAL float T_FLOAT OFF_T T_OFF_T INPUT T_STRINGP $var = ($type)packND($arg,TSTRING) T_COMPLEXP $var = ($type)packND($arg,TCOMPLEX) T_DBLCOMPLEXP $var = ($type)packND($arg,TDBLCOMPLEX) T_LOGICALP $var = ($type)packND($arg,TLOGICAL) T_BYTEP $var = ($type)packND($arg,TBYTE) T_SCHARP $var = ($type)packND($arg,TSBYTE) T_USHORTP $var = ($type)packND($arg,TUSHORT) T_SHORTP $var = ($type)packND($arg,TSHORT) T_UINTP $var = ($type)packND($arg,TUINT) T_ULONGP $var = ($type)packND($arg,TULONG) T_INTP $var = ($type)packND($arg,TINT) T_LONGP $var = ($type)packND($arg,TLONG) T_LONGLONGP $var = ($type)packND($arg,TLONGLONG) T_FLOATP $var = ($type)packND($arg,TFLOAT) T_DOUBLEP $var = ($type)packND($arg,TDOUBLE) T_BYTE $var = ($type)SvIV($arg) T_SCHAR $var = ($type)SvIV($arg) T_OFF_T $var = ($type)SvUV($arg) T_LOGICAL $var = ($type)SvIV($arg) T_FLOAT $var = ($type)SvNV($arg) T_STRING { if ($arg == &PL_sv_undef) $var = ($type)NULL; else $var = ($type)SvPV($arg,PL_na); } T_PTROBJ_fitsfile if (sv_derived_from($arg, \"fitsfilePtr\")) { $var = fitsfileSV($arg); } else croak(\"$var is not of type fitsfilePtr\"); T_PTROBJ_FitsFile if (sv_derived_from($arg, \"fitsfilePtr\")) { $var = FitsFileSV($arg); } else croak(\"$var is not of type fitsfilePtr\"); OUTPUT T_BYTE sv_setiv($arg, (IV) $var); T_SCHAR sv_setiv($arg, (IV) $var); T_OFF_T sv_setuv($arg, (UV) $var); T_LOGICAL sv_setiv($arg, (IV) $var); T_FLOAT sv_setnv($arg, (double) $var); T_STRING if ($var != NULL) sv_setpv((SV *)$arg, $var); T_PTROBJ_FitsFile if ($var != NULL) sv_setref_pv($arg, \"fitsfilePtr\", (void*)$var); Astro-FITS-CFITSIO-1.10/util.c0000644000115400000360000005605211424127421014307 0ustar rpetehead#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include "fitsio.h" #include "util.h" /* newSVuv seems to be perl 5.6.0-ism */ #ifndef newSVuv #define newSVuv newSViv #endif static int perly_unpacking = 1; /* state variable */ /* * Get the width of a string column in an ASCII or binary table */ long column_width(fitsfile * fptr, int colnum) { int hdutype, status=0, tfields, dispwidth; long repeat, size; long start_col,end_col; /* starting and ending positions for ASCII tables */ long rowlen, nrows, *tbcol; char typechar[FLEN_VALUE]; fits_get_hdu_type(fptr,&hdutype,&status); check_status(status); switch (hdutype) { case ASCII_TBL: /* Get starting column of field */ fits_get_acolparms( fptr,colnum,NULL,&start_col,NULL,NULL,NULL,NULL,NULL,NULL, &status ); check_status(status); /* Get length of each row and number of fields */ fits_read_atblhdr( fptr,0,&rowlen,&nrows,&tfields,NULL,NULL,NULL,NULL,NULL,&status ); check_status(status); if (colnum == tfields) { end_col = rowlen + 1; } else { tbcol = get_mortalspace(tfields,TLONG); fits_read_atblhdr( fptr,tfields,&rowlen,&nrows,&tfields,NULL, tbcol,NULL,NULL,NULL,&status ); check_status(status); end_col = tbcol[colnum] + 1; } size = end_col - start_col; break; case BINARY_TBL: fits_get_col_display_width(fptr, colnum, &dispwidth, &status); check_status(status); size = dispwidth; break; default: croak("column_width() - unrecognized HDU type (%d)",hdutype); } return size; } /* * croaks() if the argument is non-zero, useful for checking on cfitsio * routines. */ void check_status(int status) { if (status != 0) { fits_report_error(stderr,status); croak("cfitsio library detected an error...I'm outta here"); } } /* * Is argument a Perl reference? To a scalar? */ int is_scalar_ref (SV* arg) { if (!SvROK(arg)) return 0; if (SvPOK(SvRV(arg))) return 1; else return 0; } /* * Swap values in a long array inplace. */ void swap_dims(int ndims, long * dims) { int i; long tmp; for (i=0; i= 0) perly_unpacking=value; return perly_unpacking; } /* * Packs a Perl array reference into the appropriate C datatype */ void* pack1D ( SV* arg, int datatype ) { int size; char * stringscalar; logical logscalar; sbyte sbscalar; byte bscalar; unsigned short usscalar; short sscalar; unsigned int uiscalar; int iscalar; unsigned long ulscalar; long lscalar; LONGLONG llscalar; float fscalar; double dscalar; float cmpval[2]; double dblcmpval[2]; AV* array; I32 i,n; SV* work; SV** work2; STRLEN len; if (arg == &PL_sv_undef) return (void *) NULL; if (is_scalar_ref(arg)) /* Scalar ref */ return (void*) SvPV(SvRV(arg), len); size = sizeof_datatype(datatype); work = sv_2mortal(newSVpv("", 0)); /* Is arg a scalar? Return scalar*/ if (!SvROK(arg) && SvTYPE(arg)!=SVt_PVGV) { switch (datatype) { case TSTRING: return (void *) SvPV(arg,PL_na); case TLOGICAL: logscalar = SvIV(arg); sv_setpvn(work, (char *) &logscalar, size); break; case TSBYTE: sbscalar = SvIV(arg); sv_setpvn(work, (char *) &sbscalar, size); break; case TBYTE: bscalar = SvUV(arg); sv_setpvn(work, (char *) &bscalar, size); break; case TUSHORT: usscalar = SvUV(arg); sv_setpvn(work, (char *) &usscalar, size); break; case TSHORT: sscalar = SvIV(arg); sv_setpvn(work, (char *) &sscalar, size); break; case TUINT: uiscalar = SvUV(arg); sv_setpvn(work, (char *) &uiscalar, size); break; case TINT: iscalar = SvIV(arg); sv_setpvn(work, (char *) &iscalar, size); break; case TULONG: ulscalar = SvUV(arg); sv_setpvn(work, (char *) &ulscalar, size); break; case TLONG: lscalar = SvIV(arg); sv_setpvn(work, (char *) &lscalar, size); break; case TLONGLONG: llscalar = SvIV(arg); sv_setpvn(work, (char *) &llscalar, size); break; case TFLOAT: fscalar = SvNV(arg); sv_setpvn(work, (char *) &fscalar, size); break; case TDOUBLE: dscalar = SvNV(arg); sv_setpvn(work, (char *) &dscalar, size); break; case TCOMPLEX: warn("pack1D() - packing scalar into TCOMPLEX...setting imaginary component to zero"); cmpval[0] = SvNV(arg); cmpval[1] = 0.0; sv_setpvn(work, (char *) cmpval, size); break; case TDBLCOMPLEX: warn("pack1D() - packing scalar into TDBLCOMPLEX...setting imaginary component to zero"); dblcmpval[0] = SvNV(arg); dblcmpval[1] = 0.0; sv_setpvn(work, (char *) dblcmpval, size); break; default: croak("pack1D() scalar code: unrecognized datatype (%d) was passed",datatype); } return (void *) SvPV(work,PL_na); } /* Is it a glob or reference to an array? */ if (SvTYPE(arg)==SVt_PVGV || (SvROK(arg) && SvTYPE(SvRV(arg))==SVt_PVAV)) { if (SvTYPE(arg)==SVt_PVGV) array = (AV *) GvAVn((GV*) arg); /* glob */ else array = (AV *) SvRV(arg); /* reference */ n = av_len(array) + 1; switch (datatype) { case TSTRING: SvGROW(work, size * n); for (i=0; i=0; i--) { if (places[i] >= dims[i]) { places[i] = 0; if (i>0) places[i-1]++; } else break; } } free(places); free(avs); } void unpackND (SV* arg, void* var, int ndims, long *dims, int datatype, int perlyunpack) { LONGLONG* dimsll = malloc(ndims*sizeof(LONGLONG)); int i; for (i=0; ifptr) #define PERLYUNPACKING(perlyunpack) ( perlyunpack < 0 ? PerlyUnpacking(-1) : perlyunpack) typedef char logical; typedef unsigned char byte; typedef signed char sbyte; typedef float cmp; typedef double dblcmp; void * pack1D( SV * arg, int datatype ); void * packND( SV * arg, int datatype ); void pack_element( SV* work, SV** arg, int datatype ); void* get_mortalspace(LONGLONG n, int datatype); AV* coerce1D ( SV* arg, LONGLONG n ); AV* coerceND ( SV* arg, int ndims, LONGLONG *dims ); void unpack1D ( SV* arg, void * var, LONGLONG n, int datatype, int perlyunpack); void unpack2D (SV* arg, void* var, LONGLONG* dims, int datatype, int perlyunpack); void unpack3D (SV* arg, void* var, LONGLONG* dims, int datatype, int perlyunpack); void unpackND (SV* arg, void * var, int ndims, long *dims, int datatype, int perlyunpack); void unpackNDll (SV* arg, void * var, int ndims, LONGLONG *dims, int datatype, int perlyunpack); void unpack2scalar ( SV* arg, void * var, long n, int datatype ); void unpackScalar( SV* arg, void *var, int datatype ); void swap_dims(int ndims, long *dims); int PerlyUnpacking(int value); int sizeof_datatype(int datatype); long column_width(fitsfile * fptr, int colnum); void check_status(int status); void order_reverse (int nelem, long *vals); void order_reversell (int nelem, LONGLONG *vals); #endif /* CFITSIO_PERL_UTIL_H */ Astro-FITS-CFITSIO-1.10/TODO0000644000115400000360000000016206633020214013643 0ustar rpeteheadfits_calc_rows: should be calling fits_test_expr fits_read_keys_TYP: do we want to automagically return all keys? Astro-FITS-CFITSIO-1.10/Makefile.PL0000644000115400000360000000202411706066225015135 0ustar rpeteheaduse strict; use warnings; use ExtUtils::MakeMaker; my ($inc, $libs); FOUND_IT: { if (exists $ENV{CFITSIO}) { $inc = "-I$ENV{CFITSIO} -I$ENV{CFITSIO}/include"; $libs = "-L$ENV{CFITSIO} -L$ENV{CFITSIO}/lib -lcfitsio -lm"; last FOUND_IT; } if ( eval 'use ExtUtils::PkgConfig; 1; ' ) { my %pkg = eval { ExtUtils::PkgConfig->find( 'cfitsio' ); }; if ( ! $@ ) { $inc = $pkg{cflags}; $libs= $pkg{libs}; last FOUND_IT; } } warn("CFITSIO environment variable not found, assuming /usr/local/cfitsio\n"); $inc = "-I/usr/local/cfitsio"; $libs = "-L/usr/local/cfitsio -lcfitsio -lm"; } # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'Astro::FITS::CFITSIO', 'VERSION_FROM' => 'CFITSIO.pm', # finds $VERSION 'LIBS' => [$libs], 'INC' => $inc, 'DEFINE' => '', 'OBJECT' => 'CFITSIO.o util.o', 'clean' => { FILES => "testprog.fit testprog/testprog.fit testprog/testprog.lis" }, ); Astro-FITS-CFITSIO-1.10/INSTALL0000644000115400000360000000352212154150461014212 0ustar rpeteheadNOTE: Astro::FITS::CFITSIO v1.10 requires cfitsio library version 3.34 or later. It can be obtained from http://heasarc.gsfc.nasa.gov/fitsio NOTE: gcc takes a very long time to compile CFITSIO.c (created from CFITSIO.xs) with -O2 optimization. With -O0, it takes about one tenth the time. This is the explanation for the optimization flag below. 1. Makefile.PL needs to know where the cfitsio library is installed. If the ExtUtils::PkgConfig Perl module is installed and the cfitsio.pc file is installed where pkg-config can find it then the library will be automatically discovered. To test the latter condition, run pkg-config --libs cfitsio If this is not the case or you wish to override the pkg-config cfitsio metainformation then set the CFITSIO environment variable pointing to the location of your cfitsio library and headers (e.g., /usr/local/cfitsio), or a prefix with include and lib subdirectories containing the cfitsio headers and library, respectively (e.g., /usr/local). $ CFITSIO=/usr/local/cfitsio # Bourne shell and variants $ export CFITSIO % setenv CFITSIO /usr/local/cfitsio # C shell variants 2. perl Makefile.PL OPTIMIZE=-O0 3. make 4. make test 5. If you want, compare the output of the testprog/testprog*.pl scripts to cfitsio's testprog.c. There is a small shell script - "runtests" - included to make this easier. 6. make install If compilation fails, please make sure the version of cfitsio you're using matches that listed in README as a requirement for this version of the module. If compilaton succeeds but 'make test' fails due to unresolved symbols, you should try explicity setting the libcfitsio.a to link to. In Makefile.PL, add the following key to the WriteMakefile() argument list: 'MYEXTLIB' => '/path/to/libcfitsio.a', Astro-FITS-CFITSIO-1.10/testprog/0000755000115400000360000000000012154152345015031 5ustar rpeteheadAstro-FITS-CFITSIO-1.10/testprog/testprog_OO.pl0000644000115400000360000020101011055057100017614 0ustar rpetehead#!/usr/bin/perl use strict; use blib; use Astro::FITS::CFITSIO qw( :longnames :constants ); my $oskey='value_string'; my $olkey=1; my $ojkey=11; my $otint = 12345678; my $ofkey = 12.121212; my $oekey = 13.131313; my $ogkey = 14.1414141414141414; my $odkey = 15.1515151515151515; my $otfrac = 0.1234567890123456; my $xcoordtype = 'RA---TAN'; my $ycoordtype = 'DEC--TAN'; my $onskey = [ 'first string', 'second string', ' ' ]; my $inclist = [ 'key*', 'newikys' ]; my $exclist = [ 'key_pr*', 'key_pkls' ]; my $onlkey = [1,0,1]; my $onjkey = [11,12,13]; my $onfkey = [12.121212, 13.131313, 14.141414]; my $onekey = [13.131313, 14.141414, 15.151515]; my $ongkey = [14.1414141414141414, 15.1515151515151515,16.1616161616161616]; my $ondkey = [15.1515151515151515, 16.1616161616161616,17.1717171717171717]; my $tbcol = [1,17,28,43,56]; my $binname = "Test-BINTABLE"; my $template = "testprog.tpt"; my $tblname = "Test-ASCII"; my ($status,$tmp,$tmp1,$tmp2,@tmp); my ($ttype,$tunit,$tdisp,$tform,$nrows,$tfields,$morekeys,$extvers,$koutarray); my ($colnum,$colname,$typecode,$repeat,$width,$scale,$zero,$jnulval,$hdutype); my ($rowlen,$errmsg,$nmsg,$cval,$oshtkey); my ($version,$fptr,$tmpfptr); my ($filename,$filemode); my ($simple,$bitpix,$naxis,$naxes,$npixels,$pcount,$gcount,$extend); my ($card,$card2,$comment,$comm); my ($nkeys); my ($boutarray,$ioutarray,$joutarray,$eoutarray,$doutarray); my ($hdunum,$anynull); my ($binarray,$iinarray,$jinarray,$einarray,$dinarray); my ($ii,$jj,$larray,$larray2,$imgarray,$imgarray2); my ($keyword,$value); my ($iskey,$ilkey,$ijkey,$iekey,$idkey,$ishtkey,$inekey,$indkey); my $lsptr; my ($existkeys,$keynum); my ($inskey,$nfound,$inlkey,$injkey); my ($signval,$uchars,$nulstr); my ($xinarray,$kinarray,$cinarray,$minarray); my ($lpixels,$fpixels,$inc,$offset); my ($bnul,$inul,$knul,$jnul,$enul,$dnul); my ($xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$xpos,$ypos); my ($checksum,$asciisum,$datsum,$datastatus,$hdustatus); fits_get_version($version); printf "CFITSIO TESTPROG, v%.3f\n\n",$version; print "Try opening then closing a nonexistent file:\n"; $status=0; $fptr=Astro::FITS::CFITSIO::open_file('tq123x.kjl',READWRITE,$status); printf " ffopen fptr, status = %d %d (expect an error)\n",$fptr,$status; eval { $status = 115; # cheat!!! $fptr->close_file($status); }; printf " ffclos status = %d\n\n", $status; fits_clear_errmsg(); $status=0; $fptr=Astro::FITS::CFITSIO::create_file('!testprog.fit',$status); print "ffinit create new file status = $status\n"; $status and goto ERRSTATUS; $fptr->file_name($filename,$status); $fptr->file_mode($filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; $simple=1; $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; $pcount=0; $gcount=1; $extend=1; ############################ # write single keywords # ############################ $fptr->write_imghdr($bitpix,$naxis,$naxes,$status) and print "ffphps status = $status"; $fptr->write_record( "key_prec= 'This keyword was written by fxprec' / comment goes here", $status ) and printf"ffprec status = $status\n"; print "\ntest writing of long string keywords:\n"; $card = "1234567890123456789012345678901234567890" . "12345678901234567890123456789012345"; $fptr->write_key_str("card1",$card,"",$status); $fptr->read_keyword('card1',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234'6789012345"; $fptr->write_key_str('card2',$card,"",$status); $fptr->read_keyword('card2',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234''789012345"; $fptr->write_key_str('card3',$card,"",$status); $fptr->read_keyword('card3',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234567'9012345"; $fptr->write_key_str('card4',$card,"",$status); $fptr->read_keyword('card4',$card2,$comment,$status); print " $card\n$card2\n"; $fptr->write_key_str('key_pkys',$oskey,'fxpkys comment',$status) and print "ffpkys status = $status\n"; $fptr->write_key_log('key_pkyl',$olkey,'fxpkyl comment',$status) and print "ffpkyl status = $status\n"; $fptr->write_key_lng('key_pkyj',$ojkey,'fxpkyj comment',$status) and print "ffpkyj status = $status\n"; $fptr->write_key_fixflt('key_pkyf',$ofkey,5,'fxpkyf comment',$status) and print "ffpkyf status = $status\n"; $fptr->write_key_flt('key_pkye',$oekey,6,'fxpkye comment',$status) and print "ffpkye status = $status\n"; $fptr->write_key_fixdbl('key_pkyg',$ogkey,14,'fxpkyg comment',$status) and print "ffpkyg status = $status\n"; $fptr->write_key_dbl('key_pkyd',$odkey,14,'fxpkyd comment',$status) and print "ffpkyd status = $status\n"; $fptr->write_key_cmp('key_pkyc',$onekey,6,'fxpkyc comment',$status) and print "ffpkyc status = $status\n"; $fptr->write_key_dblcmp('key_pkym',$ondkey,14,'fxpkym comment',$status) and print "ffpkym status = $status\n"; $fptr->write_key_fixcmp('key_pkfc',$onekey,6,'fxpkfc comment',$status) and print "ffpkfc status = $status\n"; $fptr->write_key_fixdblcmp('key_pkfm',$ondkey,14,'fxpkfm comment',$status) and print "ffpkfm status = $status\n"; $fptr->write_key_longstr( 'key_pkls', 'This is a very long string value that is continued over more than one keyword.', 'fxpkls comment', $status, ) and print "ffpkls status = $status\n"; $fptr->write_key_longwarn($status) and print "ffplsw status = $status\n"; $fptr->write_key_triple('key_pkyt',$otint,$otfrac,'fxpkyt comment',$status) and print "ffpkyt status = $status\n"; $fptr->write_comment(' This keyword was written by fxpcom.',$status) and print "ffpcom status = $status\n"; $fptr->write_history(" This keyword written by fxphis (w/ 2 leading spaces).",$status) and print "ffphis status = $status\n"; $fptr->write_date($status) and print "ffpdat status = $status\n, goto ERRSTATUS"; ############################ # write arrays of keywords # ############################ $nkeys = 3; $fptr->write_keys_str('ky_pkns',1,$nkeys,$onskey,'fxpkns comment&',$status) and print "ffpkns status = $status\n"; $fptr->write_keys_log('ky_pknl',1,$nkeys,$onlkey,'fxpknl comment&',$status) and print "ffpknl status = $status\n"; $fptr->write_keys_lng('ky_pknj',1,$nkeys,$onjkey,'fxpknj comment&',$status) and print "ffpknj status = $status\n"; $fptr->write_keys_fixflt('ky_pknf',1,$nkeys,$onfkey,5,'fxpknf comment&',$status) and print "ffpknf status = $status\n"; $fptr->write_keys_flt('ky_pkne',1,$nkeys,$onekey,6,'fxpkne comment&',$status) and print "ffpkne status = $status\n"; $fptr->write_keys_fixdbl('ky_pkng',1,$nkeys,$ongkey,13,'fxpkng comment&',$status) and print "ffpkng status = $status\n"; $fptr->write_keys_dbl('ky_pknd',1,$nkeys,$ondkey,14,'fxpknd comment&',$status) and print "ffpknd status = $status\n",goto ERRSTATUS; ############################ # write generic keywords # ############################ $oskey = 1; $fptr->write_key(TSTRING,'tstring',$oskey,'tstring comment',$status) and print "ffpky status = $status\n"; $olkey = TLOGICAL; $fptr->write_key(TLOGICAL,'tlogical',$olkey,'tlogical comment',$status) and print "ffpky status = $status\n"; $cval = TBYTE; $fptr->write_key(TBYTE,'tbyte',$cval,'tbyte comment',$status) and print "ffpky status = $status\n"; $oshtkey = TSHORT; $fptr->write_key(TSHORT,'tshort',$oshtkey,'tshort comment',$status) and print "ffpky status = $status\n"; $olkey = TINT; $fptr->write_key(TINT,'tint',$olkey,'tint comment',$status) and print "ffpky status = $status\n"; $ojkey = TLONG; $fptr->write_key(TLONG,'tlong',$ojkey,'tlong comment',$status) and print "ffpky status = $status\n"; $oekey = TFLOAT; $fptr->write_key(TFLOAT,'tfloat',$oekey,'tfloat comment',$status) and print "ffpky status = $status\n"; $odkey = TDOUBLE; $fptr->write_key(TDOUBLE,'tdouble',$odkey,'tdouble comment',$status) and print "ffpky status = $status\n"; ############################ # write data # ############################ $fptr->write_key_lng('BLANK',-99,'value to use for undefined pixels',$status) and print "BLANK keyword status = $status\n"; $boutarray = [1..$npixels]; $ioutarray = [1..$npixels]; $joutarray = [1..$npixels]; $eoutarray = [1..$npixels]; $doutarray = [1..$npixels]; $fptr->write_img_byt(1,1,2,[@{$boutarray}[0..1]],$status); $fptr->write_img_sht(1,5,2,[@{$ioutarray}[4..5]],$status); $fptr->write_img_lng(1,9,2,[@{$joutarray}[8..9]],$status); $fptr->write_img_flt(1,13,2,[@{$eoutarray}[12..13]],$status); $fptr->write_img_dbl(1,17,2,[@{$doutarray}[16..17]],$status); $fptr->write_imgnull_byt(1,3,2,[@{$boutarray}[2..3]],4,$status); $fptr->write_imgnull_sht(1,7,2,[@{$ioutarray}[6..7]],8,$status); $fptr->write_imgnull_lng(1,11,2,[@{$joutarray}[10..11]],12,$status); $fptr->write_imgnull_flt(1,15,2,[@{$eoutarray}[14..15]],16,$status); $fptr->write_imgnull_dbl(1,19,2,[@{$doutarray}[18..19]],20,$status); $fptr->write_img_null(1,1,1,$status); $status and print "ffppnx status = $status\n", goto ERRSTATUS; $fptr->flush_file($status); print "ffflus status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; ############################ # read data # ############################ print "\nValues read back from primary array (99 = null pixel)\n"; print "The 1st, and every 4th pixel should be undefined:\n"; $anynull = 0; $fptr->read_img_byt(1,1,10,99,$binarray,$anynull,$status); $fptr->read_img_byt(1,11,10,99,$tmp,$anynull,$status); @{$binarray}[10..$npixels-1] = @{$tmp}; map printf(" %2d",$binarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvb)\n"; $fptr->read_img_sht(1,1,$npixels,99,$iinarray,$anynull,$status); map printf(" %2d",$iinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvi)\n"; $fptr->read_img_lng(1,1,$npixels,99,$jinarray,$anynull,$status); map printf(" %2d",$jinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvj)\n"; $fptr->read_img_flt(1,1,$npixels,99,$einarray,$anynull,$status); map printf(" %2.0f",$einarray->[$_]),(0..$npixels-1); print " $anynull (ffgpve)\n"; $fptr->read_img_dbl(1,1,10,99,$dinarray,$anynull,$status); $fptr->read_img_dbl(1,11,10,99,$tmp,$anynull,$status); @{$dinarray}[10..$npixels-1] = @{$tmp}; map printf(" %2.0d",$dinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvd)\n"; $status and print("ERROR: ffgpv_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpv_ did not detect null values\n"; for ($ii=3;$ii<$npixels;$ii+=4) { $boutarray->[$ii] = 99; $ioutarray->[$ii] = 99; $joutarray->[$ii] = 99; $eoutarray->[$ii] = 99.; $doutarray->[$ii] = 99.; } $ii=0; $boutarray->[$ii] = 99; $ioutarray->[$ii] = 99; $joutarray->[$ii] = 99; $eoutarray->[$ii] = 99.; $doutarray->[$ii] = 99.; for ($ii=0; $ii<$npixels;$ii++) { ($boutarray->[$ii] != $binarray->[$ii]) and print "bout != bin = $boutarray->[$ii] $binarray->[$ii]\n"; ($ioutarray->[$ii] != $iinarray->[$ii]) and print "iout != iin = $ioutarray->[$ii] $iinarray->[$ii]\n"; ($joutarray->[$ii] != $jinarray->[$ii]) and print "jout != jin = $joutarray->[$ii] $jinarray->[$ii]\n"; ($eoutarray->[$ii] != $einarray->[$ii]) and print "eout != ein = $eoutarray->[$ii] $einarray->[$ii]\n"; ($doutarray->[$ii] != $dinarray->[$ii]) and print "dout != din = $doutarray->[$ii] $dinarray->[$ii]\n"; } @{$binarray} = map(0,(0..$npixels-1)); @{$iinarray} = map(0,(0..$npixels-1)); @{$jinarray} = map(0,(0..$npixels-1)); @{$einarray} = map(0.0,(0..$npixels-1)); @{$dinarray} = map(0.0,(0..$npixels-1)); $anynull = 0; $fptr->read_imgnull_byt(1,1,10,$binarray,$larray,$anynull,$status); $fptr->read_imgnull_byt(1,11,10,$tmp1,$tmp2,$anynull,$status); @{$binarray}[10..$npixels-1] = @{$tmp1}; @{$larray}[10..$npixels-1] = @{$tmp2}; for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$binarray->[$ii] } } print " $anynull (ffgpfb)\n"; $fptr->read_imgnull_sht(1,1,$npixels,$iinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$iinarray->[$ii] } } print " $anynull (ffgpfi)\n"; $fptr->read_imgnull_lng(1,1,$npixels,$jinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$jinarray->[$ii] } } print " $anynull (ffgpfj)\n"; $fptr->read_imgnull_flt(1,1,$npixels,$einarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2.0f",$einarray->[$ii] } } print " $anynull (ffgpfe)\n"; $fptr->read_imgnull_dbl(1,1,10,$dinarray,$larray,$anynull,$status); $fptr->read_imgnull_dbl(1,11,10,$tmp1,$tmp2,$anynull,$status); @{$dinarray}[10..$npixels-1] = @{$tmp1}; @{$larray}[10..$npixels-1] = @{$tmp2}; for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2.0f",$dinarray->[$ii] } } print " $anynull (ffgpfd)\n"; $status and print("ERROR: ffgpf_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpf_ did not detect null values\n"; ########################################## # close and reopen file multiple times # ########################################## for ($ii=0;$ii<10;$ii++) { $fptr->close_file($status) and print("ERROR in ftclos (1) = $status"), goto ERRSTATUS; $fptr=Astro::FITS::CFITSIO::open_file($filename,READWRITE,$status); $status and print("ERROR: ffopen open file status = $status\n"), goto ERRSTATUS; } print "\nClosed then reopened the FITS file 10 times.\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $filename = ""; $fptr->file_name($filename,$status); $fptr->file_mode($filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; ############################ # read single keywords # ############################ $simple = 0; $bitpix = 0; $naxis = 0; $naxes = [0,0]; $pcount = -99; $gcount = -99; $extend = -99; print "\nRead back keywords:\n"; $fptr->read_imghdr($simple,$bitpix,$naxis,$naxes,$pcount,$gcount,$extend,$status); print "simple = $simple, bitpix = $bitpix, naxis = $naxis, naxes = ($naxes->[0], $naxes->[1])\n"; print " pcount = $pcount, gcount = $gcount, extend = $extend\n"; $fptr->read_record(9,$card,$status); print $card,"\n"; (substr($card,0,15) eq "KEY_PREC= 'This") or print "ERROR in ffgrec\n"; $fptr->read_keyn(9,$keyword,$value,$comment,$status); print "$keyword : $value : $comment :\n"; ($keyword eq 'KEY_PREC') or print "ERROR in ffgkyn: $keyword\n"; $fptr->read_card($keyword,$card,$status); print $card,"\n"; ($keyword eq substr($card,0,8)) or print "ERROR in ffgcrd: $keyword\n"; $fptr->read_keyword('KY_PKNS1',$value,$comment,$status); print "KY_PKNS1 : $value : $comment :\n"; (substr($value,0,14) eq "'first string'") or print "ERROR in ffgkey $value\n"; $fptr->read_key_str('key_pkys',$iskey,$comment,$status); print "KEY_PKYS $iskey $comment $status\n"; $fptr->read_key_log('key_pkyl',$ilkey,$comment,$status); print "KEY_PKYL $ilkey $comment $status\n"; $fptr->read_key_lng('KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKYJ $ijkey $comment $status\n"; $fptr->read_key_flt('KEY_PKYJ',$iekey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$iekey; $fptr->read_key_dbl('KEY_PKYJ',$idkey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$idkey; ($ijkey == 11 and $iekey == 11.0 and $idkey == 11.0) or printf "ERROR in ffgky[jed]: %d, %f, %f\n",$ijkey,$iekey,$idkey; $iskey = ""; $fptr->read_key(TSTRING,'key_pkys',$iskey,$comment,$status); print "KEY_PKY S $iskey $comment $status\n"; $ilkey = 0; $fptr->read_key(TLOGICAL,'key_pkyl',$ilkey,$comment,$status); print "KEY_PKY L $ilkey $comment $status\n"; $fptr->read_key(TBYTE,'KEY_PKYJ',$cval,$comment,$status); print "KEY_PKY BYTE $cval $comment $status\n"; $fptr->read_key(TSHORT,'KEY_PKYJ',$ishtkey,$comment,$status); print "KEY_PKY SHORT $ishtkey $comment $status\n"; $fptr->read_key(TINT,'KEY_PKYJ',$ilkey,$comment,$status); print "KEY_PKY INT $ilkey $comment $status\n"; $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $iekey=0; $fptr->read_key(TFLOAT,'KEY_PKYE',$iekey,$comment,$status); printf "KEY_PKY E %f $comment $status\n",$iekey; $idkey=0; $fptr->read_key(TDOUBLE,'KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKY D %f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYF',$idkey,$comment,$status); printf "KEY_PKYF %f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYE',$idkey,$comment,$status); printf "KEY_PKYE %f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYG',$idkey,$comment,$status); printf "KEY_PKYG %.14f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKYD %.14f $comment $status\n",$idkey; $fptr->read_key_cmp('KEY_PKYC',$inekey,$comment,$status); printf "KEY_PKYC %f %f $comment $status\n",@$inekey; $fptr->read_key_cmp('KEY_PKFC',$inekey,$comment,$status); printf "KEY_PKFC %f %f $comment $status\n",@$inekey; $fptr->read_key_dblcmp('KEY_PKYM',$indkey,$comment,$status); printf "KEY_PKYM %f %f $comment $status\n",@$indkey; $fptr->read_key_dblcmp('KEY_PKFM',$indkey,$comment,$status); printf "KEY_PKFM %f %f $comment $status\n",@$indkey; $fptr->read_key_triple('KEY_PKYT',$ijkey,$idkey,$comment,$status); printf "KEY_PKYT $ijkey %.14f $comment $status\n",$idkey; $fptr->write_key_unit('KEY_PKYJ',"km/s/Mpc",$status); $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $fptr->read_key_unit('KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; $fptr->write_key_unit('KEY_PKYJ','',$status); $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $fptr->read_key_unit('KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; $fptr->write_key_unit('KEY_PKYJ','feet/second/second',$status); $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $fptr->read_key_unit('KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; $fptr->read_key_longstr('key_pkls',$lsptr,$comment,$status); print "KEY_PKLS long string value = \n$lsptr\n"; $fptr->get_hdrpos($existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; ############################ # read array keywords # ############################ $fptr->read_keys_str('ky_pkns',1,3,$inskey,$nfound,$status); print "ffgkns: $inskey->[0], $inskey->[1], $inskey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkns $nfound, $status\n"; $fptr->read_keys_log('ky_pknl',1,3,$inlkey,$nfound,$status); print "ffgknl: $inlkey->[0], $inlkey->[1], $inlkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknl $nfound, $status\n"; $fptr->read_keys_lng('ky_pknj',1,3,$injkey,$nfound,$status); print "ffgknj: $injkey->[0], $injkey->[1], $injkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknj $nfound, $status\n"; $fptr->read_keys_flt('ky_pkne',1,3,$inekey,$nfound,$status); printf "ffgkne: %f, %f, %f\n",@{$inekey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkne $nfound, $status\n"; $fptr->read_keys_dbl('ky_pknd',1,3,$indkey,$nfound,$status); printf "ffgknd: %f, %f, %f\n",@{$indkey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknd $nfound, $status\n"; $fptr->read_card('HISTORY',$card,$status); $fptr->get_hdrpos($existkeys,$keynum,$status); $keynum -= 2; print "\nBefore deleting the HISTORY and DATE keywords...\n"; for ($ii=$keynum; $ii<=$keynum+3;$ii++) { $fptr->read_record($ii,$card,$status); print substr($card,0,8),"\n"; } ############################ # delete keywords # ############################ $fptr->delete_record($keynum+1,$status); $fptr->delete_key('DATE',$status); print "\nAfter deleting the keywords...\n"; for ($ii=$keynum; $ii<=$keynum+1;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR deleting keywords\n"; ############################ # insert keywords # ############################ $keynum += 4; $fptr->insert_record($keynum-3,"KY_IREC = 'This keyword inserted by fxirec'",$status); $fptr->insert_key_str('KY_IKYS',"insert_value_string", "ikys comment", $status); $fptr->insert_key_lng('KY_IKYJ',49,"ikyj comment", $status); $fptr->insert_key_log('KY_IKYL',1, "ikyl comment", $status); $fptr->insert_key_flt('KY_IKYE',12.3456, 4, "ikye comment", $status); $fptr->insert_key_dbl('KY_IKYD',12.345678901234567, 14, "ikyd comment", $status); $fptr->insert_key_fixflt('KY_IKYF',12.3456, 4, "ikyf comment", $status); $fptr->insert_key_fixdbl('KY_IKYG',12.345678901234567, 13, "ikyg comment", $status); print "\nAfter inserting the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR inserting keywords\n"; ############################ # modify keywords # ############################ $fptr->modify_record($keynum-4,'COMMENT This keyword was modified by fxmrec', $status); $fptr->modify_card('KY_IREC',"KY_MREC = 'This keyword was modified by fxmcrd'",$status); $fptr->modify_name('KY_IKYS','NEWIKYS',$status); $fptr->modify_comment('KY_IKYJ','This is a modified comment', $status); $fptr->modify_key_lng('KY_IKYJ',50,'&',$status); $fptr->modify_key_log('KY_IKYL',0,'&',$status); $fptr->modify_key_str('NEWIKYS','modified_string', '&', $status); $fptr->modify_key_flt('KY_IKYE',-12.3456, 4, '&', $status); $fptr->modify_key_dbl('KY_IKYD',-12.345678901234567, 14, 'modified comment', $status); $fptr->modify_key_fixflt('KY_IKYF',-12.3456, 4, '&', $status); $fptr->modify_key_fixdbl('KY_IKYG',-12.345678901234567, 13, '&', $status); print "\nAfter modifying the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; ############################ # update keywords # ############################ $fptr->update_card('KY_MREC',"KY_UCRD = 'This keyword was updated by fxucrd'",$status); $fptr->update_key_lng('KY_IKYJ',51,'&',$status); $fptr->update_key_log('KY_IKYL',1,'&',$status); $fptr->update_key_str('NEWIKYS',"updated_string",'&',$status); $fptr->update_key_flt('KY_IKYE',-13.3456, 4,'&',$status); $fptr->update_key_dbl('KY_IKYD',-13.345678901234567, 14,'modified comment',$status); $fptr->update_key_fixflt('KY_IKYF',-13.3456, 4,'&',$status); $fptr->update_key_fixdbl('KY_IKYG',-13.345678901234567, 13,'&',$status); print "\nAfter updating the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; $fptr->read_record(0,$card,$status); print "\nKeywords found using wildcard search (should be 13)...\n"; $nfound = 0; while (!$fptr->find_nextkey($inclist,2,$exclist,2,$card,$status)) { $nfound++; print $card,"\n"; } ($nfound == 13) or print("\nERROR reading keywords using wildcards (ffgnxk)\n"), goto ERRSTATUS; $status=0; ############################ # copy index keyword # ############################ $fptr->copy_key($fptr,1,4,'KY_PKNE',$status); $fptr->read_keys_str('ky_pkne',2,4,$inekey,$nfound,$status); printf "\nCopied keyword: ffgkne: %f, %f, %f\n", @$inekey; $status and print("\nERROR in ffgkne $nfound, $status\n"),goto ERRSTATUS; ###################################### # modify header using template file # ###################################### $fptr->write_key_template($template,$status) and print "\nERROR returned by ffpktp\n", goto ERRSTATUS; print "Updated header using template file (ffpktp)\n"; ############################ # create binary table # ############################ $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '') ]; $nrows = 21; $tfields = 10; $pcount = 0; $fptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nffibin status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $fptr->get_hdrpos($existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; $morekeys=40; $fptr->set_hdrsize($morekeys,$status); $fptr->get_hdrspace($existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; $fptr->set_btblnull(4,99,$status); $fptr->set_btblnull(5,99,$status); $fptr->set_btblnull(6,99,$status); $extvers=1; $fptr->write_key_lng('EXTVER',$extvers,'extension version number', $status); $fptr->write_key_lng('TNULL4',99,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL5',99,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL6',99,'value for undefined pixels',$status); $naxis=3; $naxes=[1,2,8]; $fptr->write_tdim(3,$naxis,$naxes,$status); $naxis=0; $naxes=undef; $fptr->read_tdim(3,$naxis,$naxes,$status); $fptr->read_key_str('TDIM3',$iskey,$comment,$status); print "TDIM3 = $iskey, $naxis, $naxes->[0], $naxes->[1], $naxes->[2]\n"; $fptr->set_hdustruc($status); ############################ # write data to columns # ############################ $signval = -1; for ($ii=0;$ii<21;$ii++) { $signval *= -1; $boutarray->[$ii] = ($ii + 1); $ioutarray->[$ii] = ($ii + 1) * $signval; $joutarray->[$ii] = ($ii + 1) * $signval; $koutarray->[$ii] = ($ii + 1) * $signval; $eoutarray->[$ii] = ($ii + 1) * $signval; $doutarray->[$ii] = ($ii + 1) * $signval; } $fptr->write_col_str(1,1,1,3,$onskey,$status); $fptr->write_col_null(1,4,1,1,$status); $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0]; $fptr->write_col_bit(3,1,1,36,$larray,$status); for ($ii=4;$ii<9;$ii++) { $fptr->write_col_byt($ii,1,1,2,$boutarray,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_sht($ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_int($ii,5,1,2,[@{$koutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_flt($ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_dbl($ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_null($ii,11,1,1,$status); } $fptr->write_col_cmp(9,1,1,10,$eoutarray,$status); $fptr->write_col_dblcmp(10,1,1,10,$doutarray,$status); for ($ii=4;$ii<9;$ii++) { $fptr->write_colnull_byt($ii,12,1,2,[@{$boutarray}[11..12]],13,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_sht($ii,14,1,2,[@{$ioutarray}[13..14]],15,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_int($ii,16,1,2,[@{$koutarray}[15..16]],17,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_flt($ii,18,1,2,[@{$eoutarray}[17..18]],19.,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_dbl($ii,20,1,2,[@{$doutarray}[19..20]],21.,$status); ($status == NUM_OVERFLOW) and $status = 0; } $fptr->write_col_log(2,1,1,21,$larray,$status); $fptr->write_col_null(2,11,1,1,$status); print "ffpcl_ status = $status\n"; ######################################### # get information about the columns # ######################################### print "\nFind the column numbers; a returned status value of 237 is"; print "\nexpected and indicates that more than one column name matches"; print "\nthe input column name template. Status = 219 indicates that"; print "\nthere was no matching column name."; $fptr->get_colnum(0,'Xvalue',$colnum,$status); print "\nColumn Xvalue is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { $fptr->get_colname(1,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; print "\nInformation about each column:\n"; for ($ii=0;$ii<$tfields;$ii++) { $fptr->get_coltype($ii+1,$typecode,$repeat,$width,$status); printf("%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width); $fptr->get_bcolparms($ii+1,$ttype->[0],$tunit->[0],$cval,$repeat,$scale,$zero,$jnulval,$tdisp,$status); printf " $ttype->[0], $tunit->[0], $cval, $repeat, %f, %f, $jnulval, $tdisp.\n",$scale,$zero; } print "\n"; ############################################### # insert ASCII table before the binary table # ############################################### $fptr->movrel_hdu(-1,$hdutype,$status) and goto ERRSTATUS; $tform = [ qw( A15 I10 F14.6 E12.5 D21.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ('','m**2','cm','erg/s','km/s') ]; $rowlen = 76; $nrows = 11; $tfields = 5; $fptr->insert_atbl($rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "ffitab status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $fptr->set_atblnull(1,'null1',$status); $fptr->set_atblnull(2,'null2',$status); $fptr->set_atblnull(3,'null3',$status); $fptr->set_atblnull(4,'null4',$status); $fptr->set_atblnull(5,'null5',$status); $extvers=2; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_key_str('TNULL1','null1','value for undefined pixels',$status); $fptr->write_key_str('TNULL2','null2','value for undefined pixels',$status); $fptr->write_key_str('TNULL3','null3','value for undefined pixels',$status); $fptr->write_key_str('TNULL4','null4','value for undefined pixels',$status); $fptr->write_key_str('TNULL5','null5','value for undefined pixels',$status); $status and goto ERRSTATUS; ############################ # write data to columns # ############################ for ($ii=0;$ii<21;$ii++) { $boutarray->[$ii] = $ii+1; $ioutarray->[$ii] = $ii+1; $joutarray->[$ii] = $ii+1; $eoutarray->[$ii] = $ii+1; $doutarray->[$ii] = $ii+1; } $fptr->write_col_str(1,1,1,3,$onskey,$status); $fptr->write_col_null(1,4,1,1,$status); for ($ii=2;$ii<6;$ii++) { $fptr->write_col_byt($ii,1,1,2,[@{$boutarray}[0..1]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_sht($ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_lng($ii,5,1,2,[@{$joutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_flt($ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_dbl($ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_null($ii,11,1,1,$status); } print "ffpcl_ status = $status\n"; ################################ # read data from ASCII table # ################################ $fptr->read_atblhdr($rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nASCII table: rowlen, nrows, tfields, extname: $rowlen $nrows $tfields $tblname\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %3d %8s %8s \n", $ttype->[$ii], $tbcol->[$ii], $tform->[$ii], $tunit->[$ii]; } $nrows = 11; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,$binarray,$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,$iinarray,$anynull,$status); $fptr->read_col_lng(3,1,1,$nrows,99,$jinarray,$anynull,$status); $fptr->read_col_flt(4,1,1,$nrows,99,$einarray,$anynull,$status); $fptr->read_col_dbl(5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values read from ASCII table:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } $fptr->read_tblbytes(1,20,78,$uchars,$status); print "\n",pack("C78",@$uchars),"\n"; $fptr->write_tblbytes(1,20,78,$uchars,$status); ######################################### # get information about the columns # ######################################### $fptr->get_colnum(0,'name',$colnum,$status); print "\nColumn name is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { $fptr->get_colname(0,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; for ($ii=0;$ii<$tfields;$ii++) { $fptr->get_coltype($ii+1,$typecode,$repeat,$width,$status); printf "%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width; $fptr->get_acolparms($ii+1,$ttype->[0],$tbcol,$tunit->[0],$tform->[0],$scale, $zero,$nulstr,$tdisp,$status); printf " $ttype->[0], $tbcol, $tunit->[0], $tform->[0], %f, %f, $nulstr, $tdisp.\n", $scale, $zero; } print "\n"; ############################################### # test the insert/delete row/column routines # ############################################### $fptr->insert_rows(2,3,$status) and goto ERRSTATUS; $nrows = 14; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,$binarray,$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,$iinarray,$anynull,$status); $fptr->read_col_lng(3,1,1,$nrows,99,$jinarray,$anynull,$status); $fptr->read_col_flt(4,1,1,$nrows,99,$einarray,$anynull,$status); $fptr->read_col_dbl(5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } $fptr->delete_rows(10,2,$status) and goto ERRSTATUS; $nrows = 12; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,$binarray,$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,$iinarray,$anynull,$status); $fptr->read_col_lng(3,1,1,$nrows,99,$jinarray,$anynull,$status); $fptr->read_col_flt(4,1,1,$nrows,99,$einarray,$anynull,$status); $fptr->read_col_dbl(5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } $fptr->delete_col(3,$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,$binarray,$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,$iinarray,$anynull,$status); $fptr->read_col_flt(3,1,1,$nrows,99,$einarray,$anynull,$status); $fptr->read_col_dbl(4,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after deleting column 3:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } $fptr->insert_col(5,'INSERT_COL','F14.6',$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,$binarray,$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,$iinarray,$anynull,$status); $fptr->read_col_flt(3,1,1,$nrows,99,$einarray,$anynull,$status); $fptr->read_col_dbl(4,1,1,$nrows,99,$dinarray,$anynull,$status); $fptr->read_col_lng(5,1,1,$nrows,99,$jinarray,$anynull,$status); print "\nData values after inserting column 5:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], $jinarray->[$ii], ); } ############################################################ # create a temporary file and copy the ASCII table to it, # # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v6.tmp'; $tmpfptr=Astro::FITS::CFITSIO::create_file($filename,$status); print "Create temporary file: ffinit status = $status\n"; $tmpfptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=12; $tfields=0; $rowlen=0; $tmpfptr->insert_atbl($rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nCreate ASCII table with 0 columns: ffitab status = $status\n"; $fptr->copy_col($tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $tmpfptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$tblname,0,$status); print "\nCreate Binary table with 0 columns: ffibin status = $status\n"; $fptr->copy_col($tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $tmpfptr->delete_file($status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; ################################ # read data from binary table # ################################ $fptr->movrel_hdu(1,$hdutype,$status) and goto ERRSTATUS; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $fptr->get_hdrspace($existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; $fptr->read_btblhdr($nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "\nBinary table: nrows, tfields, extname, pcount: $nrows $tfields $binname $pcount\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %8s %8s \n", $ttype->[$ii], $tform->[$ii], $tunit->[$ii]; } @$larray = map(0,(0..39)); print "\nData values read from binary table:\n"; printf " Bit column (X) data values: \n\n"; $fptr->read_col_bit(3,1,1,36,$larray,$status); for ($jj=0;$jj<5;$jj++) { print @{$larray}[$jj*8..$jj*8+7]; print " "; } @{$larray} = map(0,(0..$nrows-1)); @{$xinarray} = map(0,(0..$nrows-1)); @{$binarray} = map(0,(0..$nrows-1)); @{$iinarray} = map(0,(0..$nrows-1)); @{$kinarray} = map(0,(0..$nrows-1)); @{$einarray} = map(0.0,(0..$nrows-1)); @{$dinarray} = map(0.0,(0..$nrows-1)); @{$cinarray} = map(0.0,(0..2*$nrows-1)); @{$minarray} = map(0.0,(0..2*$nrows-1)); print "\n\n"; $fptr->read_col_str(1,4,1,1,'',$inskey,$anynull,$status); print "null string column value = -$inskey->[0]- (should be --)\n"; $nrows=21; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_log(2,1,1,$nrows,0,$larray,$anynull,$status); $fptr->read_col_byt(3,1,1,$nrows,98,$xinarray,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,$binarray,$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,$iinarray,$anynull,$status); $fptr->read_col_lng(6,1,1,$nrows,98,$kinarray,$anynull,$status); $fptr->read_col_flt(7,1,1,$nrows,98.,$einarray,$anynull,$status); $fptr->read_col_dbl(8,1,1,$nrows,98.,$dinarray,$anynull,$status); $fptr->read_col_cmp(9,1,1,$nrows,98.,$cinarray,$anynull,$status); $fptr->read_col_dblcmp(10,1,1,$nrows,98.,$minarray,$anynull,$status); print "\nRead columns with ffgcv_:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f) \n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii],$kinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], @{$cinarray->[$ii]}, @{$minarray->[$ii]}; } @tmp = (0..$nrows-1); @$larray = @tmp; @$xinarray = @tmp; @$binarray = @tmp; @$iinarray = @tmp; @$kinarray = @tmp; @$einarray = @tmp; @$dinarray = @tmp; @tmp = (0..2*$nrows-1); @$cinarray = @tmp; @$minarray = @tmp; $fptr->read_colnull_str(1,1,1,$nrows,$inskey,$larray2,$anynull,$status); $fptr->read_colnull_log(2,1,1,$nrows,$larray,$larray2,$anynull,$status); $fptr->read_colnull_byt(3,1,1,$nrows,$xinarray,$larray2,$anynull,$status); $fptr->read_colnull_byt(4,1,1,$nrows,$binarray,,$larray2,$anynull,$status); $fptr->read_colnull_sht(5,1,1,$nrows,$iinarray,$larray2,$anynull,$status); $fptr->read_colnull_int(6,1,1,$nrows,$kinarray,$larray2,$anynull,$status); $fptr->read_colnull_flt(7,1,1,$nrows,$einarray,$larray2,$anynull,$status); $fptr->read_colnull_dbl(8,1,1,$nrows,$dinarray,$larray2,$anynull,$status); $fptr->read_colnull_cmp(9,1,1,$nrows,$cinarray,$larray2,$anynull,$status); $fptr->read_colnull_dblcmp(10,1,1,$nrows,$minarray,$larray2,$anynull,$status); print "\nRead columns with ffgcf_:\n"; for ($ii=0;$ii<10;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f)\n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii], $kinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], @{$cinarray->[$ii]}, @{$minarray->[$ii]}; } for ($ii=10; $ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d \n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii]; } $fptr->write_record("key_prec= 'This keyword was written by f_prec' / comment here", $status); ############################################### # test the insert/delete row/column routines # ############################################### $fptr->insert_rows(2,3,$status) and goto ERRSTATUS; $nrows=14; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,$binarray,$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,$iinarray,$anynull,$status); $fptr->read_col_lng(6,1,1,$nrows,98,$jinarray,$anynull,$status); $fptr->read_col_flt(7,1,1,$nrows,98.,$einarray,$anynull,$status); $fptr->read_col_dbl(8,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } $fptr->delete_rows(10,2,$status) and goto ERRSTATUS; $nrows=12; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,$binarray,$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,$iinarray,$anynull,$status); $fptr->read_col_lng(6,1,1,$nrows,98,$jinarray,$anynull,$status); $fptr->read_col_flt(7,1,1,$nrows,98.,$einarray,$anynull,$status); $fptr->read_col_dbl(8,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } $fptr->delete_col(6,$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,$binarray,$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,$iinarray,$anynull,$status); $fptr->read_col_flt(6,1,1,$nrows,98.,$einarray,$anynull,$status); $fptr->read_col_dbl(7,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after deleting column 6:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } $fptr->insert_col(8,'INSERT_COL','1E',$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,$binarray,$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,$iinarray,$anynull,$status); $fptr->read_col_flt(6,1,1,$nrows,98.,$einarray,$anynull,$status); $fptr->read_col_dbl(7,1,1,$nrows,98.,$dinarray,$anynull,$status); $fptr->read_col_lng(8,1,1,$nrows,98,$jinarray,$anynull,$status); print "\nData values after inserting column 8:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] , $jinarray->[$ii]; } $fptr->write_col_null(8,1,1,10,$status); $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,$binarray,$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,$iinarray,$anynull,$status); $fptr->read_col_flt(6,1,1,$nrows,98.,$einarray,$anynull,$status); $fptr->read_col_dbl(7,1,1,$nrows,98.,$dinarray,$anynull,$status); $fptr->read_col_lng(8,1,1,$nrows,98,$jinarray,$anynull,$status); print "\nValues after setting 1st 10 elements in column 8 = null:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] , $jinarray->[$ii]; } ############################################################ # create a temporary file and copy the binary table to it,# # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v5.tmp'; $tmpfptr=Astro::FITS::CFITSIO::create_file($filename,$status); print "Create temporary file: ffinit status = $status\n"; $tmpfptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=22; $tfields=0; $tmpfptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nCreate binary table with 0 columns: ffibin status = $status\n"; $fptr->copy_col($tmpfptr,7,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,6,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,5,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $tmpfptr->delete_file($status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; #################################################### # insert binary table following the primary array # #################################################### $fptr->movabs_hdu(1,$hdutype,$status); $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields=10; $pcount=0; $fptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "ffibin status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $extvers=3; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_key_lng('TNULL4',77,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL5',77,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL6',77,'value for undefined pixels',$status); $fptr->write_key_lng('TSCAL4',1000,'scaling factor',$status); $fptr->write_key_lng('TSCAL5',1,'scaling factor',$status); $fptr->write_key_lng('TSCAL6',100,'scaling factor',$status); $fptr->write_key_lng('TZERO4',0,'scaling offset',$status); $fptr->write_key_lng('TZERO5',32768,'scaling offset',$status); $fptr->write_key_lng('TZERO6',100,'scaling offset',$status); $fptr->set_btblnull(4,77,$status); $fptr->set_btblnull(5,77,$status); $fptr->set_btblnull(6,77,$status); $fptr->set_tscale(4,1000.,0.,$status); $fptr->set_tscale(5,1.,32768.,$status); $fptr->set_tscale(6,100.,100.,$status); ############################ # write data to columns # ############################ @$joutarray = (0,1000,10000,32768,65535); for ($ii=4;$ii<7;$ii++) { $fptr->write_col_lng($ii,1,1,5,$joutarray,$status); ($status == NUM_OVERFLOW) and print("Overflow writing to column $ii\n"),$status=0; $fptr->write_col_null($ii,6,1,1,$status); } for ($jj=4;$jj<7;$jj++) { $fptr->read_col_lng($jj,1,1,6,-999,$jinarray,$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->[$ii]; } print "\n"; } print "\n"; $fptr->set_tscale(4,1.,0.,$status); $fptr->set_tscale(5,1.,0.,$status); $fptr->set_tscale(6,1.,0.,$status); for ($jj=4;$jj<7;$jj++) { $fptr->read_col_lng($jj,1,1,6,-999,$jinarray,$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->[$ii]; } print "\n"; } ###################################################### # insert image extension following the binary table # ###################################################### $bitpix=-32; $naxis=2; $naxes=[15,25]; $fptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; for ($jj=0;$jj<30;$jj++) { for ($ii=0;$ii<19;$ii++) { $imgarray->[$jj]->[$ii] = ($ii<15) ? ($jj * 10) + $ii : 0; } } $fptr->write_2d_sht(1,19,$naxes->[0],$naxes->[1],$imgarray,$status); print "\nWrote whole 2D array: ffp2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } $fptr->read_2d_sht(1,0,19,$naxes->[0],$naxes->[1],$imgarray,$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]}[15..18] = (0,0,0,0); for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->[$jj]->[$ii]; } print "\n"; } for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } for ($jj=0;$jj<20;$jj++) { @{$imgarray2->[$jj]} = map(($jj * -10 - $_),(0..9)); } $fpixels=[5,5]; $lpixels = [14,14]; $fptr->write_subset_sht(1,$naxis,$naxes,$fpixels,$lpixels,$imgarray2,$status); print "\nWrote subset 2D array: ffpssi status = $status\n"; $fptr->read_2d_sht(1,0,19,$naxes->[0],$naxes->[1],$imgarray,$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]}[15..18] = (0,0,0,0); for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->[$jj]->[$ii]; } print "\n"; } $fpixels = [2,5]; $lpixels = [10,8]; $inc = [2,3]; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } $fptr->read_subset_sht(1,$naxis,$naxes,$fpixels,$lpixels,$inc,0,$imgarray->[0],$anynull,$status); print "\nRead subset of 2D array: ffgsvi status = $status\n"; for ($ii=0;$ii<10;$ii++) { printf " %3d",$imgarray->[0]->[$ii]; } print "\n"; ########################################################### # insert another image extension # # copy the image extension to primary array of tmp file. # # then delete the tmp file, and the image extension # ########################################################### $bitpix=16; $naxis=2; $naxes = [15,25]; $fptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $filename = 't1q2s3v4.tmp'; $tmpfptr=Astro::FITS::CFITSIO::create_file($filename,$status); print "Create temporary file: ffinit status = $status\n"; $fptr->copy_hdu($tmpfptr,0,$status); print "Copy image extension to primary array of tmp file.\n"; print "ffcopy status = $status\n"; $tmpfptr->read_record(1,$card,$status); print "$card\n"; $tmpfptr->read_record(2,$card,$status); print "$card\n"; $tmpfptr->read_record(3,$card,$status); print "$card\n"; $tmpfptr->read_record(4,$card,$status); print "$card\n"; $tmpfptr->read_record(5,$card,$status); print "$card\n"; $tmpfptr->read_record(6,$card,$status); print "$card\n"; $tmpfptr->delete_file($status); print "Delete the tmp file: ffdelt status = $status\n"; $fptr->delete_hdu($hdutype,$status); print "Delete the image extension; hdutype, status = $hdutype $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; ########################################################### # append bintable extension with variable length columns # ########################################################### $fptr->create_hdu($status); print "ffcrhd status = $status\n"; $tform = [ qw( 1PA 1PL 1PB 1PB 1PI 1PJ 1PE 1PD 1PC 1PM ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields = 10; $pcount=0; $fptr->write_btblhdr($nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "Variable length arrays: ffphbn status = $status\n"; $extvers=4; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_key_lng('TNULL4', 88, 'value for undefined pixels', $status); $fptr->write_key_lng('TNULL5', 88, 'value for undefined pixels', $status); $fptr->write_key_lng('TNULL6', 88, 'value for undefined pixels', $status); ############################ # write data to columns # ############################ $iskey = 'abcdefghijklmnopqrst'; @tmp = (1..20); @{$boutarray} = @tmp; @{$ioutarray} = @tmp; @{$joutarray} = @tmp; @{$eoutarray} = @tmp; @{$doutarray} = @tmp; $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1]; $inskey=['']; $fptr->write_col_str(1,1,1,1,$inskey,$status); $fptr->write_col_log(2,1,1,1,$larray,$status); $fptr->write_col_bit(3,1,1,1,$larray,$status); $fptr->write_col_byt(4,1,1,1,$boutarray,$status); $fptr->write_col_sht(5,1,1,1,$ioutarray,$status); $fptr->write_col_lng(6,1,1,1,$joutarray,$status); $fptr->write_col_flt(7,1,1,1,$eoutarray,$status); $fptr->write_col_dbl(8,1,1,1,$doutarray,$status); for ($ii=2;$ii<=20;$ii++) { $inskey->[0] = $iskey; $inskey->[0] = substr($inskey->[0],0,$ii); $fptr->write_col_str(1,$ii,1,1,$inskey,$status); $fptr->write_col_log(2,$ii,1,$ii,$larray,$status); $fptr->write_col_null(2,$ii,$ii-1,1,$status); $fptr->write_col_bit(3,$ii,1,$ii,$larray,$status); $fptr->write_col_byt(4,$ii,1,$ii,$boutarray,$status); $fptr->write_col_null(4,$ii,$ii-1,1,$status); $fptr->write_col_sht(5,$ii,1,$ii,$ioutarray,$status); $fptr->write_col_null(5,$ii,$ii-1,1,$status); $fptr->write_col_lng(6,$ii,1,$ii,$joutarray,$status); $fptr->write_col_null(6,$ii,$ii-1,1,$status); $fptr->write_col_flt(7,$ii,1,$ii,$eoutarray,$status); $fptr->write_col_null(7,$ii,$ii-1,1,$status); $fptr->write_col_dbl(8,$ii,1,$ii,$doutarray,$status); $fptr->write_col_null(8,$ii,$ii-1,1,$status); } print "ffpcl_ status = $status\n"; ################################# # close then reopen this HDU # ################################# $fptr->movrel_hdu(-1,$hdutype,$status); $fptr->movrel_hdu(1,$hdutype,$status); ############################# # read data from columns # ############################# $fptr->read_key_lng('PCOUNT',$pcount,$comm,$status); print "PCOUNT = $pcount\n"; $inskey->[0] = ' '; $iskey = ' '; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; for ($ii=1;$ii<=20;$ii++) { @tmp = map(0,(0..$ii-1)); @$larray = @tmp; @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; $fptr->read_col_str(1,$ii,1,1,$iskey,$inskey,$anynull,$status); print "A $inskey->[0] $status\nL"; $fptr->read_col_log(2,$ii,1,$ii,0,$larray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $larray->[$_]; } print " $status\nX"; $fptr->read_col_bit(3,$ii,1,$ii,$larray,$status); foreach (0..$ii-1) { printf " %2d", $larray->[$_]; } print " $status\nB"; $fptr->read_col_byt(4,$ii,1,$ii,99,$boutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $boutarray->[$_]; } print " $status\nI"; $fptr->read_col_sht(5,$ii,1,$ii,99,$ioutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $ioutarray->[$_]; } print " $status\nJ"; $fptr->read_col_lng(6,$ii,1,$ii,99,$joutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $joutarray->[$_]; } print " $status\nE"; $fptr->read_col_flt(7,$ii,1,$ii,99,$eoutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $eoutarray->[$_]; } print " $status\nD"; $fptr->read_col_dbl(8,$ii,1,$ii,99,$doutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $doutarray->[$_]; } print " $status\n"; $fptr->read_descript(8,$ii,$repeat,$offset,$status); print "Column 8 repeat and offset = $repeat $offset\n"; } ##################################### # create another image extension # ##################################### $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; $fptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nffcrim status = $status\n"; @tmp = map(($_*2),(0..$npixels-1)); @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$koutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; $fptr->write_img(TBYTE, 1, 2, [@{$boutarray}[0..1]], $status); $fptr->write_img(TSHORT, 3, 2,[ @{$ioutarray}[2..3]], $status); $fptr->write_img(TINT, 5, 2, [@{$koutarray}[4..5]], $status); $fptr->write_img(TSHORT, 7, 2, [@{$ioutarray}[6..7]], $status); $fptr->write_img(TLONG, 9, 2, [@{$joutarray}[8..9]], $status); $fptr->write_img(TFLOAT, 11, 2, [@{$eoutarray}[10..11]], $status); $fptr->write_img(TDOUBLE, 13, 2, [@{$doutarray}[12..13]], $status); print "ffppr status = $status\n"; $bnul=0; $inul=0; $knul=0; $jnul=0; $enul=0.0; $dnul=0.0; $fptr->read_img(TBYTE,1,14,$bnul,$binarray,$anynull,$status); $fptr->read_img(TSHORT,1,14,$inul,$iinarray,$anynull,$status); $fptr->read_img(TINT,1,14,$knul,$kinarray,$anynull,$status); $fptr->read_img(TLONG,1,14,$jnul,$jinarray,$anynull,$status); $fptr->read_img(TFLOAT,1,14,$enul,$einarray,$anynull,$status); $fptr->read_img(TDOUBLE,1,14,$dnul,$dinarray,$anynull,$status); print "\nImage values written with ffppr and read with ffgpv:\n"; $npixels=14; foreach (0..$npixels-1) { printf " %2d", $binarray->[$_] }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d", $iinarray->[$_] }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d", $kinarray->[$_] }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d", $jinarray->[$_] }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f", $einarray->[$_] }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f", $dinarray->[$_] }; print " $anynull (double)\n"; ########################################## # test world coordinate system routines # ########################################## $xrval=45.83; $yrval=63.57; $xrpix=256.0; $yrpix=257.0; $xinc = -.00277777; $yinc = .00277777; $fptr->write_key_dbl('CRVAL1',$xrval,10,'comment',$status); $fptr->write_key_dbl('CRVAL2',$yrval,10,'comment',$status); $fptr->write_key_dbl('CRPIX1',$xrpix,10,'comment',$status); $fptr->write_key_dbl('CRPIX2',$yrpix,10,'comment',$status); $fptr->write_key_dbl('CDELT1',$xinc,10,'comment',$status); $fptr->write_key_dbl('CDELT2',$yinc,10,'comment',$status); $fptr->write_key_str('CTYPE1',$xcoordtype,'comment',$status); $fptr->write_key_str('CTYPE2',$ycoordtype,'comment',$status); print "\nWrote WCS keywords status = $status\n"; $xrval = 0; $yrval = 0; $xrpix = 0; $yrpix = 0; $xinc = 0; $yinc = 0; $rot = 0; $fptr->read_img_coord($xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$status); print "Read WCS keywords with ffgics status = $status\n"; $xpix = 0.5; $ypix = 0.5; fits_pix_to_world($xpix,$ypix,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpos,$ypos,$status); printf " CRVAL1, CRVAL2 = %16.12f, %16.12f\n", $xrval,$yrval; printf " CRPIX1, CRPIX2 = %16.12f, %16.12f\n", $xrpix,$yrpix; printf " CDELT1, CDELT2 = %16.12f, %16.12f\n", $xinc,$yinc; printf " Rotation = %10.3f, CTYPE = $ctype\n", $rot; print "Calculated sky coordinate with ffwldp status = $status\n"; printf " Pixels (%8.4f,%8.4f) --> (%11.6f, %11.6f) Sky\n",$xpix,$ypix,$xpos,$ypos; fits_world_to_pix($xpos,$ypos,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$status); print "Calculated pixel coordinate with ffxypx status = $status\n"; printf " Sky (%11.6f, %11.6f) --> (%8.4f,%8.4f) Pixels\n",$xpos,$ypos,$xpix,$ypix; ###################################### # append another ASCII table # ###################################### $tform = [ qw( A15 I11 F15.6 E13.5 D22.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s' ) ]; $nrows = 11; $tfields = 5; $tblname = 'new_table'; $fptr->create_tbl(ASCII_TBL,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,$status); print "\nffcrtb status = $status\n"; $extvers = 5; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_col(TSTRING,1,1,1,3,$onskey,$status); @tmp = map(($_*3),(0..$npixels-1)); @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$koutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; for ($ii=2;$ii<6;$ii++) { $fptr->write_col(TBYTE,$ii,1,1,2,[@{$boutarray}[0..1]],$status); $fptr->write_col(TSHORT,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); $fptr->write_col(TLONG,$ii,5,1,2,[@{$joutarray}[4..5]],$status); $fptr->write_col(TFLOAT,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); $fptr->write_col(TDOUBLE,$ii,9,1,2,[@{$doutarray}[8..9]],$status); } print "ffpcl status = $status\n"; $fptr->read_col(TBYTE,2,1,1,10,$bnul,$binarray,$anynull,$status); $fptr->read_col(TSHORT,2,1,1,10,$inul,$iinarray,$anynull,$status); $fptr->read_col(TINT,3,1,1,10,$knul,$kinarray,$anynull,$status); $fptr->read_col(TLONG,3,1,1,10,$jnul,$jinarray,$anynull,$status); $fptr->read_col(TFLOAT,4,1,1,10,$enul,$einarray,$anynull,$status); $fptr->read_col(TDOUBLE,5,1,1,10,$dnul,$dinarray,$anynull,$status); print "\nColumn values written with ffpcl and read with ffgcl:\n"; $npixels = 10; foreach (0..$npixels-1) { printf " %2d",$binarray->[$_] }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d",$iinarray->[$_] }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d",$kinarray->[$_] }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d",$jinarray->[$_] }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f",$einarray->[$_] }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f",$dinarray->[$_] }; print " $anynull (double)\n"; ########################################################### # perform stress test by cycling thru all the extensions # ########################################################### print "\nRepeatedly move to the 1st 4 HDUs of the file:\n"; for ($ii=0;$ii<10;$ii++) { $fptr->movabs_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(-1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $status and last; } print "\n"; print "Move to extensions by name and version number: (ffmnhd)\n"; $extvers=1; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=3; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=4; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $tblname = 'Test-ASCII'; $extvers=2; $fptr->movnam_hdu(ANY_HDU,$tblname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $tblname = 'new_table'; $extvers=5; $fptr->movnam_hdu(ANY_HDU,$tblname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $extvers=0; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=17; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status"; print " (expect a 301 error status here)\n"; $status = 0; $fptr->get_num_hdus($hdunum,$status); print "Total number of HDUs in the file = $hdunum\n"; ######################## # checksum tests # ######################## $checksum=1234567890; fits_encode_chksum($checksum,0,$asciisum); print "\nEncode checksum: $checksum -> $asciisum\n"; $checksum = 0; fits_decode_chksum($asciisum,0,$checksum); print "Decode checksum: $asciisum -> $checksum\n"; $fptr->write_chksum($status); $fptr->read_card('DATASUM',$card,$status); printf "%.30s\n", $card; $fptr->get_chksum($datsum,$checksum,$status); print "ffgcks data checksum, status = $datsum, $status\n"; $fptr->verify_chksum($datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; $fptr->write_record("new_key = 'written by fxprec' / to change checksum",$status); $fptr->update_chksum($status); print "ffupck status = $status\n"; $fptr->read_card('DATASUM',$card,$status); printf "%.30s\n", $card; $fptr->verify_chksum($datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; $fptr->delete_key('CHECKSUM',$status); $fptr->delete_key('DATASUM',$status); ############################ # close file and quit # ############################ ERRSTATUS: { $fptr->close_file($status); print "ffclos status = $status\n"; print "\nNormally, there should be 8 error messages on the stack\n"; print "all regarding 'numerical overflows':\n"; fits_read_errmsg($errmsg); $nmsg = 0; while (length $errmsg) { printf " $errmsg\n"; $nmsg++; fits_read_errmsg($errmsg); } if ($nmsg != 8) { print "\nWARNING: Did not find the expected 8 error messages!\n"; } fits_get_errstatus($status,$errmsg); print "\nStatus = $status: $errmsg\n"; } Astro-FITS-CFITSIO-1.10/testprog/testprog.tpt0000644000115400000360000000061406631304512017430 0ustar rpeteheadtmpcard1 1001 this is the 1st template card tmpcard2 ABCD this is the 2nd template card tmpcard3 1001.23 this is the 3rd template card tmpcard4 1001.45 this is the 4rd template card comment this is the 5th template card history this is the 6th template card tmpcard7 = / comment for null keyword -tmpcard1 tmpcarda change the name of tmpcard1 -tmpcard4 end junk will be ignored Astro-FITS-CFITSIO-1.10/testprog/testprog_pdl.pl0000644000115400000360000021341711055066275020111 0ustar rpetehead#!/usr/bin/perl use strict; use blib; use Astro::FITS::CFITSIO qw( :longnames :constants ); use PDL; use PDL::Core qw( howbig ); # for building the type translation table Astro::FITS::CFITSIO::PerlyUnpacking(0); my %types = type_table(); # bug in PDL (error with pdl(longlong, [1,2,3]) even though all other # types are fine with this sytax) forces us to use a workaround # whereby we first copy the hash elements to scalar and then use those # scalars as methods my $tbyte = $types{TBYTE()}; my $tshort = $types{TSHORT()}; my $tint = $types{TINT()}; my $tlong = $types{TLONG()}; my $oskey='value_string'; my $olkey=1; my $ojkey=11; my $otint = 12345678; my $ofkey = 12.121212; my $oekey = 13.131313; my $ogkey = 14.1414141414141414; my $odkey = 15.1515151515151515; my $otfrac = 0.1234567890123456; my $xcoordtype = 'RA---TAN'; my $ycoordtype = 'DEC--TAN'; my $onskey = [ 'first string', 'second string', ' ' ]; my $inclist = [ 'key*', 'newikys' ]; my $exclist = [ 'key_pr*', 'key_pkls' ]; my $onlkey = pdl([1,0,1])->$tint; # fits_write_key_log expects int my $onjkey = pdl([11,12,13])->$tlong; my $onfkey = float [12.121212, 13.131313, 14.141414]; my $onekey = float [13.131313, 14.141414, 15.151515]; my $ongkey = double [14.1414141414141414, 15.1515151515151515,16.1616161616161616]; my $ondkey = double [15.1515151515151515, 16.1616161616161616,17.1717171717171717]; my $tbcol = pdl([1,17,28,43,56])->$tlong; my $binname = "Test-BINTABLE"; my $template = "testprog.tpt"; my $tblname = "Test-ASCII"; my ($status,$tmp,$tmp1,$tmp2,@tmp); my ($ttype,$tunit,$tdisp,$tform,$nrows,$tfields,$morekeys,$extvers,$koutarray); my ($colnum,$colname,$typecode,$repeat,$width,$scale,$zero,$jnulval,$hdutype); my ($rowlen,$errmsg,$nmsg,$cval,$oshtkey); my ($version,$fptr,$tmpfptr); my ($filename,$filemode); my ($simple,$bitpix,$naxis,$naxes,$npixels,$pcount,$gcount,$extend); my ($card,$card2,$comment,$comm); my ($nkeys); my ($boutarray,$ioutarray,$joutarray,$eoutarray,$doutarray); my ($hdunum,$anynull); my ($binarray,$iinarray,$jinarray,$einarray,$dinarray); my ($ii,$jj,$larray,$larray2,$imgarray,$imgarray2); my ($keyword,$value); my ($iskey,$ilkey,$ijkey,$iekey,$idkey,$ishtkey,$inekey,$indkey); my $lsptr; my ($existkeys,$keynum); my ($inskey,$nfound,$inlkey,$injkey); my ($signval,$uchars,$nulstr); my ($xinarray,$kinarray,$cinarray,$minarray); my ($lpixels,$fpixels,$inc,$offset); my ($bnul,$inul,$knul,$jnul,$enul,$dnul); my ($xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$xpos,$ypos); my ($checksum,$asciisum,$datsum,$datastatus,$hdustatus); fits_get_version($version); printf "CFITSIO TESTPROG, v%.3f\n\n",$version; print "Try opening then closing a nonexistent file:\n"; $status=0; $fptr=Astro::FITS::CFITSIO::open_file('tq123x.kjl',READWRITE,$status); printf " ffopen fptr, status = %d %d (expect an error)\n",$fptr,$status; eval { $status = 115; # cheat!!! $fptr->close_file($status); }; printf " ffclos status = %d\n\n", $status; fits_clear_errmsg(); $status=0; $fptr=Astro::FITS::CFITSIO::create_file('!testprog.fit',$status); print "ffinit create new file status = $status\n"; $status and goto ERRSTATUS; $fptr->file_name($filename,$status); $fptr->file_mode($filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; $simple=1; $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; $pcount=0; $gcount=1; $extend=1; ############################ # write single keywords # ############################ $fptr->write_imghdr($bitpix,$naxis,$naxes,$status) and print "ffphps status = $status"; $fptr->write_record( "key_prec= 'This keyword was written by fxprec' / comment goes here", $status ) and printf"ffprec status = $status\n"; print "\ntest writing of long string keywords:\n"; $card = "1234567890123456789012345678901234567890" . "12345678901234567890123456789012345"; $fptr->write_key_str("card1",$card,"",$status); $fptr->read_keyword('card1',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234'6789012345"; $fptr->write_key_str('card2',$card,"",$status); $fptr->read_keyword('card2',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234''789012345"; $fptr->write_key_str('card3',$card,"",$status); $fptr->read_keyword('card3',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234567'9012345"; $fptr->write_key_str('card4',$card,"",$status); $fptr->read_keyword('card4',$card2,$comment,$status); print " $card\n$card2\n"; $fptr->write_key_str('key_pkys',$oskey,'fxpkys comment',$status) and print "ffpkys status = $status\n"; $fptr->write_key_log('key_pkyl',$olkey,'fxpkyl comment',$status) and print "ffpkyl status = $status\n"; $fptr->write_key_lng('key_pkyj',$ojkey,'fxpkyj comment',$status) and print "ffpkyj status = $status\n"; $fptr->write_key_fixflt('key_pkyf',$ofkey,5,'fxpkyf comment',$status) and print "ffpkyf status = $status\n"; $fptr->write_key_flt('key_pkye',$oekey,6,'fxpkye comment',$status) and print "ffpkye status = $status\n"; $fptr->write_key_fixdbl('key_pkyg',$ogkey,14,'fxpkyg comment',$status) and print "ffpkyg status = $status\n"; $fptr->write_key_dbl('key_pkyd',$odkey,14,'fxpkyd comment',$status) and print "ffpkyd status = $status\n"; $fptr->write_key_cmp('key_pkyc',$onekey->get_dataref,6,'fxpkyc comment',$status) and print "ffpkyc status = $status\n"; $fptr->write_key_dblcmp('key_pkym',$ondkey->get_dataref,14,'fxpkym comment',$status) and print "ffpkym status = $status\n"; $fptr->write_key_fixcmp('key_pkfc',$onekey->get_dataref,6,'fxpkfc comment',$status) and print "ffpkfc status = $status\n"; $fptr->write_key_fixdblcmp('key_pkfm',$ondkey->get_dataref,14,'fxpkfm comment',$status) and print "ffpkfm status = $status\n"; $fptr->write_key_longstr( 'key_pkls', 'This is a very long string value that is continued over more than one keyword.', 'fxpkls comment', $status, ) and print "ffpkls status = $status\n"; $fptr->write_key_longwarn($status) and print "ffplsw status = $status\n"; $fptr->write_key_triple('key_pkyt',$otint,$otfrac,'fxpkyt comment',$status) and print "ffpkyt status = $status\n"; $fptr->write_comment(' This keyword was written by fxpcom.',$status) and print "ffpcom status = $status\n"; $fptr->write_history(" This keyword written by fxphis (w/ 2 leading spaces).",$status) and print "ffphis status = $status\n"; $fptr->write_date($status) and print "ffpdat status = $status\n, goto ERRSTATUS"; ############################ # write arrays of keywords # ############################ $nkeys = 3; $fptr->write_keys_str('ky_pkns',1,$nkeys,$onskey,'fxpkns comment&',$status) and print "ffpkns status = $status\n"; $fptr->write_keys_log('ky_pknl',1,$nkeys,$onlkey->get_dataref,'fxpknl comment&',$status) and print "ffpknl status = $status\n"; $fptr->write_keys_lng('ky_pknj',1,$nkeys,$onjkey->get_dataref,'fxpknj comment&',$status) and print "ffpknj status = $status\n"; $fptr->write_keys_fixflt('ky_pknf',1,$nkeys,$onfkey->get_dataref,5,'fxpknf comment&',$status) and print "ffpknf status = $status\n"; $fptr->write_keys_flt('ky_pkne',1,$nkeys,$onekey->get_dataref,6,'fxpkne comment&',$status) and print "ffpkne status = $status\n"; $fptr->write_keys_fixdbl('ky_pkng',1,$nkeys,$ongkey->get_dataref,13,'fxpkng comment&',$status) and print "ffpkng status = $status\n"; $fptr->write_keys_dbl('ky_pknd',1,$nkeys,$ondkey->get_dataref,14,'fxpknd comment&',$status) and print "ffpknd status = $status\n",goto ERRSTATUS; ############################ # write generic keywords # ############################ $oskey = 1; $fptr->write_key(TSTRING,'tstring',$oskey,'tstring comment',$status) and print "ffpky status = $status\n"; $olkey = TLOGICAL; $fptr->write_key(TLOGICAL,'tlogical',$olkey,'tlogical comment',$status) and print "ffpky status = $status\n"; $cval = TBYTE; $fptr->write_key(TBYTE,'tbyte',$cval,'tbyte comment',$status) and print "ffpky status = $status\n"; $oshtkey = TSHORT; $fptr->write_key(TSHORT,'tshort',$oshtkey,'tshort comment',$status) and print "ffpky status = $status\n"; $olkey = TINT; $fptr->write_key(TINT,'tint',$olkey,'tint comment',$status) and print "ffpky status = $status\n"; $ojkey = TLONG; $fptr->write_key(TLONG,'tlong',$ojkey,'tlong comment',$status) and print "ffpky status = $status\n"; $oekey = TFLOAT; $fptr->write_key(TFLOAT,'tfloat',$oekey,'tfloat comment',$status) and print "ffpky status = $status\n"; $odkey = TDOUBLE; $fptr->write_key(TDOUBLE,'tdouble',$odkey,'tdouble comment',$status) and print "ffpky status = $status\n"; ############################ # write data # ############################ $fptr->write_key_lng('BLANK',-99,'value to use for undefined pixels',$status) and print "BLANK keyword status = $status\n"; $boutarray = sequence($types{TBYTE()}, $npixels+1)+1; $ioutarray = sequence($types{TSHORT()}, $npixels+1)+1; $koutarray = sequence($types{TINT()}, $npixels+1)+1; $joutarray = sequence($types{TLONG()}, $npixels+1)+1; $eoutarray = sequence(float, $npixels+1)+1; $doutarray = sequence(double, $npixels+1)+1; $fptr->write_img_byt(1,1,2,$boutarray->slice('0:1')->get_dataref,$status); $fptr->write_img_sht(1,5,2,$ioutarray->slice('4:5')->get_dataref,$status); $fptr->write_img_lng(1,9,2,$joutarray->slice('8:9')->get_dataref,$status); $fptr->write_img_flt(1,13,2,$eoutarray->slice('12:13')->get_dataref,$status); $fptr->write_img_dbl(1,17,2,$doutarray->slice('16:17')->get_dataref,$status); $fptr->write_imgnull_byt(1,3,2,$boutarray->slice('2:3')->get_dataref,4,$status); $fptr->write_imgnull_sht(1,7,2,$ioutarray->slice('6:7')->get_dataref,8,$status); $fptr->write_imgnull_lng(1,11,2,$joutarray->slice('10:11')->get_dataref,12,$status); $fptr->write_imgnull_flt(1,15,2,$eoutarray->slice('14:15')->get_dataref,16,$status); $fptr->write_imgnull_dbl(1,19,2,$doutarray->slice('18:19')->get_dataref,20,$status); $fptr->write_img_null(1,1,1,$status); $status and print "ffppnx status = $status\n", goto ERRSTATUS; $fptr->flush_file($status); print "ffflus status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; ############################ # read data # ############################ print "\nValues read back from primary array (99 = null pixel)\n"; print "The 1st, and every 4th pixel should be undefined:\n"; $anynull = 0; $binarray = zeroes($types{TBYTE()}, $npixels); $fptr->read_img_byt(1,1,$npixels,99,${$binarray->get_dataref},$anynull,$status); map printf(" %2d",$binarray->at($_)),(0..$npixels-1); print " $anynull (ffgpvb)\n"; $iinarray = zeroes($types{TSHORT()}, $npixels); $fptr->read_img_sht(1,1,$npixels,99,${$iinarray->get_dataref},$anynull,$status); map printf(" %2d",$iinarray->at($_)),(0..$npixels-1); print " $anynull (ffgpvi)\n"; $jinarray = zeroes($types{TLONG()}, $npixels); $fptr->read_img_lng(1,1,$npixels,99,${$jinarray->get_dataref},$anynull,$status); map printf(" %2d",$jinarray->at($_)),(0..$npixels-1); print " $anynull (ffgpvj)\n"; $einarray = zeroes(float, $npixels); $fptr->read_img_flt(1,1,$npixels,99,${$einarray->get_dataref},$anynull,$status); map printf(" %2.0f",$einarray->at($_)),(0..$npixels-1); print " $anynull (ffgpve)\n"; $dinarray = zeroes(double, $npixels); $fptr->read_img_dbl(1,1,$npixels,99,${$dinarray->get_dataref},$anynull,$status); map printf(" %2.0d",$dinarray->at($_)),(0..$npixels-1); print " $anynull (ffgpvd)\n"; $status and print("ERROR: ffgpv_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpv_ did not detect null values\n"; for ($ii=3;$ii<$npixels;$ii+=4) { $boutarray->set($ii,99); $ioutarray->set($ii,99); $joutarray->set($ii,99); $eoutarray->set($ii,99.0); $doutarray->set($ii,99.0); } $ii=0; $boutarray->set($ii,99); $ioutarray->set($ii,99); $joutarray->set($ii,99); $eoutarray->set($ii,99.0); $doutarray->set($ii,99.0); for ($ii=0; $ii<$npixels;$ii++) { ($boutarray->at($ii) != $binarray->at($ii)) and print "bout != bin = ${\($boutarray->at($ii))} ${\($binarray->at($ii))}}\n"; ($ioutarray->at($ii) != $iinarray->at($ii)) and print "iout != iin = ${\($ioutarray->at($ii))} ${\($iinarray->at($ii))}\n"; ($joutarray->at($ii) != $jinarray->at($ii)) and print "jout != jin = ${\($joutarray->at($ii))} ${\($jinarray->at($ii))}\n"; ($eoutarray->at($ii) != $einarray->at($ii)) and print "eout != ein = ${\($eoutarray->at($ii))} ${\($einarray->at($ii))}\n"; ($doutarray->at($ii) != $dinarray->at($ii)) and print "dout != din = ${\($doutarray->at($ii))} ${\($dinarray->at($ii))}\n"; } $binarray = zeroes($types{TBYTE()}, $npixels); $larray = $binarray->copy; $iinarray = zeroes($types{TSHORT()}, $npixels); $jinarray = zeroes($types{TLONG()}, $npixels); $einarray = zeroes(float, $npixels); $dinarray = zeroes(double, $npixels); $anynull = 0; $fptr->read_imgnull_byt(1,1,$npixels,${$binarray->get_dataref},${$larray->get_dataref},$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->at($ii)) { print " *" } else { printf " %2d",$binarray->at($ii) } } print " $anynull (ffgpfb)\n"; $fptr->read_imgnull_sht(1,1,$npixels,${$iinarray->get_dataref},${$larray->get_dataref},$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->at($ii)) { print " *" } else { printf " %2d",$iinarray->at($ii) } } print " $anynull (ffgpfi)\n"; $fptr->read_imgnull_lng(1,1,$npixels,${$jinarray->get_dataref},${$larray->get_dataref},$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->at($ii)) { print " *" } else { printf " %2d",$jinarray->at($ii) } } print " $anynull (ffgpfj)\n"; $fptr->read_imgnull_flt(1,1,$npixels,${$einarray->get_dataref},${$larray->get_dataref},$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->at($ii)) { print " *" } else { printf " %2.0f",$einarray->at($ii) } } print " $anynull (ffgpfe)\n"; $fptr->read_imgnull_dbl(1,1,$npixels,${$dinarray->get_dataref},${$larray->get_dataref},$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->at($ii)) { print " *" } else { printf " %2.0f",$dinarray->at($ii) } } print " $anynull (ffgpfd)\n"; $status and print("ERROR: ffgpf_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpf_ did not detect null values\n"; ########################################## # close and reopen file multiple times # ########################################## for ($ii=0;$ii<10;$ii++) { $fptr->close_file($status) and print("ERROR in ftclos (1) = $status"), goto ERRSTATUS; $fptr=Astro::FITS::CFITSIO::open_file($filename,READWRITE,$status); $status and print("ERROR: ffopen open file status = $status\n"), goto ERRSTATUS; } print "\nClosed then reopened the FITS file 10 times.\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $filename = ""; $fptr->file_name($filename,$status); $fptr->file_mode($filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; ############################ # read single keywords # ############################ $simple = 0; $bitpix = 0; $naxis = 0; $naxes = [0,0]; $pcount = -99; $gcount = -99; $extend = -99; print "\nRead back keywords:\n"; Astro::FITS::CFITSIO::PerlyUnpacking(1); $fptr->read_imghdr($simple,$bitpix,$naxis,$naxes,$pcount,$gcount,$extend,$status); Astro::FITS::CFITSIO::PerlyUnpacking(0); print "simple = $simple, bitpix = $bitpix, naxis = $naxis, naxes = ($naxes->[0], $naxes->[1])\n"; print " pcount = $pcount, gcount = $gcount, extend = $extend\n"; $fptr->read_record(9,$card,$status); print $card,"\n"; (substr($card,0,15) eq "KEY_PREC= 'This") or print "ERROR in ffgrec\n"; $fptr->read_keyn(9,$keyword,$value,$comment,$status); print "$keyword : $value : $comment :\n"; ($keyword eq 'KEY_PREC') or print "ERROR in ffgkyn: $keyword\n"; $fptr->read_card($keyword,$card,$status); print $card,"\n"; ($keyword eq substr($card,0,8)) or print "ERROR in ffgcrd: $keyword\n"; $fptr->read_keyword('KY_PKNS1',$value,$comment,$status); print "KY_PKNS1 : $value : $comment :\n"; (substr($value,0,14) eq "'first string'") or print "ERROR in ffgkey $value\n"; $fptr->read_key_str('key_pkys',$iskey,$comment,$status); print "KEY_PKYS $iskey $comment $status\n"; $fptr->read_key_log('key_pkyl',$ilkey,$comment,$status); print "KEY_PKYL $ilkey $comment $status\n"; $fptr->read_key_lng('KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKYJ $ijkey $comment $status\n"; $fptr->read_key_flt('KEY_PKYJ',$iekey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$iekey; $fptr->read_key_dbl('KEY_PKYJ',$idkey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$idkey; ($ijkey == 11 and $iekey == 11.0 and $idkey == 11.0) or printf "ERROR in ffgky[jed]: %d, %f, %f\n",$ijkey,$iekey,$idkey; $iskey = ""; $fptr->read_key(TSTRING,'key_pkys',$iskey,$comment,$status); print "KEY_PKY S $iskey $comment $status\n"; $ilkey = 0; $fptr->read_key(TLOGICAL,'key_pkyl',$ilkey,$comment,$status); print "KEY_PKY L $ilkey $comment $status\n"; $fptr->read_key(TBYTE,'KEY_PKYJ',$cval,$comment,$status); print "KEY_PKY BYTE $cval $comment $status\n"; $fptr->read_key(TSHORT,'KEY_PKYJ',$ishtkey,$comment,$status); print "KEY_PKY SHORT $ishtkey $comment $status\n"; $fptr->read_key(TINT,'KEY_PKYJ',$ilkey,$comment,$status); print "KEY_PKY INT $ilkey $comment $status\n"; $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $iekey=0; $fptr->read_key(TFLOAT,'KEY_PKYE',$iekey,$comment,$status); printf "KEY_PKY E %f $comment $status\n",$iekey; $idkey=0; $fptr->read_key(TDOUBLE,'KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKY D %f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYF',$idkey,$comment,$status); printf "KEY_PKYF %f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYE',$idkey,$comment,$status); printf "KEY_PKYE %f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYG',$idkey,$comment,$status); printf "KEY_PKYG %.14f $comment $status\n",$idkey; $fptr->read_key_dbl('KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKYD %.14f $comment $status\n",$idkey; $fptr->read_key_cmp('KEY_PKYC',$inekey,$comment,$status); printf "KEY_PKYC %f %f $comment $status\n",@$inekey; $fptr->read_key_cmp('KEY_PKFC',$inekey,$comment,$status); printf "KEY_PKFC %f %f $comment $status\n",@$inekey; $fptr->read_key_dblcmp('KEY_PKYM',$indkey,$comment,$status); printf "KEY_PKYM %f %f $comment $status\n",@$indkey; $fptr->read_key_dblcmp('KEY_PKFM',$indkey,$comment,$status); printf "KEY_PKFM %f %f $comment $status\n",@$indkey; $fptr->read_key_triple('KEY_PKYT',$ijkey,$idkey,$comment,$status); printf "KEY_PKYT $ijkey %.14f $comment $status\n",$idkey; $fptr->write_key_unit('KEY_PKYJ',"km/s/Mpc",$status); $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $fptr->read_key_unit('KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; $fptr->write_key_unit('KEY_PKYJ','',$status); $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $fptr->read_key_unit('KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; $fptr->write_key_unit('KEY_PKYJ','feet/second/second',$status); $ijkey=0; $fptr->read_key(TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $fptr->read_key_unit('KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; $fptr->read_key_longstr('key_pkls',$lsptr,$comment,$status); print "KEY_PKLS long string value = \n$lsptr\n"; $fptr->get_hdrpos($existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; ############################ # read array keywords # ############################ Astro::FITS::CFITSIO::PerlyUnpacking(1); $fptr->read_keys_str('ky_pkns',1,3,$inskey,$nfound,$status); print "ffgkns: $inskey->[0], $inskey->[1], $inskey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkns $nfound, $status\n"; $fptr->read_keys_log('ky_pknl',1,3,$inlkey,$nfound,$status); print "ffgknl: $inlkey->[0], $inlkey->[1], $inlkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknl $nfound, $status\n"; $fptr->read_keys_lng('ky_pknj',1,3,$injkey,$nfound,$status); print "ffgknj: $injkey->[0], $injkey->[1], $injkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknj $nfound, $status\n"; $fptr->read_keys_flt('ky_pkne',1,3,$inekey,$nfound,$status); printf "ffgkne: %f, %f, %f\n",@{$inekey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkne $nfound, $status\n"; $fptr->read_keys_dbl('ky_pknd',1,3,$indkey,$nfound,$status); printf "ffgknd: %f, %f, %f\n",@{$indkey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknd $nfound, $status\n"; Astro::FITS::CFITSIO::PerlyUnpacking(0); $fptr->read_card('HISTORY',$card,$status); $fptr->get_hdrpos($existkeys,$keynum,$status); $keynum -= 2; print "\nBefore deleting the HISTORY and DATE keywords...\n"; for ($ii=$keynum; $ii<=$keynum+3;$ii++) { $fptr->read_record($ii,$card,$status); print substr($card,0,8),"\n"; } ############################ # delete keywords # ############################ $fptr->delete_record($keynum+1,$status); $fptr->delete_key('DATE',$status); print "\nAfter deleting the keywords...\n"; for ($ii=$keynum; $ii<=$keynum+1;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR deleting keywords\n"; ############################ # insert keywords # ############################ $keynum += 4; $fptr->insert_record($keynum-3,"KY_IREC = 'This keyword inserted by fxirec'",$status); $fptr->insert_key_str('KY_IKYS',"insert_value_string", "ikys comment", $status); $fptr->insert_key_lng('KY_IKYJ',49,"ikyj comment", $status); $fptr->insert_key_log('KY_IKYL',1, "ikyl comment", $status); $fptr->insert_key_flt('KY_IKYE',12.3456, 4, "ikye comment", $status); $fptr->insert_key_dbl('KY_IKYD',12.345678901234567, 14, "ikyd comment", $status); $fptr->insert_key_fixflt('KY_IKYF',12.3456, 4, "ikyf comment", $status); $fptr->insert_key_fixdbl('KY_IKYG',12.345678901234567, 13, "ikyg comment", $status); print "\nAfter inserting the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR inserting keywords\n"; ############################ # modify keywords # ############################ $fptr->modify_record($keynum-4,'COMMENT This keyword was modified by fxmrec', $status); $fptr->modify_card('KY_IREC',"KY_MREC = 'This keyword was modified by fxmcrd'",$status); $fptr->modify_name('KY_IKYS','NEWIKYS',$status); $fptr->modify_comment('KY_IKYJ','This is a modified comment', $status); $fptr->modify_key_lng('KY_IKYJ',50,'&',$status); $fptr->modify_key_log('KY_IKYL',0,'&',$status); $fptr->modify_key_str('NEWIKYS','modified_string', '&', $status); $fptr->modify_key_flt('KY_IKYE',-12.3456, 4, '&', $status); $fptr->modify_key_dbl('KY_IKYD',-12.345678901234567, 14, 'modified comment', $status); $fptr->modify_key_fixflt('KY_IKYF',-12.3456, 4, '&', $status); $fptr->modify_key_fixdbl('KY_IKYG',-12.345678901234567, 13, '&', $status); print "\nAfter modifying the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; ############################ # update keywords # ############################ $fptr->update_card('KY_MREC',"KY_UCRD = 'This keyword was updated by fxucrd'",$status); $fptr->update_key_lng('KY_IKYJ',51,'&',$status); $fptr->update_key_log('KY_IKYL',1,'&',$status); $fptr->update_key_str('NEWIKYS',"updated_string",'&',$status); $fptr->update_key_flt('KY_IKYE',-13.3456, 4,'&',$status); $fptr->update_key_dbl('KY_IKYD',-13.345678901234567, 14,'modified comment',$status); $fptr->update_key_fixflt('KY_IKYF',-13.3456, 4,'&',$status); $fptr->update_key_fixdbl('KY_IKYG',-13.345678901234567, 13,'&',$status); print "\nAfter updating the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { $fptr->read_record($ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; $fptr->read_record(0,$card,$status); print "\nKeywords found using wildcard search (should be 13)...\n"; $nfound = 0; while (!$fptr->find_nextkey($inclist,2,$exclist,2,$card,$status)) { $nfound++; print $card,"\n"; } ($nfound == 13) or print("\nERROR reading keywords using wildcards (ffgnxk)\n"), goto ERRSTATUS; $status=0; ############################ # copy index keyword # ############################ $fptr->copy_key($fptr,1,4,'KY_PKNE',$status); $fptr->read_keys_str('ky_pkne',2,4,$inekey,$nfound,$status); printf "\nCopied keyword: ffgkne: %f, %f, %f\n", @$inekey; $status and print("\nERROR in ffgkne $nfound, $status\n"),goto ERRSTATUS; ###################################### # modify header using template file # ###################################### $fptr->write_key_template($template,$status) and print "\nERROR returned by ffpktp\n", goto ERRSTATUS; print "Updated header using template file (ffpktp)\n"; ############################ # create binary table # ############################ $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '') ]; $nrows = 21; $tfields = 10; $pcount = 0; $fptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nffibin status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $fptr->get_hdrpos($existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; $morekeys=40; $fptr->set_hdrsize($morekeys,$status); $fptr->get_hdrspace($existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; $fptr->set_btblnull(4,99,$status); $fptr->set_btblnull(5,99,$status); $fptr->set_btblnull(6,99,$status); $extvers=1; $fptr->write_key_lng('EXTVER',$extvers,'extension version number', $status); $fptr->write_key_lng('TNULL4',99,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL5',99,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL6',99,'value for undefined pixels',$status); $naxis=3; $naxes=[1,2,8]; $fptr->write_tdim(3,$naxis,$naxes,$status); $naxis=0; $naxes=undef; Astro::FITS::CFITSIO::PerlyUnpacking(1); # make naxes a normal Perl array $fptr->read_tdim(3,$naxis,$naxes,$status); Astro::FITS::CFITSIO::PerlyUnpacking(0); $fptr->read_key_str('TDIM3',$iskey,$comment,$status); print "TDIM3 = $iskey, $naxis, $naxes->[0], $naxes->[1], $naxes->[2]\n"; $fptr->set_hdustruc($status); ############################ # write data to columns # ############################ $signval = -1; for ($ii=0;$ii<21;$ii++) { $signval *= -1; $boutarray->set($ii,$ii+1); $ioutarray->set($ii, ($ii+1) * $signval); $koutarray->set($ii, ($ii+1) * $signval); $joutarray->set($ii, ($ii+1) * $signval); $eoutarray->set($ii, ($ii+1) * $signval); $doutarray->set($ii, ($ii+1) * $signval); } $fptr->write_col_str(1,1,1,3,$onskey,$status); $fptr->write_col_null(1,4,1,1,$status); $larray = byte [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0]; $fptr->write_col_bit(3,1,1,36,$larray->get_dataref,$status); for ($ii=4;$ii<9;$ii++) { $fptr->write_col_byt($ii,1,1,2,$boutarray->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_sht($ii,3,1,2,$ioutarray->slice('2:3')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_int($ii,5,1,2,$koutarray->slice('4:5')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_flt($ii,7,1,2,$eoutarray->slice('6:7')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_dbl($ii,9,1,2,$doutarray->slice('8:9')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_null($ii,11,1,1,$status); } $fptr->write_col_cmp(9,1,1,10,$eoutarray->get_dataref,$status); $fptr->write_col_dblcmp(10,1,1,10,$doutarray->get_dataref,$status); for ($ii=4;$ii<9;$ii++) { $fptr->write_colnull_byt($ii,12,1,2,$boutarray->slice('11:12')->get_dataref,13,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_sht($ii,14,1,2,$ioutarray->slice('13:14')->get_dataref,15,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_int($ii,16,1,2,$koutarray->slice('15:16')->get_dataref,17,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_flt($ii,18,1,2,$eoutarray->slice('17:18')->get_dataref,19.,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_colnull_dbl($ii,20,1,2,$doutarray->slice('19:20')->get_dataref,21.,$status); ($status == NUM_OVERFLOW) and $status = 0; } $fptr->write_col_log(2,1,1,21,$larray->get_dataref,$status); $fptr->write_col_null(2,11,1,1,$status); print "ffpcl_ status = $status\n"; ######################################### # get information about the columns # ######################################### print "\nFind the column numbers; a returned status value of 237 is"; print "\nexpected and indicates that more than one column name matches"; print "\nthe input column name template. Status = 219 indicates that"; print "\nthere was no matching column name."; $fptr->get_colnum(0,'Xvalue',$colnum,$status); print "\nColumn Xvalue is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { $fptr->get_colname(1,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; print "\nInformation about each column:\n"; for ($ii=0;$ii<$tfields;$ii++) { $fptr->get_coltype($ii+1,$typecode,$repeat,$width,$status); printf("%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width); $fptr->get_bcolparms($ii+1,$ttype->[0],$tunit->[0],$cval,$repeat,$scale,$zero,$jnulval,$tdisp,$status); printf " $ttype->[0], $tunit->[0], $cval, $repeat, %f, %f, $jnulval, $tdisp.\n",$scale,$zero; } print "\n"; ############################################### # insert ASCII table before the binary table # ############################################### $fptr->movrel_hdu(-1,$hdutype,$status) and goto ERRSTATUS; $tform = [ qw( A15 I10 F14.6 E12.5 D21.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ('','m**2','cm','erg/s','km/s') ]; $rowlen = 76; $nrows = 11; $tfields = 5; $fptr->insert_atbl($rowlen,$nrows,$tfields,$ttype,$tbcol->get_dataref,$tform,$tunit,$tblname,$status); print "ffitab status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $fptr->set_atblnull(1,'null1',$status); $fptr->set_atblnull(2,'null2',$status); $fptr->set_atblnull(3,'null3',$status); $fptr->set_atblnull(4,'null4',$status); $fptr->set_atblnull(5,'null5',$status); $extvers=2; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_key_str('TNULL1','null1','value for undefined pixels',$status); $fptr->write_key_str('TNULL2','null2','value for undefined pixels',$status); $fptr->write_key_str('TNULL3','null3','value for undefined pixels',$status); $fptr->write_key_str('TNULL4','null4','value for undefined pixels',$status); $fptr->write_key_str('TNULL5','null5','value for undefined pixels',$status); $status and goto ERRSTATUS; ############################ # write data to columns # ############################ for ($ii=0;$ii<21;$ii++) { $boutarray->set($ii,$ii+1); $ioutarray->set($ii,$ii+1); $joutarray->set($ii,$ii+1); $eoutarray->set($ii,$ii+1); $doutarray->set($ii,$ii+1); } $fptr->write_col_str(1,1,1,3,$onskey,$status); $fptr->write_col_null(1,4,1,1,$status); for ($ii=2;$ii<6;$ii++) { $fptr->write_col_byt($ii,1,1,2,$boutarray->slice('0:1')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_sht($ii,3,1,2,$ioutarray->slice('2:3')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_lng($ii,5,1,2,$joutarray->slice('4:5')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_flt($ii,7,1,2,$eoutarray->slice('6:7')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_dbl($ii,9,1,2,$doutarray->slice('8:9')->get_dataref,$status); ($status == NUM_OVERFLOW) and $status = 0; $fptr->write_col_null($ii,11,1,1,$status); } print "ffpcl_ status = $status\n"; ################################ # read data from ASCII table # ################################ $fptr->read_atblhdr($rowlen,$nrows,$tfields,$ttype,${$tbcol->get_dataref},$tform,$tunit,$tblname,$status); print "\nASCII table: rowlen, nrows, tfields, extname: $rowlen $nrows $tfields $tblname\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %3d %8s %8s \n", $ttype->[$ii], $tbcol->at($ii), $tform->[$ii], $tunit->[$ii]; } $nrows = 11; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(3,1,1,$nrows,99,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(4,1,1,$nrows,99,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(5,1,1,$nrows,99,${$dinarray->get_dataref},$anynull,$status); print "\nData values read from ASCII table:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $jinarray->at($ii), $einarray->at($ii), $dinarray->at($ii) ); } $uchars = zeroes(78)->byte; $fptr->read_tblbytes(1,20,78,${$uchars->get_dataref},$status); print "\n"; foreach (0..77) { print pack "C", $uchars->at($_) } print "\n"; $fptr->write_tblbytes(1,20,78,$uchars->get_dataref,$status); ######################################### # get information about the columns # ######################################### $fptr->get_colnum(0,'name',$colnum,$status); print "\nColumn name is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { $fptr->get_colname(0,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; for ($ii=0;$ii<$tfields;$ii++) { $fptr->get_coltype($ii+1,$typecode,$repeat,$width,$status); printf "%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width; $fptr->get_acolparms($ii+1,$ttype->[0],$tbcol,$tunit->[0],$tform->[0],$scale, $zero,$nulstr,$tdisp,$status); printf " $ttype->[0], $tbcol, $tunit->[0], $tform->[0], %f, %f, $nulstr, $tdisp.\n", $scale, $zero; } print "\n"; ############################################### # test the insert/delete row/column routines # ############################################### $fptr->insert_rows(2,3,$status) and goto ERRSTATUS; $nrows = 14; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(3,1,1,$nrows,99,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(4,1,1,$nrows,99,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(5,1,1,$nrows,99,${$dinarray->get_dataref},$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $jinarray->at($ii), $einarray->at($ii), $dinarray->at($ii) ); } $fptr->delete_rows(10,2,$status) and goto ERRSTATUS; $nrows = 12; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(3,1,1,$nrows,99,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(4,1,1,$nrows,99,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(5,1,1,$nrows,99,${$dinarray->get_dataref},$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $jinarray->at($ii), $einarray->at($ii), $dinarray->at($ii) ); } $fptr->delete_col(3,$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(3,1,1,$nrows,99,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(4,1,1,$nrows,99,${$dinarray->get_dataref},$anynull,$status); print "\nData values after deleting column 3:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $einarray->at($ii), $dinarray->at($ii) ); } $fptr->insert_col(5,'INSERT_COL','F14.6',$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(2,1,1,$nrows,99,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(2,1,1,$nrows,99,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(3,1,1,$nrows,99,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(4,1,1,$nrows,99,${$dinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(5,1,1,$nrows,99,${$jinarray->get_dataref},$anynull,$status); print "\nData values after inserting column 5:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f %d\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $einarray->at($ii), $dinarray->at($ii), $jinarray->at($ii), ); } ############################################################ # create a temporary file and copy the ASCII table to it, # # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v6.tmp'; $tmpfptr=Astro::FITS::CFITSIO::create_file($filename,$status); print "Create temporary file: ffinit status = $status\n"; $tmpfptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=12; $tfields=0; $rowlen=0; $tmpfptr->insert_atbl($rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nCreate ASCII table with 0 columns: ffitab status = $status\n"; $fptr->copy_col($tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $tmpfptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$tblname,0,$status); print "\nCreate Binary table with 0 columns: ffibin status = $status\n"; $fptr->copy_col($tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $tmpfptr->delete_file($status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; ################################ # read data from binary table # ################################ $fptr->movrel_hdu(1,$hdutype,$status) and goto ERRSTATUS; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $fptr->get_hdrspace($existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; $fptr->read_btblhdr($nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "\nBinary table: nrows, tfields, extname, pcount: $nrows $tfields $binname $pcount\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %8s %8s \n", $ttype->[$ii], $tform->[$ii], $tunit->[$ii]; } $larray = zeroes($types{TBYTE()}, 40); print "\nData values read from binary table:\n"; printf " Bit column (X) data values: \n\n"; $fptr->read_col_bit(3,1,1,36,${$larray->get_dataref},$status); for ($jj=0;$jj<5;$jj++) { foreach ($jj*8..$jj*8+7) { print $larray->at($_); } print " "; } $larray = zeroes($types{TBYTE()}, $nrows); $xinarray = zeroes($types{TBYTE()}, $nrows); $binarray = zeroes($types{TBYTE()}, $nrows); $iinarray = zeroes($types{TSHORT()}, $nrows); $kinarray = zeroes($types{TINT()}, $nrows); $einarray = zeroes(float, $nrows); $dinarray = zeroes(double, $nrows); $cinarray = zeroes(float, $nrows*2); $minarray = zeroes(double, $nrows*2); print "\n\n"; $fptr->read_col_str(1,4,1,1,'',$inskey,$anynull,$status); print "null string column value = -$inskey->[0]- (should be --)\n"; $nrows=21; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_log(2,1,1,$nrows,0,${$larray->get_dataref},$anynull,$status); $fptr->read_col_byt(3,1,1,$nrows,98,${$xinarray->get_dataref},$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_int(6,1,1,$nrows,98,${$kinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(7,1,1,$nrows,98.,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(8,1,1,$nrows,98.,${$dinarray->get_dataref},$anynull,$status); $fptr->read_col_cmp(9,1,1,$nrows,98.,${$cinarray->get_dataref},$anynull,$status); $fptr->read_col_dblcmp(10,1,1,$nrows,98.,${$minarray->get_dataref},$anynull,$status); print "\nRead columns with ffgcv_:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f) \n", $inskey->[$ii], $larray->at($ii), $xinarray->at($ii), $binarray->at($ii), $iinarray->at($ii),$kinarray->at($ii), $einarray->at($ii), $dinarray->at($ii), $cinarray->at($ii*2),$cinarray->at($ii*2+1), $minarray->at($ii*2),$minarray->at($ii*2+1), } @tmp = (0..$nrows-1); $larray = pdl(\@tmp)->$tbyte; $larray2 = $larray->copy; $xinarray = pdl(\@tmp)->$tbyte; $binarray = pdl(\@tmp)->$tbyte; $iinarray = pdl(\@tmp)->$tshort; $kinarray = pdl(\@tmp)->$tint; $einarray = float \@tmp; $dinarray = double \@tmp; @tmp = (0..2*$nrows-1); $cinarray = float \@tmp; $minarray = double \@tmp; $fptr->read_colnull_str(1,1,1,$nrows,$inskey,${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_log(2,1,1,$nrows,${$larray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_byt(3,1,1,$nrows,${$xinarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_byt(4,1,1,$nrows,${$binarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_sht(5,1,1,$nrows,${$iinarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_int(6,1,1,$nrows,${$kinarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_flt(7,1,1,$nrows,${$einarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_dbl(8,1,1,$nrows,${$dinarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_cmp(9,1,1,$nrows,${$cinarray->get_dataref},${$larray2->get_dataref},$anynull,$status); $fptr->read_colnull_dblcmp(10,1,1,$nrows,${$minarray->get_dataref},${$larray2->get_dataref},$anynull,$status); print "\nRead columns with ffgcf_:\n"; for ($ii=0;$ii<10;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f)\n", $inskey->[$ii], $larray->at($ii), $xinarray->at($ii), $binarray->at($ii), $iinarray->at($ii), $kinarray->at($ii), $einarray->at($ii), $dinarray->at($ii), $cinarray->at($ii*2),$cinarray->at($ii*2+1), $minarray->at($ii*2),$minarray->at($ii*2+1), } for ($ii=10; $ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d \n", $inskey->[$ii], $larray->at($ii), $xinarray->at($ii), $binarray->at($ii), $iinarray->at($ii); } $fptr->write_record("key_prec= 'This keyword was written by f_prec' / comment here", $status); ############################################### # test the insert/delete row/column routines # ############################################### $fptr->insert_rows(2,3,$status) and goto ERRSTATUS; $nrows=14; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(6,1,1,$nrows,98,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(7,1,1,$nrows,98.,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(8,1,1,$nrows,98.,${$dinarray->get_dataref},$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $jinarray->at($ii), $einarray->at($ii), $dinarray->at($ii); } $fptr->delete_rows(10,2,$status) and goto ERRSTATUS; $nrows=12; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(6,1,1,$nrows,98,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(7,1,1,$nrows,98.,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(8,1,1,$nrows,98.,${$dinarray->get_dataref},$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $jinarray->at($ii), $einarray->at($ii), $dinarray->at($ii); } $fptr->delete_col(6,$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(6,1,1,$nrows,98.,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(7,1,1,$nrows,98.,${$dinarray->get_dataref},$anynull,$status); print "\nData values after deleting column 6:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $einarray->at($ii), $dinarray->at($ii); } $fptr->insert_col(8,'INSERT_COL','1E',$status) and goto ERRSTATUS; $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(8,1,1,$nrows,98,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(6,1,1,$nrows,98.,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(7,1,1,$nrows,98.,${$dinarray->get_dataref},$anynull,$status); print "\nData values after inserting column 8:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $einarray->at($ii), $dinarray->at($ii) , $jinarray->at($ii); } $fptr->write_col_null(8,1,1,10,$status); $fptr->read_col_str(1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); $fptr->read_col_byt(4,1,1,$nrows,98,${$binarray->get_dataref},$anynull,$status); $fptr->read_col_sht(5,1,1,$nrows,98,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col_flt(6,1,1,$nrows,98.,${$einarray->get_dataref},$anynull,$status); $fptr->read_col_dbl(7,1,1,$nrows,98.,${$dinarray->get_dataref},$anynull,$status); $fptr->read_col_lng(8,1,1,$nrows,98,${$jinarray->get_dataref},$anynull,$status); print "\nValues after setting 1st 10 elements in column 8 = null:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->at($ii), $iinarray->at($ii), $einarray->at($ii), $dinarray->at($ii) , $jinarray->at($ii); } ############################################################ # create a temporary file and copy the binary table to it,# # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v5.tmp'; $tmpfptr=Astro::FITS::CFITSIO::create_file($filename,$status); print "Create temporary file: ffinit status = $status\n"; $tmpfptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=22; $tfields=0; $tmpfptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nCreate binary table with 0 columns: ffibin status = $status\n"; $fptr->copy_col($tmpfptr,7,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,6,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,5,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $fptr->copy_col($tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; $tmpfptr->delete_file($status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; #################################################### # insert binary table following the primary array # #################################################### $fptr->movabs_hdu(1,$hdutype,$status); $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields=10; $pcount=0; $fptr->insert_btbl($nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "ffibin status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $extvers=3; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_key_lng('TNULL4',77,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL5',77,'value for undefined pixels',$status); $fptr->write_key_lng('TNULL6',77,'value for undefined pixels',$status); $fptr->write_key_lng('TSCAL4',1000,'scaling factor',$status); $fptr->write_key_lng('TSCAL5',1,'scaling factor',$status); $fptr->write_key_lng('TSCAL6',100,'scaling factor',$status); $fptr->write_key_lng('TZERO4',0,'scaling offset',$status); $fptr->write_key_lng('TZERO5',32768,'scaling offset',$status); $fptr->write_key_lng('TZERO6',100,'scaling offset',$status); $fptr->set_btblnull(4,77,$status); $fptr->set_btblnull(5,77,$status); $fptr->set_btblnull(6,77,$status); $fptr->set_tscale(4,1000.,0.,$status); $fptr->set_tscale(5,1.,32768.,$status); $fptr->set_tscale(6,100.,100.,$status); ############################ # write data to columns # ############################ $joutarray = pdl([0,1000,10000,32768,65535])->$tlong; for ($ii=4;$ii<7;$ii++) { $fptr->write_col_lng($ii,1,1,5,$joutarray->get_dataref,$status); ($status == NUM_OVERFLOW) and print("Overflow writing to column $ii\n"),$status=0; $fptr->write_col_null($ii,6,1,1,$status); } for ($jj=4;$jj<7;$jj++) { $fptr->read_col_lng($jj,1,1,6,-999,${$jinarray->get_dataref},$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->at($ii); } print "\n"; } print "\n"; $fptr->set_tscale(4,1.,0.,$status); $fptr->set_tscale(5,1.,0.,$status); $fptr->set_tscale(6,1.,0.,$status); for ($jj=4;$jj<7;$jj++) { $fptr->read_col_lng($jj,1,1,6,-999,${$jinarray->get_dataref},$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->at($ii); } print "\n"; } ###################################################### # insert image extension following the binary table # ###################################################### $bitpix=-32; $naxis=2; $naxes=[15,25]; $fptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $imgarray = zeroes($types{TSHORT()}, 19,30); for ($jj=0;$jj<30;$jj++) { for ($ii=0;$ii<19;$ii++) { $imgarray->set($ii,$jj, ($ii<15) ? ($jj * 10) + $ii : 0 );; } } $fptr->write_2d_sht(1,19,$naxes->[0],$naxes->[1],$imgarray->get_dataref,$status); print "\nWrote whole 2D array: ffp2di status = $status\n"; $imgarray = zeroes($types{TSHORT()}, 19,30); $fptr->read_2d_sht(1,0,19,$naxes->[0],$naxes->[1],${$imgarray->get_dataref},$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { foreach (15..18) { $imgarray->set($_,$jj,0) } for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->at($ii,$jj); } print "\n"; } $imgarray2 = zeroes($types{TSHORT()}, 10,20); for ($jj=0;$jj<20;$jj++) { for ($ii=0;$ii<10;$ii++) { $imgarray2->set($ii,$jj, ($jj * -10) - $ii); } } $fpixels=[5,5]; $lpixels = [14,14]; $fptr->write_subset_sht(1,$naxis,$naxes,$fpixels,$lpixels,$imgarray2->get_dataref,$status); print "\nWrote subset 2D array: ffpssi status = $status\n"; $imgarray = zeroes($types{TSHORT()}, 19,30); $fptr->read_2d_sht(1,0,19,$naxes->[0],$naxes->[1],${$imgarray->get_dataref},$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { foreach (15..18) { $imgarray->set($_,$jj,0) } for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->at($ii,$jj); } print "\n"; } $fpixels = [2,5]; $lpixels = [10,8]; $inc = [2,3]; $imgarray = zeroes($types{TSHORT()}, 19,30); $fptr->read_subset_sht(1,$naxis,$naxes,$fpixels,$lpixels,$inc,0,${$imgarray->get_dataref},$anynull,$status); print "\nRead subset of 2D array: ffgsvi status = $status\n"; for ($ii=0;$ii<10;$ii++) { printf " %3d",$imgarray->at($ii,0); } print "\n"; ########################################################### # insert another image extension # # copy the image extension to primary array of tmp file. # # then delete the tmp file, and the image extension # ########################################################### $bitpix=16; $naxis=2; $naxes = [15,25]; $fptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; $filename = 't1q2s3v4.tmp'; $tmpfptr=Astro::FITS::CFITSIO::create_file($filename,$status); print "Create temporary file: ffinit status = $status\n"; $fptr->copy_hdu($tmpfptr,0,$status); print "Copy image extension to primary array of tmp file.\n"; print "ffcopy status = $status\n"; $tmpfptr->read_record(1,$card,$status); print "$card\n"; $tmpfptr->read_record(2,$card,$status); print "$card\n"; $tmpfptr->read_record(3,$card,$status); print "$card\n"; $tmpfptr->read_record(4,$card,$status); print "$card\n"; $tmpfptr->read_record(5,$card,$status); print "$card\n"; $tmpfptr->read_record(6,$card,$status); print "$card\n"; $tmpfptr->delete_file($status); print "Delete the tmp file: ffdelt status = $status\n"; $fptr->delete_hdu($hdutype,$status); print "Delete the image extension; hdutype, status = $hdutype $status\n"; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; ########################################################### # append bintable extension with variable length columns # ########################################################### $fptr->create_hdu($status); print "ffcrhd status = $status\n"; $tform = [ qw( 1PA 1PL 1PB 1PB 1PI 1PJ 1PE 1PD 1PC 1PM ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields = 10; $pcount=0; $fptr->write_btblhdr($nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "Variable length arrays: ffphbn status = $status\n"; $extvers=4; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_key_lng('TNULL4', 88, 'value for undefined pixels', $status); $fptr->write_key_lng('TNULL5', 88, 'value for undefined pixels', $status); $fptr->write_key_lng('TNULL6', 88, 'value for undefined pixels', $status); ############################ # write data to columns # ############################ $iskey = 'abcdefghijklmnopqrst'; $boutarray = pdl([1..21])->$tbyte; $ioutarray = pdl([1..21])->$tshort; $joutarray = pdl([1..21])->$tlong; $eoutarray = float [1..21]; $doutarray = double [1..21]; $larray = pdl([0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1])->$tbyte; $inskey=['']; $fptr->write_col_str(1,1,1,1,$inskey,$status); $fptr->write_col_log(2,1,1,1,$larray->get_dataref,$status); $fptr->write_col_bit(3,1,1,1,$larray->get_dataref,$status); $fptr->write_col_byt(4,1,1,1,$boutarray->get_dataref,$status); $fptr->write_col_sht(5,1,1,1,$ioutarray->get_dataref,$status); $fptr->write_col_lng(6,1,1,1,$joutarray->get_dataref,$status); $fptr->write_col_flt(7,1,1,1,$eoutarray->get_dataref,$status); $fptr->write_col_dbl(8,1,1,1,$doutarray->get_dataref,$status); for ($ii=2;$ii<=20;$ii++) { $inskey->[0] = $iskey; $inskey->[0] = substr($inskey->[0],0,$ii); $fptr->write_col_str(1,$ii,1,1,$inskey,$status); $fptr->write_col_log(2,$ii,1,$ii,$larray->get_dataref,$status); $fptr->write_col_null(2,$ii,$ii-1,1,$status); $fptr->write_col_bit(3,$ii,1,$ii,$larray->get_dataref,$status); $fptr->write_col_byt(4,$ii,1,$ii,$boutarray->get_dataref,$status); $fptr->write_col_null(4,$ii,$ii-1,1,$status); $fptr->write_col_sht(5,$ii,1,$ii,$ioutarray->get_dataref,$status); $fptr->write_col_null(5,$ii,$ii-1,1,$status); $fptr->write_col_lng(6,$ii,1,$ii,$joutarray->get_dataref,$status); $fptr->write_col_null(6,$ii,$ii-1,1,$status); $fptr->write_col_flt(7,$ii,1,$ii,$eoutarray->get_dataref,$status); $fptr->write_col_null(7,$ii,$ii-1,1,$status); $fptr->write_col_dbl(8,$ii,1,$ii,$doutarray->get_dataref,$status); $fptr->write_col_null(8,$ii,$ii-1,1,$status); } print "ffpcl_ status = $status\n"; ################################# # close then reopen this HDU # ################################# $fptr->movrel_hdu(-1,$hdutype,$status); $fptr->movrel_hdu(1,$hdutype,$status); ############################# # read data from columns # ############################# $fptr->read_key_lng('PCOUNT',$pcount,$comm,$status); print "PCOUNT = $pcount\n"; $inskey->[0] = ' '; $iskey = ' '; print "HDU number = ${\($fptr->get_hdu_num($hdunum))}\n"; for ($ii=1;$ii<=20;$ii++) { $larray = zeroes($types{TBYTE()}, $ii); $boutarray = zeroes($types{TBYTE()}, $ii); $ioutarray = zeroes($types{TSHORT()}, $ii); $joutarray = zeroes($types{TLONG()}, $ii); $eoutarray = zeroes(float, $ii); $doutarray = zeroes(double, $ii); $fptr->read_col_str(1,$ii,1,1,$iskey,$inskey,$anynull,$status); print "A $inskey->[0] $status\nL"; $fptr->read_col_log(2,$ii,1,$ii,0,${$larray->get_dataref},$anynull,$status); foreach (0..$ii-1) { printf " %2d", $larray->at($_); } print " $status\nX"; $fptr->read_col_bit(3,$ii,1,$ii,${$larray->get_dataref},$status); foreach (0..$ii-1) { printf " %2d", $larray->at($_); } print " $status\nB"; $fptr->read_col_byt(4,$ii,1,$ii,99,${$boutarray->get_dataref},$anynull,$status); foreach (0..$ii-1) { printf " %2d", $boutarray->at($_); } print " $status\nI"; $fptr->read_col_sht(5,$ii,1,$ii,99,${$ioutarray->get_dataref},$anynull,$status); foreach (0..$ii-1) { printf " %2d", $ioutarray->at($_); } print " $status\nJ"; $fptr->read_col_lng(6,$ii,1,$ii,99,${$joutarray->get_dataref},$anynull,$status); foreach (0..$ii-1) { printf " %2d", $joutarray->at($_); } print " $status\nE"; $fptr->read_col_flt(7,$ii,1,$ii,99,${$eoutarray->get_dataref},$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $eoutarray->at($_); } print " $status\nD"; $fptr->read_col_dbl(8,$ii,1,$ii,99,${$doutarray->get_dataref},$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $doutarray->at($_); } print " $status\n"; $fptr->read_descript(8,$ii,$repeat,$offset,$status); print "Column 8 repeat and offset = $repeat $offset\n"; } ##################################### # create another image extension # ##################################### $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; $fptr->insert_img($bitpix,$naxis,$naxes,$status); print "\nffcrim status = $status\n"; @tmp = map(($_*2),(0..$npixels-1)); $boutarray = pdl(\@tmp)->$tbyte; $ioutarray = pdl(\@tmp)->$tshort; $koutarray = pdl(\@tmp)->$tint; $joutarray = pdl(\@tmp)->$tlong; $eoutarray = float \@tmp; $doutarray = double \@tmp; $fptr->write_img(TBYTE, 1, 2, $boutarray->slice('0:1')->get_dataref, $status); $fptr->write_img(TSHORT, 3, 2,$ioutarray->slice('2:3')->get_dataref, $status); $fptr->write_img(TINT, 5, 2, $koutarray->slice('4:5')->get_dataref, $status); $fptr->write_img(TSHORT, 7, 2, $ioutarray->slice('6:7')->get_dataref, $status); $fptr->write_img(TLONG, 9, 2, $joutarray->slice('8:9')->get_dataref, $status); $fptr->write_img(TFLOAT, 11, 2, $eoutarray->slice('10:11')->get_dataref, $status); $fptr->write_img(TDOUBLE, 13, 2, $doutarray->slice('12:13')->get_dataref, $status); print "ffppr status = $status\n"; $bnul=0; $inul=0; $knul=0; $jnul=0; $enul=0.0; $dnul=0.0; $fptr->read_img(TBYTE,1,14,$bnul,${$binarray->get_dataref},$anynull,$status); $fptr->read_img(TSHORT,1,14,$inul,${$iinarray->get_dataref},$anynull,$status); $fptr->read_img(TINT,1,14,$knul,${$kinarray->get_dataref},$anynull,$status); $fptr->read_img(TLONG,1,14,$jnul,${$jinarray->get_dataref},$anynull,$status); $fptr->read_img(TFLOAT,1,14,$enul,${$einarray->get_dataref},$anynull,$status); $fptr->read_img(TDOUBLE,1,14,$dnul,${$dinarray->get_dataref},$anynull,$status); print "\nImage values written with ffppr and read with ffgpv:\n"; $npixels=14; foreach (0..$npixels-1) { printf " %2d", $binarray->at($_) }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d", $iinarray->at($_) }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d", $kinarray->at($_) }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d", $jinarray->at($_) }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f", $einarray->at($_) }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f", $dinarray->at($_) }; print " $anynull (double)\n"; ########################################## # test world coordinate system routines # ########################################## $xrval=45.83; $yrval=63.57; $xrpix=256.0; $yrpix=257.0; $xinc = -.00277777; $yinc = .00277777; $fptr->write_key_dbl('CRVAL1',$xrval,10,'comment',$status); $fptr->write_key_dbl('CRVAL2',$yrval,10,'comment',$status); $fptr->write_key_dbl('CRPIX1',$xrpix,10,'comment',$status); $fptr->write_key_dbl('CRPIX2',$yrpix,10,'comment',$status); $fptr->write_key_dbl('CDELT1',$xinc,10,'comment',$status); $fptr->write_key_dbl('CDELT2',$yinc,10,'comment',$status); $fptr->write_key_str('CTYPE1',$xcoordtype,'comment',$status); $fptr->write_key_str('CTYPE2',$ycoordtype,'comment',$status); print "\nWrote WCS keywords status = $status\n"; $xrval = 0; $yrval = 0; $xrpix = 0; $yrpix = 0; $xinc = 0; $yinc = 0; $rot = 0; $fptr->read_img_coord($xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$status); print "Read WCS keywords with ffgics status = $status\n"; $xpix = 0.5; $ypix = 0.5; fits_pix_to_world($xpix,$ypix,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpos,$ypos,$status); printf " CRVAL1, CRVAL2 = %16.12f, %16.12f\n", $xrval,$yrval; printf " CRPIX1, CRPIX2 = %16.12f, %16.12f\n", $xrpix,$yrpix; printf " CDELT1, CDELT2 = %16.12f, %16.12f\n", $xinc,$yinc; printf " Rotation = %10.3f, CTYPE = $ctype\n", $rot; print "Calculated sky coordinate with ffwldp status = $status\n"; printf " Pixels (%8.4f,%8.4f) --> (%11.6f, %11.6f) Sky\n",$xpix,$ypix,$xpos,$ypos; fits_world_to_pix($xpos,$ypos,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$status); print "Calculated pixel coordinate with ffxypx status = $status\n"; printf " Sky (%11.6f, %11.6f) --> (%8.4f,%8.4f) Pixels\n",$xpos,$ypos,$xpix,$ypix; ###################################### # append another ASCII table # ###################################### $tform = [ qw( A15 I11 F15.6 E13.5 D22.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s' ) ]; $nrows = 11; $tfields = 5; $tblname = 'new_table'; $fptr->create_tbl(ASCII_TBL,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,$status); print "\nffcrtb status = $status\n"; $extvers = 5; $fptr->write_key_lng('EXTVER',$extvers,'extension version number',$status); $fptr->write_col(TSTRING,1,1,1,3,$onskey,$status); @tmp = map(($_*3),(0..$npixels-1)); $boutarray = pdl(\@tmp)->$tbyte; $ioutarray = pdl(\@tmp)->$tshort; $koutarray = pdl(\@tmp)->$tint; $joutarray = pdl(\@tmp)->$tlong; $eoutarray = float \@tmp; $doutarray = double \@tmp; for ($ii=2;$ii<6;$ii++) { $fptr->write_col(TBYTE,$ii,1,1,2,$boutarray->slice('0:1')->get_dataref,$status); $fptr->write_col(TSHORT,$ii,3,1,2,$ioutarray->slice('2:3')->get_dataref,$status); $fptr->write_col(TLONG,$ii,5,1,2,$joutarray->slice('4:5')->get_dataref,$status); $fptr->write_col(TFLOAT,$ii,7,1,2,$eoutarray->slice('6:7')->get_dataref,$status); $fptr->write_col(TDOUBLE,$ii,9,1,2,$doutarray->slice('8:9')->get_dataref,$status); } print "ffpcl status = $status\n"; $fptr->read_col(TBYTE,2,1,1,10,$bnul,${$binarray->get_dataref},$anynull,$status); $fptr->read_col(TSHORT,2,1,1,10,$inul,${$iinarray->get_dataref},$anynull,$status); $fptr->read_col(TINT,3,1,1,10,$knul,${$kinarray->get_dataref},$anynull,$status); $fptr->read_col(TLONG,3,1,1,10,$jnul,${$jinarray->get_dataref},$anynull,$status); $fptr->read_col(TFLOAT,4,1,1,10,$enul,${$einarray->get_dataref},$anynull,$status); $fptr->read_col(TDOUBLE,5,1,1,10,$dnul,${$dinarray->get_dataref},$anynull,$status); print "\nColumn values written with ffpcl and read with ffgcl:\n"; $npixels = 10; foreach (0..$npixels-1) { printf " %2d",$binarray->at($_) }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d",$iinarray->at($_) }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d",$kinarray->at($_) }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d",$jinarray->at($_) }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f",$einarray->at($_) }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f",$dinarray->at($_) }; print " $anynull (double)\n"; ########################################################### # perform stress test by cycling thru all the extensions # ########################################################### print "\nRepeatedly move to the 1st 4 HDUs of the file:\n"; for ($ii=0;$ii<10;$ii++) { $fptr->movabs_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $fptr->movrel_hdu(-1,$hdutype,$status); print $fptr->get_hdu_num($hdunum); $status and last; } print "\n"; print "Move to extensions by name and version number: (ffmnhd)\n"; $extvers=1; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=3; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=4; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $tblname = 'Test-ASCII'; $extvers=2; $fptr->movnam_hdu(ANY_HDU,$tblname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $tblname = 'new_table'; $extvers=5; $fptr->movnam_hdu(ANY_HDU,$tblname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $extvers=0; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=17; $fptr->movnam_hdu(ANY_HDU,$binname,$extvers,$status); $fptr->get_hdu_num($hdunum); print " $binname, $extvers = hdu $hdunum, $status"; print " (expect a 301 error status here)\n"; $status = 0; $fptr->get_num_hdus($hdunum,$status); print "Total number of HDUs in the file = $hdunum\n"; ######################## # checksum tests # ######################## $checksum=1234567890; fits_encode_chksum($checksum,0,$asciisum); print "\nEncode checksum: $checksum -> $asciisum\n"; $checksum = 0; fits_decode_chksum($asciisum,0,$checksum); print "Decode checksum: $asciisum -> $checksum\n"; $fptr->write_chksum($status); $fptr->read_card('DATASUM',$card,$status); printf "%.30s\n", $card; $fptr->get_chksum($datsum,$checksum,$status); print "ffgcks data checksum, status = $datsum, $status\n"; $fptr->verify_chksum($datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; $fptr->write_record("new_key = 'written by fxprec' / to change checksum",$status); $fptr->update_chksum($status); print "ffupck status = $status\n"; $fptr->read_card('DATASUM',$card,$status); printf "%.30s\n", $card; $fptr->verify_chksum($datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; $fptr->delete_key('CHECKSUM',$status); $fptr->delete_key('DATASUM',$status); ############################ # close file and quit # ############################ ERRSTATUS: { $fptr->close_file($status); print "ffclos status = $status\n"; print "\nNormally, there should be 8 error messages on the stack\n"; print "all regarding 'numerical overflows':\n"; fits_read_errmsg($errmsg); $nmsg = 0; while (length $errmsg) { printf " $errmsg\n"; $nmsg++; fits_read_errmsg($errmsg); } if ($nmsg != 8) { print "\nWARNING: Did not find the expected 8 error messages!\n"; } fits_get_errstatus($status,$errmsg); print "\nStatus = $status: $errmsg\n"; } sub type_table { my %table; my (@pdl_types, @cfitsio_types); # unsigned type routines are not tested in this program, so we only # need to handle the signed types @pdl_types = (byte, short, long, longlong); @cfitsio_types = ( TBYTE, TSHORT, TINT, TLONG, TLONGLONG ); CFITSIO_TYPES: for my $cfitsio_type ( @cfitsio_types ) { for my $ptype (@pdl_types) { howbig($ptype) == Astro::FITS::CFITSIO::sizeof_datatype($cfitsio_type) and $table{$cfitsio_type} = $ptype, next CFITSIO_TYPES; } die "could not find a matching PDL type for cfitsio type $cfitsio_type"; } return %table; } Astro-FITS-CFITSIO-1.10/testprog/testprog.pl0000644000115400000360000017054611055057036017252 0ustar rpetehead#!/usr/bin/perl use strict; use blib; use Astro::FITS::CFITSIO qw( :shortnames :constants ); my $oskey='value_string'; my $olkey=1; my $ojkey=11; my $otint = 12345678; my $ofkey = 12.121212; my $oekey = 13.131313; my $ogkey = 14.1414141414141414; my $odkey = 15.1515151515151515; my $otfrac = 0.1234567890123456; my $xcoordtype = 'RA---TAN'; my $ycoordtype = 'DEC--TAN'; my $onskey = [ 'first string', 'second string', ' ' ]; my $inclist = [ 'key*', 'newikys' ]; my $exclist = [ 'key_pr*', 'key_pkls' ]; my $onlkey = [1,0,1]; my $onjkey = [11,12,13]; my $onfkey = [12.121212, 13.131313, 14.141414]; my $onekey = [13.131313, 14.141414, 15.151515]; my $ongkey = [14.1414141414141414, 15.1515151515151515,16.1616161616161616]; my $ondkey = [15.1515151515151515, 16.1616161616161616,17.1717171717171717]; my $tbcol = [1,17,28,43,56]; my $binname = "Test-BINTABLE"; my $template = "testprog.tpt"; my $tblname = "Test-ASCII"; my ($status,$tmp,$tmp1,$tmp2,@tmp); my ($ttype,$tunit,$tdisp,$tform,$nrows,$tfields,$morekeys,$extvers,$koutarray); my ($colnum,$colname,$typecode,$repeat,$width,$scale,$zero,$jnulval,$hdutype); my ($rowlen,$errmsg,$nmsg,$cval,$oshtkey); my ($version,$fptr,$tmpfptr); my ($filename,$filemode); my ($simple,$bitpix,$naxis,$naxes,$npixels,$pcount,$gcount,$extend); my ($card,$card2,$comment,$comm); my ($nkeys); my ($boutarray,$ioutarray,$joutarray,$eoutarray,$doutarray); my ($hdunum,$anynull); my ($binarray,$iinarray,$jinarray,$einarray,$dinarray); my ($ii,$jj,$larray,$larray2,$imgarray,$imgarray2); my ($keyword,$value); my ($iskey,$ilkey,$ijkey,$iekey,$idkey,$ishtkey,$inekey,$indkey); my $lsptr; my ($existkeys,$keynum); my ($inskey,$nfound,$inlkey,$injkey); my ($signval,$uchars,$nulstr); my ($xinarray,$kinarray,$cinarray,$minarray); my ($lpixels,$fpixels,$inc,$offset); my ($bnul,$inul,$knul,$jnul,$enul,$dnul); my ($xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$xpos,$ypos); my ($checksum,$asciisum,$datsum,$datastatus,$hdustatus); ffvers($version); printf "CFITSIO TESTPROG, v%.3f\n\n",$version; print "Try opening then closing a nonexistent file:\n"; $status=0; ffopen($fptr,'tq123x.kjl',READWRITE,$status); printf " ffopen fptr, status = %d %d (expect an error)\n",$fptr,$status; eval { $status = 115; # cheat!!! ffclos($fptr,$status); }; printf " ffclos status = %d\n\n", $status; ffcmsg(); $status=0; ffinit($fptr,'!testprog.fit',$status); print "ffinit create new file status = $status\n"; $status and goto ERRSTATUS; ffflnm($fptr,$filename,$status); ffflmd($fptr,$filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; $simple=1; $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; $pcount=0; $gcount=1; $extend=1; ############################ # write single keywords # ############################ ffphps($fptr,$bitpix,$naxis,$naxes,$status) and print "ffphps status = $status"; ffprec( $fptr, "key_prec= 'This keyword was written by fxprec' / comment goes here", $status ) and printf"ffprec status = $status\n"; print "\ntest writing of long string keywords:\n"; $card = "1234567890123456789012345678901234567890" . "12345678901234567890123456789012345"; ffpkys($fptr,"card1",$card,"",$status); ffgkey($fptr,'card1',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234'6789012345"; ffpkys($fptr,'card2',$card,"",$status); ffgkey($fptr,'card2',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234''789012345"; ffpkys($fptr,'card3',$card,"",$status); ffgkey($fptr,'card3',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234567'9012345"; ffpkys($fptr,'card4',$card,"",$status); ffgkey($fptr,'card4',$card2,$comment,$status); print " $card\n$card2\n"; ffpkys($fptr,'key_pkys',$oskey,'fxpkys comment',$status) and print "ffpkys status = $status\n"; ffpkyl($fptr,'key_pkyl',$olkey,'fxpkyl comment',$status) and print "ffpkyl status = $status\n"; ffpkyj($fptr,'key_pkyj',$ojkey,'fxpkyj comment',$status) and print "ffpkyj status = $status\n"; ffpkyf($fptr,'key_pkyf',$ofkey,5,'fxpkyf comment',$status) and print "ffpkyf status = $status\n"; ffpkye($fptr,'key_pkye',$oekey,6,'fxpkye comment',$status) and print "ffpkye status = $status\n"; ffpkyg($fptr,'key_pkyg',$ogkey,14,'fxpkyg comment',$status) and print "ffpkyg status = $status\n"; ffpkyd($fptr,'key_pkyd',$odkey,14,'fxpkyd comment',$status) and print "ffpkyd status = $status\n"; ffpkyc($fptr,'key_pkyc',$onekey,6,'fxpkyc comment',$status) and print "ffpkyc status = $status\n"; ffpkym($fptr,'key_pkym',$ondkey,14,'fxpkym comment',$status) and print "ffpkym status = $status\n"; ffpkfc($fptr,'key_pkfc',$onekey,6,'fxpkfc comment',$status) and print "ffpkfc status = $status\n"; ffpkfm($fptr,'key_pkfm',$ondkey,14,'fxpkfm comment',$status) and print "ffpkfm status = $status\n"; ffpkls( $fptr, 'key_pkls', 'This is a very long string value that is continued over more than one keyword.', 'fxpkls comment', $status, ) and print "ffpkls status = $status\n"; ffplsw($fptr,$status) and print "ffplsw status = $status\n"; ffpkyt($fptr,'key_pkyt',$otint,$otfrac,'fxpkyt comment',$status) and print "ffpkyt status = $status\n"; ffpcom($fptr,' This keyword was written by fxpcom.',$status) and print "ffpcom status = $status\n"; ffphis($fptr," This keyword written by fxphis (w/ 2 leading spaces).",$status) and print "ffphis status = $status\n"; ffpdat($fptr,$status) and print "ffpdat status = $status\n, goto ERRSTATUS"; ############################ # write arrays of keywords # ############################ $nkeys = 3; ffpkns($fptr,'ky_pkns',1,$nkeys,$onskey,'fxpkns comment&',$status) and print "ffpkns status = $status\n"; ffpknl($fptr,'ky_pknl',1,$nkeys,$onlkey,'fxpknl comment&',$status) and print "ffpknl status = $status\n"; ffpknj($fptr,'ky_pknj',1,$nkeys,$onjkey,'fxpknj comment&',$status) and print "ffpknj status = $status\n"; ffpknf($fptr,'ky_pknf',1,$nkeys,$onfkey,5,'fxpknf comment&',$status) and print "ffpknf status = $status\n"; ffpkne($fptr,'ky_pkne',1,$nkeys,$onekey,6,'fxpkne comment&',$status) and print "ffpkne status = $status\n"; ffpkng($fptr,'ky_pkng',1,$nkeys,$ongkey,13,'fxpkng comment&',$status) and print "ffpkng status = $status\n"; ffpknd($fptr,'ky_pknd',1,$nkeys,$ondkey,14,'fxpknd comment&',$status) and print "ffpknd status = $status\n",goto ERRSTATUS; ############################ # write generic keywords # ############################ $oskey = 1; ffpky($fptr,TSTRING,'tstring',$oskey,'tstring comment',$status) and print "ffpky status = $status\n"; $olkey = TLOGICAL; ffpky($fptr,TLOGICAL,'tlogical',$olkey,'tlogical comment',$status) and print "ffpky status = $status\n"; $cval = TBYTE; ffpky($fptr,TBYTE,'tbyte',$cval,'tbyte comment',$status) and print "ffpky status = $status\n"; $oshtkey = TSHORT; ffpky($fptr,TSHORT,'tshort',$oshtkey,'tshort comment',$status) and print "ffpky status = $status\n"; $olkey = TINT; ffpky($fptr,TINT,'tint',$olkey,'tint comment',$status) and print "ffpky status = $status\n"; $ojkey = TLONG; ffpky($fptr,TLONG,'tlong',$ojkey,'tlong comment',$status) and print "ffpky status = $status\n"; $oekey = TFLOAT; ffpky($fptr,TFLOAT,'tfloat',$oekey,'tfloat comment',$status) and print "ffpky status = $status\n"; $odkey = TDOUBLE; ffpky($fptr,TDOUBLE,'tdouble',$odkey,'tdouble comment',$status) and print "ffpky status = $status\n"; ############################ # write data # ############################ ffpkyj($fptr,'BLANK',-99,'value to use for undefined pixels',$status) and print "BLANK keyword status = $status\n"; $boutarray = [1..$npixels]; $ioutarray = [1..$npixels]; $joutarray = [1..$npixels]; $eoutarray = [1..$npixels]; $doutarray = [1..$npixels]; ffpprb($fptr,1,1,2,[@{$boutarray}[0..1]],$status); ffppri($fptr,1,5,2,[@{$ioutarray}[4..5]],$status); ffpprj($fptr,1,9,2,[@{$joutarray}[8..9]],$status); ffppre($fptr,1,13,2,[@{$eoutarray}[12..13]],$status); ffpprd($fptr,1,17,2,[@{$doutarray}[16..17]],$status); ffppnb($fptr,1,3,2,[@{$boutarray}[2..3]],4,$status); ffppni($fptr,1,7,2,[@{$ioutarray}[6..7]],8,$status); ffppnj($fptr,1,11,2,[@{$joutarray}[10..11]],12,$status); ffppne($fptr,1,15,2,[@{$eoutarray}[14..15]],16,$status); ffppnd($fptr,1,19,2,[@{$doutarray}[18..19]],20,$status); ffppru($fptr,1,1,1,$status); $status and print "ffppnx status = $status\n", goto ERRSTATUS; ffflus($fptr,$status); print "ffflus status = $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; ############################ # read data # ############################ print "\nValues read back from primary array (99 = null pixel)\n"; print "The 1st, and every 4th pixel should be undefined:\n"; $anynull = 0; ffgpvb($fptr,1,1,$npixels,99,$binarray,$anynull,$status); map printf(" %2d",$binarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvb)\n"; ffgpvi($fptr,1,1,$npixels,99,$iinarray,$anynull,$status); map printf(" %2d",$iinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvi)\n"; ffgpvj($fptr,1,1,$npixels,99,$jinarray,$anynull,$status); map printf(" %2d",$jinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvj)\n"; ffgpve($fptr,1,1,$npixels,99,$einarray,$anynull,$status); map printf(" %2.0f",$einarray->[$_]),(0..$npixels-1); print " $anynull (ffgpve)\n"; ffgpvd($fptr,1,1,$npixels,99,$dinarray,$anynull,$status); map printf(" %2.0d",$dinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvd)\n"; $status and print("ERROR: ffgpv_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpv_ did not detect null values\n"; for ($ii=3;$ii<$npixels;$ii+=4) { $boutarray->[$ii] = 99; $ioutarray->[$ii] = 99; $joutarray->[$ii] = 99; $eoutarray->[$ii] = 99.; $doutarray->[$ii] = 99.; } $ii=0; $boutarray->[$ii] = 99; $ioutarray->[$ii] = 99; $joutarray->[$ii] = 99; $eoutarray->[$ii] = 99.; $doutarray->[$ii] = 99.; for ($ii=0; $ii<$npixels;$ii++) { ($boutarray->[$ii] != $binarray->[$ii]) and print "bout != bin = $boutarray->[$ii] $binarray->[$ii]\n"; ($ioutarray->[$ii] != $iinarray->[$ii]) and print "iout != iin = $ioutarray->[$ii] $iinarray->[$ii]\n"; ($joutarray->[$ii] != $jinarray->[$ii]) and print "jout != jin = $joutarray->[$ii] $jinarray->[$ii]\n"; ($eoutarray->[$ii] != $einarray->[$ii]) and print "eout != ein = $eoutarray->[$ii] $einarray->[$ii]\n"; ($doutarray->[$ii] != $dinarray->[$ii]) and print "dout != din = $doutarray->[$ii] $dinarray->[$ii]\n"; } @$binarray = map(0,(0..$npixels-1)); @$iinarray = map(0,(0..$npixels-1)); @$jinarray = map(0,(0..$npixels-1)); @$einarray = map(0.0,(0..$npixels-1)); @$dinarray = map(0.0,(0..$npixels-1)); $anynull = 0; ffgpfb($fptr,1,1,$npixels,$binarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$binarray->[$ii] } } print " $anynull (ffgpfb)\n"; ffgpfi($fptr,1,1,$npixels,$iinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$iinarray->[$ii] } } print " $anynull (ffgpfi)\n"; ffgpfj($fptr,1,1,$npixels,$jinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$jinarray->[$ii] } } print " $anynull (ffgpfj)\n"; ffgpfe($fptr,1,1,$npixels,$einarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2.0f",$einarray->[$ii] } } print " $anynull (ffgpfe)\n"; ffgpfd($fptr,1,1,$npixels,$dinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2.0f",$dinarray->[$ii] } } print " $anynull (ffgpfd)\n"; $status and print("ERROR: ffgpf_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpf_ did not detect null values\n"; ########################################## # close and reopen file multiple times # ########################################## for ($ii=0;$ii<10;$ii++) { ffclos($fptr,$status) and print("ERROR in ftclos (1) = $status"), goto ERRSTATUS; ffopen($fptr,$filename,READWRITE,$status) and print("ERROR: ffopen open file status = $status\n"), goto ERRSTATUS; } print "\nClosed then reopened the FITS file 10 times.\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; $filename = ""; ffflnm($fptr,$filename,$status); ffflmd($fptr,$filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; ############################ # read single keywords # ############################ $simple = 0; $bitpix = 0; $naxis = 0; $naxes = [0,0]; $pcount = -99; $gcount = -99; $extend = -99; print "\nRead back keywords:\n"; ffghpr($fptr,$simple,$bitpix,$naxis,$naxes,$pcount,$gcount,$extend,$status); print "simple = $simple, bitpix = $bitpix, naxis = $naxis, naxes = ($naxes->[0], $naxes->[1])\n"; print " pcount = $pcount, gcount = $gcount, extend = $extend\n"; ffgrec($fptr,9,$card,$status); print $card,"\n"; (substr($card,0,15) eq "KEY_PREC= 'This") or print "ERROR in ffgrec\n"; ffgkyn($fptr,9,$keyword,$value,$comment,$status); print "$keyword : $value : $comment :\n"; ($keyword eq 'KEY_PREC') or print "ERROR in ffgkyn: $keyword\n"; ffgcrd($fptr,$keyword,$card,$status); print $card,"\n"; ($keyword eq substr($card,0,8)) or print "ERROR in ffgcrd: $keyword\n"; ffgkey($fptr,'KY_PKNS1',$value,$comment,$status); print "KY_PKNS1 : $value : $comment :\n"; (substr($value,0,14) eq "'first string'") or print "ERROR in ffgkey $value\n"; ffgkys($fptr,'key_pkys',$iskey,$comment,$status); print "KEY_PKYS $iskey $comment $status\n"; ffgkyl($fptr,'key_pkyl',$ilkey,$comment,$status); print "KEY_PKYL $ilkey $comment $status\n"; ffgkyj($fptr,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKYJ $ijkey $comment $status\n"; ffgkye($fptr,'KEY_PKYJ',$iekey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$iekey; ffgkyd($fptr,'KEY_PKYJ',$idkey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$idkey; ($ijkey == 11 and $iekey == 11.0 and $idkey == 11.0) or printf "ERROR in ffgky[jed]: %d, %f, %f\n",$ijkey,$iekey,$idkey; $iskey = ""; ffgky($fptr,TSTRING,'key_pkys',$iskey,$comment,$status); print "KEY_PKY S $iskey $comment $status\n"; $ilkey = 0; ffgky($fptr,TLOGICAL,'key_pkyl',$ilkey,$comment,$status); print "KEY_PKY L $ilkey $comment $status\n"; ffgky($fptr,TBYTE,'KEY_PKYJ',$cval,$comment,$status); print "KEY_PKY BYTE $cval $comment $status\n"; ffgky($fptr,TSHORT,'KEY_PKYJ',$ishtkey,$comment,$status); print "KEY_PKY SHORT $ishtkey $comment $status\n"; ffgky($fptr,TINT,'KEY_PKYJ',$ilkey,$comment,$status); print "KEY_PKY INT $ilkey $comment $status\n"; $ijkey=0; ffgky($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $iekey=0; ffgky($fptr,TFLOAT,'KEY_PKYE',$iekey,$comment,$status); printf "KEY_PKY E %f $comment $status\n",$iekey; $idkey=0; ffgky($fptr,TDOUBLE,'KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKY D %f $comment $status\n",$idkey; ffgkyd($fptr,'KEY_PKYF',$idkey,$comment,$status); printf "KEY_PKYF %f $comment $status\n",$idkey; ffgkyd($fptr,'KEY_PKYE',$idkey,$comment,$status); printf "KEY_PKYE %f $comment $status\n",$idkey; ffgkyd($fptr,'KEY_PKYG',$idkey,$comment,$status); printf "KEY_PKYG %.14f $comment $status\n",$idkey; ffgkyd($fptr,'KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKYD %.14f $comment $status\n",$idkey; ffgkyc($fptr,'KEY_PKYC',$inekey,$comment,$status); printf "KEY_PKYC %f %f $comment $status\n",@$inekey; ffgkyc($fptr,'KEY_PKFC',$inekey,$comment,$status); printf "KEY_PKFC %f %f $comment $status\n",@$inekey; ffgkym($fptr,'KEY_PKYM',$indkey,$comment,$status); printf "KEY_PKYM %f %f $comment $status\n",@$indkey; ffgkym($fptr,'KEY_PKFM',$indkey,$comment,$status); printf "KEY_PKFM %f %f $comment $status\n",@$indkey; ffgkyt($fptr,'KEY_PKYT',$ijkey,$idkey,$comment,$status); printf "KEY_PKYT $ijkey %.14f $comment $status\n",$idkey; ffpunt($fptr,'KEY_PKYJ',"km/s/Mpc",$status); $ijkey=0; ffgky($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; ffgunt($fptr,'KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; ffpunt($fptr,'KEY_PKYJ','',$status); $ijkey=0; ffgky($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; ffgunt($fptr,'KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; ffpunt($fptr,'KEY_PKYJ','feet/second/second',$status); $ijkey=0; ffgky($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; ffgunt($fptr,'KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; ffgkls($fptr,'key_pkls',$lsptr,$comment,$status); print "KEY_PKLS long string value = \n$lsptr\n"; ffghps($fptr,$existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; ############################ # read array keywords # ############################ ffgkns($fptr,'ky_pkns',1,3,$inskey,$nfound,$status); print "ffgkns: $inskey->[0], $inskey->[1], $inskey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkns $nfound, $status\n"; ffgknl($fptr,'ky_pknl',1,3,$inlkey,$nfound,$status); print "ffgknl: $inlkey->[0], $inlkey->[1], $inlkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknl $nfound, $status\n"; ffgknj($fptr,'ky_pknj',1,3,$injkey,$nfound,$status); print "ffgknj: $injkey->[0], $injkey->[1], $injkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknj $nfound, $status\n"; ffgkne($fptr,'ky_pkne',1,3,$inekey,$nfound,$status); printf "ffgkne: %f, %f, %f\n",@{$inekey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkne $nfound, $status\n"; ffgknd($fptr,'ky_pknd',1,3,$indkey,$nfound,$status); printf "ffgknd: %f, %f, %f\n",@{$indkey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknd $nfound, $status\n"; ffgcrd($fptr,'HISTORY',$card,$status); ffghps($fptr,$existkeys,$keynum,$status); $keynum -= 2; print "\nBefore deleting the HISTORY and DATE keywords...\n"; for ($ii=$keynum; $ii<=$keynum+3;$ii++) { ffgrec($fptr,$ii,$card,$status); print substr($card,0,8),"\n"; } ############################ # delete keywords # ############################ ffdrec($fptr,$keynum+1,$status); ffdkey($fptr,'DATE',$status); print "\nAfter deleting the keywords...\n"; for ($ii=$keynum; $ii<=$keynum+1;$ii++) { ffgrec($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR deleting keywords\n"; ############################ # insert keywords # ############################ $keynum += 4; ffirec($fptr,$keynum-3,"KY_IREC = 'This keyword inserted by fxirec'",$status); ffikys($fptr,'KY_IKYS',"insert_value_string", "ikys comment", $status); ffikyj($fptr,'KY_IKYJ',49,"ikyj comment", $status); ffikyl($fptr,'KY_IKYL',1, "ikyl comment", $status); ffikye($fptr,'KY_IKYE',12.3456, 4, "ikye comment", $status); ffikyd($fptr,'KY_IKYD',12.345678901234567, 14, "ikyd comment", $status); ffikyf($fptr,'KY_IKYF',12.3456, 4, "ikyf comment", $status); ffikyg($fptr,'KY_IKYG',12.345678901234567, 13, "ikyg comment", $status); print "\nAfter inserting the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { ffgrec($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR inserting keywords\n"; ############################ # modify keywords # ############################ ffmrec($fptr,$keynum-4,'COMMENT This keyword was modified by fxmrec', $status); ffmcrd($fptr,'KY_IREC',"KY_MREC = 'This keyword was modified by fxmcrd'",$status); ffmnam($fptr,'KY_IKYS','NEWIKYS',$status); ffmcom($fptr,'KY_IKYJ','This is a modified comment', $status); ffmkyj($fptr,'KY_IKYJ',50,'&',$status); ffmkyl($fptr,'KY_IKYL',0,'&',$status); ffmkys($fptr,'NEWIKYS','modified_string', '&', $status); ffmkye($fptr,'KY_IKYE',-12.3456, 4, '&', $status); ffmkyd($fptr,'KY_IKYD',-12.345678901234567, 14, 'modified comment', $status); ffmkyf($fptr,'KY_IKYF',-12.3456, 4, '&', $status); ffmkyg($fptr,'KY_IKYG',-12.345678901234567, 13, '&', $status); print "\nAfter modifying the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { ffgrec($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; ############################ # update keywords # ############################ ffucrd($fptr,'KY_MREC',"KY_UCRD = 'This keyword was updated by fxucrd'",$status); ffukyj($fptr,'KY_IKYJ',51,'&',$status); ffukyl($fptr,'KY_IKYL',1,'&',$status); ffukys($fptr,'NEWIKYS',"updated_string",'&',$status); ffukye($fptr,'KY_IKYE',-13.3456, 4,'&',$status); ffukyd($fptr,'KY_IKYD',-13.345678901234567, 14,'modified comment',$status); ffukyf($fptr,'KY_IKYF',-13.3456, 4,'&',$status); ffukyg($fptr,'KY_IKYG',-13.345678901234567, 13,'&',$status); print "\nAfter updating the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { ffgrec($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; ffgrec($fptr,0,$card,$status); print "\nKeywords found using wildcard search (should be 13)...\n"; $nfound = 0; while (!ffgnxk($fptr,$inclist,2,$exclist,2,$card,$status)) { $nfound++; print $card,"\n"; } ($nfound == 13) or print("\nERROR reading keywords using wildcards (ffgnxk)\n"), goto ERRSTATUS; $status=0; ############################ # copy index keyword # ############################ ffcpky($fptr,$fptr,1,4,'KY_PKNE',$status); ffgkns($fptr,'ky_pkne',2,4,$inekey,$nfound,$status); printf "\nCopied keyword: ffgkne: %f, %f, %f\n", @$inekey; $status and print("\nERROR in ffgkne $nfound, $status\n"),goto ERRSTATUS; ###################################### # modify header using template file # ###################################### ffpktp($fptr,$template,$status) and print "\nERROR returned by ffpktp\n", goto ERRSTATUS; print "Updated header using template file (ffpktp)\n"; ############################ # create binary table # ############################ $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '') ]; $nrows = 21; $tfields = 10; $pcount = 0; ffibin($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nffibin status = $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; ffghps($fptr,$existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; $morekeys=40; ffhdef($fptr,$morekeys,$status); ffghsp($fptr,$existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; fftnul($fptr,4,99,$status); fftnul($fptr,5,99,$status); fftnul($fptr,6,99,$status); $extvers=1; ffpkyj($fptr,'EXTVER',$extvers,'extension version number', $status); ffpkyj($fptr,'TNULL4',99,'value for undefined pixels',$status); ffpkyj($fptr,'TNULL5',99,'value for undefined pixels',$status); ffpkyj($fptr,'TNULL6',99,'value for undefined pixels',$status); $naxis=3; $naxes=[1,2,8]; ffptdm($fptr,3,$naxis,$naxes,$status); $naxis=0; $naxes=undef; ffgtdm($fptr,3,$naxis,$naxes,$status); ffgkys($fptr,'TDIM3',$iskey,$comment,$status); print "TDIM3 = $iskey, $naxis, $naxes->[0], $naxes->[1], $naxes->[2]\n"; ffrdef($fptr,$status); ############################ # write data to columns # ############################ $signval = -1; for ($ii=0;$ii<21;$ii++) { $signval *= -1; $boutarray->[$ii] = ($ii + 1); $ioutarray->[$ii] = ($ii + 1) * $signval; $joutarray->[$ii] = ($ii + 1) * $signval; $koutarray->[$ii] = ($ii + 1) * $signval; $eoutarray->[$ii] = ($ii + 1) * $signval; $doutarray->[$ii] = ($ii + 1) * $signval; } ffpcls($fptr,1,1,1,3,$onskey,$status); ffpclu($fptr,1,4,1,1,$status); $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0]; ffpclx($fptr,3,1,1,36,$larray,$status); for ($ii=4;$ii<9;$ii++) { ffpclb($fptr,$ii,1,1,2,$boutarray,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcli($fptr,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclk($fptr,$ii,5,1,2,[@{$koutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcle($fptr,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcld($fptr,$ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclu($fptr,$ii,11,1,1,$status); } ffpclc($fptr,9,1,1,10,$eoutarray,$status); ffpclm($fptr,10,1,1,10,$doutarray,$status); for ($ii=4;$ii<9;$ii++) { ffpcnb($fptr,$ii,12,1,2,[@{$boutarray}[11..12]],13,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcni($fptr,$ii,14,1,2,[@{$ioutarray}[13..14]],15,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcnk($fptr,$ii,16,1,2,[@{$koutarray}[15..16]],17,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcne($fptr,$ii,18,1,2,[@{$eoutarray}[17..18]],19.,$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcnd($fptr,$ii,20,1,2,[@{$doutarray}[19..20]],21.,$status); ($status == NUM_OVERFLOW) and $status = 0; } ffpcll($fptr,2,1,1,21,$larray,$status); ffpclu($fptr,2,11,1,1,$status); print "ffpcl_ status = $status\n"; ######################################### # get information about the columns # ######################################### print "\nFind the column numbers; a returned status value of 237 is"; print "\nexpected and indicates that more than one column name matches"; print "\nthe input column name template. Status = 219 indicates that"; print "\nthere was no matching column name."; ffgcno($fptr,0,'Xvalue',$colnum,$status); print "\nColumn Xvalue is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { ffgcnn($fptr,1,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; print "\nInformation about each column:\n"; for ($ii=0;$ii<$tfields;$ii++) { ffgtcl($fptr,$ii+1,$typecode,$repeat,$width,$status); printf("%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width); ffgbcl($fptr,$ii+1,$ttype->[0],$tunit->[0],$cval,$repeat,$scale,$zero,$jnulval,$tdisp,$status); printf " $ttype->[0], $tunit->[0], $cval, $repeat, %f, %f, $jnulval, $tdisp.\n",$scale,$zero; } print "\n"; ############################################### # insert ASCII table before the binary table # ############################################### ffmrhd($fptr,-1,$hdutype,$status) and goto ERRSTATUS; $tform = [ qw( A15 I10 F14.6 E12.5 D21.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ('','m**2','cm','erg/s','km/s') ]; $rowlen = 76; $nrows = 11; $tfields = 5; ffitab($fptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "ffitab status = $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; ffsnul($fptr,1,'null1',$status); ffsnul($fptr,2,'null2',$status); ffsnul($fptr,3,'null3',$status); ffsnul($fptr,4,'null4',$status); ffsnul($fptr,5,'null5',$status); $extvers=2; ffpkyj($fptr,'EXTVER',$extvers,'extension version number',$status); ffpkys($fptr,'TNULL1','null1','value for undefined pixels',$status); ffpkys($fptr,'TNULL2','null2','value for undefined pixels',$status); ffpkys($fptr,'TNULL3','null3','value for undefined pixels',$status); ffpkys($fptr,'TNULL4','null4','value for undefined pixels',$status); ffpkys($fptr,'TNULL5','null5','value for undefined pixels',$status); $status and goto ERRSTATUS; ############################ # write data to columns # ############################ for ($ii=0;$ii<21;$ii++) { $boutarray->[$ii] = $ii+1; $ioutarray->[$ii] = $ii+1; $joutarray->[$ii] = $ii+1; $eoutarray->[$ii] = $ii+1; $doutarray->[$ii] = $ii+1; } ffpcls($fptr,1,1,1,3,$onskey,$status); ffpclu($fptr,1,4,1,1,$status); for ($ii=2;$ii<6;$ii++) { ffpclb($fptr,$ii,1,1,2,[@{$boutarray}[0..1]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcli($fptr,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclj($fptr,$ii,5,1,2,[@{$joutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcle($fptr,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpcld($fptr,$ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; ffpclu($fptr,$ii,11,1,1,$status); } print "ffpcl_ status = $status\n"; ################################ # read data from ASCII table # ################################ ffghtb($fptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nASCII table: rowlen, nrows, tfields, extname: $rowlen $nrows $tfields $tblname\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %3d %8s %8s \n", $ttype->[$ii], $tbcol->[$ii], $tform->[$ii], $tunit->[$ii]; } $nrows = 11; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcvj($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); ffgcve($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values read from ASCII table:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } ffgtbb($fptr,1,20,78,$uchars,$status); print "\n",pack("C78",@$uchars),"\n"; ffptbb($fptr,1,20,78,$uchars,$status); ######################################### # get information about the columns # ######################################### ffgcno($fptr,0,'name',$colnum,$status); print "\nColumn name is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { ffgcnn($fptr,0,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; for ($ii=0;$ii<$tfields;$ii++) { ffgtcl($fptr,$ii+1,$typecode,$repeat,$width,$status); printf "%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width; ffgacl($fptr,$ii+1,$ttype->[0],$tbcol,$tunit->[0],$tform->[0],$scale, $zero,$nulstr,$tdisp,$status); printf " $ttype->[0], $tbcol, $tunit->[0], $tform->[0], %f, %f, $nulstr, $tdisp.\n", $scale, $zero; } print "\n"; ############################################### # test the insert/delete row/column routines # ############################################### ffirow($fptr,2,3,$status) and goto ERRSTATUS; $nrows = 14; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcvj($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); ffgcve($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } ffdrow($fptr,10,2,$status) and goto ERRSTATUS; $nrows = 12; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcvj($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); ffgcve($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } ffdcol($fptr,3,$status) and goto ERRSTATUS; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcve($fptr,3,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,4,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after deleting column 3:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } fficol($fptr,5,'INSERT_COL','F14.6',$status) and goto ERRSTATUS; ffgcvs($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); ffgcvb($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); ffgcvi($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); ffgcve($fptr,3,1,1,$nrows,99,$einarray,$anynull,$status); ffgcvd($fptr,4,1,1,$nrows,99,$dinarray,$anynull,$status); ffgcvj($fptr,5,1,1,$nrows,99,$jinarray,$anynull,$status); print "\nData values after inserting column 5:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], $jinarray->[$ii], ); } ############################################################ # create a temporary file and copy the ASCII table to it, # # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v6.tmp'; ffinit($tmpfptr,$filename,$status); print "Create temporary file: ffinit status = $status\n"; ffiimg($tmpfptr,$bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=12; $tfields=0; $rowlen=0; ffitab($tmpfptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nCreate ASCII table with 0 columns: ffitab status = $status\n"; ffcpcl($fptr,$tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffibin($tmpfptr,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,0,$status); print "\nCreate Binary table with 0 columns: ffibin status = $status\n"; ffcpcl($fptr,$tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffdelt($tmpfptr,$status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; ################################ # read data from binary table # ################################ ffmrhd($fptr,1,$hdutype,$status) and goto ERRSTATUS; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; ffghsp($fptr,$existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; ffghbn($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "\nBinary table: nrows, tfields, extname, pcount: $nrows $tfields $binname $pcount\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %8s %8s \n", $ttype->[$ii], $tform->[$ii], $tunit->[$ii]; } @$larray = map(0,(0..39)); print "\nData values read from binary table:\n"; printf " Bit column (X) data values: \n\n"; ffgcx($fptr,3,1,1,36,$larray,$status); for ($jj=0;$jj<5;$jj++) { print @{$larray}[$jj*8..$jj*8+7]; print " "; } @{$larray} = map(0,(0..$nrows-1)); @{$xinarray} = map(0,(0..$nrows-1)); @{$binarray} = map(0,(0..$nrows-1)); @{$iinarray} = map(0,(0..$nrows-1)); @{$kinarray} = map(0,(0..$nrows-1)); @{$einarray} = map(0.0,(0..$nrows-1)); @{$dinarray} = map(0.0,(0..$nrows-1)); @{$cinarray} = map(0.0,(0..2*$nrows-1)); @{$minarray} = map(0.0,(0..2*$nrows-1)); print "\n\n"; ffgcvs($fptr,1,4,1,1,'',$inskey,$anynull,$status); print "null string column value = -$inskey->[0]- (should be --)\n"; $nrows=21; ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvl($fptr,2,1,1,$nrows,0,$larray,$anynull,$status); ffgcvb($fptr,3,1,1,$nrows,98,$xinarray,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcvj($fptr,6,1,1,$nrows,98,$kinarray,$anynull,$status); ffgcve($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); ffgcvc($fptr,9,1,1,$nrows,98.,$cinarray,$anynull,$status); ffgcvm($fptr,10,1,1,$nrows,98.,$minarray,$anynull,$status); print "\nRead columns with ffgcv_:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f) \n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii],$kinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], @{$cinarray->[$ii]}, @{$minarray->[$ii]}; } @tmp = (0..$nrows-1); @$larray = @tmp; @$xinarray = @tmp; @$binarray = @tmp; @$iinarray = @tmp; @$kinarray = @tmp; @$einarray = @tmp; @$dinarray = @tmp; @tmp = (0..2*$nrows-1); @$cinarray = @tmp; @$minarray = @tmp; ffgcfs($fptr,1,1,1,$nrows,$inskey,$larray2,$anynull,$status); ffgcfl($fptr,2,1,1,$nrows,$larray,$larray2,$anynull,$status); ffgcfb($fptr,3,1,1,$nrows,$xinarray,$larray2,$anynull,$status); ffgcfb($fptr,4,1,1,$nrows,$binarray,,$larray2,$anynull,$status); ffgcfi($fptr,5,1,1,$nrows,$iinarray,$larray2,$anynull,$status); ffgcfk($fptr,6,1,1,$nrows,$kinarray,$larray2,$anynull,$status); ffgcfe($fptr,7,1,1,$nrows,$einarray,$larray2,$anynull,$status); ffgcfd($fptr,8,1,1,$nrows,$dinarray,$larray2,$anynull,$status); ffgcfc($fptr,9,1,1,$nrows,$cinarray,$larray2,$anynull,$status); ffgcfm($fptr,10,1,1,$nrows,$minarray,$larray2,$anynull,$status); print "\nRead columns with ffgcf_:\n"; for ($ii=0;$ii<10;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f)\n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii], $kinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], @{$cinarray->[$ii]}, @{$minarray->[$ii]}; } for ($ii=10; $ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d \n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii]; } ffprec($fptr,"key_prec= 'This keyword was written by f_prec' / comment here", $status); ############################################### # test the insert/delete row/column routines # ############################################### ffirow($fptr,2,3,$status) and goto ERRSTATUS; $nrows=14; ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcvj($fptr,6,1,1,$nrows,98,$jinarray,$anynull,$status); ffgcve($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } ffdrow($fptr,10,2,$status) and goto ERRSTATUS; $nrows=12; ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcvj($fptr,6,1,1,$nrows,98,$jinarray,$anynull,$status); ffgcve($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } ffdcol($fptr,6,$status) and goto ERRSTATUS; ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcve($fptr,6,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,7,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after deleting column 6:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } fficol($fptr,8,'INSERT_COL','1E',$status) and goto ERRSTATUS; ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcve($fptr,6,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,7,1,1,$nrows,98.,$dinarray,$anynull,$status); ffgcvj($fptr,8,1,1,$nrows,98,$jinarray,$anynull,$status); print "\nData values after inserting column 8:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] , $jinarray->[$ii]; } ffpclu($fptr,8,1,1,10,$status); ffgcvs($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); ffgcvb($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); ffgcvi($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); ffgcve($fptr,6,1,1,$nrows,98.,$einarray,$anynull,$status); ffgcvd($fptr,7,1,1,$nrows,98.,$dinarray,$anynull,$status); ffgcvj($fptr,8,1,1,$nrows,98,$jinarray,$anynull,$status); print "\nValues after setting 1st 10 elements in column 8 = null:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] , $jinarray->[$ii]; } ############################################################ # create a temporary file and copy the binary table to it,# # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v5.tmp'; ffinit($tmpfptr,$filename,$status); print "Create temporary file: ffinit status = $status\n"; ffiimg($tmpfptr,$bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=22; $tfields=0; ffibin($tmpfptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nCreate binary table with 0 columns: ffibin status = $status\n"; ffcpcl($fptr,$tmpfptr,7,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,6,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,5,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffcpcl($fptr,$tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; ffdelt($tmpfptr,$status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; #################################################### # insert binary table following the primary array # #################################################### ffmahd($fptr,1,$hdutype,$status); $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields=10; $pcount=0; ffibin($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "ffibin status = $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; $extvers=3; ffpkyj($fptr,'EXTVER',$extvers,'extension version number',$status); ffpkyj($fptr,'TNULL4',77,'value for undefined pixels',$status); ffpkyj($fptr,'TNULL5',77,'value for undefined pixels',$status); ffpkyj($fptr,'TNULL6',77,'value for undefined pixels',$status); ffpkyj($fptr,'TSCAL4',1000,'scaling factor',$status); ffpkyj($fptr,'TSCAL5',1,'scaling factor',$status); ffpkyj($fptr,'TSCAL6',100,'scaling factor',$status); ffpkyj($fptr,'TZERO4',0,'scaling offset',$status); ffpkyj($fptr,'TZERO5',32768,'scaling offset',$status); ffpkyj($fptr,'TZERO6',100,'scaling offset',$status); fftnul($fptr,4,77,$status); fftnul($fptr,5,77,$status); fftnul($fptr,6,77,$status); fftscl($fptr,4,1000.,0.,$status); fftscl($fptr,5,1.,32768.,$status); fftscl($fptr,6,100.,100.,$status); ############################ # write data to columns # ############################ @$joutarray = (0,1000,10000,32768,65535); for ($ii=4;$ii<7;$ii++) { ffpclj($fptr,$ii,1,1,5,$joutarray,$status); ($status == NUM_OVERFLOW) and print("Overflow writing to column $ii\n"),$status=0; ffpclu($fptr,$ii,6,1,1,$status); } for ($jj=4;$jj<7;$jj++) { ffgcvj($fptr,$jj,1,1,6,-999,$jinarray,$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->[$ii]; } print "\n"; } print "\n"; fftscl($fptr,4,1.,0.,$status); fftscl($fptr,5,1.,0.,$status); fftscl($fptr,6,1.,0.,$status); for ($jj=4;$jj<7;$jj++) { ffgcvj($fptr,$jj,1,1,6,-999,$jinarray,$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->[$ii]; } print "\n"; } ###################################################### # insert image extension following the binary table # ###################################################### $bitpix=-32; $naxis=2; $naxes=[15,25]; ffiimg($fptr,$bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; for ($jj=0;$jj<30;$jj++) { for ($ii=0;$ii<19;$ii++) { $imgarray->[$jj]->[$ii] = ($ii<15) ? ($jj * 10) + $ii : 0; } } ffp2di($fptr,1,19,$naxes->[0],$naxes->[1],$imgarray,$status); print "\nWrote whole 2D array: ffp2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } ffg2di($fptr,1,0,19,$naxes->[0],$naxes->[1],$imgarray,$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]}[15..18] = (0,0,0,0); for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->[$jj]->[$ii]; } print "\n"; } for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } for ($jj=0;$jj<20;$jj++) { @{$imgarray2->[$jj]} = map(($jj * -10 - $_),(0..9)); } $fpixels=[5,5]; $lpixels = [14,14]; ffpssi($fptr,1,$naxis,$naxes,$fpixels,$lpixels,$imgarray2,$status); print "\nWrote subset 2D array: ffpssi status = $status\n"; ffg2di($fptr,1,0,19,$naxes->[0],$naxes->[1],$imgarray,$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]}[15..18] = (0,0,0,0); for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->[$jj]->[$ii]; } print "\n"; } $fpixels = [2,5]; $lpixels = [10,8]; $inc = [2,3]; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } ffgsvi($fptr,1,$naxis,$naxes,$fpixels,$lpixels,$inc,0,$imgarray->[0],$anynull,$status); print "\nRead subset of 2D array: ffgsvi status = $status\n"; for ($ii=0;$ii<10;$ii++) { printf " %3d",$imgarray->[0]->[$ii]; } print "\n"; ########################################################### # insert another image extension # # copy the image extension to primary array of tmp file. # # then delete the tmp file, and the image extension # ########################################################### $bitpix=16; $naxis=2; $naxes = [15,25]; ffiimg($fptr,$bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; $filename = 't1q2s3v4.tmp'; ffinit($tmpfptr,$filename,$status); print "Create temporary file: ffinit status = $status\n"; ffcopy($fptr,$tmpfptr,0,$status); print "Copy image extension to primary array of tmp file.\n"; print "ffcopy status = $status\n"; ffgrec($tmpfptr,1,$card,$status); print "$card\n"; ffgrec($tmpfptr,2,$card,$status); print "$card\n"; ffgrec($tmpfptr,3,$card,$status); print "$card\n"; ffgrec($tmpfptr,4,$card,$status); print "$card\n"; ffgrec($tmpfptr,5,$card,$status); print "$card\n"; ffgrec($tmpfptr,6,$card,$status); print "$card\n"; ffdelt($tmpfptr,$status); print "Delete the tmp file: ffdelt status = $status\n"; ffdhdu($fptr,$hdutype,$status); print "Delete the image extension; hdutype, status = $hdutype $status\n"; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; ########################################################### # append bintable extension with variable length columns # ########################################################### ffcrhd($fptr,$status); print "ffcrhd status = $status\n"; $tform = [ qw( 1PA 1PL 1PB 1PB 1PI 1PJ 1PE 1PD 1PC 1PM ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields = 10; $pcount=0; ffphbn($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "Variable length arrays: ffphbn status = $status\n"; $extvers=4; ffpkyj($fptr,'EXTVER',$extvers,'extension version number',$status); ffpkyj($fptr, 'TNULL4', 88, 'value for undefined pixels', $status); ffpkyj($fptr, 'TNULL5', 88, 'value for undefined pixels', $status); ffpkyj($fptr, 'TNULL6', 88, 'value for undefined pixels', $status); ############################ # write data to columns # ############################ $iskey = 'abcdefghijklmnopqrst'; @tmp = (1..20); @{$boutarray} = @tmp; @{$ioutarray} = @tmp; @{$joutarray} = @tmp; @{$eoutarray} = @tmp; @{$doutarray} = @tmp; $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1]; $inskey=['']; ffpcls($fptr,1,1,1,1,$inskey,$status); ffpcll($fptr,2,1,1,1,$larray,$status); ffpclx($fptr,3,1,1,1,$larray,$status); ffpclb($fptr,4,1,1,1,$boutarray,$status); ffpcli($fptr,5,1,1,1,$ioutarray,$status); ffpclj($fptr,6,1,1,1,$joutarray,$status); ffpcle($fptr,7,1,1,1,$eoutarray,$status); ffpcld($fptr,8,1,1,1,$doutarray,$status); for ($ii=2;$ii<=20;$ii++) { $inskey->[0] = $iskey; $inskey->[0] = substr($inskey->[0],0,$ii); ffpcls($fptr,1,$ii,1,1,$inskey,$status); ffpcll($fptr,2,$ii,1,$ii,$larray,$status); ffpclu($fptr,2,$ii,$ii-1,1,$status); ffpclx($fptr,3,$ii,1,$ii,$larray,$status); ffpclb($fptr,4,$ii,1,$ii,$boutarray,$status); ffpclu($fptr,4,$ii,$ii-1,1,$status); ffpcli($fptr,5,$ii,1,$ii,$ioutarray,$status); ffpclu($fptr,5,$ii,$ii-1,1,$status); ffpclj($fptr,6,$ii,1,$ii,$joutarray,$status); ffpclu($fptr,6,$ii,$ii-1,1,$status); ffpcle($fptr,7,$ii,1,$ii,$eoutarray,$status); ffpclu($fptr,7,$ii,$ii-1,1,$status); ffpcld($fptr,8,$ii,1,$ii,$doutarray,$status); ffpclu($fptr,8,$ii,$ii-1,1,$status); } print "ffpcl_ status = $status\n"; ################################# # close then reopen this HDU # ################################# ffmrhd($fptr,-1,$hdutype,$status); ffmrhd($fptr,1,$hdutype,$status); ############################# # read data from columns # ############################# ffgkyj($fptr,'PCOUNT',$pcount,$comm,$status); print "PCOUNT = $pcount\n"; $inskey->[0] = ' '; $iskey = ' '; print "HDU number = ${\(ffghdn($fptr,$hdunum))}\n"; for ($ii=1;$ii<=20;$ii++) { @tmp = map(0,(0..$ii-1)); @$larray = @tmp; @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; ffgcvs($fptr,1,$ii,1,1,$iskey,$inskey,$anynull,$status); print "A $inskey->[0] $status\nL"; ffgcvl($fptr,2,$ii,1,$ii,0,$larray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $larray->[$_]; } print " $status\nX"; ffgcx($fptr,3,$ii,1,$ii,$larray,$status); foreach (0..$ii-1) { printf " %2d", $larray->[$_]; } print " $status\nB"; ffgcvb($fptr,4,$ii,1,$ii,99,$boutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $boutarray->[$_]; } print " $status\nI"; ffgcvi($fptr,5,$ii,1,$ii,99,$ioutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $ioutarray->[$_]; } print " $status\nJ"; ffgcvj($fptr,6,$ii,1,$ii,99,$joutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $joutarray->[$_]; } print " $status\nE"; ffgcve($fptr,7,$ii,1,$ii,99,$eoutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $eoutarray->[$_]; } print " $status\nD"; ffgcvd($fptr,8,$ii,1,$ii,99,$doutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $doutarray->[$_]; } print " $status\n"; ffgdes($fptr,8,$ii,$repeat,$offset,$status); print "Column 8 repeat and offset = $repeat $offset\n"; } ##################################### # create another image extension # ##################################### $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; ffiimg($fptr,$bitpix,$naxis,$naxes,$status); print "\nffcrim status = $status\n"; @tmp = map(($_*2),(0..$npixels-1)); @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$koutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; ffppr($fptr,TBYTE, 1, 2, [@{$boutarray}[0..1]], $status); ffppr($fptr,TSHORT, 3, 2,[ @{$ioutarray}[2..3]], $status); ffppr($fptr,TINT, 5, 2, [@{$koutarray}[4..5]], $status); ffppr($fptr,TSHORT, 7, 2, [@{$ioutarray}[6..7]], $status); ffppr($fptr,TLONG, 9, 2, [@{$joutarray}[8..9]], $status); ffppr($fptr,TFLOAT, 11, 2, [@{$eoutarray}[10..11]], $status); ffppr($fptr,TDOUBLE, 13, 2, [@{$doutarray}[12..13]], $status); print "ffppr status = $status\n"; $bnul=0; $inul=0; $knul=0; $jnul=0; $enul=0.0; $dnul=0.0; ffgpv($fptr,TBYTE,1,14,$bnul,$binarray,$anynull,$status); ffgpv($fptr,TSHORT,1,14,$inul,$iinarray,$anynull,$status); ffgpv($fptr,TINT,1,14,$knul,$kinarray,$anynull,$status); ffgpv($fptr,TLONG,1,14,$jnul,$jinarray,$anynull,$status); ffgpv($fptr,TFLOAT,1,14,$enul,$einarray,$anynull,$status); ffgpv($fptr,TDOUBLE,1,14,$dnul,$dinarray,$anynull,$status); print "\nImage values written with ffppr and read with ffgpv:\n"; $npixels=14; foreach (0..$npixels-1) { printf " %2d", $binarray->[$_] }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d", $iinarray->[$_] }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d", $kinarray->[$_] }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d", $jinarray->[$_] }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f", $einarray->[$_] }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f", $dinarray->[$_] }; print " $anynull (double)\n"; ########################################## # test world coordinate system routines # ########################################## $xrval=45.83; $yrval=63.57; $xrpix=256.0; $yrpix=257.0; $xinc = -.00277777; $yinc = .00277777; ffpkyd($fptr,'CRVAL1',$xrval,10,'comment',$status); ffpkyd($fptr,'CRVAL2',$yrval,10,'comment',$status); ffpkyd($fptr,'CRPIX1',$xrpix,10,'comment',$status); ffpkyd($fptr,'CRPIX2',$yrpix,10,'comment',$status); ffpkyd($fptr,'CDELT1',$xinc,10,'comment',$status); ffpkyd($fptr,'CDELT2',$yinc,10,'comment',$status); ffpkys($fptr,'CTYPE1',$xcoordtype,'comment',$status); ffpkys($fptr,'CTYPE2',$ycoordtype,'comment',$status); print "\nWrote WCS keywords status = $status\n"; $xrval = 0; $yrval = 0; $xrpix = 0; $yrpix = 0; $xinc = 0; $yinc = 0; $rot = 0; ffgics($fptr,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$status); print "Read WCS keywords with ffgics status = $status\n"; $xpix = 0.5; $ypix = 0.5; ffwldp($xpix,$ypix,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpos,$ypos,$status); printf " CRVAL1, CRVAL2 = %16.12f, %16.12f\n", $xrval,$yrval; printf " CRPIX1, CRPIX2 = %16.12f, %16.12f\n", $xrpix,$yrpix; printf " CDELT1, CDELT2 = %16.12f, %16.12f\n", $xinc,$yinc; printf " Rotation = %10.3f, CTYPE = $ctype\n", $rot; print "Calculated sky coordinate with ffwldp status = $status\n"; printf " Pixels (%8.4f,%8.4f) --> (%11.6f, %11.6f) Sky\n",$xpix,$ypix,$xpos,$ypos; ffxypx($xpos,$ypos,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$status); print "Calculated pixel coordinate with ffxypx status = $status\n"; printf " Sky (%11.6f, %11.6f) --> (%8.4f,%8.4f) Pixels\n",$xpos,$ypos,$xpix,$ypix; ###################################### # append another ASCII table # ###################################### $tform = [ qw( A15 I11 F15.6 E13.5 D22.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s' ) ]; $nrows = 11; $tfields = 5; $tblname = 'new_table'; ffcrtb($fptr,ASCII_TBL,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,$status); print "\nffcrtb status = $status\n"; $extvers = 5; ffpkyj($fptr,'EXTVER',$extvers,'extension version number',$status); ffpcl($fptr,TSTRING,1,1,1,3,$onskey,$status); @tmp = map(($_*3),(0..$npixels-1)); @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$koutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; for ($ii=2;$ii<6;$ii++) { ffpcl($fptr,TBYTE,$ii,1,1,2,[@{$boutarray}[0..1]],$status); ffpcl($fptr,TSHORT,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ffpcl($fptr,TLONG,$ii,5,1,2,[@{$joutarray}[4..5]],$status); ffpcl($fptr,TFLOAT,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ffpcl($fptr,TDOUBLE,$ii,9,1,2,[@{$doutarray}[8..9]],$status); } print "ffpcl status = $status\n"; ffgcv($fptr,TBYTE,2,1,1,10,$bnul,$binarray,$anynull,$status); ffgcv($fptr,TSHORT,2,1,1,10,$inul,$iinarray,$anynull,$status); ffgcv($fptr,TINT,3,1,1,10,$knul,$kinarray,$anynull,$status); ffgcv($fptr,TLONG,3,1,1,10,$jnul,$jinarray,$anynull,$status); ffgcv($fptr,TFLOAT,4,1,1,10,$enul,$einarray,$anynull,$status); ffgcv($fptr,TDOUBLE,5,1,1,10,$dnul,$dinarray,$anynull,$status); print "\nColumn values written with ffpcl and read with ffgcl:\n"; $npixels = 10; foreach (0..$npixels-1) { printf " %2d",$binarray->[$_] }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d",$iinarray->[$_] }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d",$kinarray->[$_] }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d",$jinarray->[$_] }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f",$einarray->[$_] }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f",$dinarray->[$_] }; print " $anynull (double)\n"; ########################################################### # perform stress test by cycling thru all the extensions # ########################################################### print "\nRepeatedly move to the 1st 4 HDUs of the file:\n"; for ($ii=0;$ii<10;$ii++) { ffmahd($fptr,1,$hdutype,$status); print ffghdn($fptr,$hdunum); ffmrhd($fptr,1,$hdutype,$status); print ffghdn($fptr,$hdunum); ffmrhd($fptr,1,$hdutype,$status); print ffghdn($fptr,$hdunum); ffmrhd($fptr,1,$hdutype,$status); print ffghdn($fptr,$hdunum); ffmrhd($fptr,-1,$hdutype,$status); print ffghdn($fptr,$hdunum); $status and last; } print "\n"; print "Move to extensions by name and version number: (ffmnhd)\n"; $extvers=1; ffmnhd($fptr,ANY_HDU,$binname,$extvers,$status); ffghdn($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=3; ffmnhd($fptr,ANY_HDU,$binname,$extvers,$status); ffghdn($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=4; ffmnhd($fptr,ANY_HDU,$binname,$extvers,$status); ffghdn($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $tblname = 'Test-ASCII'; $extvers=2; ffmnhd($fptr,ANY_HDU,$tblname,$extvers,$status); ffghdn($fptr,$hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $tblname = 'new_table'; $extvers=5; ffmnhd($fptr,ANY_HDU,$tblname,$extvers,$status); ffghdn($fptr,$hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $extvers=0; ffmnhd($fptr,ANY_HDU,$binname,$extvers,$status); ffghdn($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=17; ffmnhd($fptr,ANY_HDU,$binname,$extvers,$status); ffghdn($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status"; print " (expect a 301 error status here)\n"; $status = 0; ffthdu($fptr,$hdunum,$status); print "Total number of HDUs in the file = $hdunum\n"; ######################## # checksum tests # ######################## $checksum=1234567890; ffesum($checksum,0,$asciisum); print "\nEncode checksum: $checksum -> $asciisum\n"; $checksum = 0; ffdsum($asciisum,0,$checksum); print "Decode checksum: $asciisum -> $checksum\n"; ffpcks($fptr,$status); ffgcrd($fptr,'DATASUM',$card,$status); printf "%.30s\n", $card; ffgcks($fptr,$datsum,$checksum,$status); print "ffgcks data checksum, status = $datsum, $status\n"; ffvcks($fptr,$datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; ffprec($fptr,"new_key = 'written by fxprec' / to change checksum",$status); ffupck($fptr,$status); print "ffupck status = $status\n"; ffgcrd($fptr,'DATASUM',$card,$status); printf "%.30s\n", $card; ffvcks($fptr,$datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; ffdkey($fptr,'CHECKSUM',$status); ffdkey($fptr,'DATASUM',$status); ############################ # close file and quit # ############################ ERRSTATUS: { ffclos($fptr,$status); print "ffclos status = $status\n"; print "\nNormally, there should be 8 error messages on the stack\n"; print "all regarding 'numerical overflows':\n"; ffgmsg($errmsg); $nmsg = 0; while (length $errmsg) { printf " $errmsg\n"; $nmsg++; ffgmsg($errmsg); } if ($nmsg != 8) { print "\nWARNING: Did not find the expected 8 error messages!\n"; } ffgerr($status,$errmsg); print "\nStatus = $status: $errmsg\n"; } Astro-FITS-CFITSIO-1.10/testprog/runtests0000755000115400000360000000232407621772570016662 0ustar rpetehead#!/bin/sh usage() { cat 2>&1 <&2 $0: cannot find file $cfitsio/testprog.out usage elif [ ! -f $cfitsio/testprog.std ]; then echo 1>&2 $0: cannot find file $cfitsio/testprog.std usage fi for f in testprog*pl ; do echo perl $f \> testprog.lis perl $f > testprog.lis if [ $? -ne 0 ]; then echo 1>&2 \*\*\* failed running $f exit fi echo diff -u testprog.lis $cfitsio/testprog.out diff -u testprog.lis $cfitsio/testprog.out if [ $? -ne 0 ]; then echo 1>&2 \*\*\* failed diffing testprog.lis and $cfitsio/testprog.out exit fi echo cmp testprog.fit $cfitsio/testprog.std cmp testprog.fit $cfitsio/testprog.std if [ $? -ne 0 ]; then echo 1>&2 \*\*\* failed cmping testprog.fit and $cfitsio/testprog.std exit fi echo done echo echo All tests succeeded echo Astro-FITS-CFITSIO-1.10/testprog/testprog_longnames.pl0000644000115400000360000020457011055057133021306 0ustar rpetehead#!/usr/bin/perl use strict; use blib; use Astro::FITS::CFITSIO qw( :constants :longnames ); my $oskey='value_string'; my $olkey=1; my $ojkey=11; my $otint = 12345678; my $ofkey = 12.121212; my $oekey = 13.131313; my $ogkey = 14.1414141414141414; my $odkey = 15.1515151515151515; my $otfrac = 0.1234567890123456; my $xcoordtype = 'RA---TAN'; my $ycoordtype = 'DEC--TAN'; my $onskey = [ 'first string', 'second string', ' ' ]; my $inclist = [ 'key*', 'newikys' ]; my $exclist = [ 'key_pr*', 'key_pkls' ]; my $onlkey = [1,0,1]; my $onjkey = [11,12,13]; my $onfkey = [12.121212, 13.131313, 14.141414]; my $onekey = [13.131313, 14.141414, 15.151515]; my $ongkey = [14.1414141414141414, 15.1515151515151515,16.1616161616161616]; my $ondkey = [15.1515151515151515, 16.1616161616161616,17.1717171717171717]; my $tbcol = [1,17,28,43,56]; my $binname = "Test-BINTABLE"; my $template = "testprog.tpt"; my $tblname = "Test-ASCII"; my ($status,$tmp,$tmp1,$tmp2,@tmp); my ($ttype,$tunit,$tdisp,$tform,$nrows,$tfields,$morekeys,$extvers,$koutarray); my ($colnum,$colname,$typecode,$repeat,$width,$scale,$zero,$jnulval,$hdutype); my ($rowlen,$errmsg,$nmsg,$cval,$oshtkey); my ($version,$fptr,$tmpfptr); my ($filename,$filemode); my ($simple,$bitpix,$naxis,$naxes,$npixels,$pcount,$gcount,$extend); my ($card,$card2,$comment,$comm); my ($nkeys); my ($boutarray,$ioutarray,$joutarray,$eoutarray,$doutarray); my ($hdunum,$anynull); my ($binarray,$iinarray,$jinarray,$einarray,$dinarray); my ($ii,$jj,$larray,$larray2,$imgarray,$imgarray2); my ($keyword,$value); my ($iskey,$ilkey,$ijkey,$iekey,$idkey,$ishtkey,$inekey,$indkey); my $lsptr; my ($existkeys,$keynum); my ($inskey,$nfound,$inlkey,$injkey); my ($signval,$uchars,$nulstr); my ($xinarray,$kinarray,$cinarray,$minarray); my ($lpixels,$fpixels,$inc,$offset); my ($bnul,$inul,$knul,$jnul,$enul,$dnul); my ($xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$xpos,$ypos); my ($checksum,$asciisum,$datsum,$datastatus,$hdustatus); fits_get_version($version); printf "CFITSIO TESTPROG, v%.3f\n\n",$version; print "Try opening then closing a nonexistent file:\n"; $status=0; fits_open_file($fptr,'tq123x.kjl',READWRITE,$status); printf " ffopen fptr, status = %d %d (expect an error)\n",$fptr,$status; eval { $status = 115; # cheat!!! fits_close_file($fptr,$status); }; printf " ffclos status = %d\n\n", $status; fits_clear_errmsg(); $status=0; fits_create_file($fptr,'!testprog.fit',$status); print "ffinit create new file status = $status\n"; $status and goto ERRSTATUS; fits_file_name($fptr,$filename,$status); fits_file_mode($fptr,$filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; $simple=1; $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; $pcount=0; $gcount=1; $extend=1; ############################ # write single keywords # ############################ fits_write_imghdr($fptr,$bitpix,$naxis,$naxes,$status) and print "ffphps status = $status"; fits_write_record( $fptr, "key_prec= 'This keyword was written by fxprec' / comment goes here", $status ) and printf"ffprec status = $status\n"; print "\ntest writing of long string keywords:\n"; $card = "1234567890123456789012345678901234567890" . "12345678901234567890123456789012345"; fits_write_key_str($fptr,"card1",$card,"",$status); fits_read_keyword($fptr,'card1',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234'6789012345"; fits_write_key_str($fptr,'card2',$card,"",$status); fits_read_keyword($fptr,'card2',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234''789012345"; fits_write_key_str($fptr,'card3',$card,"",$status); fits_read_keyword($fptr,'card3',$card2,$comment,$status); print " $card\n$card2\n"; $card = "1234567890123456789012345678901234567890" . "123456789012345678901234567'9012345"; fits_write_key_str($fptr,'card4',$card,"",$status); fits_read_keyword($fptr,'card4',$card2,$comment,$status); print " $card\n$card2\n"; fits_write_key_str($fptr,'key_pkys',$oskey,'fxpkys comment',$status) and print "ffpkys status = $status\n"; fits_write_key_log($fptr,'key_pkyl',$olkey,'fxpkyl comment',$status) and print "ffpkyl status = $status\n"; fits_write_key_lng($fptr,'key_pkyj',$ojkey,'fxpkyj comment',$status) and print "ffpkyj status = $status\n"; fits_write_key_fixflt($fptr,'key_pkyf',$ofkey,5,'fxpkyf comment',$status) and print "ffpkyf status = $status\n"; fits_write_key_flt($fptr,'key_pkye',$oekey,6,'fxpkye comment',$status) and print "ffpkye status = $status\n"; fits_write_key_fixdbl($fptr,'key_pkyg',$ogkey,14,'fxpkyg comment',$status) and print "ffpkyg status = $status\n"; fits_write_key_dbl($fptr,'key_pkyd',$odkey,14,'fxpkyd comment',$status) and print "ffpkyd status = $status\n"; fits_write_key_cmp($fptr,'key_pkyc',$onekey,6,'fxpkyc comment',$status) and print "ffpkyc status = $status\n"; fits_write_key_dblcmp($fptr,'key_pkym',$ondkey,14,'fxpkym comment',$status) and print "ffpkym status = $status\n"; fits_write_key_fixcmp($fptr,'key_pkfc',$onekey,6,'fxpkfc comment',$status) and print "ffpkfc status = $status\n"; fits_write_key_fixdblcmp($fptr,'key_pkfm',$ondkey,14,'fxpkfm comment',$status) and print "ffpkfm status = $status\n"; fits_write_key_longstr( $fptr, 'key_pkls', 'This is a very long string value that is continued over more than one keyword.', 'fxpkls comment', $status, ) and print "ffpkls status = $status\n"; fits_write_key_longwarn($fptr,$status) and print "ffplsw status = $status\n"; fits_write_key_triple($fptr,'key_pkyt',$otint,$otfrac,'fxpkyt comment',$status) and print "ffpkyt status = $status\n"; fits_write_comment($fptr,' This keyword was written by fxpcom.',$status) and print "ffpcom status = $status\n"; fits_write_history($fptr," This keyword written by fxphis (w/ 2 leading spaces).",$status) and print "ffphis status = $status\n"; fits_write_date($fptr,$status) and print "ffpdat status = $status\n, goto ERRSTATUS"; ############################ # write arrays of keywords # ############################ $nkeys = 3; fits_write_keys_str($fptr,'ky_pkns',1,$nkeys,$onskey,'fxpkns comment&',$status) and print "ffpkns status = $status\n"; fits_write_keys_log($fptr,'ky_pknl',1,$nkeys,$onlkey,'fxpknl comment&',$status) and print "ffpknl status = $status\n"; fits_write_keys_lng($fptr,'ky_pknj',1,$nkeys,$onjkey,'fxpknj comment&',$status) and print "ffpknj status = $status\n"; fits_write_keys_fixflt($fptr,'ky_pknf',1,$nkeys,$onfkey,5,'fxpknf comment&',$status) and print "ffpknf status = $status\n"; fits_write_keys_flt($fptr,'ky_pkne',1,$nkeys,$onekey,6,'fxpkne comment&',$status) and print "ffpkne status = $status\n"; fits_write_keys_fixdbl($fptr,'ky_pkng',1,$nkeys,$ongkey,13,'fxpkng comment&',$status) and print "ffpkng status = $status\n"; fits_write_keys_dbl($fptr,'ky_pknd',1,$nkeys,$ondkey,14,'fxpknd comment&',$status) and print "ffpknd status = $status\n",goto ERRSTATUS; ############################ # write generic keywords # ############################ $oskey = 1; fits_write_key($fptr,TSTRING,'tstring',$oskey,'tstring comment',$status) and print "ffpky status = $status\n"; $olkey = TLOGICAL; fits_write_key($fptr,TLOGICAL,'tlogical',$olkey,'tlogical comment',$status) and print "ffpky status = $status\n"; $cval = TBYTE; fits_write_key($fptr,TBYTE,'tbyte',$cval,'tbyte comment',$status) and print "ffpky status = $status\n"; $oshtkey = TSHORT; fits_write_key($fptr,TSHORT,'tshort',$oshtkey,'tshort comment',$status) and print "ffpky status = $status\n"; $olkey = TINT; fits_write_key($fptr,TINT,'tint',$olkey,'tint comment',$status) and print "ffpky status = $status\n"; $ojkey = TLONG; fits_write_key($fptr,TLONG,'tlong',$ojkey,'tlong comment',$status) and print "ffpky status = $status\n"; $oekey = TFLOAT; fits_write_key($fptr,TFLOAT,'tfloat',$oekey,'tfloat comment',$status) and print "ffpky status = $status\n"; $odkey = TDOUBLE; fits_write_key($fptr,TDOUBLE,'tdouble',$odkey,'tdouble comment',$status) and print "ffpky status = $status\n"; ############################ # write data # ############################ fits_write_key_lng($fptr,'BLANK',-99,'value to use for undefined pixels',$status) and print "BLANK keyword status = $status\n"; $boutarray = [1..$npixels]; $ioutarray = [1..$npixels]; $joutarray = [1..$npixels]; $eoutarray = [1..$npixels]; $doutarray = [1..$npixels]; fits_write_img_byt($fptr,1,1,2,[@{$boutarray}[0..1]],$status); fits_write_img_sht($fptr,1,5,2,[@{$ioutarray}[4..5]],$status); fits_write_img_lng($fptr,1,9,2,[@{$joutarray}[8..9]],$status); fits_write_img_flt($fptr,1,13,2,[@{$eoutarray}[12..13]],$status); fits_write_img_dbl($fptr,1,17,2,[@{$doutarray}[16..17]],$status); fits_write_imgnull_byt($fptr,1,3,2,[@{$boutarray}[2..3]],4,$status); fits_write_imgnull_sht($fptr,1,7,2,[@{$ioutarray}[6..7]],8,$status); fits_write_imgnull_lng($fptr,1,11,2,[@{$joutarray}[10..11]],12,$status); fits_write_imgnull_flt($fptr,1,15,2,[@{$eoutarray}[14..15]],16,$status); fits_write_imgnull_dbl($fptr,1,19,2,[@{$doutarray}[18..19]],20,$status); fits_write_img_null($fptr,1,1,1,$status); $status and print "ffppnx status = $status\n", goto ERRSTATUS; fits_flush_file($fptr,$status); print "ffflus status = $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; ############################ # read data # ############################ print "\nValues read back from primary array (99 = null pixel)\n"; print "The 1st, and every 4th pixel should be undefined:\n"; $anynull = 0; fits_read_img_byt($fptr,1,1,10,99,$binarray,$anynull,$status); fits_read_img_byt($fptr,1,11,10,99,$tmp,$anynull,$status); @{$binarray}[10..$npixels-1] = @{$tmp}; map printf(" %2d",$binarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvb)\n"; fits_read_img_sht($fptr,1,1,$npixels,99,$iinarray,$anynull,$status); map printf(" %2d",$iinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvi)\n"; fits_read_img_lng($fptr,1,1,$npixels,99,$jinarray,$anynull,$status); map printf(" %2d",$jinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvj)\n"; fits_read_img_flt($fptr,1,1,$npixels,99,$einarray,$anynull,$status); map printf(" %2.0f",$einarray->[$_]),(0..$npixels-1); print " $anynull (ffgpve)\n"; fits_read_img_dbl($fptr,1,1,10,99,$dinarray,$anynull,$status); fits_read_img_dbl($fptr,1,11,10,99,$tmp,$anynull,$status); @{$dinarray}[10..$npixels-1] = @{$tmp}; map printf(" %2.0d",$dinarray->[$_]),(0..$npixels-1); print " $anynull (ffgpvd)\n"; $status and print("ERROR: ffgpv_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpv_ did not detect null values\n"; for ($ii=3;$ii<$npixels;$ii+=4) { $boutarray->[$ii] = 99; $ioutarray->[$ii] = 99; $joutarray->[$ii] = 99; $eoutarray->[$ii] = 99.; $doutarray->[$ii] = 99.; } $ii=0; $boutarray->[$ii] = 99; $ioutarray->[$ii] = 99; $joutarray->[$ii] = 99; $eoutarray->[$ii] = 99.; $doutarray->[$ii] = 99.; for ($ii=0; $ii<$npixels;$ii++) { ($boutarray->[$ii] != $binarray->[$ii]) and print "bout != bin = $boutarray->[$ii] $binarray->[$ii]\n"; ($ioutarray->[$ii] != $iinarray->[$ii]) and print "iout != iin = $ioutarray->[$ii] $iinarray->[$ii]\n"; ($joutarray->[$ii] != $jinarray->[$ii]) and print "jout != jin = $joutarray->[$ii] $jinarray->[$ii]\n"; ($eoutarray->[$ii] != $einarray->[$ii]) and print "eout != ein = $eoutarray->[$ii] $einarray->[$ii]\n"; ($doutarray->[$ii] != $dinarray->[$ii]) and print "dout != din = $doutarray->[$ii] $dinarray->[$ii]\n"; } @{$binarray} = map(0,(0..$npixels-1)); @{$iinarray} = map(0,(0..$npixels-1)); @{$jinarray} = map(0,(0..$npixels-1)); @{$einarray} = map(0.0,(0..$npixels-1)); @{$dinarray} = map(0.0,(0..$npixels-1)); $anynull = 0; fits_read_imgnull_byt($fptr,1,1,10,$binarray,$larray,$anynull,$status); fits_read_imgnull_byt($fptr,1,11,10,$tmp1,$tmp2,$anynull,$status); @{$binarray}[10..$npixels-1] = @{$tmp1}; @{$larray}[10..$npixels-1] = @{$tmp2}; for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$binarray->[$ii] } } print " $anynull (ffgpfb)\n"; fits_read_imgnull_sht($fptr,1,1,$npixels,$iinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$iinarray->[$ii] } } print " $anynull (ffgpfi)\n"; fits_read_imgnull_lng($fptr,1,1,$npixels,$jinarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2d",$jinarray->[$ii] } } print " $anynull (ffgpfj)\n"; fits_read_imgnull_flt($fptr,1,1,$npixels,$einarray,$larray,$anynull,$status); for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2.0f",$einarray->[$ii] } } print " $anynull (ffgpfe)\n"; fits_read_imgnull_dbl($fptr,1,1,10,$dinarray,$larray,$anynull,$status); fits_read_imgnull_dbl($fptr,1,11,10,$tmp1,$tmp2,$anynull,$status); @{$dinarray}[10..$npixels-1] = @{$tmp1}; @{$larray}[10..$npixels-1] = @{$tmp2}; for ($ii=0;$ii<$npixels;$ii++) { if ($larray->[$ii]) { print " *" } else { printf " %2.0f",$dinarray->[$ii] } } print " $anynull (ffgpfd)\n"; $status and print("ERROR: ffgpf_ status = $status\n"), goto ERRSTATUS; $anynull or print "ERROR: ffgpf_ did not detect null values\n"; ########################################## # close and reopen file multiple times # ########################################## for ($ii=0;$ii<10;$ii++) { fits_close_file($fptr,$status) and print("ERROR in ftclos (1) = $status"), goto ERRSTATUS; fits_open_file($fptr,$filename,READWRITE,$status) and print("ERROR: ffopen open file status = $status\n"), goto ERRSTATUS; } print "\nClosed then reopened the FITS file 10 times.\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; $filename = ""; fits_file_name($fptr,$filename,$status); fits_file_mode($fptr,$filemode,$status); print "Name of file = $filename, I/O mode = $filemode\n"; ############################ # read single keywords # ############################ $simple = 0; $bitpix = 0; $naxis = 0; $naxes = [0,0]; $pcount = -99; $gcount = -99; $extend = -99; print "\nRead back keywords:\n"; fits_read_imghdr($fptr,$simple,$bitpix,$naxis,$naxes,$pcount,$gcount,$extend,$status); print "simple = $simple, bitpix = $bitpix, naxis = $naxis, naxes = ($naxes->[0], $naxes->[1])\n"; print " pcount = $pcount, gcount = $gcount, extend = $extend\n"; fits_read_record($fptr,9,$card,$status); print $card,"\n"; (substr($card,0,15) eq "KEY_PREC= 'This") or print "ERROR in ffgrec\n"; fits_read_keyn($fptr,9,$keyword,$value,$comment,$status); print "$keyword : $value : $comment :\n"; ($keyword eq 'KEY_PREC') or print "ERROR in ffgkyn: $keyword\n"; fits_read_card($fptr,$keyword,$card,$status); print $card,"\n"; ($keyword eq substr($card,0,8)) or print "ERROR in ffgcrd: $keyword\n"; fits_read_keyword($fptr,'KY_PKNS1',$value,$comment,$status); print "KY_PKNS1 : $value : $comment :\n"; (substr($value,0,14) eq "'first string'") or print "ERROR in ffgkey $value\n"; fits_read_key_str($fptr,'key_pkys',$iskey,$comment,$status); print "KEY_PKYS $iskey $comment $status\n"; fits_read_key_log($fptr,'key_pkyl',$ilkey,$comment,$status); print "KEY_PKYL $ilkey $comment $status\n"; fits_read_key_lng($fptr,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKYJ $ijkey $comment $status\n"; fits_read_key_flt($fptr,'KEY_PKYJ',$iekey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$iekey; fits_read_key_dbl($fptr,'KEY_PKYJ',$idkey,$comment,$status); printf "KEY_PKYJ %f $comment $status\n",$idkey; ($ijkey == 11 and $iekey == 11.0 and $idkey == 11.0) or printf "ERROR in ffgky[jed]: %d, %f, %f\n",$ijkey,$iekey,$idkey; $iskey = ""; fits_read_key($fptr,TSTRING,'key_pkys',$iskey,$comment,$status); print "KEY_PKY S $iskey $comment $status\n"; $ilkey = 0; fits_read_key($fptr,TLOGICAL,'key_pkyl',$ilkey,$comment,$status); print "KEY_PKY L $ilkey $comment $status\n"; fits_read_key($fptr,TBYTE,'KEY_PKYJ',$cval,$comment,$status); print "KEY_PKY BYTE $cval $comment $status\n"; fits_read_key($fptr,TSHORT,'KEY_PKYJ',$ishtkey,$comment,$status); print "KEY_PKY SHORT $ishtkey $comment $status\n"; fits_read_key($fptr,TINT,'KEY_PKYJ',$ilkey,$comment,$status); print "KEY_PKY INT $ilkey $comment $status\n"; $ijkey=0; fits_read_key($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; $iekey=0; fits_read_key($fptr,TFLOAT,'KEY_PKYE',$iekey,$comment,$status); printf "KEY_PKY E %f $comment $status\n",$iekey; $idkey=0; fits_read_key($fptr,TDOUBLE,'KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKY D %f $comment $status\n",$idkey; fits_read_key_dbl($fptr,'KEY_PKYF',$idkey,$comment,$status); printf "KEY_PKYF %f $comment $status\n",$idkey; fits_read_key_dbl($fptr,'KEY_PKYE',$idkey,$comment,$status); printf "KEY_PKYE %f $comment $status\n",$idkey; fits_read_key_dbl($fptr,'KEY_PKYG',$idkey,$comment,$status); printf "KEY_PKYG %.14f $comment $status\n",$idkey; fits_read_key_dbl($fptr,'KEY_PKYD',$idkey,$comment,$status); printf "KEY_PKYD %.14f $comment $status\n",$idkey; fits_read_key_cmp($fptr,'KEY_PKYC',$inekey,$comment,$status); printf "KEY_PKYC %f %f $comment $status\n",@$inekey; fits_read_key_cmp($fptr,'KEY_PKFC',$inekey,$comment,$status); printf "KEY_PKFC %f %f $comment $status\n",@$inekey; fits_read_key_dblcmp($fptr,'KEY_PKYM',$indkey,$comment,$status); printf "KEY_PKYM %f %f $comment $status\n",@$indkey; fits_read_key_dblcmp($fptr,'KEY_PKFM',$indkey,$comment,$status); printf "KEY_PKFM %f %f $comment $status\n",@$indkey; fits_read_key_triple($fptr,'KEY_PKYT',$ijkey,$idkey,$comment,$status); printf "KEY_PKYT $ijkey %.14f $comment $status\n",$idkey; fits_write_key_unit($fptr,'KEY_PKYJ',"km/s/Mpc",$status); $ijkey=0; fits_read_key($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; fits_read_key_unit($fptr,'KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; fits_write_key_unit($fptr,'KEY_PKYJ','',$status); $ijkey=0; fits_read_key($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; fits_read_key_unit($fptr,'KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; fits_write_key_unit($fptr,'KEY_PKYJ','feet/second/second',$status); $ijkey=0; fits_read_key($fptr,TLONG,'KEY_PKYJ',$ijkey,$comment,$status); print "KEY_PKY J $ijkey $comment $status\n"; fits_read_key_unit($fptr,'KEY_PKYJ',$comment,$status); print "KEY_PKY units = $comment\n"; fits_read_key_longstr($fptr,'key_pkls',$lsptr,$comment,$status); print "KEY_PKLS long string value = \n$lsptr\n"; fits_get_hdrpos($fptr,$existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; ############################ # read array keywords # ############################ fits_read_keys_str($fptr,'ky_pkns',1,3,$inskey,$nfound,$status); print "ffgkns: $inskey->[0], $inskey->[1], $inskey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkns $nfound, $status\n"; fits_read_keys_log($fptr,'ky_pknl',1,3,$inlkey,$nfound,$status); print "ffgknl: $inlkey->[0], $inlkey->[1], $inlkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknl $nfound, $status\n"; fits_read_keys_lng($fptr,'ky_pknj',1,3,$injkey,$nfound,$status); print "ffgknj: $injkey->[0], $injkey->[1], $injkey->[2]\n"; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknj $nfound, $status\n"; fits_read_keys_flt($fptr,'ky_pkne',1,3,$inekey,$nfound,$status); printf "ffgkne: %f, %f, %f\n",@{$inekey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgkne $nfound, $status\n"; fits_read_keys_dbl($fptr,'ky_pknd',1,3,$indkey,$nfound,$status); printf "ffgknd: %f, %f, %f\n",@{$indkey}; ($nfound == 3 and $status == 0) or print "\nERROR in ffgknd $nfound, $status\n"; fits_read_card($fptr,'HISTORY',$card,$status); fits_get_hdrpos($fptr,$existkeys,$keynum,$status); $keynum -= 2; print "\nBefore deleting the HISTORY and DATE keywords...\n"; for ($ii=$keynum; $ii<=$keynum+3;$ii++) { fits_read_record($fptr,$ii,$card,$status); print substr($card,0,8),"\n"; } ############################ # delete keywords # ############################ fits_delete_record($fptr,$keynum+1,$status); fits_delete_key($fptr,'DATE',$status); print "\nAfter deleting the keywords...\n"; for ($ii=$keynum; $ii<=$keynum+1;$ii++) { fits_read_record($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR deleting keywords\n"; ############################ # insert keywords # ############################ $keynum += 4; fits_insert_record($fptr,$keynum-3,"KY_IREC = 'This keyword inserted by fxirec'",$status); fits_insert_key_str($fptr,'KY_IKYS',"insert_value_string", "ikys comment", $status); fits_insert_key_lng($fptr,'KY_IKYJ',49,"ikyj comment", $status); fits_insert_key_log($fptr,'KY_IKYL',1, "ikyl comment", $status); fits_insert_key_flt($fptr,'KY_IKYE',12.3456, 4, "ikye comment", $status); fits_insert_key_dbl($fptr,'KY_IKYD',12.345678901234567, 14, "ikyd comment", $status); fits_insert_key_fixflt($fptr,'KY_IKYF',12.3456, 4, "ikyf comment", $status); fits_insert_key_fixdbl($fptr,'KY_IKYG',12.345678901234567, 13, "ikyg comment", $status); print "\nAfter inserting the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { fits_read_record($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR inserting keywords\n"; ############################ # modify keywords # ############################ fits_modify_record($fptr,$keynum-4,'COMMENT This keyword was modified by fxmrec', $status); fits_modify_card($fptr,'KY_IREC',"KY_MREC = 'This keyword was modified by fxmcrd'",$status); fits_modify_name($fptr,'KY_IKYS','NEWIKYS',$status); fits_modify_comment($fptr,'KY_IKYJ','This is a modified comment', $status); fits_modify_key_lng($fptr,'KY_IKYJ',50,'&',$status); fits_modify_key_log($fptr,'KY_IKYL',0,'&',$status); fits_modify_key_str($fptr,'NEWIKYS','modified_string', '&', $status); fits_modify_key_flt($fptr,'KY_IKYE',-12.3456, 4, '&', $status); fits_modify_key_dbl($fptr,'KY_IKYD',-12.345678901234567, 14, 'modified comment', $status); fits_modify_key_fixflt($fptr,'KY_IKYF',-12.3456, 4, '&', $status); fits_modify_key_fixdbl($fptr,'KY_IKYG',-12.345678901234567, 13, '&', $status); print "\nAfter modifying the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { fits_read_record($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; ############################ # update keywords # ############################ fits_update_card($fptr,'KY_MREC',"KY_UCRD = 'This keyword was updated by fxucrd'",$status); fits_update_key_lng($fptr,'KY_IKYJ',51,'&',$status); fits_update_key_log($fptr,'KY_IKYL',1,'&',$status); fits_update_key_str($fptr,'NEWIKYS',"updated_string",'&',$status); fits_update_key_flt($fptr,'KY_IKYE',-13.3456, 4,'&',$status); fits_update_key_dbl($fptr,'KY_IKYD',-13.345678901234567, 14,'modified comment',$status); fits_update_key_fixflt($fptr,'KY_IKYF',-13.3456, 4,'&',$status); fits_update_key_fixdbl($fptr,'KY_IKYG',-13.345678901234567, 13,'&',$status); print "\nAfter updating the keywords...\n"; for ($ii=$keynum-4; $ii<=$keynum+5;$ii++) { fits_read_record($fptr,$ii,$card,$status); print $card,"\n"; } $status and print "ERROR modifying keywords\n"; fits_read_record($fptr,0,$card,$status); print "\nKeywords found using wildcard search (should be 13)...\n"; $nfound = 0; while (!fits_find_nextkey($fptr,$inclist,2,$exclist,2,$card,$status)) { $nfound++; print $card,"\n"; } ($nfound == 13) or print("\nERROR reading keywords using wildcards (ffgnxk)\n"), goto ERRSTATUS; $status=0; ############################ # copy index keyword # ############################ fits_copy_key($fptr,$fptr,1,4,'KY_PKNE',$status); fits_read_keys_str($fptr,'ky_pkne',2,4,$inekey,$nfound,$status); printf "\nCopied keyword: ffgkne: %f, %f, %f\n", @$inekey; $status and print("\nERROR in ffgkne $nfound, $status\n"),goto ERRSTATUS; ###################################### # modify header using template file # ###################################### fits_write_key_template($fptr,$template,$status) and print "\nERROR returned by ffpktp\n", goto ERRSTATUS; print "Updated header using template file (ffpktp)\n"; ############################ # create binary table # ############################ $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '') ]; $nrows = 21; $tfields = 10; $pcount = 0; fits_insert_btbl($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nffibin status = $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; fits_get_hdrpos($fptr,$existkeys,$keynum,$status); print "header contains $existkeys keywords; located at keyword $keynum \n"; $morekeys=40; fits_set_hdrsize($fptr,$morekeys,$status); fits_get_hdrspace($fptr,$existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; fits_set_btblnull($fptr,4,99,$status); fits_set_btblnull($fptr,5,99,$status); fits_set_btblnull($fptr,6,99,$status); $extvers=1; fits_write_key_lng($fptr,'EXTVER',$extvers,'extension version number', $status); fits_write_key_lng($fptr,'TNULL4',99,'value for undefined pixels',$status); fits_write_key_lng($fptr,'TNULL5',99,'value for undefined pixels',$status); fits_write_key_lng($fptr,'TNULL6',99,'value for undefined pixels',$status); $naxis=3; $naxes=[1,2,8]; fits_write_tdim($fptr,3,$naxis,$naxes,$status); $naxis=0; $naxes=undef; fits_read_tdim($fptr,3,$naxis,$naxes,$status); fits_read_key_str($fptr,'TDIM3',$iskey,$comment,$status); print "TDIM3 = $iskey, $naxis, $naxes->[0], $naxes->[1], $naxes->[2]\n"; fits_set_hdustruc($fptr,$status); ############################ # write data to columns # ############################ $signval = -1; for ($ii=0;$ii<21;$ii++) { $signval *= -1; $boutarray->[$ii] = ($ii + 1); $ioutarray->[$ii] = ($ii + 1) * $signval; $joutarray->[$ii] = ($ii + 1) * $signval; $koutarray->[$ii] = ($ii + 1) * $signval; $eoutarray->[$ii] = ($ii + 1) * $signval; $doutarray->[$ii] = ($ii + 1) * $signval; } fits_write_col_str($fptr,1,1,1,3,$onskey,$status); fits_write_col_null($fptr,1,4,1,1,$status); $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0]; fits_write_col_bit($fptr,3,1,1,36,$larray,$status); for ($ii=4;$ii<9;$ii++) { fits_write_col_byt($fptr,$ii,1,1,2,$boutarray,$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_sht($fptr,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_int($fptr,$ii,5,1,2,[@{$koutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_flt($fptr,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_dbl($fptr,$ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_null($fptr,$ii,11,1,1,$status); } fits_write_col_cmp($fptr,9,1,1,10,$eoutarray,$status); fits_write_col_dblcmp($fptr,10,1,1,10,$doutarray,$status); for ($ii=4;$ii<9;$ii++) { fits_write_colnull_byt($fptr,$ii,12,1,2,[@{$boutarray}[11..12]],13,$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_colnull_sht($fptr,$ii,14,1,2,[@{$ioutarray}[13..14]],15,$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_colnull_int($fptr,$ii,16,1,2,[@{$koutarray}[15..16]],17,$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_colnull_flt($fptr,$ii,18,1,2,[@{$eoutarray}[17..18]],19.,$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_colnull_dbl($fptr,$ii,20,1,2,[@{$doutarray}[19..20]],21.,$status); ($status == NUM_OVERFLOW) and $status = 0; } fits_write_col_log($fptr,2,1,1,21,$larray,$status); fits_write_col_null($fptr,2,11,1,1,$status); print "ffpcl_ status = $status\n"; ######################################### # get information about the columns # ######################################### print "\nFind the column numbers; a returned status value of 237 is"; print "\nexpected and indicates that more than one column name matches"; print "\nthe input column name template. Status = 219 indicates that"; print "\nthere was no matching column name."; fits_get_colnum($fptr,0,'Xvalue',$colnum,$status); print "\nColumn Xvalue is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { fits_get_colname($fptr,1,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; print "\nInformation about each column:\n"; for ($ii=0;$ii<$tfields;$ii++) { fits_get_coltype($fptr,$ii+1,$typecode,$repeat,$width,$status); printf("%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width); fits_get_bcolparms($fptr,$ii+1,$ttype->[0],$tunit->[0],$cval,$repeat,$scale,$zero,$jnulval,$tdisp,$status); printf " $ttype->[0], $tunit->[0], $cval, $repeat, %f, %f, $jnulval, $tdisp.\n",$scale,$zero; } print "\n"; ############################################### # insert ASCII table before the binary table # ############################################### fits_movrel_hdu($fptr,-1,$hdutype,$status) and goto ERRSTATUS; $tform = [ qw( A15 I10 F14.6 E12.5 D21.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ('','m**2','cm','erg/s','km/s') ]; $rowlen = 76; $nrows = 11; $tfields = 5; fits_insert_atbl($fptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "ffitab status = $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; fits_set_atblnull($fptr,1,'null1',$status); fits_set_atblnull($fptr,2,'null2',$status); fits_set_atblnull($fptr,3,'null3',$status); fits_set_atblnull($fptr,4,'null4',$status); fits_set_atblnull($fptr,5,'null5',$status); $extvers=2; fits_write_key_lng($fptr,'EXTVER',$extvers,'extension version number',$status); fits_write_key_str($fptr,'TNULL1','null1','value for undefined pixels',$status); fits_write_key_str($fptr,'TNULL2','null2','value for undefined pixels',$status); fits_write_key_str($fptr,'TNULL3','null3','value for undefined pixels',$status); fits_write_key_str($fptr,'TNULL4','null4','value for undefined pixels',$status); fits_write_key_str($fptr,'TNULL5','null5','value for undefined pixels',$status); $status and goto ERRSTATUS; ############################ # write data to columns # ############################ for ($ii=0;$ii<21;$ii++) { $boutarray->[$ii] = $ii+1; $ioutarray->[$ii] = $ii+1; $joutarray->[$ii] = $ii+1; $eoutarray->[$ii] = $ii+1; $doutarray->[$ii] = $ii+1; } fits_write_col_str($fptr,1,1,1,3,$onskey,$status); fits_write_col_null($fptr,1,4,1,1,$status); for ($ii=2;$ii<6;$ii++) { fits_write_col_byt($fptr,$ii,1,1,2,[@{$boutarray}[0..1]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_sht($fptr,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_lng($fptr,$ii,5,1,2,[@{$joutarray}[4..5]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_flt($fptr,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_dbl($fptr,$ii,9,1,2,[@{$doutarray}[8..9]],$status); ($status == NUM_OVERFLOW) and $status = 0; fits_write_col_null($fptr,$ii,11,1,1,$status); } print "ffpcl_ status = $status\n"; ################################ # read data from ASCII table # ################################ fits_read_atblhdr($fptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nASCII table: rowlen, nrows, tfields, extname: $rowlen $nrows $tfields $tblname\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %3d %8s %8s \n", $ttype->[$ii], $tbcol->[$ii], $tform->[$ii], $tunit->[$ii]; } $nrows = 11; fits_read_col_str($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); fits_read_col_sht($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); fits_read_col_lng($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); fits_read_col_flt($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); fits_read_col_dbl($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values read from ASCII table:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } fits_read_tblbytes($fptr,1,20,78,$uchars,$status); print "\n",pack("C78",@$uchars),"\n"; fits_write_tblbytes($fptr,1,20,78,$uchars,$status); ######################################### # get information about the columns # ######################################### fits_get_colnum($fptr,0,'name',$colnum,$status); print "\nColumn name is number $colnum; status = $status.\n"; while ($status != COL_NOT_FOUND) { fits_get_colname($fptr,0,'*ue',$colname,$colnum,$status); print "Column $colname is number $colnum; status = $status.\n"; } $status = 0; for ($ii=0;$ii<$tfields;$ii++) { fits_get_coltype($fptr,$ii+1,$typecode,$repeat,$width,$status); printf "%4s %3d %2d %2d", $tform->[$ii], $typecode, $repeat, $width; fits_get_acolparms($fptr,$ii+1,$ttype->[0],$tbcol,$tunit->[0],$tform->[0],$scale, $zero,$nulstr,$tdisp,$status); printf " $ttype->[0], $tbcol, $tunit->[0], $tform->[0], %f, %f, $nulstr, $tdisp.\n", $scale, $zero; } print "\n"; ############################################### # test the insert/delete row/column routines # ############################################### fits_insert_rows($fptr,2,3,$status) and goto ERRSTATUS; $nrows = 14; fits_read_col_str($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); fits_read_col_sht($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); fits_read_col_lng($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); fits_read_col_flt($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); fits_read_col_dbl($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } fits_delete_rows($fptr,10,2,$status) and goto ERRSTATUS; $nrows = 12; fits_read_col_str($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); fits_read_col_sht($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); fits_read_col_lng($fptr,3,1,1,$nrows,99,$jinarray,$anynull,$status); fits_read_col_flt($fptr,4,1,1,$nrows,99,$einarray,$anynull,$status); fits_read_col_dbl($fptr,5,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } fits_delete_col($fptr,3,$status) and goto ERRSTATUS; fits_read_col_str($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); fits_read_col_sht($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); fits_read_col_flt($fptr,3,1,1,$nrows,99,$einarray,$anynull,$status); fits_read_col_dbl($fptr,4,1,1,$nrows,99,$dinarray,$anynull,$status); print "\nData values after deleting column 3:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] ); } fits_insert_col($fptr,5,'INSERT_COL','F14.6',$status) and goto ERRSTATUS; fits_read_col_str($fptr,1,1,1,$nrows,'UNDEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,2,1,1,$nrows,99,$binarray,$anynull,$status); fits_read_col_sht($fptr,2,1,1,$nrows,99,$iinarray,$anynull,$status); fits_read_col_flt($fptr,3,1,1,$nrows,99,$einarray,$anynull,$status); fits_read_col_dbl($fptr,4,1,1,$nrows,99,$dinarray,$anynull,$status); fits_read_col_lng($fptr,5,1,1,$nrows,99,$jinarray,$anynull,$status); print "\nData values after inserting column 5:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf("%15s %2d %2d %4.1f %4.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], $jinarray->[$ii], ); } ############################################################ # create a temporary file and copy the ASCII table to it, # # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v6.tmp'; fits_create_file($tmpfptr,$filename,$status); print "Create temporary file: ffinit status = $status\n"; fits_insert_img($tmpfptr,$bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=12; $tfields=0; $rowlen=0; fits_insert_atbl($tmpfptr,$rowlen,$nrows,$tfields,$ttype,$tbcol,$tform,$tunit,$tblname,$status); print "\nCreate ASCII table with 0 columns: ffitab status = $status\n"; fits_copy_col($fptr,$tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_insert_btbl($tmpfptr,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,0,$status); print "\nCreate Binary table with 0 columns: ffibin status = $status\n"; fits_copy_col($fptr,$tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_delete_file($tmpfptr,$status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; ################################ # read data from binary table # ################################ fits_movrel_hdu($fptr,1,$hdutype,$status) and goto ERRSTATUS; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; fits_get_hdrspace($fptr,$existkeys,$morekeys,$status); print "header contains $existkeys keywords with room for $morekeys more\n"; fits_read_btblhdr($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "\nBinary table: nrows, tfields, extname, pcount: $nrows $tfields $binname $pcount\n"; for ($ii=0;$ii<$tfields;$ii++) { printf "%8s %8s %8s \n", $ttype->[$ii], $tform->[$ii], $tunit->[$ii]; } @$larray = map(0,(0..39)); print "\nData values read from binary table:\n"; printf " Bit column (X) data values: \n\n"; fits_read_col_bit($fptr,3,1,1,36,$larray,$status); for ($jj=0;$jj<5;$jj++) { print @{$larray}[$jj*8..$jj*8+7]; print " "; } @{$larray} = map(0,(0..$nrows-1)); @{$xinarray} = map(0,(0..$nrows-1)); @{$binarray} = map(0,(0..$nrows-1)); @{$iinarray} = map(0,(0..$nrows-1)); @{$kinarray} = map(0,(0..$nrows-1)); @{$einarray} = map(0.0,(0..$nrows-1)); @{$dinarray} = map(0.0,(0..$nrows-1)); @{$cinarray} = map(0.0,(0..2*$nrows-1)); @{$minarray} = map(0.0,(0..2*$nrows-1)); print "\n\n"; fits_read_col_str($fptr,1,4,1,1,'',$inskey,$anynull,$status); print "null string column value = -$inskey->[0]- (should be --)\n"; $nrows=21; fits_read_col_str($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); fits_read_col_log($fptr,2,1,1,$nrows,0,$larray,$anynull,$status); fits_read_col_byt($fptr,3,1,1,$nrows,98,$xinarray,$anynull,$status); fits_read_col_byt($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); fits_read_col_sht($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); fits_read_col_lng($fptr,6,1,1,$nrows,98,$kinarray,$anynull,$status); fits_read_col_flt($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); fits_read_col_dbl($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); fits_read_col_cmp($fptr,9,1,1,$nrows,98.,$cinarray,$anynull,$status); fits_read_col_dblcmp($fptr,10,1,1,$nrows,98.,$minarray,$anynull,$status); print "\nRead columns with ffgcv_:\n"; for ($ii=0;$ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f) \n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii],$kinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], @{$cinarray->[$ii]}, @{$minarray->[$ii]}; } @tmp = (0..$nrows-1); @$larray = @tmp; @$xinarray = @tmp; @$binarray = @tmp; @$iinarray = @tmp; @$kinarray = @tmp; @$einarray = @tmp; @$dinarray = @tmp; @tmp = (0..2*$nrows-1); @$cinarray = @tmp; @$minarray = @tmp; fits_read_colnull_str($fptr,1,1,1,$nrows,$inskey,$larray2,$anynull,$status); fits_read_colnull_log($fptr,2,1,1,$nrows,$larray,$larray2,$anynull,$status); fits_read_colnull_byt($fptr,3,1,1,$nrows,$xinarray,$larray2,$anynull,$status); fits_read_colnull_byt($fptr,4,1,1,$nrows,$binarray,,$larray2,$anynull,$status); fits_read_colnull_sht($fptr,5,1,1,$nrows,$iinarray,$larray2,$anynull,$status); fits_read_colnull_int($fptr,6,1,1,$nrows,$kinarray,$larray2,$anynull,$status); fits_read_colnull_flt($fptr,7,1,1,$nrows,$einarray,$larray2,$anynull,$status); fits_read_colnull_dbl($fptr,8,1,1,$nrows,$dinarray,$larray2,$anynull,$status); fits_read_colnull_cmp($fptr,9,1,1,$nrows,$cinarray,$larray2,$anynull,$status); fits_read_colnull_dblcmp($fptr,10,1,1,$nrows,$minarray,$larray2,$anynull,$status); print "\nRead columns with ffgcf_:\n"; for ($ii=0;$ii<10;$ii++) { printf "%15s %d %3d %2d %3d %3d %5.1f %5.1f (%5.1f,%5.1f) (%5.1f,%5.1f)\n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii], $kinarray->[$ii], $einarray->[$ii], $dinarray->[$ii], @{$cinarray->[$ii]}, @{$minarray->[$ii]}; } for ($ii=10; $ii<$nrows;$ii++) { printf "%15s %d %3d %2d %3d \n", $inskey->[$ii], $larray->[$ii], $xinarray->[$ii], $binarray->[$ii], $iinarray->[$ii]; } fits_write_record($fptr,"key_prec= 'This keyword was written by f_prec' / comment here", $status); ############################################### # test the insert/delete row/column routines # ############################################### fits_insert_rows($fptr,2,3,$status) and goto ERRSTATUS; $nrows=14; fits_read_col_str($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); fits_read_col_sht($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); fits_read_col_lng($fptr,6,1,1,$nrows,98,$jinarray,$anynull,$status); fits_read_col_flt($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); fits_read_col_dbl($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after inserting 3 rows after row 2:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } fits_delete_rows($fptr,10,2,$status) and goto ERRSTATUS; $nrows=12; fits_read_col_str($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); fits_read_col_sht($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); fits_read_col_lng($fptr,6,1,1,$nrows,98,$jinarray,$anynull,$status); fits_read_col_flt($fptr,7,1,1,$nrows,98.,$einarray,$anynull,$status); fits_read_col_dbl($fptr,8,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after deleting 2 rows at row 10:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $jinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } fits_delete_col($fptr,6,$status) and goto ERRSTATUS; fits_read_col_str($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); fits_read_col_sht($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); fits_read_col_flt($fptr,6,1,1,$nrows,98.,$einarray,$anynull,$status); fits_read_col_dbl($fptr,7,1,1,$nrows,98.,$dinarray,$anynull,$status); print "\nData values after deleting column 6:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii]; } fits_insert_col($fptr,8,'INSERT_COL','1E',$status) and goto ERRSTATUS; fits_read_col_str($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); fits_read_col_sht($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); fits_read_col_flt($fptr,6,1,1,$nrows,98.,$einarray,$anynull,$status); fits_read_col_dbl($fptr,7,1,1,$nrows,98.,$dinarray,$anynull,$status); fits_read_col_lng($fptr,8,1,1,$nrows,98,$jinarray,$anynull,$status); print "\nData values after inserting column 8:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] , $jinarray->[$ii]; } fits_write_col_null($fptr,8,1,1,10,$status); fits_read_col_str($fptr,1,1,1,$nrows,'NOT DEFINED',$inskey,$anynull,$status); fits_read_col_byt($fptr,4,1,1,$nrows,98,$binarray,$anynull,$status); fits_read_col_sht($fptr,5,1,1,$nrows,98,$iinarray,$anynull,$status); fits_read_col_flt($fptr,6,1,1,$nrows,98.,$einarray,$anynull,$status); fits_read_col_dbl($fptr,7,1,1,$nrows,98.,$dinarray,$anynull,$status); fits_read_col_lng($fptr,8,1,1,$nrows,98,$jinarray,$anynull,$status); print "\nValues after setting 1st 10 elements in column 8 = null:\n"; for ($ii = 0; $ii < $nrows; $ii++) { printf "%15s %2d %3d %5.1f %5.1f %d\n", $inskey->[$ii], $binarray->[$ii], $iinarray->[$ii], $einarray->[$ii], $dinarray->[$ii] , $jinarray->[$ii]; } ############################################################ # create a temporary file and copy the binary table to it,# # column by column. # ############################################################ $bitpix=16; $naxis=0; $filename = '!t1q2s3v5.tmp'; fits_create_file($tmpfptr,$filename,$status); print "Create temporary file: ffinit status = $status\n"; fits_insert_img($tmpfptr,$bitpix,$naxis,$naxes,$status); print "\nCreate null primary array: ffiimg status = $status\n"; $nrows=22; $tfields=0; fits_insert_btbl($tmpfptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,0,$status); print "\nCreate binary table with 0 columns: ffibin status = $status\n"; fits_copy_col($fptr,$tmpfptr,7,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,6,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,5,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,4,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,3,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,2,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_copy_col($fptr,$tmpfptr,1,1,TRUE,$status); print "copy column, ffcpcl status = $status\n"; fits_delete_file($tmpfptr,$status); print "Delete the tmp file: ffdelt status = $status\n"; $status and goto ERRSTATUS; #################################################### # insert binary table following the primary array # #################################################### fits_movabs_hdu($fptr,1,$hdutype,$status); $tform = [ qw( 15A 1L 16X 1B 1I 1J 1E 1D 1C 1M ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields=10; $pcount=0; fits_insert_btbl($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "ffibin status = $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; $extvers=3; fits_write_key_lng($fptr,'EXTVER',$extvers,'extension version number',$status); fits_write_key_lng($fptr,'TNULL4',77,'value for undefined pixels',$status); fits_write_key_lng($fptr,'TNULL5',77,'value for undefined pixels',$status); fits_write_key_lng($fptr,'TNULL6',77,'value for undefined pixels',$status); fits_write_key_lng($fptr,'TSCAL4',1000,'scaling factor',$status); fits_write_key_lng($fptr,'TSCAL5',1,'scaling factor',$status); fits_write_key_lng($fptr,'TSCAL6',100,'scaling factor',$status); fits_write_key_lng($fptr,'TZERO4',0,'scaling offset',$status); fits_write_key_lng($fptr,'TZERO5',32768,'scaling offset',$status); fits_write_key_lng($fptr,'TZERO6',100,'scaling offset',$status); fits_set_btblnull($fptr,4,77,$status); fits_set_btblnull($fptr,5,77,$status); fits_set_btblnull($fptr,6,77,$status); fits_set_tscale($fptr,4,1000.,0.,$status); fits_set_tscale($fptr,5,1.,32768.,$status); fits_set_tscale($fptr,6,100.,100.,$status); ############################ # write data to columns # ############################ @$joutarray = (0,1000,10000,32768,65535); for ($ii=4;$ii<7;$ii++) { fits_write_col_lng($fptr,$ii,1,1,5,$joutarray,$status); ($status == NUM_OVERFLOW) and print("Overflow writing to column $ii\n"),$status=0; fits_write_col_null($fptr,$ii,6,1,1,$status); } for ($jj=4;$jj<7;$jj++) { fits_read_col_lng($fptr,$jj,1,1,6,-999,$jinarray,$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->[$ii]; } print "\n"; } print "\n"; fits_set_tscale($fptr,4,1.,0.,$status); fits_set_tscale($fptr,5,1.,0.,$status); fits_set_tscale($fptr,6,1.,0.,$status); for ($jj=4;$jj<7;$jj++) { fits_read_col_lng($fptr,$jj,1,1,6,-999,$jinarray,$anynull,$status); for ($ii=0;$ii<6;$ii++) { printf " %6d",$jinarray->[$ii]; } print "\n"; } ###################################################### # insert image extension following the binary table # ###################################################### $bitpix=-32; $naxis=2; $naxes=[15,25]; fits_insert_img($fptr,$bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; for ($jj=0;$jj<30;$jj++) { for ($ii=0;$ii<19;$ii++) { $imgarray->[$jj]->[$ii] = ($ii<15) ? ($jj * 10) + $ii : 0; } } fits_write_2d_sht($fptr,1,19,$naxes->[0],$naxes->[1],$imgarray,$status); print "\nWrote whole 2D array: ffp2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } fits_read_2d_sht($fptr,1,0,19,$naxes->[0],$naxes->[1],$imgarray,$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]}[15..18] = (0,0,0,0); for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->[$jj]->[$ii]; } print "\n"; } for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } for ($jj=0;$jj<20;$jj++) { @{$imgarray2->[$jj]} = map(($jj * -10 - $_),(0..9)); } $fpixels=[5,5]; $lpixels = [14,14]; fits_write_subset_sht($fptr,1,$naxis,$naxes,$fpixels,$lpixels,$imgarray2,$status); print "\nWrote subset 2D array: ffpssi status = $status\n"; fits_read_2d_sht($fptr,1,0,19,$naxes->[0],$naxes->[1],$imgarray,$anynull,$status); print "\nRead whole 2D array: ffg2di status = $status\n"; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]}[15..18] = (0,0,0,0); for ($ii=0;$ii<19;$ii++) { printf " %3d", $imgarray->[$jj]->[$ii]; } print "\n"; } $fpixels = [2,5]; $lpixels = [10,8]; $inc = [2,3]; for ($jj=0;$jj<30;$jj++) { @{$imgarray->[$jj]} = map(0,(0..18)); } fits_read_subset_sht($fptr,1,$naxis,$naxes,$fpixels,$lpixels,$inc,0,$imgarray->[0],$anynull,$status); print "\nRead subset of 2D array: ffgsvi status = $status\n"; for ($ii=0;$ii<10;$ii++) { printf " %3d",$imgarray->[0]->[$ii]; } print "\n"; ########################################################### # insert another image extension # # copy the image extension to primary array of tmp file. # # then delete the tmp file, and the image extension # ########################################################### $bitpix=16; $naxis=2; $naxes = [15,25]; fits_insert_img($fptr,$bitpix,$naxis,$naxes,$status); print "\nCreate image extension: ffiimg status = $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; $filename = 't1q2s3v4.tmp'; fits_create_file($tmpfptr,$filename,$status); print "Create temporary file: ffinit status = $status\n"; fits_copy_hdu($fptr,$tmpfptr,0,$status); print "Copy image extension to primary array of tmp file.\n"; print "ffcopy status = $status\n"; fits_read_record($tmpfptr,1,$card,$status); print "$card\n"; fits_read_record($tmpfptr,2,$card,$status); print "$card\n"; fits_read_record($tmpfptr,3,$card,$status); print "$card\n"; fits_read_record($tmpfptr,4,$card,$status); print "$card\n"; fits_read_record($tmpfptr,5,$card,$status); print "$card\n"; fits_read_record($tmpfptr,6,$card,$status); print "$card\n"; fits_delete_file($tmpfptr,$status); print "Delete the tmp file: ffdelt status = $status\n"; fits_delete_hdu($fptr,$hdutype,$status); print "Delete the image extension; hdutype, status = $hdutype $status\n"; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; ########################################################### # append bintable extension with variable length columns # ########################################################### fits_create_hdu($fptr,$status); print "ffcrhd status = $status\n"; $tform = [ qw( 1PA 1PL 1PB 1PB 1PI 1PJ 1PE 1PD 1PC 1PM ) ]; $ttype = [ qw( Avalue Lvalue Xvalue Bvalue Ivalue Jvalue Evalue Dvalue Cvalue Mvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s', '', '', '', '', '' ) ]; $nrows=20; $tfields = 10; $pcount=0; fits_write_btblhdr($fptr,$nrows,$tfields,$ttype,$tform,$tunit,$binname,$pcount,$status); print "Variable length arrays: ffphbn status = $status\n"; $extvers=4; fits_write_key_lng($fptr,'EXTVER',$extvers,'extension version number',$status); fits_write_key_lng($fptr, 'TNULL4', 88, 'value for undefined pixels', $status); fits_write_key_lng($fptr, 'TNULL5', 88, 'value for undefined pixels', $status); fits_write_key_lng($fptr, 'TNULL6', 88, 'value for undefined pixels', $status); ############################ # write data to columns # ############################ $iskey = 'abcdefghijklmnopqrst'; @tmp = (1..20); @{$boutarray} = @tmp; @{$ioutarray} = @tmp; @{$joutarray} = @tmp; @{$eoutarray} = @tmp; @{$doutarray} = @tmp; $larray = [0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1]; $inskey=['']; fits_write_col_str($fptr,1,1,1,1,$inskey,$status); fits_write_col_log($fptr,2,1,1,1,$larray,$status); fits_write_col_bit($fptr,3,1,1,1,$larray,$status); fits_write_col_byt($fptr,4,1,1,1,$boutarray,$status); fits_write_col_sht($fptr,5,1,1,1,$ioutarray,$status); fits_write_col_lng($fptr,6,1,1,1,$joutarray,$status); fits_write_col_flt($fptr,7,1,1,1,$eoutarray,$status); fits_write_col_dbl($fptr,8,1,1,1,$doutarray,$status); for ($ii=2;$ii<=20;$ii++) { $inskey->[0] = $iskey; $inskey->[0] = substr($inskey->[0],0,$ii); fits_write_col_str($fptr,1,$ii,1,1,$inskey,$status); fits_write_col_log($fptr,2,$ii,1,$ii,$larray,$status); fits_write_col_null($fptr,2,$ii,$ii-1,1,$status); fits_write_col_bit($fptr,3,$ii,1,$ii,$larray,$status); fits_write_col_byt($fptr,4,$ii,1,$ii,$boutarray,$status); fits_write_col_null($fptr,4,$ii,$ii-1,1,$status); fits_write_col_sht($fptr,5,$ii,1,$ii,$ioutarray,$status); fits_write_col_null($fptr,5,$ii,$ii-1,1,$status); fits_write_col_lng($fptr,6,$ii,1,$ii,$joutarray,$status); fits_write_col_null($fptr,6,$ii,$ii-1,1,$status); fits_write_col_flt($fptr,7,$ii,1,$ii,$eoutarray,$status); fits_write_col_null($fptr,7,$ii,$ii-1,1,$status); fits_write_col_dbl($fptr,8,$ii,1,$ii,$doutarray,$status); fits_write_col_null($fptr,8,$ii,$ii-1,1,$status); } print "ffpcl_ status = $status\n"; ################################# # close then reopen this HDU # ################################# fits_movrel_hdu($fptr,-1,$hdutype,$status); fits_movrel_hdu($fptr,1,$hdutype,$status); ############################# # read data from columns # ############################# fits_read_key_lng($fptr,'PCOUNT',$pcount,$comm,$status); print "PCOUNT = $pcount\n"; $inskey->[0] = ' '; $iskey = ' '; print "HDU number = ${\(fits_get_hdu_num($fptr,$hdunum))}\n"; for ($ii=1;$ii<=20;$ii++) { @tmp = map(0,(0..$ii-1)); @$larray = @tmp; @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; fits_read_col_str($fptr,1,$ii,1,1,$iskey,$inskey,$anynull,$status); print "A $inskey->[0] $status\nL"; fits_read_col_log($fptr,2,$ii,1,$ii,0,$larray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $larray->[$_]; } print " $status\nX"; fits_read_col_bit($fptr,3,$ii,1,$ii,$larray,$status); foreach (0..$ii-1) { printf " %2d", $larray->[$_]; } print " $status\nB"; fits_read_col_byt($fptr,4,$ii,1,$ii,99,$boutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $boutarray->[$_]; } print " $status\nI"; fits_read_col_sht($fptr,5,$ii,1,$ii,99,$ioutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $ioutarray->[$_]; } print " $status\nJ"; fits_read_col_lng($fptr,6,$ii,1,$ii,99,$joutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2d", $joutarray->[$_]; } print " $status\nE"; fits_read_col_flt($fptr,7,$ii,1,$ii,99,$eoutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $eoutarray->[$_]; } print " $status\nD"; fits_read_col_dbl($fptr,8,$ii,1,$ii,99,$doutarray,$anynull,$status); foreach (0..$ii-1) { printf " %2.0f", $doutarray->[$_]; } print " $status\n"; fits_read_descript($fptr,8,$ii,$repeat,$offset,$status); print "Column 8 repeat and offset = $repeat $offset\n"; } ##################################### # create another image extension # ##################################### $bitpix=32; $naxis=2; $naxes=[10,2]; $npixels=20; fits_insert_img($fptr,$bitpix,$naxis,$naxes,$status); print "\nffcrim status = $status\n"; @tmp = map(($_*2),(0..$npixels-1)); @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$koutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; fits_write_img($fptr,TBYTE, 1, 2, [@{$boutarray}[0..1]], $status); fits_write_img($fptr,TSHORT, 3, 2,[ @{$ioutarray}[2..3]], $status); fits_write_img($fptr,TINT, 5, 2, [@{$koutarray}[4..5]], $status); fits_write_img($fptr,TSHORT, 7, 2, [@{$ioutarray}[6..7]], $status); fits_write_img($fptr,TLONG, 9, 2, [@{$joutarray}[8..9]], $status); fits_write_img($fptr,TFLOAT, 11, 2, [@{$eoutarray}[10..11]], $status); fits_write_img($fptr,TDOUBLE, 13, 2, [@{$doutarray}[12..13]], $status); print "ffppr status = $status\n"; $bnul=0; $inul=0; $knul=0; $jnul=0; $enul=0.0; $dnul=0.0; fits_read_img($fptr,TBYTE,1,14,$bnul,$binarray,$anynull,$status); fits_read_img($fptr,TSHORT,1,14,$inul,$iinarray,$anynull,$status); fits_read_img($fptr,TINT,1,14,$knul,$kinarray,$anynull,$status); fits_read_img($fptr,TLONG,1,14,$jnul,$jinarray,$anynull,$status); fits_read_img($fptr,TFLOAT,1,14,$enul,$einarray,$anynull,$status); fits_read_img($fptr,TDOUBLE,1,14,$dnul,$dinarray,$anynull,$status); print "\nImage values written with ffppr and read with ffgpv:\n"; $npixels=14; foreach (0..$npixels-1) { printf " %2d", $binarray->[$_] }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d", $iinarray->[$_] }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d", $kinarray->[$_] }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d", $jinarray->[$_] }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f", $einarray->[$_] }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f", $dinarray->[$_] }; print " $anynull (double)\n"; ########################################## # test world coordinate system routines # ########################################## $xrval=45.83; $yrval=63.57; $xrpix=256.0; $yrpix=257.0; $xinc = -.00277777; $yinc = .00277777; fits_write_key_dbl($fptr,'CRVAL1',$xrval,10,'comment',$status); fits_write_key_dbl($fptr,'CRVAL2',$yrval,10,'comment',$status); fits_write_key_dbl($fptr,'CRPIX1',$xrpix,10,'comment',$status); fits_write_key_dbl($fptr,'CRPIX2',$yrpix,10,'comment',$status); fits_write_key_dbl($fptr,'CDELT1',$xinc,10,'comment',$status); fits_write_key_dbl($fptr,'CDELT2',$yinc,10,'comment',$status); fits_write_key_str($fptr,'CTYPE1',$xcoordtype,'comment',$status); fits_write_key_str($fptr,'CTYPE2',$ycoordtype,'comment',$status); print "\nWrote WCS keywords status = $status\n"; $xrval = 0; $yrval = 0; $xrpix = 0; $yrpix = 0; $xinc = 0; $yinc = 0; $rot = 0; fits_read_img_coord($fptr,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$status); print "Read WCS keywords with ffgics status = $status\n"; $xpix = 0.5; $ypix = 0.5; fits_pix_to_world($xpix,$ypix,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpos,$ypos,$status); printf " CRVAL1, CRVAL2 = %16.12f, %16.12f\n", $xrval,$yrval; printf " CRPIX1, CRPIX2 = %16.12f, %16.12f\n", $xrpix,$yrpix; printf " CDELT1, CDELT2 = %16.12f, %16.12f\n", $xinc,$yinc; printf " Rotation = %10.3f, CTYPE = $ctype\n", $rot; print "Calculated sky coordinate with ffwldp status = $status\n"; printf " Pixels (%8.4f,%8.4f) --> (%11.6f, %11.6f) Sky\n",$xpix,$ypix,$xpos,$ypos; fits_world_to_pix($xpos,$ypos,$xrval,$yrval,$xrpix,$yrpix,$xinc,$yinc,$rot,$ctype,$xpix,$ypix,$status); print "Calculated pixel coordinate with ffxypx status = $status\n"; printf " Sky (%11.6f, %11.6f) --> (%8.4f,%8.4f) Pixels\n",$xpos,$ypos,$xpix,$ypix; ###################################### # append another ASCII table # ###################################### $tform = [ qw( A15 I11 F15.6 E13.5 D22.14 ) ]; $ttype = [ qw( Name Ivalue Fvalue Evalue Dvalue ) ]; $tunit = [ ( '', 'm**2', 'cm', 'erg/s', 'km/s' ) ]; $nrows = 11; $tfields = 5; $tblname = 'new_table'; fits_create_tbl($fptr,ASCII_TBL,$nrows,$tfields,$ttype,$tform,$tunit,$tblname,$status); print "\nffcrtb status = $status\n"; $extvers = 5; fits_write_key_lng($fptr,'EXTVER',$extvers,'extension version number',$status); fits_write_col($fptr,TSTRING,1,1,1,3,$onskey,$status); @tmp = map(($_*3),(0..$npixels-1)); @$boutarray = @tmp; @$ioutarray = @tmp; @$joutarray = @tmp; @$koutarray = @tmp; @$eoutarray = @tmp; @$doutarray = @tmp; for ($ii=2;$ii<6;$ii++) { fits_write_col($fptr,TBYTE,$ii,1,1,2,[@{$boutarray}[0..1]],$status); fits_write_col($fptr,TSHORT,$ii,3,1,2,[@{$ioutarray}[2..3]],$status); fits_write_col($fptr,TLONG,$ii,5,1,2,[@{$joutarray}[4..5]],$status); fits_write_col($fptr,TFLOAT,$ii,7,1,2,[@{$eoutarray}[6..7]],$status); fits_write_col($fptr,TDOUBLE,$ii,9,1,2,[@{$doutarray}[8..9]],$status); } print "ffpcl status = $status\n"; fits_read_col($fptr,TBYTE,2,1,1,10,$bnul,$binarray,$anynull,$status); fits_read_col($fptr,TSHORT,2,1,1,10,$inul,$iinarray,$anynull,$status); fits_read_col($fptr,TINT,3,1,1,10,$knul,$kinarray,$anynull,$status); fits_read_col($fptr,TLONG,3,1,1,10,$jnul,$jinarray,$anynull,$status); fits_read_col($fptr,TFLOAT,4,1,1,10,$enul,$einarray,$anynull,$status); fits_read_col($fptr,TDOUBLE,5,1,1,10,$dnul,$dinarray,$anynull,$status); print "\nColumn values written with ffpcl and read with ffgcl:\n"; $npixels = 10; foreach (0..$npixels-1) { printf " %2d",$binarray->[$_] }; print " $anynull (byte)\n"; foreach (0..$npixels-1) { printf " %2d",$iinarray->[$_] }; print " $anynull (short)\n"; foreach (0..$npixels-1) { printf " %2d",$kinarray->[$_] }; print " $anynull (int)\n"; foreach (0..$npixels-1) { printf " %2d",$jinarray->[$_] }; print " $anynull (long)\n"; foreach (0..$npixels-1) { printf " %2.0f",$einarray->[$_] }; print " $anynull (float)\n"; foreach (0..$npixels-1) { printf " %2.0f",$dinarray->[$_] }; print " $anynull (double)\n"; ########################################################### # perform stress test by cycling thru all the extensions # ########################################################### print "\nRepeatedly move to the 1st 4 HDUs of the file:\n"; for ($ii=0;$ii<10;$ii++) { fits_movabs_hdu($fptr,1,$hdutype,$status); print fits_get_hdu_num($fptr,$hdunum); fits_movrel_hdu($fptr,1,$hdutype,$status); print fits_get_hdu_num($fptr,$hdunum); fits_movrel_hdu($fptr,1,$hdutype,$status); print fits_get_hdu_num($fptr,$hdunum); fits_movrel_hdu($fptr,1,$hdutype,$status); print fits_get_hdu_num($fptr,$hdunum); fits_movrel_hdu($fptr,-1,$hdutype,$status); print fits_get_hdu_num($fptr,$hdunum); $status and last; } print "\n"; print "Move to extensions by name and version number: (ffmnhd)\n"; $extvers=1; fits_movnam_hdu($fptr,ANY_HDU,$binname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=3; fits_movnam_hdu($fptr,ANY_HDU,$binname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=4; fits_movnam_hdu($fptr,ANY_HDU,$binname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $tblname = 'Test-ASCII'; $extvers=2; fits_movnam_hdu($fptr,ANY_HDU,$tblname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $tblname = 'new_table'; $extvers=5; fits_movnam_hdu($fptr,ANY_HDU,$tblname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $tblname, $extvers = hdu $hdunum, $status\n"; $extvers=0; fits_movnam_hdu($fptr,ANY_HDU,$binname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status\n"; $extvers=17; fits_movnam_hdu($fptr,ANY_HDU,$binname,$extvers,$status); fits_get_hdu_num($fptr,$hdunum); print " $binname, $extvers = hdu $hdunum, $status"; print " (expect a 301 error status here)\n"; $status = 0; fits_get_num_hdus($fptr,$hdunum,$status); print "Total number of HDUs in the file = $hdunum\n"; ######################## # checksum tests # ######################## $checksum=1234567890; fits_encode_chksum($checksum,0,$asciisum); print "\nEncode checksum: $checksum -> $asciisum\n"; $checksum = 0; fits_decode_chksum($asciisum,0,$checksum); print "Decode checksum: $asciisum -> $checksum\n"; fits_write_chksum($fptr,$status); fits_read_card($fptr,'DATASUM',$card,$status); printf "%.30s\n", $card; fits_get_chksum($fptr,$datsum,$checksum,$status); print "ffgcks data checksum, status = $datsum, $status\n"; fits_verify_chksum($fptr,$datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; fits_write_record($fptr,"new_key = 'written by fxprec' / to change checksum",$status); fits_update_chksum($fptr,$status); print "ffupck status = $status\n"; fits_read_card($fptr,'DATASUM',$card,$status); printf "%.30s\n", $card; fits_verify_chksum($fptr,$datastatus,$hdustatus,$status); print "ffvcks datastatus, hdustatus, status = $datastatus $hdustatus $status\n"; fits_delete_key($fptr,'CHECKSUM',$status); fits_delete_key($fptr,'DATASUM',$status); ############################ # close file and quit # ############################ ERRSTATUS: { fits_close_file($fptr,$status); print "ffclos status = $status\n"; print "\nNormally, there should be 8 error messages on the stack\n"; print "all regarding 'numerical overflows':\n"; fits_read_errmsg($errmsg); $nmsg = 0; while (length $errmsg) { printf " $errmsg\n"; $nmsg++; fits_read_errmsg($errmsg); } if ($nmsg != 8) { print "\nWARNING: Did not find the expected 8 error messages!\n"; } fits_get_errstatus($status,$errmsg); print "\nStatus = $status: $errmsg\n"; } Astro-FITS-CFITSIO-1.10/CFITSIO.pm0000644000115400000360000011712512154150237014625 0ustar rpeteheadpackage Astro::FITS::CFITSIO; $VERSION = '1.10'; use strict; use Carp; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); require Exporter; require DynaLoader; require AutoLoader; @ISA = qw(Exporter DynaLoader); my @__names_no_short = qw( fits_get_compression_type fits_set_compression_type fits_get_noise_bits fits_set_noise_bits fits_get_tile_dim fits_set_tile_dim fits_translate_keyword fits_translate_keywords fits_copy_cell2image fits_copy_image2cell ); # perl -nle "next unless /^\s*#define\s+fits_/; (undef,\$l,\$s) = split ' '; print \"\$s => '\$l',\"" /usr/local/cfitsio/longnam.h my %__names = ( ffiurl => 'fits_parse_input_url', ffifile => 'fits_parse_input_filename', ffrtnm => 'fits_parse_rootname', ffrwrg => 'fits_parse_range', ffrwrgll => 'fits_parse_rangell', ffourl => 'fits_parse_output_url', ffexts => 'fits_parse_extspec', ffextn => 'fits_parse_extnum', ffbins => 'fits_parse_binspec', ffbinr => 'fits_parse_binrange', ffdopn => 'fits_open_data', fftopn => 'fits_open_table', ffiopn => 'fits_open_image', ffomem => 'fits_open_memfile', ffopen => 'fits_open_file', ffdkopn => 'fits_open_diskfile', ffreopen => 'fits_reopen_file', ffinit => 'fits_create_file', ffdkinit => 'fits_create_diskfile', ffimem => 'fits_create_memfile', fftplt => 'fits_create_template', ffflus => 'fits_flush_file', ffflsh => 'fits_flush_buffer', ffclos => 'fits_close_file', ffdelt => 'fits_delete_file', ffexist => 'fits_file_exists', ffflnm => 'fits_file_name', ffflmd => 'fits_file_mode', ffurlt => 'fits_url_type', ffvers => 'fits_get_version', ffupch => 'fits_uppercase', ffgerr => 'fits_get_errstatus', ffpmsg => 'fits_write_errmsg', ffgmsg => 'fits_read_errmsg', ffcmsg => 'fits_clear_errmsg', ffrprt => 'fits_report_error', ffpmrk => 'fits_write_errmark', ffcmrk => 'fits_clear_errmark', ffcmsg => 'fits_clear_errmsg', ffcmps => 'fits_compare_str', fftkey => 'fits_test_keyword', fftrec => 'fits_test_record', ffnchk => 'fits_null_check', ffkeyn => 'fits_make_keyn', ffnkey => 'fits_make_nkey', ffmkky => 'fits_make_key', ffgkcl => 'fits_get_keyclass', ffdtyp => 'fits_get_keytype', ffpsvc => 'fits_parse_value', ffgknm => 'fits_get_keyname', ffgthd => 'fits_parse_template', ffasfm => 'fits_ascii_tform', ffbnfm => 'fits_binary_tform', ffbnfmll => 'fits_binary_tformll', ffgabc => 'fits_get_tbcol', ffgrsz => 'fits_get_rowsize', ffgcdw => 'fits_get_col_display_width', ffprec => 'fits_write_record', ffpky => 'fits_write_key', ffpunt => 'fits_write_key_unit', ffpcom => 'fits_write_comment', ffphis => 'fits_write_history', ffpdat => 'fits_write_date', ffgstm => 'fits_get_system_time', ffgsdt => 'fits_get_system_date', ffdt2s => 'fits_date2str', fftm2s => 'fits_time2str', ffs2dt => 'fits_str2date', ffs2tm => 'fits_str2time', ffpkls => 'fits_write_key_longstr', ffplsw => 'fits_write_key_longwarn', ffpkyu => 'fits_write_key_null', ffpkys => 'fits_write_key_str', ffpkyl => 'fits_write_key_log', ffpkyj => 'fits_write_key_lng', ffpkyf => 'fits_write_key_fixflt', ffpkye => 'fits_write_key_flt', ffpkyg => 'fits_write_key_fixdbl', ffpkyd => 'fits_write_key_dbl', ffpkfc => 'fits_write_key_fixcmp', ffpkyc => 'fits_write_key_cmp', ffpkfm => 'fits_write_key_fixdblcmp', ffpkym => 'fits_write_key_dblcmp', ffpkyt => 'fits_write_key_triple', ffptdm => 'fits_write_tdim', ffptdmll => 'fits_write_tdimll', ffpkns => 'fits_write_keys_str', ffpknl => 'fits_write_keys_log', ffpknj => 'fits_write_keys_lng', ffpknjj => 'fits_write_keys_lnglng', ffpknf => 'fits_write_keys_fixflt', ffpkne => 'fits_write_keys_flt', ffpkng => 'fits_write_keys_fixdbl', ffpknd => 'fits_write_keys_dbl', ffcpky => 'fits_copy_key', ffphps => 'fits_write_imghdr', ffphpsll => 'fits_write_imghdrll', ffphpr => 'fits_write_grphdr', ffphprll => 'fits_write_grphdrll', ffphtb => 'fits_write_atblhdr', ffphbn => 'fits_write_btblhdr', ffphext => 'fits_write_exthdr', ffpktp => 'fits_write_key_template', ffghsp => 'fits_get_hdrspace', ffghps => 'fits_get_hdrpos', ffmaky => 'fits_movabs_key', ffmrky => 'fits_movrel_key', ffgnxk => 'fits_find_nextkey', ffgrec => 'fits_read_record', ffgcrd => 'fits_read_card', ffgunt => 'fits_read_key_unit', ffgkyn => 'fits_read_keyn', ffgstr => 'fits_read_str', ffdstr => 'fits_delete_str', ffgky => 'fits_read_key', ffgkey => 'fits_read_keyword', ffgkys => 'fits_read_key_str', ffgkyl => 'fits_read_key_log', ffgkyj => 'fits_read_key_lng', ffgkye => 'fits_read_key_flt', ffgkyd => 'fits_read_key_dbl', ffgkyc => 'fits_read_key_cmp', ffgkym => 'fits_read_key_dblcmp', ffgkyt => 'fits_read_key_triple', ffgkls => 'fits_read_key_longstr', fffree => 'fits_free_memory', ffhdr2str => 'fits_hdr2str', ffcnvthdr2str => 'fits_convert_hdr2str', ffgtdm => 'fits_read_tdim', ffgtdmll => 'fits_read_tdimll', ffdtdm => 'fits_decode_tdim', ffdtdmll => 'fits_decode_tdimll', ffgkns => 'fits_read_keys_str', ffgknl => 'fits_read_keys_log', ffgknj => 'fits_read_keys_lng', ffgknjj => 'fits_read_keys_lnglng', ffgkne => 'fits_read_keys_flt', ffgknd => 'fits_read_keys_dbl', ffghpr => 'fits_read_imghdr', ffghprll => 'fits_read_imghdrll', ffghtb => 'fits_read_atblhdr', ffghtbll => 'fits_read_atblhdrll', ffghbn => 'fits_read_btblhdr', ffghbnll => 'fits_read_btblhdrll', ffh2st => 'fits_header2str', ffucrd => 'fits_update_card', ffuky => 'fits_update_key', ffukyu => 'fits_update_key_null', ffukys => 'fits_update_key_str', ffukls => 'fits_update_key_longstr', ffukyl => 'fits_update_key_log', ffukyj => 'fits_update_key_lng', ffukyf => 'fits_update_key_fixflt', ffukye => 'fits_update_key_flt', ffukyg => 'fits_update_key_fixdbl', ffukyd => 'fits_update_key_dbl', ffukfc => 'fits_update_key_fixcmp', ffukyc => 'fits_update_key_cmp', ffukfm => 'fits_update_key_fixdblcmp', ffukym => 'fits_update_key_dblcmp', ffmrec => 'fits_modify_record', ffmcrd => 'fits_modify_card', ffmnam => 'fits_modify_name', ffmcom => 'fits_modify_comment', ffmkyu => 'fits_modify_key_null', ffmkys => 'fits_modify_key_str', ffmkls => 'fits_modify_key_longstr', ffmkyl => 'fits_modify_key_log', ffmkyj => 'fits_modify_key_lng', ffmkyf => 'fits_modify_key_fixflt', ffmkye => 'fits_modify_key_flt', ffmkyg => 'fits_modify_key_fixdbl', ffmkyd => 'fits_modify_key_dbl', ffmkfc => 'fits_modify_key_fixcmp', ffmkyc => 'fits_modify_key_cmp', ffmkfm => 'fits_modify_key_fixdblcmp', ffmkym => 'fits_modify_key_dblcmp', ffikey => 'fits_insert_card', ffirec => 'fits_insert_record', ffikyu => 'fits_insert_key_null', ffikys => 'fits_insert_key_str', ffikls => 'fits_insert_key_longstr', ffikyl => 'fits_insert_key_log', ffikyj => 'fits_insert_key_lng', ffikyf => 'fits_insert_key_fixflt', ffikye => 'fits_insert_key_flt', ffikyg => 'fits_insert_key_fixdbl', ffikyd => 'fits_insert_key_dbl', ffikfc => 'fits_insert_key_fixcmp', ffikyc => 'fits_insert_key_cmp', ffikfm => 'fits_insert_key_fixdblcmp', ffikym => 'fits_insert_key_dblcmp', ffdkey => 'fits_delete_key', ffdrec => 'fits_delete_record', ffghdn => 'fits_get_hdu_num', ffghdt => 'fits_get_hdu_type', ffghad => 'fits_get_hduaddr', ffghadll => 'fits_get_hduaddrll', ffghof => 'fits_get_hduoff', ffgipr => 'fits_get_img_param', ffgiprll => 'fits_get_img_paramll', ffgidt => 'fits_get_img_type', ffinttyp => 'fits_get_inttype', ffgiet => 'fits_get_img_equivtype', ffgidm => 'fits_get_img_dim', ffgisz => 'fits_get_img_size', ffgiszll => 'fits_get_img_sizell', ffmahd => 'fits_movabs_hdu', ffmrhd => 'fits_movrel_hdu', ffmnhd => 'fits_movnam_hdu', ffthdu => 'fits_get_num_hdus', ffcrim => 'fits_create_img', ffcrimll => 'fits_create_imgll', ffcrtb => 'fits_create_tbl', ffcrhd => 'fits_create_hdu', ffiimg => 'fits_insert_img', ffiimgll => 'fits_insert_imgll', ffitab => 'fits_insert_atbl', ffibin => 'fits_insert_btbl', ffrsim => 'fits_resize_img', ffrsimll => 'fits_resize_imgll', ffdhdu => 'fits_delete_hdu', ffcpfl => 'fits_copy_file', ffcopy => 'fits_copy_hdu', ffcphd => 'fits_copy_header', ffcpdt => 'fits_copy_data', ffwrhdu => 'fits_write_hdu', ffrdef => 'fits_set_hdustruc', ffhdef => 'fits_set_hdrsize', ffpthp => 'fits_write_theap', ffesum => 'fits_encode_chksum', ffdsum => 'fits_decode_chksum', ffpcks => 'fits_write_chksum', ffupck => 'fits_update_chksum', ffvcks => 'fits_verify_chksum', ffgcks => 'fits_get_chksum', ffpscl => 'fits_set_bscale', fftscl => 'fits_set_tscale', ffpnul => 'fits_set_imgnull', fftnul => 'fits_set_btblnull', ffsnul => 'fits_set_atblnull', ffgcno => 'fits_get_colnum', ffgcnn => 'fits_get_colname', ffgtcl => 'fits_get_coltype', ffgtclll => 'fits_get_coltypell', ffeqty => 'fits_get_eqcoltype', ffeqtyll => 'fits_get_eqcoltypell', ffgnrw => 'fits_get_num_rows', ffgnrwll => 'fits_get_num_rowsll', ffgncl => 'fits_get_num_cols', ffgacl => 'fits_get_acolparms', ffgbcl => 'fits_get_bcolparms', ffgbclll => 'fits_get_bcolparmsll', ffiter => 'fits_iterate_data', ffggpb => 'fits_read_grppar_byt', ffggpb => 'fits_read_grppar_sbyt', ffggpui => 'fits_read_grppar_usht', ffggpuj => 'fits_read_grppar_ulng', ffggpi => 'fits_read_grppar_sht', ffggpj => 'fits_read_grppar_lng', ffggpjj => 'fits_read_grppar_lnglng', ffggpk => 'fits_read_grppar_int', ffggpuk => 'fits_read_grppar_uint', ffggpe => 'fits_read_grppar_flt', ffggpd => 'fits_read_grppar_dbl', ffgpxv => 'fits_read_pix', ffgpxvll => 'fits_read_pixll', ffgpxf => 'fits_read_pixnull', ffgpxfll => 'fits_read_pixnullll', ffgpv => 'fits_read_img', ffgpf => 'fits_read_imgnull', ffgpvb => 'fits_read_img_byt', ffgpvsb => 'fits_read_img_sbyt', ffgpvui => 'fits_read_img_usht', ffgpvuj => 'fits_read_img_ulng', ffgpvi => 'fits_read_img_sht', ffgpvj => 'fits_read_img_lng', ffgpvjj => 'fits_read_img_lnglng', ffgpvuk => 'fits_read_img_uint', ffgpvk => 'fits_read_img_int', ffgpve => 'fits_read_img_flt', ffgpvd => 'fits_read_img_dbl', ffgpfb => 'fits_read_imgnull_byt', ffgpfsb => 'fits_read_imgnull_sbyt', ffgpfui => 'fits_read_imgnull_usht', ffgpfuj => 'fits_read_imgnull_ulng', ffgpfi => 'fits_read_imgnull_sht', ffgpfj => 'fits_read_imgnull_lng', ffgpfjj => 'fits_read_imgnull_lnglng', ffgpfuk => 'fits_read_imgnull_uint', ffgpfk => 'fits_read_imgnull_int', ffgpfe => 'fits_read_imgnull_flt', ffgpfd => 'fits_read_imgnull_dbl', ffg2db => 'fits_read_2d_byt', ffg2dsb => 'fits_read_2d_sbyt', ffg2dui => 'fits_read_2d_usht', ffg2duj => 'fits_read_2d_ulng', ffg2di => 'fits_read_2d_sht', ffg2dj => 'fits_read_2d_lng', ffg2djj => 'fits_read_2d_lnglng', ffg2duk => 'fits_read_2d_uint', ffg2dk => 'fits_read_2d_int', ffg2de => 'fits_read_2d_flt', ffg2dd => 'fits_read_2d_dbl', ffg3db => 'fits_read_3d_byt', ffg3dsb => 'fits_read_3d_sbyt', ffg3dui => 'fits_read_3d_usht', ffg3duj => 'fits_read_3d_ulng', ffg3di => 'fits_read_3d_sht', ffg3dj => 'fits_read_3d_lng', ffg3dj => 'fits_read_3d_lnglng', ffg3duk => 'fits_read_3d_uint', ffg3dk => 'fits_read_3d_int', ffg3de => 'fits_read_3d_flt', ffg3dd => 'fits_read_3d_dbl', ffgsv => 'fits_read_subset', ffgsvb => 'fits_read_subset_byt', ffgsvsb => 'fits_read_subset_sbyt', ffgsvui => 'fits_read_subset_usht', ffgsvuj => 'fits_read_subset_ulng', ffgsvi => 'fits_read_subset_sht', ffgsvj => 'fits_read_subset_lng', ffgsvjj => 'fits_read_subset_lnglng', ffgsvuk => 'fits_read_subset_uint', ffgsvk => 'fits_read_subset_int', ffgsve => 'fits_read_subset_flt', ffgsvd => 'fits_read_subset_dbl', ffgsfb => 'fits_read_subsetnull_byt', ffgsfsb => 'fits_read_subsetnull_sbyt', ffgsfui => 'fits_read_subsetnull_usht', ffgsfuj => 'fits_read_subsetnull_ulng', ffgsfi => 'fits_read_subsetnull_sht', ffgsfj => 'fits_read_subsetnull_lng', ffgsfjj => 'fits_read_subsetnull_lnglng', ffgsfuk => 'fits_read_subsetnull_uint', ffgsfk => 'fits_read_subsetnull_int', ffgsfe => 'fits_read_subsetnull_flt', ffgsfd => 'fits_read_subsetnull_dbl', fits_decomp_img => 'fits_decompress_img', ffgcv => 'fits_read_col', ffgcf => 'fits_read_colnull', ffgcvs => 'fits_read_col_str', ffgcvl => 'fits_read_col_log', ffgcvb => 'fits_read_col_byt', ffgcvsb => 'fits_read_col_sbyt', ffgcvui => 'fits_read_col_usht', ffgcvuj => 'fits_read_col_ulng', ffgcvi => 'fits_read_col_sht', ffgcvj => 'fits_read_col_lng', ffgcvjj => 'fits_read_col_lnglng', ffgcvuk => 'fits_read_col_uint', ffgcvk => 'fits_read_col_int', ffgcve => 'fits_read_col_flt', ffgcvd => 'fits_read_col_dbl', ffgcvc => 'fits_read_col_cmp', ffgcvm => 'fits_read_col_dblcmp', ffgcx => 'fits_read_col_bit', ffgcxui => 'fits_read_col_bit_usht', ffgcxuk => 'fits_read_col_bit_uint', ffgcfs => 'fits_read_colnull_str', ffgcfl => 'fits_read_colnull_log', ffgcfb => 'fits_read_colnull_byt', ffgcfsb => 'fits_read_colnull_sbyt', ffgcfui => 'fits_read_colnull_usht', ffgcfuj => 'fits_read_colnull_ulng', ffgcfi => 'fits_read_colnull_sht', ffgcfj => 'fits_read_colnull_lng', ffgcfjj => 'fits_read_colnull_lnglng', ffgcfuk => 'fits_read_colnull_uint', ffgcfk => 'fits_read_colnull_int', ffgcfe => 'fits_read_colnull_flt', ffgcfd => 'fits_read_colnull_dbl', ffgcfc => 'fits_read_colnull_cmp', ffgcfm => 'fits_read_colnull_dblcmp', ffgdes => 'fits_read_descript', ffgdesll => 'fits_read_descriptll', ffgdess => 'fits_read_descripts', ffgdessll => 'fits_read_descriptsll', ffgtbb => 'fits_read_tblbytes', ffpgpb => 'fits_write_grppar_byt', ffpgpsb => 'fits_write_grppar_sbyt', ffpgpui => 'fits_write_grppar_usht', ffpgpuj => 'fits_write_grppar_ulng', ffpgpi => 'fits_write_grppar_sht', ffpgpj => 'fits_write_grppar_lng', ffpgpjj => 'fits_write_grppar_lngj', ffpgpuk => 'fits_write_grppar_uint', ffpgpk => 'fits_write_grppar_int', ffpgpe => 'fits_write_grppar_flt', ffpgpd => 'fits_write_grppar_dbl', ffppx => 'fits_write_pix', ffppxll => 'fits_write_pixll', ffppxn => 'fits_write_pixnull', ffppxnll => 'fits_write_pixnullll', ffppr => 'fits_write_img', ffpprb => 'fits_write_img_byt', ffpprsb => 'fits_write_img_sbyt', ffpprui => 'fits_write_img_usht', ffppruj => 'fits_write_img_ulng', ffppri => 'fits_write_img_sht', ffpprj => 'fits_write_img_lng', ffpprjj => 'fits_write_img_lnglng', ffppruk => 'fits_write_img_uint', ffpprk => 'fits_write_img_int', ffppre => 'fits_write_img_flt', ffpprd => 'fits_write_img_dbl', ffppn => 'fits_write_imgnull', ffppnb => 'fits_write_imgnull_byt', ffppnsb => 'fits_write_imgnull_sbyt', ffppnui => 'fits_write_imgnull_usht', ffppnuj => 'fits_write_imgnull_ulng', ffppni => 'fits_write_imgnull_sht', ffppnj => 'fits_write_imgnull_lng', ffppnjj => 'fits_write_imgnull_lnglng', ffppnuk => 'fits_write_imgnull_uint', ffppnk => 'fits_write_imgnull_int', ffppne => 'fits_write_imgnull_flt', ffppnd => 'fits_write_imgnull_dbl', ffppru => 'fits_write_img_null', ffpprn => 'fits_write_null_img', ffp2db => 'fits_write_2d_byt', ffp2dsb => 'fits_write_2d_sbyt', ffp2dui => 'fits_write_2d_usht', ffp2duj => 'fits_write_2d_ulng', ffp2di => 'fits_write_2d_sht', ffp2dj => 'fits_write_2d_lng', ffp2djj => 'fits_write_2d_lnglng', ffp2duk => 'fits_write_2d_uint', ffp2dk => 'fits_write_2d_int', ffp2de => 'fits_write_2d_flt', ffp2dd => 'fits_write_2d_dbl', ffp3db => 'fits_write_3d_byt', ffp3dsb => 'fits_write_3d_sbyt', ffp3dui => 'fits_write_3d_usht', ffp3duj => 'fits_write_3d_ulng', ffp3di => 'fits_write_3d_sht', ffp3dj => 'fits_write_3d_lng', ffp3djj => 'fits_write_3d_lnglng', ffp3duk => 'fits_write_3d_uint', ffp3dk => 'fits_write_3d_int', ffp3de => 'fits_write_3d_flt', ffp3dd => 'fits_write_3d_dbl', ffpss => 'fits_write_subset', ffpssb => 'fits_write_subset_byt', ffpsssb => 'fits_write_subset_sbyt', ffpssui => 'fits_write_subset_usht', ffpssuj => 'fits_write_subset_ulng', ffpssi => 'fits_write_subset_sht', ffpssj => 'fits_write_subset_lng', ffpssjj => 'fits_write_subset_lnglng', ffpssuk => 'fits_write_subset_uint', ffpssk => 'fits_write_subset_int', ffpsse => 'fits_write_subset_flt', ffpssd => 'fits_write_subset_dbl', ffprwu => 'fits_write_nullrows', ffpcl => 'fits_write_col', ffpcls => 'fits_write_col_str', ffpcll => 'fits_write_col_log', ffpclb => 'fits_write_col_byt', ffpclsb => 'fits_write_col_sbyt', ffpclui => 'fits_write_col_usht', ffpcluj => 'fits_write_col_ulng', ffpcli => 'fits_write_col_sht', ffpclj => 'fits_write_col_lng', ffpcljj => 'fits_write_col_lnglng', ffpcluk => 'fits_write_col_uint', ffpclk => 'fits_write_col_int', ffpcle => 'fits_write_col_flt', ffpcld => 'fits_write_col_dbl', ffpclc => 'fits_write_col_cmp', ffpclm => 'fits_write_col_dblcmp', ffpclu => 'fits_write_col_null', ffpclx => 'fits_write_col_bit', ffpcn => 'fits_write_colnull', ffpcns => 'fits_write_colnull_str', ffpcnl => 'fits_write_colnull_log', ffpcnb => 'fits_write_colnull_byt', ffpcnsb => 'fits_write_colnull_sbyt', ffpcnui => 'fits_write_colnull_usht', ffpcnuj => 'fits_write_colnull_ulng', ffpcni => 'fits_write_colnull_sht', ffpcnj => 'fits_write_colnull_lng', ffpcnjj => 'fits_write_colnull_lnglng', ffpcnuk => 'fits_write_colnull_uint', ffpcnk => 'fits_write_colnull_int', ffpcne => 'fits_write_colnull_flt', ffpcnd => 'fits_write_colnull_dbl', ffpdes => 'fits_write_descript', ffcmph => 'fits_compress_heap', fftheap => 'fits_test_heap', ffptbb => 'fits_write_tblbytes', ffirow => 'fits_insert_rows', ffdrrg => 'fits_delete_rowrange', ffdrow => 'fits_delete_rows', ffdrws => 'fits_delete_rowlist', ffdrwsll => 'fits_delete_rowlistll', fficol => 'fits_insert_col', fficls => 'fits_insert_cols', ffdcol => 'fits_delete_col', ffcpcl => 'fits_copy_col', ffcprw => 'fits_copy_rows', ffmvec => 'fits_modify_vector_len', ffgics => 'fits_read_img_coord', ffgtcs => 'fits_read_tbl_coord', ffgicsa => 'fits_read_img_coord_version', ffwldp => 'fits_pix_to_world', ffxypx => 'fits_world_to_pix', ffgiwcs => 'fits_get_image_wcs_keys', ffgtwcs => 'fits_get_table_wcs_keys', fffrow => 'fits_find_rows', ffffrw => 'fits_find_first_row', fffrwc => 'fits_find_rows_cmp', ffsrow => 'fits_select_rows', ffcrow => 'fits_calc_rows', ffcalc => 'fits_calculator', ffcalc_rng => 'fits_calculator_rng', fftexp => 'fits_test_expr', ffgtcr => 'fits_create_group', ffgtis => 'fits_insert_group', ffgtch => 'fits_change_group', ffgtrm => 'fits_remove_group', ffgtcp => 'fits_copy_group', ffgtmg => 'fits_merge_groups', ffmbyt => 'fits_seek', ffgtcm => 'fits_compact_group', ffgtvf => 'fits_verify_group', ffgtop => 'fits_open_group', ffgtam => 'fits_add_group_member', ffgtnm => 'fits_get_num_members', ffgmng => 'fits_get_num_groups', ffgmop => 'fits_open_member', ffgmcp => 'fits_copy_member', ffgmtf => 'fits_transfer_member', ffgmrm => 'fits_remove_member', ); my @__shortnames = keys %__names; my @__longnames = (values(%__names), @__names_no_short); my @__constants = qw( ANGLE_TOO_BIG ANY_HDU ARRAY_TOO_BIG ASCII_TBL BAD_ATABLE_FORMAT BAD_BITPIX BAD_BTABLE_FORMAT BAD_C2D BAD_C2F BAD_C2I BAD_COL_NUM BAD_DATATYPE BAD_DATA_FILL BAD_DATE BAD_DECIM BAD_DIMEN BAD_DOUBLEKEY BAD_ELEM_NUM BAD_F2C BAD_FILEPTR BAD_FLOATKEY BAD_GCOUNT BAD_GROUP_ID BAD_HDU_NUM BAD_HEADER_FILL BAD_I2C BAD_INTKEY BAD_KEYCHAR BAD_LOGICALKEY BAD_NAXES BAD_NAXIS BAD_OPTION BAD_ORDER BAD_PCOUNT BAD_PIX_NUM BAD_ROW_NUM BAD_ROW_WIDTH BAD_SIMPLE BAD_TBCOL BAD_TDIM BAD_TFIELDS BAD_TFORM BAD_TFORM_DTYPE BAD_URL_PREFIX BAD_WCS_PROJ BAD_WCS_VAL BINARY_TBL BYTE_IMG CASEINSEN CASESEN CFITSIO_MAJOR CFITSIO_MINOR COL_NOT_FOUND COL_NOT_UNIQUE COL_TOO_WIDE DOUBLENULLVALUE DOUBLE_IMG DRIVER_INIT_FAILED END_JUNK END_OF_FILE FALSE FILE_NOT_CLOSED FILE_NOT_CREATED FILE_NOT_OPENED FLEN_CARD FLEN_COMMENT FLEN_ERRMSG FLEN_FILENAME FLEN_KEYWORD FLEN_STATUS FLEN_VALUE FLOATNULLVALUE FLOAT_IMG GROUP_NOT_FOUND GT_ID_ALL GT_ID_ALL_URI GT_ID_POS GT_ID_POS_URI GT_ID_REF GT_ID_REF_URI GZIP_1 HDU_ALREADY_MEMBER HDU_ALREADY_TRACKED HEADER_NOT_EMPTY IDENTICAL_POINTERS IMAGE_HDU InputCol InputOutputCol KEY_NO_EXIST KEY_OUT_BOUNDS LONG_IMG LONGLONG_IMG MAXHDU MEMBER_NOT_FOUND MEMORY_ALLOCATION NEG_AXIS NEG_BYTES NEG_FILE_POS NEG_ROWS NEG_WIDTH NOT_ASCII_COL NOT_ATABLE NOT_BTABLE NOT_GROUP_TABLE NOT_IMAGE NOT_LOGICAL_COL NOT_POS_INT NOT_TABLE NOT_VARI_LEN NO_BITPIX NO_END NO_GCOUNT NO_MATCHING_DRIVER NO_NAXES NO_NAXIS NO_NULL NO_PCOUNT NO_QUOTE NO_SIMPLE NO_TBCOL NO_TFIELDS NO_TFORM NO_WCS_KEY NO_XTENSION NULL_INPUT_PTR NUM_OVERFLOW OPT_CMT_MBR OPT_CMT_MBR_DEL OPT_GCP_ALL OPT_GCP_GPT OPT_GCP_MBR OPT_MCP_ADD OPT_MCP_MOV OPT_MCP_NADD OPT_MCP_REPL OPT_MRG_COPY OPT_MRG_MOV OPT_RM_ALL OPT_RM_ENTRY OPT_RM_GPT OPT_RM_MBR OVERFLOW_ERR OutputCol PARSE_BAD_COL PARSE_BAD_OUTPUT PARSE_BAD_TYPE PARSE_LRG_VECTOR PARSE_NO_OUTPUT PARSE_SYNTAX_ERR PLIO_1 READONLY READONLY_FILE READWRITE READ_ERROR RICE_1 SAME_FILE SEEK_ERROR SHORT_IMG TBIT TBYTE TSBYTE TCOMPLEX TDBLCOMPLEX TDOUBLE TFLOAT TINT TLOGICAL TLONG TLONGLONG TOO_MANY_DRIVERS TOO_MANY_FILES TOO_MANY_HDUS_TRACKED TRUE TSHORT TSTRING TUINT TULONG TUSHORT ULONG_IMG UNKNOWN_EXT UNKNOWN_REC URL_PARSE_ERROR USE_MEM_BUFF USHORT_IMG VALIDSTRUC VALUE_UNDEFINED WCS_ERROR WRITE_ERROR ZERO_SCALE TYP_STRUC_KEY TYP_CMPRS_KEY TYP_SCAL_KEY TYP_NULL_KEY TYP_DIM_KEY TYP_RANG_KEY TYP_UNIT_KEY TYP_DISP_KEY TYP_HDUID_KEY TYP_CKSUM_KEY TYP_WCS_KEY TYP_REFSYS_KEY TYP_COMM_KEY TYP_CONT_KEY TYP_USER_KEY ); ### @__constants @EXPORT = qw( ); %EXPORT_TAGS = ( 'shortnames' => \@__shortnames, 'longnames' => \@__longnames, 'constants' => \@__constants, ); @EXPORT_OK = ( 'PerlyUnpacking', @__shortnames, @__longnames, @__constants, ); sub AUTOLOAD { no strict; # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. my $constname; ($constname = $AUTOLOAD) =~ s/.*:://; croak "& not defined" if $constname eq 'constant'; my $val = constant($constname, @_ ? $_[0] : 0); if ($! != 0) { if ($! =~ /Invalid/) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { croak "Your vendor has not defined Astro::FITS::CFITSIO macro $constname"; } } *$AUTOLOAD = sub { $val }; #eval "sub $AUTOLOAD { $val }"; goto &$AUTOLOAD; } bootstrap Astro::FITS::CFITSIO $VERSION; # Preloaded methods go here. # Compound routines -- useful routines that combine lower level # Astro::FITS::CFITSIO commands # This routine takes an argument (either a fitsfilePtr object # or a string containing a FITS file name) and returns the header # into a hash along with the exit status of the routine. # If it is called in a scalar context then only the hash reference # is returned # $hashref = fits_read_header("test.fits"); # ($hashref, $status) = $fitsfile->read_header; # The comments are stored in a hash in $hashref->{COMMENTS}. sub fits_read_header { croak 'Usage: fits_read_header(file|fitsfilePtr)' unless @_; my ($fitsfile, $status); my ($n, $left, %header, $key, $value, $comment); # Read the argument my $file = shift; my $obj_passed = 0; # were we passed a fitsfilePtr? $status = 0; if (UNIVERSAL::isa($file,'fitsfilePtr')) { $fitsfile = $file; $obj_passed = 1; } else { # Open the file. fits_open_file($fitsfile, $file, READONLY(), $status); } # Now we have an open file -- check that status is good before # proceeding unless ($status) { # Get the number of fits keywords in primary header $fitsfile->get_hdrspace($n, $left, $status); # Loop over the keys for my $i (1..$n) { last unless $status == 0; $fitsfile->read_keyn($i, $key, $value, $comment, $status); # Store the key/value in a hash $header{$key} = $value; # Store the comments. if (! exists $header{COMMENTS}{$key}) { $header{COMMENTS}{$key} = $comment; } # HISTORY keywords, for instance, can be numerous else { if (! ref $header{COMMENTS}{$key}) { $header{COMMENTS}{$key} = [ $header{COMMENTS}{$key} ]; } push @{$header{COMMENTS}{$key}}, $comment; } } # Close the file if we opened it $fitsfile->close_file($status) unless $obj_passed; } # Report an error - may not always want to write to STDERR... fits_report_error(*STDERR, $status); return (\%header, $status) if wantarray; return \%header; } # This section provides perl aliases for the OO interface # This is a bit of a kluge since the actual command is in the # Astro::FITS::CFITSIO namespace. Did not open a new namespace with the package # command since AUTOSPLIT gets confused sub fitsfilePtr::read_header { my $self = shift; my ($href, $status) = Astro::FITS::CFITSIO::fits_read_header($self); return ($href, $status) if wantarray; return $href; } # Autoload methods go after =cut, and are processed by the autosplit program. 1; __END__ =head1 NAME Astro::FITS::CFITSIO - Perl extension for using the cfitsio library =head1 SYNOPSIS use Astro::FITS::CFITSIO; use Astro::FITS::CFITSIO qw( :longnames ); use Astro::FITS::CFITSIO qw( :shortnames ); use Astro::FITS::CFITSIO qw( :constants ); =head1 DESCRIPTION Perl interface to William Pence's cfitsio subroutine library. For more information on cfitsio, see http://heasarc.gsfc.nasa.gov/fitsio. This module attempts to provide a wrapper for nearly every cfitsio routine, while retaining as much cfitsio behavior as possible. As such, one should be aware that it is still somewhat low-level, in the sense that handing an array which is not the correct size to a routine like C may cause SIGSEGVs. My goal is to eventually use these routines to build a more Perl-like interface to many common tasks such as reading and writing of images and ASCII and binary tables. =head1 cfitsio API MAPPING Astro::FITS::CFITSIO allows one to use either the long or short name forms of the cfitsio routines. These work by using the exact same form of arguments as one would find in an equivalent C program. There is also an object-oriented API which uses the same function names as the long-name API, but with the leading "fits_" stripped. To get a Astro::FITS::CFITSIO "object" one would call C, C or C: my $status = 0; my $fptr = Astro::FITS::CFITSIO::open_file($filename, Astro::FITS::CFITSIO::READONLY(),$status); $fptr->read_key_str('NAXIS1',$naxis1,undef,$status); Note that the object-oriented forms of function names are only available for those cfitsio routines which accept a C data-type as the first argument. As an added benefit, whenever a filehandle goes out of scope, B is automatically closed: { my $fptr = Astro::FITS::CFITSIO::open_file($filename, Astro::FITS::CFITSIO::READWRITE(),$status); [manipulate $fptr] # neither of the following are needed # ffclos($fptr,$status); # $fptr->close_file($status); } It there is an error, it will B. =head1 NAME SPACE All cfitsio routines, with the exception of C and C, are available in both long and short name forms (e.g., C E=E C), as well as all constants defined in the F header file. This raises the possibility of your name space being invaded by nearly 1000 function and constant names. To deal with this situation, Astro::FITS::CFITSIO makes use of the Exporter package support for C<%EXPORT_TAGS>. You can import the long-named functions with use Astro::FITS::CFITSIO qw( :longnames ); and the short-named routines with use Astro::FITS::CFITSIO qw( :shortnames ); Constants are actually implemented as AUTOLOADed functions, so C, for instance, would be accessed via C. Alternatively you can use Astro::FITS::CFITSIO qw( :constants ); which would allow you to simply say C. =head1 DATA STORAGE DETAILS =head2 Input Variables If a routine expects an N-dimensional array as input, and you hand it a reference to a scalar, then Astro::FITS::CFITSIO simply uses the data in the scalar which the argument is referencing. Otherwise it expects the argument to be a Perl array reference whose total number of elements satisfies the input demands of the corresponding C routine. Astro::FITS::CFITSIO then unpacks the array reference into a format that the C routine can understand. If your input array does not hold enough data for the C routine then a segfault is likely to occur. cfitsio functions which take an optional NULL pointer - indicating no output in that place is desired - can instead be given an C. In other words, the following C and Perl statements which read a keyword but ignore the comment would be roughly equivalent: fits_read_key_lng(fptr,key,&value,NULL,&status); fits_read_key_lng($fptr,$key,$value,undef,$status); =head2 Output Variables Calling cfitsio routines which read data from FITS files causes the output variable to be transformed into a Perl array of the appropriate dimensions. The exception to this is if one wants the output to be in the machine-native format (e.g., for use with PDL). Then all output variables will become scalars containing the appropriate data. The exception here is with routines which read arrays of strings (e.g., C). In this case the output is again a Perl array reference. There are two ways to specify how data are retrieved. The behavior can be specified either globally or on a per filehandle basis. The global selection is done by calling the B function. This sets the behavior for I file handles which do not I choose not to follow it. # turn ON unpacking into Perl arrays. This is the default PerlyUnpacking(1); # turn OFF unpacking into Perl arrays, i.e. put in machine-native # format PerlyUnpacking(0); # retrieve the current state: $state = PerlyUnpacking(); To change the behavior for a particular file handle, use the B method. The default behavior for a file handle is to track what is done with B # track PerlyUnpacking(). This is the default $fptr->perlyunpacking(-1); # turn ON unpacking into Perl arrays $fptr->perlyunpacking(1); # turn OFF unpacking into Perl arrays $fptr->perlyunpacking(0); # retrieve the current state: $state = $fptr->perlyunpacking; =head1 EXAMPLES Take a look at F under the distribution directory. It should produce output identical to F which comes with the cfitsio library. Additionally, the versions named F, F and F test the long-name and object-oriented APIs, and machine-native unpacking with PDL. There is also an F directory with scripts which do the following: =over 4 =item F reads a FITS primary image and displays it using PGPLOT =item F same as above, but uses machine-native unpacking with PDL =item F reads binary table column into PDL object, makes histogram and plots it =back =head1 CONSIDERATIONS =over 4 =item Ensure your input arrays contain enough data The caller is responsible for ensuring that the input arrays given to Astro::FITS::CFITSIO routines are large enough to satisfy the access demands of said routines. For example, if you tell C to write a data column containing 100 elements, your Perl array should contain at least 100 elements. Segfaults abound, so beware! =item maxdim semantics Some cfitsio routines take a parameter named something like 'C', indicating that no more than that many elements should be placed into the output data area. An example of this would be C. In these cases Astro::FITS::CFITSIO will automatically determine how much storage space is needed for the full amount of output possible. As a result, the arguments expected in Astro::FITS::CFITSIO are slightly different than one would use in a C program, in that the 'C' argument is unnecessary. Currently the routines for which this is the case are C, C, C, C, C C, C and C. =item Output arrays remain as undisturbed as possible For routines like C, Astro::FITS::CFITSIO unpacks the output into a Perl array reference (unless C has been called, of course). Prior to doing this, it ensures the scalar passed is a reference to an array large enough to hold the data. If the argument is an array reference which is too small, it expands the array pointed to appropriately. B, if the array is large enough already, the data are just unpacked into the array. The upshot: If you call C, telling it to read 100 data elements, and the array you are placing the data into already has 200 elements, then after C returns your array will still have 200 elements, only the first 100 of which actually correspond to the data read by the routine. In more succinct language: @output = (0..199); fits_read_col_lng($fptr,2,1,1,100,0,\@output,$anynul,$status); # @output still has 200 elements, only first 100 are from FITS # file =back =head1 EXTRA COMMANDS Some extra commands that use sets of cfitsio routines are supplied to simplify some standard tasks: =over 4 =item fits_read_header(filename) This command reads in a primary fits header (unless one is using the extended filename sytax to move to a different HDU on open) from the specified filename and returns the header as a hash reference and a status (when called in an array context) or simply a hash reference (when called in a scalar context): ($hash_ref, $status) = fits_read_header ($file); $hash_ref = fits_read_header($file); An object-oriented interface is also provided for reading headers from FITS files that have already been opened. In this case, the header read is from the current HDU. $fitsfile = Astro::FITS::CFITSIO::open_file($file); $hash_ref = $fitsfile->read_header; ($hash_ref, $status) = $fitsfile->read_header; =item sizeof_datatype(datatype) Returns the size of the given Astro::FITS::CFITSIO datatype constant (e.g., C). =back =head1 BUGS FIXME =head1 AUTHOR Pete Ratzlaff Epratzlaff@cfa.harvard.eduE, with a great deal of code taken from Karl Glazebrook's PGPLOT module. Contributors include: =over 4 =item Diab Jerius, Edjerius@cpan.orgE general improvements =item Tim Jenness, Et.jenness@jach.hawaii.eduE convenience routines =item Tim Conrow, Etim@ipac.caltech.eduE function implementations, bug fixes =back =head1 COPYRIGHT AND LICENSE Copyright (C) 2002,2004,2006,2011 by the Smithsonian Astrophysical Observatory. This software is released under the same terms as Perl. A copy of the Perl license may be obtained at http://dev.perl.org/licenses/ =cut Astro-FITS-CFITSIO-1.10/README0000644000115400000360000000247612154150527014053 0ustar rpetehead Astro::FITS::CFITSIO What is it? ----------- Astro::FITS::CFITSIO is a Perl interface to William Pence's cfitsio subroutine library. For more information on cfitsio, see http://heasarc.gsfc.nasa.gov/fitsio Where can (did) I get it? ------------------------- http://hea-www.harvard.edu/~rpete/cfitsio http://www.perl.com/CPAN/authors/id/P/PR/PRATZLAFF What version of cfitsio does this module require? ---------------------------------------------- Astro::FITS::CFITSIO version 1.10 requires at least cfitsio version 3.34 Installation ------------ For installation instructions, see the 'INSTALL' file in the base distribution directory. Essentially, it just tells you to set the CFITSIO environment variable, and then do $ perl Makefile.PL OPTIMIZE=-O0 $ make $ make test $ make install Copyright and License --------------------- Copyright (C) 2002,2004,2006,2011,2012,2013 by the Smithsonian Astrophysical Observatory. This software is released under the same terms as Perl. A copy of the Perl license may be obtained at http://dev.perl.org/licenses/ The demonstration image m51.fits.gz is derived from the Hubble Heritage project archival images; its creation was funded in part by a grant from NASA. The image is in the public domain.