[net.sources.mac] FREE DA Sampler program

tdn@spice.cs.cmu.edu (Thomas Newton) (11/10/85)

This post contains all three parts (Sampler.c, Sampler.R, Sampler.Hqx) of
my Desk Accessory Sampler program.  (See my message in net.micro.mac and
net.sources.mac entitled 'A Program and a Flame' for details.)

                                        -- Thomas.Newton
                                           Thomas.Newton@spice.cs.cmu.edu

------------------------------ Sampler.c ------------------------------

/***************************************************************************/
/*      Desk Accessory Sampler						   */
/*									   */
/*      Copyright (C) 1985 Thomas D. Newton   				   */
/*	Based on SKEL 2.2.3C by Steve Maker, translated by Bill Jefferys   */
/*									   */
/*      This program may be copied, used, and modified freely so long as   */
/*	it is only done for noncommercial purposes, this copyright notice  */
/*      remains attached to any copy of the program, and any modified      */
/*      version carries a comment identifying who last changed it.         */
/*									   */
/* This program has a similar function to the shareware "DA Sampler" which */
/* appeared a while back on net.sources.mac.  My reaction to the shareware */
/* program was that it was handy but that it was not worth $10; the Mac OS */
/* makes this type of program entirely too easy to write. Instead of using */
/* the program without paying for it, I decided to write a similar program */
/* (which would be free) to see if my intuition was correct; the result is */
/* the program you currently see before you. If you enjoy it, please don't */
/* send any money -- keep both the program and your money.		   */
/***************************************************************************/

/* Definitions from .h files needed by program 		  	  */
/* (The .h files need too much symbol table space for a 128K Mac) */

#include <mem.h>

	/* <win.h>   */
#define inDesk 0
#define inMenuBar 1
#define inSysWindow 2
#define inContent 3
#define inDrag 4
#define inGrow 5
#define inGoAway 6
typedef GrafPtr WindowPtr;

	/* <menu.h>  */
typedef char **MenuHandle;
extern MenuHandle NewMenu();
extern long MenuSelect();
extern long MenuKey();

	/* <event.h> */
#define mouseDown 1
#define keyDown 3
#define autoKey 5
#define updateEvt 6
#define activateEvt 8
#define charcodemask 0x000000ffL
#define keyUpMask 16
#define everyEvent -1
#define cmdKey 256
typedef struct {
	int what;
	long message;
	long when;
	Point where;
	int modifiers;
} EventRecord;
	  
	/* <file.h>  */
typedef char OsType[4];
	  
	/* <pack.h>  */
typedef struct {
    boolean good;    /* boolean */
    boolean copy;
    OsType ftype;
    int vRefNum;
    int version;
    char fName[64];
} SFReply;

typedef OsType SFTypeList[4];

	/* <dialog.h> */
typedef char *DialogPtr;
extern DialogPtr GetNewDialog();
	
#include "qdvars.h"
	  

/*    
    The following two constants are not defined in any .h file.  They
    are described in "Inside Macintosh" - Event Manager, pp. 14-15.
*/
#define charcodemask 255  
#define cmdKey 256        

#define NULL     0L
#define lastmenu 3		/* number of menus */
#define applemenu 1
#define filemenu  2
#define editmenu  3

#define iopen     1
#define iclose    2
#define itoggle   4
#define iquit     6

#define iundo     1
#define icut      3
#define icopy     4
#define ipaste    5
#define iclear    6

GrafPtr screenport;		/* a port for the whole screen */
MenuHandle mymenus[lastmenu + 1];/* our menus */

EventRecord myevent;
WindowPtr whichwindow;		/* points to window of mouseDown */
int     windowcode;		/* what mouse was in when event posted */
boolean userdone;		/* true when user wants to exit program */
boolean open_file;		/* true when there is an open resource file */
int the_ref_num;		/* reference number of open resource file   */
boolean open_any_file;		/* true when there's no SFGetFile filtering */

/*

SetUps for handling memory
##########################   SetUpMemory   ############################
     This very important set of initializations can be left out of the
   first versions of a program. We are making sure that memory is laid
   out as we desire, with adequate protection against running out of
   memory, bad handles, etc.
*/

setupmemory () {


#define maxStackSize 8192	/* max size of stack; the heap gets the
				   rest */

    typedef long   *lomemptr;	/* a pointer to low memory locations */

    lomemptr nilptr;		/* will have value NIL */
    lomemptr stackbaseptr;	/* points to current stack base */

/* 
  Place a longint -1 (an odd and therefore illegal address) in the
  memory location that would be referenced by an accidentally-NULL
  Handle, so the error will be caught at Handle-reference time (as
  an Address error, ID=02) instead of later on.
*/

    nilptr = NULL;
    *nilptr = -1;

/* 
  If you needed to use an Application heap limit other than the
  default (which allows 8K for the stack), you'd set it here,
  possible using this technique of explicitly specifying the maximum
  stack size and allocating the rest to the heap.  Should be
  independent of memory size. */

    stackbaseptr = (lomemptr) 0x908;
				/* CurStackBase from Tlasm/sysequ.text */
    SetApplLimit ((Ptr) (*stackbaseptr - maxStackSize));

/* 
  Expand the application heap Zone to its maximum size, without
  purging any purgeable resources.  This saves memory compactions
  and heap expansions later.
*/

    maxapplzone ();

/* 
  get plenty of master pointers now; if we let the Memory Manager
  Allocate them as needed, they'd form non-relocatable islands in
  the heap.
*/

    MoreMasters ();
    MoreMasters ();
    MoreMasters ();
}				/* SetUpMemory */

/*
############################   SetUpMenus   #############################
*/
setupmenus () {
    mymenus[1] = NewMenu(1,"\024");
	AppendMenu(mymenus[1],"About this program...");
	AppendMenu(mymenus[1],"(-");
	AddResMenu(mymenus[1],"DRVR");
    mymenus[2] = NewMenu(2,"File");
	AppendMenu(mymenus[2],"Open desk accessory file.../O");
	AppendMenu(mymenus[2],"(Close current accessory file/K");
	AppendMenu(mymenus[2],"(-");
	AppendMenu(mymenus[2],"Show only Apple DA Mover files!\022/T");
	AppendMenu(mymenus[2],"(-");
	AppendMenu(mymenus[2],"Quit/Q");
    mymenus[3] = NewMenu(3,"Edit");
	AppendMenu(mymenus[3],"Undo/Z");
	AppendMenu(mymenus[3],"(-");
	AppendMenu(mymenus[3],"Cut/X");
	AppendMenu(mymenus[3],"Copy/C");
	AppendMenu(mymenus[3],"Paste/V");
	AppendMenu(mymenus[3],"Clear/B");
    InsertMenu(mymenus[1],0);
    InsertMenu(mymenus[2],0);
    InsertMenu(mymenus[3],0);
    DrawMenuBar();
}

resetmenus () {
    DeleteMenu(1);
    DisposeMenu(mymenus[1]);
    mymenus[1] = NewMenu(1,"\024");
    AppendMenu(mymenus[1],"About this program...");
    AppendMenu(mymenus[1],"(-");
    AddResMenu(mymenus[1],"DRVR");
    InsertMenu(mymenus[1],2);			/* Insert before FILE menu */
    DrawMenuBar();
}

/*
body of SetUp
Once-only initialization for Skel
############################   SetUp   ##############################

   Initialize our program.  It seems best to Handle:
   Memory inits first, ToolBox inits second, then the program variables'
   inits. Note that the order of inits is important; see "Using the
   Dialog Manager" in the Dialog Mgr section.

*/

setup () {
    setupmemory ();		/*  init memory layout and protection */

/*  init QuickDraw, and everybody else */
    InitGraf (&thePort);
    InitFonts ();
    InitWindows ();
    InitMenus ();
    TEInit ();
    InitDialogs (NULL);		/* NULL => no Restart proc; see Dialog Mgr
				   and System Error Handler */
    InitCursor ();

/* 
  Init the system event mask, in case the previous program left
  it in a bad state.  If you set it non-standard here, FIX IT
  BEFORE EXITING, because the Finder (1.1g) does NOT set it.
*/
    SetEventMask (everyEvent - keyUpMask);/* standard setting */
/* 
  Get the port which is the whole screen, to use when deactivating
  our window.  This prevents the current GrafPort pointer from
  ever dangling.
*/
    GetWMgrPort (&screenport);	/* get whole screen port that window mgr
				   uses */
    SetPort (screenport);	/* and start off with it */

/* set up our menus */
    setupmenus ();
	
/* set up program variables */
    open_file = 0;
    open_any_file = 0;
}

/*
Close all currently open desk accessories
############################   closeaccs   ##############################
*/
CloseAllAccs()
{   int i;
    for (i = 12; i < 32; i++) CloseDeskAcc(-i-1);
}

/*
Handle a command given through a menu selection
############################   DoCommand   ##############################

   We carry out the command indicated by mResult.
   If it was Quit, we return true, else false.  Since the menu was
   highlighted by MenuSelect, we must finish by unhighlighting it
   to indicate we're done.
*/
int     docommand (mresult)
long    mresult;


{
    int     refnum;
    int     themenu,
            theitem;
    char    name[255];
    GrafPtr saveport;		/* for saving current port in when opening
				   a desk accessory */
    int     returns;
	
    Point where;
    SFReply InRecord;
    char FileType[5];
	
#define aboutboxid 257
    DialogPtr theDialog;
    int itemhit;

    returns = 0;		/* assume Quit not selected */
    themenu = HiWord (mresult);	/* get the menu selected */
    theitem = LoWord (mresult);	/* ... and the Item of that menu */
    switch (themenu) {
	case 0: 
	    break;		/* user made no selection; do nothing */

	case applemenu: 
	    if (theitem == 1) { /* tell about the program */
		theDialog = GetNewDialog(aboutboxid, 0L, -1L);
		ModalDialog(0L, &itemhit);
		DisposDialog(theDialog);
		}
	    else {		/* run a desk accessory; make sure port is preserved */
		GetPort (&saveport);
		GetItem (mymenus[applemenu], theitem, name);  /* get name */
		refnum = OpenDeskAcc (name);/* run the desk accessory */
		SetPort (saveport);
	        }
	    break;

	case filemenu: 
	    switch (theitem) {
		case iopen:		/* Open */
		    where.a.h = 82; where.a.v = 100; strcpy(FileType,"DFIL");
		    SFGetFile(&where, "", 0L, open_any_file ? -1 : 1,
			     (SFTypeList *) &FileType, 0L, &InRecord);
		    if (InRecord.good) {
			if (open_file) {
			    /* Make sure that there are no open accessories from */
			    /* the old resource file, then close it.			 */
			    CloseAllAccs();
			    CloseResFile(the_ref_num);
			    }

			GetVol(name, &refnum);			/* Save the current default */
			SetVol(0L,InRecord.vRefNum);	/* Resource file is here */
			the_ref_num = OpenResFile(&(InRecord.fName));	/* Open it */
			SetVol(0L, refnum);				/* Restore default volume */
				
			open_file = 0;
			if (the_ref_num != -1) {
			    open_file = 1;
			    EnableItem(mymenus[filemenu],iclose);
			    }
			resetmenus();
			}
		    break;
		case iclose:    /* Close */
		    if (open_file) {
			/* Make sure that there are no open accessories from */
			/* the old resource file, then close it.		     */
			CloseAllAccs();
			CloseResFile(the_ref_num);
			open_file = 0;
			DisableItem(mymenus[filemenu],iclose);
			resetmenus();
			}
		    break;
		case itoggle:   /* Toggle filter for Font/DA Mover files */
		    CheckItem(mymenus[filemenu],itoggle,open_any_file);
		    open_any_file = 1 - open_any_file;
		    break;
		case iquit:     /* Quit */
		    CloseAllAccs();
		    if (open_file) { CloseResFile(the_ref_num); open_file = 0; }
		    returns = 1;
	    }			/* fileMenu case */
		
	case editmenu:
	    SystemEdit(theitem-1);
    }				/* menu case */

    HiliteMenu (0);		/* turn off hilighting on the menu just used */
    return (returns);
}				/* DoCommand */


/* 
the main loop that handles events
############################   MainEventLoop  ##########################  
*/

maineventloop () {

/* body of MainEventLoop */

    FlushEvents (everyEvent, 0);	/* discard leftover events */

/* get next event, and Handle it appropriately, until user QUITs */

    userdone = 0;
    do {
	SystemTask ();		/* Handle desk accessories */
	if (GetNextEvent (everyEvent, &myevent)) {
				/* get event; if for us... */
	    switch (myevent.what) {/* Handle each kind of event */
		case mouseDown: /* find out what window the mouse went
				   down in, and where in it */
		    windowcode = FindWindow (&myevent.where, &whichwindow);
		    switch (windowcode) { /* Handle mouse-down for each place */
			case inSysWindow:
			    /* Handle the desk accessories */
			    SystemClick (&myevent, whichwindow);
			    break;/* inSysWindow */
			case inMenuBar: /* Handle the command */
			    userdone = docommand (MenuSelect (&myevent.where));
			/* break;  I got a compiler error here with the
			   break left in.  Good C programming Style would
			   have a break even after the last case - WHJ
			   3/11/85 */
		    }
		    break;	/* switch */

		case keyDown: 
		case autoKey: 	/* if command key, pass the char to MenuKey */
		    if ((myevent.modifiers & cmdKey) != 0)
			userdone = docommand (MenuKey ((char) (myevent.message & charcodemask)));
		case updateEvt:
		    break;
		case activateEvt:
		    break;
	    }
	}

    } while (userdone == 0);
}

/*
  body of Skel
*/


main () {
    setup ();
    maineventloop ();
}

------------------------------ Sampler.R ------------------------------

*  Sampler.R -- resource definition file for Desk Accessory Sampler
*  		 Adapted from the SkelR file in Skel 2.2.3C by Thomas Newton
*
Sampler
APPLTDN1

* Version data for the finder
*    Our signature is "TDN1"
*    res. ID = 0, by convention
*    finder version data
*    Note that the blank in 'STR ' is significant 3/8/85 WHJ
TYPE TDN1 = STR 
  ,0
  Desk Accessory Sampler v1.0 -- November 10, 1985

* dialog box for About command
*   ID (4 => pre-loaded; 32 => purgeable)
*   title
*   BoundsRect(global: TLBR)
*   Vis NoGo: it's visible, but has no close box
*   ProcID: Window type is modal dialog
*   RefCon: Unused user variable
*   res. ID of item list
Type DLOG
  ,257(4)
  About Box
  35 16 285 496
  Visible NoGoAway
  1
  0
  257

* dialog item list for About command
*   ID (4 => pre-loaded; 32 => purgeable - it should always be purgeable.)
*   # Items
*   the first item:
*      a Button you can select
*      display rect (local coords)
*      title
*   the second-last items:
*     Static text, disabled (i.e. can't select it)
*     display rect
*     text to be displayed
Type DITL
  ,257(36)
  8
    button Enabled
    220 370 241 470
OK

    staticText Disabled
    5 145 20 481
Desk Accessory Sampler v1.0

    staticText Disabled
    20 121 35 481
Copyright  1985 Thomas D. Newton

    staticText Disabled
    65 0 80 481
This program allows one to use desk accessories stored in resource files

    staticText Disabled
    80 0 95 481
(such as the ones produced by Apple's Font/DA Mover) without installing

    staticText Disabled
    95 0 110 481
those accessories into a System file.

    staticText Disabled
    140 0 155 481
Desk Accessory Sampler may be copied and used by anyone, so long as

    staticText Disabled
    155 0 170 481
that use is not for commercial purposes.

****************************************************************************
****        This section contains information for the Finder;           ****
****     the program never accesses this information directly.          ****
****        The entire section can be omitted from the first versions   ****
****     of a program (you must then set the application's type to      ****
****     APPL, the creator to ????, and don't set the bundle bit);      ****
****     the default application icon will be used.                     ****
****        For more info, read "Putting together a Mac Application"    ****
****     and "The Structure of a Mac Application".                      ****
*
* a Bundle: contains references to other finder info, (below)
*   ID (32 => purgeable)
*   Bundle owner: TDN1 (our signature), Res ID of version data = 0
*   "ICN#" (means icon list), # of icon resources in bndl = 1
*   local ID 0 maps to global ID 128 (the FREF uses a local ID, to refer to
*      an icon which has a global ID. See the FREF resource, below);
*   "FREF" (means file reference), # of FREF res in bndl = 1
*   local ID 0 maps to global ID 128

Type BNDL
   ,128(32)
   TDN1 0
   ICN# 1
   0 128
   FREF 1
   0 128

* a File Reference
*   ID, (32 => purgeable)
*   "APPL" : a file of type APPL gets the following icon (a suitcase);
*       local icon ID; maps to global ID as specified in BNDL
*   name of file that must accompany application if transferred; omit if none.
  Type FREF
   ,128(32)
   APPL 0

* An icon list for the application icon (a partially opened suitcase)
* REdit 1.0 (resource decompile option)
*   ID (the application icon), (32 => purgeable)
*   Data is Hex data (.H)
*   the icon data: 32 lines of 8 hex chars each
*   the icon mask: 32 lines of 8 hex chars each
Type ICN# = GNRL
 ,128(32)
.H
00000000
7245D1DC
456D5112
7755D1DC
15451112
75451DD2
00000000
00007E00
00008100
00FF7EFE
01014283
0203C385
04000009
0FFFFFF1
0AAAAAB1
0D555551
0AAAAAB1
FFFFFF51
800002B1
8FFFF351
480011B1
4FFFF151
449249B1
27FFF8D1
249248B1
27FFFCD1
12492471
13FFFC51
11249272
09FFFE34
08000018
07FFFFF0
*
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
00007E00
0000FF00
00FFFFFE
01FFFFFF
03FFFFFF
07FFFFFF
0FFFFFFF
0FFFFFFF
0FFFFFFF
0FFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
7FFFFFFF
7FFFFFFF
7FFFFFFF
3FFFFFFF
3FFFFFFF
3FFFFFFF
1FFFFFFF
1FFFFFFF
1FFFFFFE
0FFFFFFC
0FFFFFF8
07FFFFF0

****    end of information for the finder                          ****
***********************************************************************


------------------------------ Sampler.Hqx ------------------------------

(This file must be converted with BinHex 4.0)

:"e0KEA"XCA)!39"36&4%6M%J!*!(%NbA-!#3"!%!N!-4GJ!!%(B!N!2@FR3+!J!
%rQejE@9ZGA-+!J!3rQejCACPER3+!J!3rRGSD@0SGfPZC'm+!J!%rRGTEQ4[Gf0
[C'8+!J!#rR9cCA*NEfjP#J)!![j[F'9ZAfCTE'8+!J!#rR4SC9pbC@CIER8+!J!
#rQp`C@jIB@jjAfB+!J!#q@eKD@i+rR0PG(9`E@9YEh)+!Nj@r#3`#J!!*N+Zrr`
JE[rm),crN!3YI!!!#3Mrq#"ZrrJJ%*!![!!!)!![!%kkqe0PG%&`F'a-D@d+!!!
%@)p1Z[YYBAKKF("XHQpZ#J!!!Nkkqde[FQ90BA0dCA)+!!!#6VVl6@pb!*!$-c)
J)%4PFfXJ3@0MCA0cEh*j)&0KEA"XCA)JGM%Z-#!Y,5"1EhCPE@*PFL!a-#`J-6N
i03#3!b!!)`!3!4d"m!!"rrm!N!B"!3XJ)%&LEh9d)%*[H!!!!G3!"`#3"G`"FJ$
a!GB%!Np,!*!&"3#4!"3"iBJE4'9cDb""Bf0PFh0[FRNJ8f&YF'aPFL"f-5i`!*!
'&!"j!#-"iBJK3fp`HA*TCfKd)+NJ-6Ni05"8D'pYBA-J4#iJ6Q9hG'pZ!3#3"8%
!N!03!H')5&4SDA-JF(*[Ch*KE5"KE'a[Gh-JEfjP)(4[)(9cC5"NCA0V)'&MBf9
cFfpbD@9c)(0dEh*PC#"TEL"bCA0[GA*MC5"QD@aPF`#3"9!!N!0I!H')4bKcG@0
S)'&c)(4SC5"[EQ9c)("bEf4eBf9N)'*j)%&`F'aP*h-J4QpZG#p%35"0EhCPFLN
JGfPdD'peG#"TER0dB@aXD@jR!*!'A`#3!fi"iBJPG'K[Ff8JB@0MCA0cEh*TCA-
JD@jdEb"K)&0jFh4PE5"QD@aP,Y`!N!@-!*!$Q`(KL%0%CA0V)%&MBf9cFfpbH5"
6B@e`E'9b)'eKH5"LC5"MEh"TC@3JB@jN)(9cC@3JBRNJB@jjEfjP,#"cEb"XEfj
R)'&c!*!'Q`#3!kS"iBJSG'KKG#"eFf8JDA-JEQpd)'C[FL"MEfeYCA*MD@&X)("
eFR"[Ff9c,J#3!aa84%ia!*!$!8P$6L-!N!@!4P*&4J#3"B!!N!-(39"36!#3"3%
!N!9b4G(F4@e4%RG9dG`944%5G88GdJ#3"Ri!N!1"!!$rI[i"!8+$!J2$K33!!!N
2rrra#UUUX3e999%+UUUarj!$8B!!!V'2rr045!!4X8rrm9&%NNQa*rrid5555,%
Rrrc4%NNNF42rr&%4***b#Irq0!J!!"J(rrr`rj!F!!"q!*!$r`!!rrrq!Iq3!`2
rN!-(rj!$$rq3!`rrN!-2rj!$$rq3$hrrN!0rrj!$Irq3!crrN!-rrj!$2rq3!ar
rN!-Irj!$(rrrrJrrrr`2rrri"rrrm!#3!b!!N!-`!*!(%!#3!b!!!$mm!!'Tm!!
!2c`!!UR`!!!,hJ#3!`'J0PQ2,ca%394"2c`!!+QJ*PpCMbm,UD8S(cSmrU")a85
&)!A3K+-H+%MCa5(-!VBJ8b*-)!5J,Lm,UD01V3!U3Hd!+MJSrri[#+Ra@Bm[2%0
24%8r"+QJ)&qJ5D!G5'crqNKXrrj1ZJA)8)m[,2rk2bcrrNkk"Z*1ZJ@QA)mr2!!
!6VS(2Nj@rrK#V[rm)'lrr##mrj!%,A`!!!N)rrJJE[ri)"#3!,`!!#!!,`"1ZJH
Q@)p1ZJHb6VS(aNkk"m*1ZJHq6Pj1G8j@!!")E!!!2c`!!8kk#-KFMbP!rqT)E!!
#,bcrkNkk#1j3MdKX!"J[,2rU6VS)i&#25'`!(#mXrqT1ZJMi8)p)E!!L2c`!!Nk
k#)aFMbP!rqj)E!!S,bcrlNkk#,*3MdKX!%B[,2rZ6VS)T&#25'`!CLmXrqj1ZJL
@8)p)E!"U,bcrlNkk#)K3MdKX!)i[,2rZ6VS)HP#25'`!NLmXrqj1ZJKX8)p)E!#
D2c`!!dkk##CFMbP!rr*)E!#J,bcrmNkk#%a3MdKX!+J[,2rb6VS)2P#25'`!V#m
Xrr*1ZJJ`8)p)E!#b,bcrmNkk##*3MdKX!,S[,2rb6VS)&&#25'`!`LmXrr*1ZJJ
'8)p#CbmXrqT1ZJ5mA)p#CbmXrqj1ZJ5`A)p#CbmXrr*1ZJ5NA)p1ZJ5`6Pj1G8j
@!!!r2!!"6VS%UP52,bcrkNkk"l4BMdKX!-Sr2!!"6VS(I&b2+8$rkNKX!-`[,2r
U6VS(SP#25'`!iLmXrqT1ZJH88)p)E!$Q,bcrkNkk"ka3Mcmm!!)[,2rU6VS%1Pb
26VS%4NjH6R919J!!6VVq&NKXrm*1ZJ6k@)p1ZJH56VS%3%kk"`j1ZJ@'3UG1ZJN
@@)p1ZJ652ccrldkk!qK8MdKXrrC1ZJ3U@)m[,2rf6VS%cPL26VVq%%)Xrma#,2r
)6Pj1G8j@rripI!!-rri-EJ!JrrjX&M!Zrrj%3&0!2`"1ZJHN9)p5E[rqB1*1ANj
e6PEqQN*Zr[3[,J!)6VS&LPL228$rr#mZ!!K1ZJ@1@)mp32rk-#lrr,"m!!"R!Q!
'B!!#!Q!)X(`!!@F#B(3-EJ!"rrTQ-#mmrj!%3UFr2!%"6VS(L0lm!!SY32kF5'l
qQN+R6VS(dP#2,blqR%kk"iCBMf!f5'lqpNkk"#"BMdKZr[Sr,[rk,bcrkNkk"BM
Hr!!+5'lqqNkk"V4BMce!rri[,[lf6VS$jPL2B!!"KQ!+X(`!!QF%B!!"C$!ZrrU
`I!!"C`4J!!$'2A`!8[lb2A`!C2l`5'`!l%KZrU"1ZJC)8)p)E[kQ3UG"l[kJ)!J
[!"!XrmKR"M!mrrpJ"$!m!!%r!%+R5'`!mNKZr["1ZJ3Bh[`!'K!ZrUCRE"!Xrma
R$NkkrV!r,2r+6VS'rP525'lrrNKZr[T1ZJ5#8)mr,[kX3UG1ZJ5FA)p)E[k`6VS
'Y&L218$rbMmZrrj#Tdkk")*FMd)Xrm`-E2q3!mTR&"Pm!!(rc$mm!!)[,2rZ6VS
%b&b26VVpL'!!!**J#,"m!!*R!Q!Z%#crc'FN6VVq0MmXrmT1ZJD%9)p#,2r-2c`
!!LmXrqj1ZJ4qA)p1Z[e3B&TJ#,"m!!4R!Q!U%#crb%L!2`!r2!!%,bcrlNkk"(a
3Mc!m!!%@,2r)5)13!%-C32r)B#KJ#,"m!!CR!Q!H6VVpe"!XrmaR$MmXrmT1ZJB
F9)p#,2r-2A`!!IldB!L`I!!$C`*J$M!ZrrT63$m!6VS")P523QG1ZJ@@9)m`,[l
d6Pj1G8j@!!"#Ccmmrrp1ZJ%Z@)p#,2r16VS#8%KXrpBr22rr6VS"!&b25N"R!!#
Z-#creV"m!!&R!Q"55'crdNKXrq"1ZJC+8)mj32r3-#crd,"m!!*R!Q!5,bcrdNK
XrpC1ZJ#F8)pJ)'!)X(`!!@F#B"C)E2rJ6VS%kPL2,`"1Z[dq@)mC32r1B&"J$V"
m!!0R#,"m!!9R!Q!`-#crj-"m!3!-3!!!Cb!J,2rB`,`!N!2r5)!r!%kk",j8Mbm
!6VVmrPL2'8$rcQ!)X(`!"QF#B!4J"Q!%X(`!#"!Xrmj)J,"m!!"R!2m`6Pj1G8j
@!!"1Z[a%6VVr$%jH6R91G8j@!!![,J!),bi!$+Qc6Pj1G8j@!!"96cmZ!!LT`P4
24N"1ANje6PB!!&922bi!##mZ!!UTF"!I5)"1ANje6PB!!$!Z!!VKL1')-#i!#+!
b6Pj1G8j@!!!JI!!!!83`VJ!)6Pj1G8j@!!![,J!)2bi!$+Ne6Pj1G8j@!!#T0dj
H6R919J!!2bi!#+Nf6Pj1G8j@!!#T%MPm!!(raNjH6R919J!!,bi!#+N36Pj1G8j
@rrS[#bCZ!!Jr"cm',8[rqL!,Cai3%dL!2!!`"aE!2JB`"QE`)!Z3!+lrqP0!)'l
rqK#!2"mq(bCI6Pj1G8j@!!![#bCZ!!Jr"bm+)!YR(L!,8SXN3#"!%"$!I!$r2J!
`"e0(5N"R""6EB24#%L4I2KmQAdjH6R919J!!6Pj1G8j@!!"1ANje6PB!!+K36Pj
1G8j@!!![,J!)U'j1ANje6PB!!#mZ!!LSFdjH6R919J!!,bi!#+Kd6Pj1G8j@!!#
TY%jH6R919[rm,@d!%2rm)'lrr#"3-+i!#%kk!rK1ANje6PErrLm,3QlrrJaZ!"A
rrQ`X-#lrrZ@!3HcqS0$!$&!!!'m8-#lrrZ@!3HcqS0$!2a"1ZJ'%9)p5E[rqB-`
r,J!)6VVrS&52*Pp1ANje6PB!!+R-6Pj1G8j@!!!JEJ!),a![,J!-,bi!%$mZ!"3
[,J!@,bi!'LmZ!"ir2!!#UHSJEJ!H3HJ!#Lm)6VVqd&L26Pj1G8j@!!!JEJ!)S#d
j32lf6Pj1G8j@rr`[2!#!!!"1ZJ#!@)mY32rm6Pj1G8j@!!#J0NjH6R919J!!9Bm
[,J!)U'S`(djH6R919J!!9Bm[,J!)U'X`(djH6R919[q`,@i!#2r#3QG)E[q`6VS
#I&b2)'i!$$#ZrmB`,[r!6Pj1G8j@rl!YEJ!)rm)pEJ!-rmC#CdKZrl"1ZJ*qA)p
1ANje6PB!!#!Z!!LK(MP!r[BJ#%jH6R919J!!,bi!#$mZ!!`[,J!1U8B[,J!16VV
prPL26Pj1G8j@!!![,J!)2bi!$+Nk6Pj1G8j@!!![,J!)2bi!$+Nj6Pj1G8j@!!!
[,J!)2bi!$"mZ!!qT48jH6R919J!!)'i!#%SZ!!eR"+3"B!+J!8jH6R919[q`2@i
!#2r)3QG)E[q`6VVrePb26Pj1G8j@!!#T-%jH6R919J!!,bi!#Nkkr6KBMeP22bi
!##mZ!!UT-5mZ!!T1Z[eJ@)mJ(djH6R919J!!,bi!#+Nb6Pj1G8j@!!![,J!-6VV
p!&L2,bi!##mZ!!bT-bmZ!!a1Z[dU@)p1ANje6PB!!#mZ!!JJEJ!-,a#T68jH6R9
19J!!U2j1ANje6PErr#m,,`SQEJ!)*'i!$#e,rr`@fQF#B2SJ,[rm*&mQAdjH6R9
19J!!,`XQEJ!)%"0Q""Dm!!%[#dkkr)TBMb!,8S!J3"!35)#`I!!"CJJJ#e+!)%"
#%&92,`ZTYLm,6VVmSPL2-"mQAdjH6R919J!!2bi!#+Qh6Pj1G8j@!!"C6b"Z!!J
[%+Np)"p1ANje6PB!!&P2%#i!#8L!2`#T2L!I6Pj1G8j@!!!r,J!)U6K1ANje6PB
!!&P22bi!##mZ!!S[,J!1UA`J(djH6R919J!!,bi!#+Q$6Pj1G8j@!!![,J!)6VV
li&L298m[,J!)UCF[,J!)6VVm$&L2-"p1ANje6PB!!$mZ!!LTQNjH6R919J!!,bi
!##mZ!!bTN8jH6R919J!!)'i!#%SZ!!eR"+38B!+J&#"Z!!J[+!!56VVla&L2)'i
!#$!S!""1ANje6PB!!#"Z!!J[+!!56VVlD&L2)'i!#%SZ!!eR"+39B!+J&5"Z!!J
[+!!56VVlL&L2)'i!#$!S!""1ANje6PB!!#mZ!!LTHdjH6R919J!!6VVlTURd6Pj
1G8j@!!"96b"Z!!J[%#mZ!!bT,$!I6Pj1G3#3!``!#!!"1A`!!2ld6R8!N!2k&!"
"BQpeG#"dD'Pc)("bEfGbB@dZN!-!+#d!!%459P)!!%CTE'8!!%p`C@iJC'9cDb"
KBf0PFh0[FRNJCQPXC5k3!bp2!#K$E'pcC5"MGA*bC@jd)'&MBf9cFfpbH5"QD@a
P,dX!+#d!!&0SEhFJEfjXH5""F("XC5"%35"0EhCPFL"QD@aPFb%5,e3!!#JY!!"
4G@Pd,e%!!%9NDA3!!&9ZC'm[@J!!+#d!!%0eG#pB!%0[F(N[3`!!8'&cG'8[9J"
$E'9KFLp#!"3!3@*[GA3JG'KTFb"`FQpRFQ&Y,T!$!#JY!!"%8PC5!!"%4NP-!*!
%3dp%43#3"!%!N!-4GJ!!%(B!N!2@!!"2)!#B!*!$(!$@!!G84%ia!*!$3N4-6dF
!N!014%P86!#3!eT#6N4-!*!$CNC548B!N!0b5801)`#3!hj$6d4&!!)!LN4"9%%
!N!1Z!!$rr`#3#!%"rrm!N!-h!*!%!3(rr`#3!eX!N!@!rrm!!!)c!*!&J2rr!!!
#8`#3"B$rr`!!!Pi!N!8#rrm!!!pS!*!&!Irr!!!$KJ#3"[rr!!!$BJ#3"[rr!!!
2H!!!6rM$bJ: