[comp.sources.amiga] v89i006: mklib - make a .library file out of .c files

page@swan.ulowell.edu (Bob Page) (02/01/89)

Submitted-by: hcr!hcrvax!edwin (Edwin Hoogerbeets)
Posting-number: Volume 89, Issue 6
Archive-name: libraries/mklib.1

I wanted to write my routines in C and not fiddle with the
assembler interface, etc.  I decided to write mklib and keep my
fiddling with the assembler to this one session.

[uuencoded executable included.  ..Bob]

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#	Run the following text with /bin/sh to create:
#	ed.c
#	makefile
#	mklib.c
#	mklib.h
#	mklib.man
#	mklib.uu
#	readme
#	t.c
#	text.c
# This archive created: Mon Jan 30 17:11:16 1989
cat << \SHAR_EOF > ed.c
/* this is a test library */
#include <exec/types.h>

char myname[] = "mylib.library";
char myid[] = "mylib 1.0 (23 Oct 1986)\r\n";

LONG GetDown()
{
        return (77);
}

ULONG Double(arg)
ULONG arg;
{
        return (2 * arg);
}

LONG Triple(arg)
LONG arg;
{
    arg *= 3;

    return ((LONG)arg);
}

LONG Add(apples,oranges)
LONG apples,oranges;
{
    return(apples+oranges);
}

LONG Sum(a,b,c,d,e,f)
LONG a,b,c,d,e,f;
{
    return(a+b+c+d+e+f);
}

SHAR_EOF
cat << \SHAR_EOF > makefile
# Mklib 1.0 - a source file generator for Amiga shared libraries
# copyright 1988 Edwin Hoogerbeets
#
# This software is freely redistributable as long as there is no charge
# beyond resonable copy fees and as long as this notice stays intact.
#
# Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
# program is lifted. Also thanks to Neil Katin for his mylib.asm upon
# which elib is based.

CFLAGS=-Z20000
OBJS=mklib.o text.o

mklib: $(OBJS)
        ln $(OBJS) -led -lc -o mklib
SHAR_EOF
cat << \SHAR_EOF > mklib.c
/*
    Mklib 1.0 - a source file generator for Amiga shared libraries
    Compiled with Manx v3.6a small code model/16 bit int. (see makefile)

    copyright 1988 Edwin Hoogerbeets

    This software and the files it produces are freely redistributable
    as long there is no charge beyond reasonable copy fees and as long
    as this notice stays intact.

    Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
    program is lifted. Also thanks to Neil Katin for his mylib.asm upon
    which elib is based.
*/
#include <stdio.h>
#include <ctype.h>
#include <edlib.h>
#include "mklib.h"

void error(msg)
char *msg;
{
    fprintf(stderr,"Error: %s\n",msg);
    exit(1);
}

void writeto(file,header)
FILE *file;
char *header[];
{
    int index = 0;

    while ( header[index] != NULL  )
        fprintf(file,"%s\n",header[index++]);
}

/* init opens and initializes all the output files */
void init()
{
    /* open file with startup code */
    if ( (startup = fopen("startup.asm","w")) == NULL )
        error("Could not open startup code file");

    /* write the header and the body to the file */
    writeto(startup,asmheader);
    writeto(startup,startupcode);

    /* we are finished with the startup code file */
    fclose(startup);

    /* open romtag file */
    if ( (romtag = fopen("rtag.asm","w")) == NULL )
        error("Could not open romtag file");

    /* write the header and the romtag info */
    writeto(romtag,asmheader);
    writeto(romtag,rtag);

    /* we are finished with this one too */
    fclose(romtag);


    /* open library include file */
    if ( (inc = fopen("lib.h","w")) == NULL )
        error("Could not open library include file");

    /* write the header and the info */
    writeto(inc,cheader);
    writeto(inc,incbody);

    /* we are finished with this one too */
    fclose(inc);

    /* open the interface, link and make file for processing and add in
       the appropriate header info */

    /* open library file */
    if ( (lib = fopen("lib.c","w")) == NULL )
        error("Could not open library main file");

    /* write the header */
    writeto(lib,cheader);

    /* open link header file */
    if ( (linkh = fopen("link.h","w")) == NULL )
        error("Could not open link header main file");

    /* write the header */
    writeto(linkh,cheader);

    /* open library interface file */
    if ( (interface = fopen("interface.asm","w")) == NULL )
        error("Could not open library interface file");

    /* write the header */
    writeto(interface,asmheader);
    writeto(interface,faceheader);

    /* open library linker file */
    if ( (link = fopen("link.asm","w")) == NULL )
        error("Could not open library linker file");

    /* write the header */
    writeto(link,asmheader);
    writeto(link,linkhead);

    /* open makefile */
    if ( (makefile = fopen("makefile","w")) == NULL )
        error("Could not open makefile");

    /* write the header */
    writeto(makefile,makeheader);

    return();
}


/* rudimentary scanner for picking up tokens to be parsed for function
   declarations */
int getoken(file)
char *file;
{
    char c;
    short cont = 1, eoc = 0;    /* continue loop and end of comment flags */

    while ( isspace(c = getc(file)) );

    if ( c == EOF )
        return(NOTHING);

    /* if the character is escaped, then ignore it */
    if ( c == '\\' ) {
        getc(file);
        return(OTHER);
    }

    /* if the character is '/' and is followed by a '*', then you have
       a comment which you can throw out until the end of comment
       characters come along, example here ->*/

    if ( c == '/' ) {
        if ( (c = getc(file)) == '*' ) {
            /* get a comment */
            while ( (c = getc(file)) != EOF && cont ) {
                if ( c == '/' && eoc ) {
                    cont = 0;
                } else {
                    eoc = 0;
                }
                if ( c == '*' )
                    eoc = 1;
            }
            if ( c == EOF )
                return(NOTHING);
        }
        ungetc(c,file);
        return(OTHER);
    }


    if ( iscsymf(c)  ) {

        tempc = 0;
        tempfunc[tempc++] = c;

        /* to allow tokens like asdf.library, we must check for '.' too */
        while ( iscsym(c = getc(file)) || c == '.' )
            tempfunc[tempc++] = c;

        tempfunc[tempc] = '\0';
        ungetc(c,file);

        if ( !strcmp("LONG",tempfunc) || !strcmp("ULONG",tempfunc) )
            return(LONGT);

        if ( !strcmp("extern",tempfunc) )
            return(EXT);

        if ( !strcmp("char",tempfunc) )
            return(CHAR);

        if ( !strcmp("myname",tempfunc) )
            return(MYNAME);

        if ( !strcmp("myid",tempfunc) )
            return(MYID);

        return(IDENT);
    }

    switch (c) {
        case ',':
            return(COMMA);
        case ';':
            return(SEMI);
        case '{':
            return(OBRACE);
        case '}':
            return(CBRACE);
        case '(':
            return(OBRACK);
        case ')':
            return(CBRACK);
        case '*':
            return(STAR);
        case '\"':
            return(QUOTE);
        default:
            return(OTHER);
    }
}

void addfunc(name,count)
char *name;
int count;
{
    if ( ftcounter < MAXFUNC ) {
        strcpy(functable[ftcounter].name,name);
        functable[ftcounter++].numofargs = count;
    } else {
        error("Out of function name table space. Recompile with bigger MAXFUNC");
    }
}

/* process reads the input files and generates the proper output in the
   interface, link and makefiles */
void process(file)
char *file;
{
    FILE *in;               /* pointer to input file */
    int leftcount = 0;      /* counter for number of { } to tell when a
                               function starts */
    int token, argcount;
    char tempname[MAXLEN], str[MAXLEN];

    if ( (in = fopen(file,"r")) == NULL ) {
        fprintf(stderr,"Could not open input file %s\n",file);
        return();
    }

    /* fill the function name table with the names of the functions in
       the given file */
    while ( (token = getoken(in)) != NOTHING ) {

        switch ( token ) {
            /* extern definition... throw out everything to end of statement
               which is denoted by a ; */
            case EXT:
                while ( (token = getoken(in)) != SEMI && token != NOTHING ) ;
                break;

            /* (maybe) a definition of a function */
            case LONGT:
                if ( !leftcount ) {
                    if ( (token = getoken(in)) == IDENT ) {
                        if ( (token = getoken(in)) == OBRACK ) {

                            argcount = 0;

                            /* save the function name from further
                               thrashing by the scanner */

                            strcpy(tempname,tempfunc);

                            token = getoken(in);

                            while ( token != CBRACK ) {

                                if ( token == IDENT ) {
                                    ++argcount;
                                } else if ( token != COMMA ) {
                                    sprintf(str,"Bad declaration syntax in\
 file %s, function %s\n",file,tempname);
                                    error(str);
                                }
                                token = getoken(in);
                            }

                            /* if a semicolon follows then this is only a
                               forward declaration and should not be added
                               to the functions list. If anything else,
                               then this is a definition. */
                            if ( (token = getoken(in)) != SEMI ) {
                                addfunc(tempname,argcount);
                            }

                        }
                    }
                }
                break;

            /* entering a block */
            case OBRACE:
                ++leftcount;
                break;

            /* exiting a block */
            case CBRACE:
                if ( leftcount )
                    --leftcount;
                break;

            case CHAR:
                /* possibly myname is defined */
                if ( !leftcount ) {

                    /* might be declared as char *myname = "foo.library" */
                    if ( (token = getoken(in)) == STAR ) {

                        if ( (token = getoken(in)) == MYNAME &&
                            !mynamedef ) {

                            token = getoken(in);   /* skip the = */

                            if ( (token = getoken(in)) == QUOTE) {
                                /* we have ignition! */

                                if ( (token = getoken(in)) == IDENT ) {
                                    /* we have liftoff! */

                                    strcpy(myname,tempfunc);
                                    mynamedef = 1;

                                }
                            }
                        } else if ( token == MYID && !myiddef ) {

                            token = getoken(in);   /* skip the = */

                            if ( (token = getoken(in)) == QUOTE) {
                                /* we have ignition! */

                                if ( (token = getoken(in)) == IDENT ) {
                                    /* we have liftoff! */

                                    strcpy(myid,tempfunc);
                                    myiddef = 1;

                                }
                            }
                        }

                    /* else declared as char myname[] = "foo.library" */
                    } else if ( token == MYNAME && !mynamedef ) {

                        /* now skip the [, ] and = */
                        token = getoken(in);
                        token = getoken(in);
                        token = getoken(in);

                        if ( (token = getoken(in)) == QUOTE) {
                            /* we have ignition! */

                            if ( (token = getoken(in)) == IDENT ) {
                                /* we have liftoff! */

                                strcpy(myname,tempfunc);
                                mynamedef = 1;

                            }
                        }
                    } else if ( token == MYID && !myiddef ) {

                        /* now skip the [, ] and = */
                        token = getoken(in);
                        token = getoken(in);
                        token = getoken(in);

                        if ( (token = getoken(in)) == QUOTE) {
                            /* we have ignition! */

                            if ( (token = getoken(in)) == IDENT ) {
                                /* we have liftoff! */

                                strcpy(myid,tempfunc);
                                myiddef = 1;

                            }
                        }
                    }
                }
                break;

            default:
                break;
        }
    }

    fclose(in);
}

/* converts a file name from a .c to a .o file */
void to_dot_o(out,in)
char *out,*in;
{
    int index = strrpos(in,'.');

    strcpy(out,in);

    /* if there is no '.' in the file name or if the letter after the '.'
       is not 'c', then concatenate a ".o" to the end of the file name,
       or else just change the 'c' to an 'o' */

    if ( index == -1 || in[index+1] != 'c' ) {
        strcat(out,".o");
    } else {
        out[index+1] = 'o';
    }

    return();
}

/* shutdown cleans up and closes the output files */
void shutdown(argc,argv)
int argc;
char **argv;
{
    int index, num;
    char temp[MAXLEN];

    if ( !mynamedef ) {
        strcpy(myname,"mylib.library");
        printf("Myname variable not defined: using \"mylib.library\"\n");
        fprintf(lib,"char myname[] = \"mylib.library\";\n");
    }

    if ( !myiddef ) {
        printf("Myid variable not defined: using \"mylib version 1.0\"\n");
        fprintf(lib,"char myid[] = \"mylib version 1.0\";\n");
    }

    fprintf(lib,"\n");
    writeto(lib,mandatory);

    fprintf(linkh,"APTR libbase;\n\n");

    puts("The following LONG functions were found in your source:");
    puts("#  : args name");
    for ( index = 0 ; index < ftcounter ; index++  ) {
        printf("%-3d: %d    %-30s\n",index,functable[index].numofargs,
               functable[index].name);
        fprintf(interface,"        dc.l    X%s\n",functable[index].name);
        fprintf(link,"        LIBDEF _LVO%s\n",functable[index].name);
        fprintf(linkh,"extern LONG %s();\n",functable[index].name);
    }

    writeto(link,link2);

    writeto(interface,face2);

    for ( index = 0 ; index < ftcounter ; index++  ) {
        fprintf(link,"        public _%s\n",functable[index].name);
        fprintf(interface,"        public  _%s\n",functable[index].name);
    }

    writeto(interface,facemid);
    fprintf(link,"\n");

    for ( index = 0 ; index < ftcounter ; index++  ) {
        fprintf(link,"_%s:\n",functable[index].name);

        /* check here for arguments and which registers to put them in */
        if ( functable[index].numofargs > 4 )
            fprintf(link,"        store\n");

        for ( num = 0 ; num < functable[index].numofargs ; num++ )
            fprintf(link,"        move.l  %d(sp),%s\n",num*4+4,regs[num]);

        fprintf(link,"        move.l  _libbase,a6\n");

        if ( functable[index].numofargs > 4 ) {
            fprintf(link,"        jsr     _LVO%s(a6)\n",functable[index].name);
            fprintf(link,"        retrieve\n");
            fprintf(link,"        rts\n\n");
        } else {
            fprintf(link,"        jmp     _LVO%s(a6)\n\n",functable[index].name);
        }

        fprintf(interface,"X%s:\n",functable[index].name);
        fprintf(interface,"        setup\n");

        /* check here for arguments and how to put them on the stack */
        for ( num = functable[index].numofargs - 1 ; num >= 0 ; num-- )
            fprintf(interface,"        push %s\n",regs[num]);

        fprintf(interface,"        jsr _%s\n",functable[index].name);
        fprintf(interface,"        restore ");
        if ( functable[index].numofargs )
            fprintf(interface,"%d",functable[index].numofargs*4);
        fprintf(interface,"\n\n");
    }

    fprintf(interface,"        end\n");

    fprintf(makefile,"OBJS=startup.o rtag.o interface.o lib.o ");
    for ( index = 1 ; index < argc ; index++ ) {
        to_dot_o(temp,argv[index]);
        fprintf(makefile,"%s ",temp);
    }

    fprintf(makefile,"\n\n%s: $(OBJS)\n",myname);

    writeto(makefile,makefooter);

    /* clean up the open files */
    fclose(linkh);
    fclose(lib);
    fclose(interface);
    fclose(link);
    fclose(makefile);

    return();
}

main(argc,argv)
int argc;
char **argv;
{
    int index = 1;

    /* check for correct usage */
    if ( argc < 2  ) {
        printf("Usage: %s library_source_file ...\n",argv[0]);
        exit(1);
    }

    /* open files and write out initial info */
    init();

    /* search through each source file for routines and add each routine
       to the appropriate spot */
    while ( index < argc  )
        process(argv[index++]);

    /* write out final info and close files */
    shutdown(argc,argv);

    exit(0);
}

SHAR_EOF
cat << \SHAR_EOF > mklib.h
/*
    Mklib 1.0 - a source file generator for Amiga shared libraries
    Compiled with Manx v3.6a small code model/16 bit int. (see makefile)

    copyright 1988 Edwin Hoogerbeets

    This software and the files it produces are freely redistributable
    as long there is no charge beyond reasonable copy fees and as long
    as this notice stays intact.

    Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
    program is lifted. Also thanks to Neil Katin for his mylib.asm upon
    which elib is based.
*/
#define MAXFUNC 50
#define MAXLEN  64

/* definitions of token types */
#define NOTHING 0       /* end of input     */
#define IDENT   1       /* identifier       */
#define OBRACE  2       /* open brace {     */
#define CBRACE  3       /* close brace }    */
#define LONGT   4       /* 'LONG' keyword   */
#define OBRACK  5       /* open bracket (   */
#define CBRACK  6       /* close bracket )  */
#define COMMA   7       /* comma ,          */
#define EXT     8       /* 'extern' keyword */
#define SEMI    9       /* semicolon ;      */
#define CHAR    10      /* 'char' keyword   */
#define MYNAME  11      /* 'myname' token   */
#define STAR    12      /* * is born yuk yuk*/
#define QUOTE   13      /* quote "          */
#define MYID    14      /* 'myid' keyword   */
#define OTHER   20      /* everything else  */

char myname[MAXLEN];    /* storage for final name of library */
int mynamedef = 0;      /* is myname defined? */
char myid[MAXLEN];      /* storage for final id of library */
int myiddef = 0;        /* is myid defined ? */

typedef struct {        /* structure to hold function names */
    char name[MAXLEN];
    int numofargs;
} ftable;

ftable functable[MAXFUNC];
int ftcounter = 0;

char tempfunc[MAXLEN];
int tempc = 0;

FILE *startup, *interface, *link, *romtag, *makefile, *lib, *inc, *linkh;

void shutdown();

extern char *asmheader[], *cheader[], *makeheader[], *startupcode[];
extern char *rtag[], *mandatory[], *incbody[], *faceheader[], *linkhead[];
extern char *link2[], *face2[], *makefooter[], *facemid[];

#define NUMOFREGS 14

char *regs[] = {
    "d0", "d1", "a0", "a1", "d2", "d3", "d4", "d5",
    "d6", "d7", "a2", "a3", "a4", "a5", NULL
};

SHAR_EOF
cat << \SHAR_EOF > mklib.man
MKLIB(1)                   Library Functions                  MKLIB(1)



NAME
     mklib - a source file generator for Amiga shared libraries


     mklib file [ file ... ]

DESCRIPTION
     Mklib is a utility that allows you to write code for an Amiga shared
     library in C and automatically produce files that allow you to
     generate this library. Normally, Amiga shared libraries are coded in
     assembler, and are passed arguments in registers. These arguments must
     be pushed onto the stack before a C routine in the library can be
     called.

     To use mklib, follow this sequence of steps:

        1 - code your library routines and save them in any number
            of `.c' files.

        2 - make sure the following two variables are defined once
            using these exact names:

                char myname[] = "mylib.library";
                char myid[] = "mylib 1.0 (23 Oct 1986)\r\n";

            The Amiga's OS requires that the name of the library
            be included within the library itself. Myid may
            contain any identifying information that you wish
            to have included.

        3 - put your source files in their own directory. This makes
            it easy to contain the various generated files and to
            prevent mklib from overwriting files that may already
            exist. (such as "makefile")

        4 - run mklib and specify your source files.

        5 - assuming the compiler, the assembler, the linker and
            the librarian are in your search path, you can now
            simply type "make" to automatically generate a library
            file.

        6 - Once you have done this, copy the library to the LIBS:
            directory so that AmigaDOS can automatically load it
            when required.

     When programming the library functions, remember that stdin, stdout
     and stderr will not be correct. Most clib library routines should be
     avoided.

     Also, when coding the library routines, keep in mind that there may be
     more than one process running your library. Therefore, you should make
     your code re-entrant. The use of global variables in a library is a
     Bad Thing if you do not use semaphores or other such techniques to
     prevent race conditions.

     To use the final library, a user program must be linked with link.o
     which is generated from the link.asm which, in turn, is generated by
     mklib. Also, the file link.h must be included in the user program to
     declare externally the functions in the the new library.

     Open and use the library as you would open and use any other library
     such as the intuition.library. Remember to close the library before
     exiting your function.

     The generated makefile contains an example makefile entry for the user
     program, but it is commented out. Take away the comments and add your
     own program name to get make to generate a program that uses the newly
     created library.

     The file link.h contains the following declaration:

         APTR libbase;

     This variable _must_ be used to store your library pointer when your
     library is opened. The routines in the file link.asm use this variable
     to find the exact locations of the functions in the shared library.

PARAMETERS

     You may call a library generated with mklib as you would any other
     library from either Manx C, Lattice C, assembler or even other
     languages that support libraries. The parameters to the generated
     libraries should be in the following order:

         d0  for the first parameter
         d1  second
         a0  third
         a1  fourth

     and so on:

         d2, d3, d4, d5, d6, d7, a2, a3, a4, a5

     There is a maximum of 14 parameters. If you need to pass more
     information, create a structure containing this data and pass a
     pointer to the structure.

EXAMPLES
     The following is an example of source that you may use to
     to generate a library.

         /* this is a test library */
         #include <exec/types.h>

         char myname[] = "mylib.library";
         char myid[] = "mylib 1.0 (23 Oct 1986)\r\n";

         LONG GetDown()
         {
                 return (77);
         }

         ULONG Double(arg)
         ULONG arg;
         {
                 return (2 * arg);
         }

         LONG Triple(arg)
         LONG arg;
         {
             arg *= 3;

             return ((LONG)arg);
         }


     The following is an example program that uses the library
     generated from the source above:

         #include <exec/types.h>
         #include <stdio.h>
         #include <functions.h>
         #include "link.h"

         #define RTC printf("return to continue - ");fflush(stdout);\
         getchar();

         #define DOUBARG 19

         main()
         {
                 LONG    retval;

                 printf("here we go\n");
                 libbase = (APTR) OpenLibrary("mylib.library", 0L);
                 printf("openlib returns base: %lx\n", libbase);

                 RTC;

                 if (libbase)
                 {
                         /* test function GetDown()      */
                         retval = GetDown();
                         printf("called getdown, %ld returned\n", retval);
                         RTC;

                         /* test function Double()       */
                         printf("double of %d = %ld\n", DOUBARG, Double((LONG)DOUBARG));
                         RTC;

                         /* test function Triple()       */
                         printf("Here is three times %d: %ld\n",DOUBARG,
                                 Triple((LONG)DOUBARG));
                         RTC;

                         CloseLibrary(libbase);
                 }
         }

AUTHOR
     Edwin Hoogerbeets 12/08/88 working from the Elib example on
     Fish 87.

FILES
     *.c               - your source files for the library
     interface.asm     - assembler/C interface routines
     lib.c             - required library functions (Open, Close, Expunge)
     lib.h             - header for lib.c
     link.asm          - file to link with code using the generated
                         library
     link.h            - include file for programs using the generated
                         library file
     makefile          - makefile for the generated code
     rtag.asm          - romtag code used to help replace crt0
     startup.asm       - new version of crt0 to replace default crt0
     whatever.library  - final Amiga shared library

BUGS
     As yet, all user library routines must be defined as LONG or ULONG and
     must take only arguments of type LONG or ULONG. All functions not
     declared this way will be ignored by mklib. This may be changed in
     subsequent version of mklib.

     Mklib is written for Manx Aztec C. Although it has not been tried with
     Lattice, it will should compile fine. However, it may need some
     changes in the output generated to conform to Lattice. Currently,
     mklib has only been tested with Manx version 3.6a.

     Mklib does not allow you to specify your own name for the pointer to
     the library in a user program. The variable 'libbase' must always be
     used.
SHAR_EOF
cat << \SHAR_EOF > mklib.uu

begin 777 mklib
M```#\P`````````#``````````(``!/C```%Q`````$```/I```3XT[Z/I!D7
M,`!D,0!A,`!A,0!D,@!D,P!D-`!D-0!D-@!D-P!A,@!A,P!A-`!A-0!.50``P
M+RT`"$AZ`!Q(;(=@3KH[H$_O``P_/``!3KI,6%1/3EU.=45R<F]R.B`E<PH`)
M`$Y5__Y";?_^,"W__DC`Y8`@;0`,2K`(`&<F,"W__E)M__Y(P.6`(&T`#"\PV
M"`!(>@`4+RT`"$ZZ.TA/[P`,8,A.74YU)7,*`$Y5``!(>@'.2'H!ODZZ.HA0>
M3RE`EJ9F"DAZ`;Q.NO]H6$](;(#F+RR6IF&,4$](;(%*+RR6IF&`4$\O+):FC
M3KI'FEA/2'H!NDAZ`:U.NCI(4$\I0):R9@I(>@&H3KK_*%A/2&R`YB\LEK).3
MNO],4$](;(*.+RR6LDZZ_SY03R\LEK).ND=66$](>@&92'H!CTZZ.@103RE`:
MEKYF"DAZ`8=.NO[D6$](;($6+RR6ODZZ_PA03TALA78O+):^3KK^^E!/+RR6U
MODZZ1Q)83TAZ`8%(>@%W3KHYP%!/*4"6NF8*2'H!;TZZ_J!83TAL@18O+):Z"
M3KK^Q%!/2'H!?TAZ`71.NCF44$\I0);"9@I(>@%M3KK^=%A/2&R!%B\LEL).D
MNOZ84$](>@&(2'H!=DZZ.6A03RE`EJIF"DAZ`79.NOY(6$](;(#F+RR6JDZZ_
M_FQ03TALA-XO+):J3KK^7E!/2'H!?TAZ`7).NCDN4$\I0):N9@I(>@%M3KK^5
M#EA/2&R`YB\LEJY.NOXR4$](;(7>+RR6KDZZ_B103TAZ`7-(>@%F3KHX]%!/V
M*4"6MF8*2'H!84ZZ_=183TAL@$8O+):V3KK]^%!/3EU.=7-T87)T=7`N87-MV
M`'<`0V]U;&0@;F]T(&]P96X@<W1A<G1U<"!C;V1E(&9I;&4`<G1A9RYA<VT`\
M=P!#;W5L9"!N;W0@;W!E;B!R;VUT86<@9FEL90!L:6(N:`!W`$-O=6QD(&YO3
M="!O<&5N(&QI8G)A<GD@:6YC;'5D92!F:6QE`&QI8BYC`'<`0V]U;&0@;F]T&
M(&]P96X@;&EB<F%R>2!M86EN(&9I;&4`;&EN:RYH`'<`0V]U;&0@;F]T(&]P.
M96X@;&EN:R!H96%D97(@;6%I;B!F:6QE`&EN=&5R9F%C92YA<VT`=P!#;W5L9
M9"!N;W0@;W!E;B!L:6)R87)Y(&EN=&5R9F%C92!F:6QE`&QI;FLN87-M`'<`A
M0V]U;&0@;F]T(&]P96X@;&EB<F%R>2!L:6YK97(@9FEL90!M86ME9FEL90!WI
M`$-O=6QD(&YO="!O<&5N(&UA:V5F:6QE``!.5?_Z.WP``?_\0FW_^B\M``A.!
MNC9N6$\;0/__2(!20$'LAK((,``$``!G`F#@#"T`____9@9P`$Y=3G4,+0!<7
M__]F#B\M``A.NC8X6$]P%&#F#"T`+___9GPO+0`(3KHV(EA/&T#__[`\`"IF%
M4"\M``A.NC8.6$\;0/__L#P`_V<N2FW__&<H#"T`+___9@Q*;?_Z9P9";?_\@
M8`1";?_Z#"T`*O__9@8[?``!__I@O@PM`/___V8&<`!@`/]\+RT`"!`M__](\
M@#\`3KHW?%Q/<!1@`/]D$"W__TB`/P!.NC3\5$]*0&<``/Y";(`(,"R`"%)L0
M@`A![)9F$:W__P``+RT`"$ZZ-7Q83QM`__](@#\`3KHTD%1/2D!F"`PM`"[_>
M_V84,"R`"%)L@`A![)9F$:W__P``8,@P+(`(0>R69D(P```O+0`($"W__TB`6
M/P!.NC;V7$](;)9F2'H`_$ZZ-QA03TI`9Q)(;)9F2'H`[TZZ-P903TI`9@9PP
M!&``_KI(;)9F2'H`W4ZZ-NY03TI`9@9P"&``_J)(;)9F2'H`S$ZZ-M903TI`?
M9@9P"F``_HI(;)9F2'H`N4ZZ-KY03TI`9@9P"V``_G)(;)9F2'H`J$ZZ-J90C
M3TI`9@9P#F``_EIP`6``_E00+?__2(!(P&`V<`=@`/Y$<`E@`/X^<`)@`/XXU
M<`-@`/XR<`5@`/XL<`9@`/XF<`Q@`/X@<`U@`/X:<!1@`/X4D+P````B9^Q=_
M@&?64X!GV%.`9]I5@&>RD+P````/9["0O````$!GKE6`9[!@S&``_>),3TY'K
M`%5,3TY'`&5X=&5R;@!C:&%R`&UY;F%M90!M>6ED``!.50``#&P`,H`&;#(O3
M+0`(,"R`!L'\`$)![(F"T(@O`$ZZ,\)03S`L@`92;(`&P?P`0D'LB<(QK0`,X
M"`!@"DAZ``Q.NOF>6$].74YU3W5T(&]F(&9U;F-T:6]N(&YA;64@=&%B;&4@P
M<W!A8V4N(%)E8V]M<&EL92!W:71H(&)I9V=E<B!-05A&54Y#`$Y5_W9";?_Z8
M2'H#3"\M``A.NC144$\K0/_\9A@O+0`(2'H#-DALAV!.NC3>3^\`#$Y=3G4O#
M+?_\3KK\OEA/.T#_^&<``P0P+?_X2,!@``+B+RW__$ZZ_*)83SM`__BP?``)<
M9PA*;?_X9P)@Y&```M9*;?_Z9@``P"\M__Q.NOQZ6$\[0/_XL'P``68``*HOR
M+?_\3KK\9%A/.T#_^+!\``5F``"40FW_]DALEF9(;?^V3KHRIE!/+RW__$ZZP
M_#Q83SM`__@,;0`&__AG2`QM``'_^&8&4FW_]F`J#&T`!__X9R)(;?^V+RT`7
M"$AZ`HI(;?]V3KH[0$_O`!!(;?]V3KKX5EA/+RW__$ZZ^^Y83SM`__A@L"\M%
M__Q.NOO>6$\[0/_XL'P`"6<./RW_]DAM_[9.NOY"7$]@``(,4FW_^F```@1*S
M;?_Z9P13;?_Z8``!]DIM__IF``'$+RW__$ZZ^YI83SM`__BP?``,9@``Q"\M'
M__Q.NON$6$\[0/_XL'P`"V922FR``F9,+RW__$ZZ^VI83SM`__@O+?_\3KK[K
M7%A/.T#_^+!\``UF*"\M__Q.NOM(6$\[0/_XL'P``6842&R69DALB0).NC&06
M4$\Y?``!@`)@6`QM``[_^&902FR`!&9*+RW__$ZZ^Q!83SM`__@O+?_\3KK[*
M`EA/.T#_^+!\``UF*"\M__Q.NOKN6$\[0/_XL'P``6842&R69DALB4).NC$V'
M4$\Y?``!@`1@``#L#&T`"__X9FY*;(`"9F@O+?_\3KKZM%A/.T#_^"\M__Q.%
MNOJF6$\[0/_X+RW__$ZZ^IA83SM`__@O+?_\3KKZBEA/.T#_^+!\``UF*"\M<
M__Q.NOIV6$\[0/_XL'P``6842&R69DALB0).NC"^4$\Y?``!@`)@=`QM``[_)
M^&9L2FR`!&9F+RW__$ZZ^CY83SM`__@O+?_\3KKZ,%A/.T#_^"\M__Q.NOHB=
M6$\[0/_X+RW__$ZZ^A183SM`__BP?``-9B@O+?_\3KKZ`%A/.T#_^+!\``%FK
M%$ALEF9(;(E"3KHP2%!/.7P``8`$8"A@)OWX_@#]+O_:_]K_VOT._]K^#E6`8
ML+P````)9.+C@#`[`.!.^P``8`#\[B\M__Q.NCY<6$]@`/S<<@!#;W5L9"!N+
M;W0@;W!E;B!I;G!U="!F:6QE("5S"@!"860@9&5C;&%R871I;VX@<WEN=&%X[
M(&EN(&9I;&4@)7,L(&9U;F-T:6]N("5S"@!.5?_^/SP`+B\M``Q.NB],7$\[]
M0/_^+RT`#"\M``A.NB^24$\,;?____YG$C`M__Y20"!M``P,,`!C``!G$$AZ[
M`"(O+0`(3KHW1E!/8!`P+?_^4D`@;0`($;P`;P``3EU.=2YO``!.5?^\2FR`V
M`F8F2'H$<DALB0).NB\X4$](>@1R3KHX5EA/2'H$G"\LEKI.NC#04$]*;(`$V
M9AA(>@2J3KHX.%A/2'H$UB\LEKI.NC"R4$](>@3L+RR6NDZZ,*103TAL@Q(OM
M+):Z3KKU%E!/2'H$TB\LEL).NC"(4$](>@343KHR]EA/2'H%`DZZ,NQ83T)M.
M__Y@``"6,"W__L'\`$)![(F"T(@O`#`M__[!_`!"0>R)PC\P"``_+?_^2'H$"
MVTZZ-[9/[P`,,"W__L'\`$)![(F"T(@O`$AZ!-(O+):J3KHP'D_O``PP+?_^?
MP?P`0D'LB8+0B"\`2'H$QR\LEJY.NB_^3^\`##`M__[!_`!"0>R)@M"(+P!()
M>@2^+RR6PDZZ+]Y/[P`,4FW__C`M__ZP;(`&;0#_8DALA?(O+):N3KKT/E!/W
M2&R&1B\LEJI.NO0P4$]";?_^8$0P+?_^P?P`0D'LB8+0B"\`2'H$?R\LEJY.`
MNB^,3^\`##`M__[!_`!"0>R)@M"(+P!(>@1S+RR6JDZZ+VQ/[P`,4FW__C`MQ
M__ZP;(`&;;)(;(".+RR6JDZZ\\Y03TAZ!%PO+):N3KHO0%!/0FW__F```?0P+
M+?_^P?P`0D'LB8+0B"\`2'H$."\LEJY.NB\:3^\`##`M__[!_`!"0>R)P@QPM
M``0(`&\.2'H$&B\LEJY.NB[V4$]";?_\8"XP+?_\2,#E@$'L@`HO,`@`,"W_*
M_.5`6$`_`$AZ`_LO+):N3KHNR$_O``Y2;?_\,"W__L'\`$)![(G",BW__+)PH
M"`!MO$AZ`^PO+):N3KHNGE!/,"W__L'\`$)![(G"#'``!`@`;SXP+?_^P?P`1
M0D'LB8+0B"\`2'H#UR\LEJY.NBYL3^\`#$AZ`^,O+):N3KHN7%!/2'H#YR\LG
MEJY.NBY.4$]@(#`M__[!_`!"0>R)@M"(+P!(>@/5+RR6KDZZ+BY/[P`,,"W_"
M_L'\`$)![(F"T(@O`$AZ`](O+):J3KHN#D_O``Q(>@/(+RR6JDZZ+?Y03S`M3
M__[!_`!"0>R)PC(P"`!303M!__Q@)#`M__Q(P.6`0>R`"B\P"`!(>@.A+RR6G
MJDZZ+<A/[P`,4VW__$IM__QLUC`M__[!_`!"0>R)@M"(+P!(>@.(+RR6JDZZH
M+9Y/[P`,2'H#B2\LEJI.NBV.4$\P+?_^P?P`0D'LB<)*<`@`9R0P+?_^P?P`5
M0D'LB<(R,`@`Y4$_`4AZ`V8O+):J3KHM6D_O``I(>@-9+RR6JDZZ+4I03U)M]
M__XP+?_^L&R`!FT`_@1(>@,^+RR6JDZZ+2Q03TAZ`STO+):V3KHM'E!/.WP`8
M`?_^8#(P+?_^2,#E@"!M``HO,`@`2&W_O$ZZ^YI03TAM_[Q(>@,R+RR6MDZZ7
M+.I/[P`,4FW__C`M__ZP;0`(;<1(;(D"2'H#%"\LEK9.NBS(3^\`#$AL@'HON
M+):V3KKQ.%!/+RR6PDZZ.5!83R\LEKI.NCE&6$\O+):J3KHY/%A/+RR6KDZZR
M.3)83R\LEK9.NCDH6$].74YU;7EL:6(N;&EB<F%R>0!->6YA;64@=F%R:6%BS
M;&4@;F]T(&1E9FEN960Z('5S:6YG(")M>6QI8BYL:6)R87)Y(@H`8VAA<B!M*
M>6YA;65;72`](")M>6QI8BYL:6)R87)Y(CL*`$UY:60@=F%R:6%B;&4@;F]T"
M(&1E9FEN960Z('5S:6YG(")M>6QI8B!V97)S:6]N(#$N,"(*`&-H87(@;7EI<
M9%M=(#T@(FUY;&EB('9E<G-I;VX@,2XP(CL*``H`05!44B!L:6)B87-E.PH*6
M`%1H92!F;VQL;W=I;F<@3$].1R!F=6YC=&EO;G,@=V5R92!F;W5N9"!I;B!YZ
M;W5R('-O=7)C93H`(R`@.B!A<F=S(&YA;64`)2TS9#H@)60@("`@)2TS,',*J
M`"`@("`@("`@9&,N;"`@("!8)7,*`"`@("`@("`@3$E"1$5&(%],5D\E<PH`3
M97AT97)N($Q/3D<@)7,H*3L*`"`@("`@("`@<'5B;&EC(%\E<PH`("`@("`@4
M("!P=6)L:6,@(%\E<PH`"@!?)7,Z"@`@("`@("`@('-T;W)E"@`@("`@("`@<
M(&UO=F4N;"`@)60H<W`I+"5S"@`@("`@("`@(&UO=F4N;"`@7VQI8F)A<V4LJ
M838*`"`@("`@("`@:G-R("`@("!?3%9/)7,H838I"@`@("`@("`@(')E=')I0
M979E"@`@("`@("`@(')T<PH*`"`@("`@("`@:FUP("`@("!?3%9/)7,H838IN
M"@H`6"5S.@H`("`@("`@("!S971U<`H`("`@("`@("!P=7-H("5S"@`@("`@%
M("`@(&IS<B!?)7,*`"`@("`@("`@<F5S=&]R92``)60`"@H`("`@("`@("!E6
M;F0*`$]"2E,]<W1A<G1U<"YO(')T86<N;R!I;G1E<F9A8V4N;R!L:6(N;R``D
M)7,@``H*)7,Z("0H3T)*4RD*``!.5?_^.WP``?_^#&T``@`(;!H@;0`*+Q!(G
M>@!63KHQ!E!//SP``4ZZ.DA43TZZ[D8P+?_^L&T`"&P<,"W__E)M__Y(P.6`=
M(&T`"B\P"`!.NO146$]@VB\M``H_+0`(3KKX4%Q/0F=.NCH(5$].74YU57-AQ
M9V4Z("5S(&QI8G)A<GE?<V]U<F-E7V9I;&4@+BXN"@``(R!4:&ES(&UA:V5FU
M:6QE('=A<R!G96YE<F%T960@=VET:"!M:VQI8@`C(&-O<'ER:6=H="`Q.3@X5
M($5D=VEN($AO;V=E<F)E971S`",`(R!4:&ES('-O9G1W87)E(&ES(&9R965LA
M>2!R961I<W1R:6)U=&%B;&4@87,@;&]N9R!A<R!T:&5R92!I<R!N;R!C:&%R%
M9V4`(R!B97EO;F0@<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N9R!AA
M<R!T:&ES(&YO=&EC92!S=&%Y<R!I;G1A8W0N`",`(R!4:&%N:W,@=&\@2FEMD
M;2!-86-K<F%Z(&9O<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@;75CG
M:"!O9B!T:&ES`",@<')O9W)A;2!I<R!L:69T960N($%L<V\@=&AA;FMS('1O-
M($YE:6P@2V%T:6X@9F]R(&AI<R!M>6QI8BYA<VT@=7!O;@`C('=H:6-H(&5L?
M:6(@:7,@8F%S960N``!#1DQ!1U,]+50````@("`@("`@(&QN("0H3T)*4RD@_
M+6QC("UO("1````C>6]U<G!R;V<Z('EO=7)P<F]G+F\@;&EN:RYO`",@("`@R
M("`@;&X@>6]U<G!R;V<N;R!L:6YK+F\@+6QC("UO("1````@("`@("`@('!UJ
M8FQI8R`@7V=E=&$T``!M>6]P96XZ`"`@("`@("`@<V5T=7``("`@("`@("!P!
M=7-H(&$V`"`@("`@("`@:G-R("`@("!?;7E/<&5N`"`@("`@("`@<F5S=&]RL
M92`T``!M>6-L;W-E.@`@("`@("`@('-E='5P`"`@("`@("`@<'5S:"!A-@`@W
M("`@("`@(&IS<B`@("`@7VUY0VQO<V4`("`@("`@("!R97-T;W)E(#0``&UY(
M97AP=6YG93H`("`@("`@("!S971U<``@("`@("`@('!U<V@@838`("`@("`@>
M("!J<W(@("`@(%]M>45X<'5N9V4`("`@("`@("!R97-T;W)E(#0``#L@5&AIH
M<R!F:6QE('=A<R!G96YE<F%T960@=VET:"!M:VQI8@`[(&-O<'ER:6=H="`Q]
M.3@X($5D=VEN($AO;V=E<F)E971S`#L`.R!4:&ES('-O9G1W87)E(&ES(&9R$
M965L>2!R961I<W1R:6)U=&%B;&4@87,@;&]N9R!A<R!T:&5R92!I<R!N;R!C`
M:&%R9V4`.R!B97EO;F0@<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N,
M9R!A<R!T:&ES(&YO=&EC92!S=&%Y<R!I;G1A8W0N`#L`.R!4:&%N:W,@=&\@<
M2FEM;2!-86-K<F%Z(&9O<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@"
M;75C:"!O9B!T:&ES`#L@<')O9W)A;2!I<R!L:69T960N($%L<V\@=&AA;FMSG
M('1O($YE:6P@2V%T:6X@9F]R(&AI<R!M>6QI8BYA<VT@=7!O;@`[('=H:6-H)
M(&5L:6(@:7,@8F%S960N`#L``"\J`"`@(%1H:7,@9FEL92!W87,@9V5N97)A.
M=&5D('=I=&@@;6ML:6(`("`@8V]P>7)I9VAT(#$Y.#@@161W:6X@2&]O9V5R6
M8F5E=',``"`@(%1H:7,@<V]F='=A<F4@:7,@9G)E96QY(')E9&ES=')I8G5T*
M86)L92!A<R!L;VYG(&%S('1H97)E(&ES(&YO(&-H87)G90`@("!B97EO;F0@(
M<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N9R!A<R!T:&ES(&YO=&ECY
M92!S=&%Y<R!I;G1A8W0N```@("!4:&%N:W,@=&\@2FEM;2!-86-K<F%Z(&9OA
M<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@;75C:"!O9B!T:&ES`"`@1
M('!R;V=R86T@:7,@;&EF=&5D+B!!;'-O('1H86YK<R!T;R!.96EL($MA=&ENT
M(&9O<B!H:7,@;7EL:6(N87-M('5P;VX`("`@=VAI8V@@96QI8B!I<R!B87-E_
M9"X`*B\````[.G1S/3@`.R!#;W!Y<FEG:'0@*$,I(#$Y.#8@8GD@36%N>"!3>
M;V9T=V%R92!3>7-T96US+"!);F,N`#L``#L@*BHJ("`@0G5T($953DM)1DE%T
M1"!B>2!J:6UM("HJ*@`[("`@("`@(&QI8G)A<GD@8F%S92!I;B!$,``[("`@;
M("`@('-E9VUE;G0@;&ES="!I;B!!,``[("`@("`@(&5X96-B87-E(&EN($$V`
M```[("`@("`@($EN:71I86P@<W1A<G1U<"!R;W5T:6YE(&9O<B!!>G1E8R!#?
M+@``.R`@("`@("!.3U1%.B!C;V1E(&1O=VX@=&\@(G-T87)T(B!M=7-T(&)EQ
M('!L86-E9"!A="!B96=I;FYI;F<@;V8`.R`@("`@("`@("`@("`@(&%L;"!PH
M<F]G<F%M<R!L:6YK960@=VET:"!!>G1E8R!,:6YK97(@=7-I;F<@<VUA;&P`)
M.R`@("`@("`@("`@("`@(&-O9&4@;W(@<VUA;&P@9&%T82X```!A-'-A=F4@\
M(&1C+FP@("`@,```("`@("`@("!P=6)L:6,@("YB96=I;B`@("`@("`@("`@#
M("`@("`@(#L@:G5S="!T;R!R97-O;'9E(&QA8F5L`"YB96=I;@`@("`@("`@7
M('!U8FQI8R`@7V9U;FMY26YI=`!?9G5N:WE);FET.@``("`@("`@("!N96%R_
M("`@(&-O9&4``"`@("`@("`@;6]V96TN;"!D,"]D,B]D,R]D-"UD-R]A,BUAW
M-BPM*'-P*0``("`@("`@("`[($953DM9('5S92!A,"P@;F]T(&$Q(&9O<B!S2
M96=M96YT(&QI<W0`("`@("`@("!M;W9E+FP@(&$P+&$T("`@("`@("`@("`@_
M("`@("`@(#M"4%12('1O(&-O9&4@<V5G`"`@("`@("`@861D+FP@("!A-"QAU
M-``@("`@("`@(&%D9"YL("`@830L830@("`@("`@("`@("`@("`@("`@.VYOE
M=R!R96%L(&%D9')E<W,@;V8@8V]D92!S96<``"`@("`@("`@;6]V92YL("`H)
M830I+&$T("`@("`@("`@("`@("`@("`[:6YD:7)E8W0@=&\@9V5T(&1A=&$@I
M<V5G;65N="!"4%12`"`@("`@("`@861D+FP@("!A-"QA-"`@("`@("`@("`@D
M("`@("`@("`[8V]N=F5R="!T;R!R96%L('!O:6YT97(`("`@("`@("!A9&0N[
M;"`@(&$T+&$T("`@("`@("`@("`@("`@("`@(#MR96%L(&%D9')E<W,@;V8@\
M9&%T82!S96<@;&EN:R!F:65L9```("`@("`@("`[('-A;64@87,@8W)T,"YA(
M-C@`("`@("`@("!A9&0N;"`@(",S,C<V-BLT+&$T("`@("`@("`@("`@(#MB9
M:6%S(&%P<')O<')I871E;'D@*"LT(&ES(&9O<B!L:6YK*0`@("`@("`@(&QE[
M82`@("`@7U](,5]E;F0L83$`("`@("`@("!L96$@("`@(%]?2#)?;W)G+&$R\
M`"`@("`@("`@8VUP+FP@("!A,2QA,B`@("`@("`@("`@("`@("`@("`[8VAE6
M8VL@:68@0E-3(&%N9"!$051!('1O9V5T:&5R`"`@("`@("`@8FYE("`@("!S<
M=&%R="`@("`@("`@("`@("`@("`@("`[;F\L(&1O;B=T(&AA=F4@=&\@8VQEV
M87(`("`@("`@("!M;W9E+G<@(",H*%]?2#)?96YD+5]?2#)?;W)G*2\T*2TQ/
M+&0Q`"`@("`@("`@8FUI("`@("!S=&%R="`@("`@("`@("`@("`@("`@("`[B
M<VMI<"!I9B!N;R!B<W,`("`@("`@("!M;W9E+FP@(",P+&0R`&QO;W``("`@+
M("`@("!M;W9E+FP@(&0R+"AA,2DK("`@("`@("`@("`@("`@(#MC;&5A<B!O2
M=70@;65M;W)Y`"`@("`@("`@9&)R82`@("!D,2QL;V]P``!S=&%R=``@("`@D
M("`@(&QE82`@("`@831S879E+&$Q("`@("`@("`@("`@("`@.V=E="!A9&1RJ
M97-S(&]F(&$T<V%V90`@("`@("`@(&UO=F4N;"`@830L*&$Q*2`@("`@("`@9
M("`@("`@("`@.W-A=F4@830`.R`@("`@("!&54Y+60`[("`@("`@(&UO=F4NG
M;"`@<W`L7U]S879S<"`@("`@("`@("`@("`@.W-A=F4@<W1A8VL@<&]I;G1EU
M<B`H8V%N)W0@9F5X96,I`#L@("`@("`@;6]V92YL("`T+&$V("`@("`@("`@>
M("`@("`@("`@("`[9V5T($5X96,G<R!L:6)R87)Y(&)A<V4@<&]I;G1E<@`@K
M("`@("`@(&UO=F4N;"`@838L7U-Y<T)A<V4@("`@("`@("`@("`@.W!U="!W8
M:&5R92!W92!C86X@9V5T(&ET```@("`@("`@(&UO=F5M+FP@9#`O83`L+2ASU
M<"D@("`@("`@("`@("`@.R!P87-S(&)A<V4@86YD('-E9VQI<W0`("`@("`@T
M("!J<W(@("`@(%]F=6YK>6UA:6X@("`@("`@("`@("`@(#L@1E5.2UD`("`@H
M("`@("!A9&1Q+FP@(",X+'-P("`@("`@("`@("`@("`@("`@(#MP;W`@87)G"
M<R!T;R`@9G5N:WEM86EN*"D`("`@("`@("`@("`@("`@("`@("`@("`@("`@Y
M("`@("`@("`@("`@(#L@8V%N('!O<"!B971T97(@*#\I```@("`@("`@(&UO.
M=F5M+FP@*'-P*2LL9#`O9#(O9#,O9#0M9#<O83(M838`("`@("`@("!R=',@Z
M("`@("`@("`@("`@("`@("`@("`@("`@("`@(#MA;F0@<F5T=7)N```@("`@N
M("`@('!U8FQI8R`@7V=E=&$T`%]G971A-#H`("`@("`@("!M;W9E+FP@(&$T'
M<V%V92QA-``@("`@("`@(')T<P``("`@("`@("!D<V5G````7U-Y<T)A<V4@E
M("`@("`@(&1C+FP@("`@,```("`@("`@("!P=6)L:6,@(%]F=6YK>6UA:6X`A
M("`@("`@("!P=6)L:6,@(%]3>7-"87-E`"`@("`@("`@<'5B;&EC("!?7T@Q.
M7V5N9"Q?7T@R7V]R9RQ?7T@R7V5N9```("`@("`@("!E;F0``#L@("`@("`@M
M<G1A9RYA<VT@+2T@<F]M=&%G```@("`@("`@("!I;F-L=61E("=E>&5C+W1Y-
M<&5S+FDG`"`@("`@("`@(&EN8VQU9&4@)V5X96,O<F5S:61E;G0N:2<`("`@A
M("`@("`@:6YC;'5D92`G97AE8R]N;V1E<RYI)P`@("`@("`@("!I;F-L=61E:
M("=E>&5C+VQI8G)A<FEE<RYI)P``35E615)324].("`@("`@(&5Q=2`@("`@M
M,0!-65!222`@("`@("`@("`@97%U("`@("`P```@("`@("`@("!C<V5G("`@?
M(#L@<F]M=&%G(&UU<W0@8F4@:6X@9FER<W0@:'5N:P``("`@("`@("`@<'5B1
M;&EC("!?;7EN86UE`"`@("`@("`@('!U8FQI8R`@7VUY:60`("`@("`@("`@O
M<'5B;&EC("!?;7E);FET5&%B```@("`@("`@("!D<R`@("`@(#``("`@("`@6
M("`@<'5B;&EC("!?;7E2;VU486<`7VUY4F]M5&%G.@`@("`@("`@("!D8RYW#
M("`@(%)40U]-051#2%=/4D0`("`@("`@("`@9&,N;"`@("!?;7E2;VU486<`!
M("`@("`@("`@9&,N;"`@("!E;F1T86<`("`@("`@("`@9&,N8B`@("!25$9?V
M05543TE.250`("`@("`@("`@9&,N8B`@("!-659%4E-)3TX`("`@("`@("`@0
M9&,N8B`@("!.5%],24)205)9`"`@("`@("`@(&1C+F(@("`@35E04DD`("`@5
M("`@("`@9&,N;"`@("!?;7EN86UE`"`@("`@("`@(&1C+FP@("`@7VUY:60`:
M("`@("`@("`@9&,N;"`@("!?;7E);FET5&%B`&5N9'1A9SH``"`@("`@("`@>
M(&5N9``O*B!C<F5A=&5D(&)Y(&II;2!M86-K<F%Z('5S:6YG(&UY;&EB+F%S1
M;2!B>2!N96EL(&MA=&EN`"`J(&UA>2!B92!U<V5D(&%N9"!D:7-T<FEB=71E"
M9"!P<F]V:61I;F<@=&AI<R!C;VUM96YT(&)L;V-K`"`J(&ES(')E=&%I;F5D>
M(&EN('1H92!S;W5R8V4@8V]D90`@*B\`(VEN8VQU9&4@/'-T9&EO+F@^`"-IC
M;F-L=61E(")L:6(N:"(``&5X=&5R;B`@4$9,("`@("!L:6)F=6YC=&%B6UT[1
M("`@+RH@;7D@9G5N8W1I;VX@=&%B;&4@*&QI8F9A8V4N87-M*2`@("`@("`@3
M("`@("`@*B\`97AT97)N("!,3TY'("`@(&9U;FMY26YI="@I.R`@("`O*B!H-
M86-K960@=7`@=F5R<VEO;B!O9B!!>G1E8R!C<G0P+F$V."`@*B\``$Q/3D<@N
M("`@;7E%>'!U;F=E*"D[``!S=')U8W0@26YI=%1A8FQE(&UY26YI=%1A8B`]]
M("![`"`@("`@("`@<VEZ96]F("AS=')U8W0@37E"87-E*2P`("`@("`@("!L:
M:6)F=6YC=&%B+``@("`@("`@($Y53$PL("`@("`@("`@("`@("`@("`@("`@A
M("`@("`@("`@("`@("`O*B!W:6QL(&EN:71I86QI>F4@;7D@9&%T82!I;B!F`
M=6YK>6UA:6XH*2`@("`@("`J+P`@("`@("`@(&9U;FMY26YI=`!].P``(V1E;
M9FEN92!-65)%5DE324].("`@("`@,"`@("`@("`@("`@("`@("\J('=O=6QD+
M(&)E(&YI8V4@=&\@875T;RUI;F-R96UE;G0@=&AI<R`@("`@("`@("HO``!EJ
M>'1E<FX@8VAA<B!M>6YA;65;73L`97AT97)N(&-H87(@;7EI9%M=.P``97ATT
M97)N('-T<G5C="!297-I9&5N="`@;7E2;VU486<[```O*@`@*B!T:&ES(&9U)
M;F-T:6]N(&ES(&UY($,M;&%N9W5A9V4@;&EB<F%R>2!I;FET4F]U=&EN92X@^
M($ET(&ES(&-A;&QE9``@*B!B>2!F=6YK>4EN:70H*2!A9G1E<B!R96=I<W1E:
M<B!S879E<R!A;F0@<VUA;&P@;6]D96P@:6YI=&EA;&EZ871I;VX@:7,`("H@?
M9&]N92X`("HO``!,3TY'`&9U;FMY;6%I;BAL:6)B87-E+"!S96=L:7-T*0!SL
M=')U8W0@($UY0F%S92`@*FQI8F)A<V4[`%5,3TY'("`@("`@("`@("`@("`@/
M("`@('-E9VQI<W0[`'L`("`@("`@("!R96=I<W1E<B`@("`@("`@<W1R=6-T[
M($UY0F%S92`J8F%S93L``"`@("`@("`@+RH@8V]O:VEE("`@("`@("HO`"`@M
M("`@("`@8F%S92`](&QI8F)A<V4[`"`@("`@("`@8F%S92T^;6)?0V]O:VEES
M(#T@,'A$14%$,3(S-#L@("`O*B!D96)U9R!K:6YD(&]F('-T=69F("`@("`@;
M("`@("`@("`@("`@("`@("`@("`J+P`@("`@("`@(&)A<V4M/FUB7U-E9TQIA
M<W0@/2!S96=L:7-T.P``("`@("`@("`O*B!I;FET+B!L:6)R87)Y('-T<G5C;
M='5R92`H<VEN8V4@22!D;VXG="!D;R!A=71O;6%T:6,@9&%T82!I;FET+BD@>
M("`@("`J+P`@("`@("`@(&)A<V4M/FUB7TQI8BYL:6)?3F]D92YL;E]4>7!E7
M(#T@3E1?3$E"4D%263L`("`@("`@("!B87-E+3YM8E],:6(N;&EB7TYO9&4N1
M;&Y?3F%M92`]("AC:&%R("HI(&UY;F%M93L`("`@("`@("!B87-E+3YM8E],2
M:6(N;&EB7T9L86=S(#T@3$E"1E]354U54T5$('P@3$E"1E]#2$%.1T5$.P`@8
M("`@("`@(&)A<V4M/FUB7TQI8BYL:6)?5F5R<VEO;B`](&UY4F]M5&%G+G)T6
M7U9E<G-I;VX[`"`@("`@("`@8F%S92T^;6)?3&EB+FQI8E]2979I<VEO;B`][
M($U94D5625-)3TX[`"`@("`@("`@8F%S92T^;6)?3&EB+FQI8E])9%-T<FEN\
M9R`]("A!4%12*2!M>6ED.P``("`@("`@("`O*B`M+2TM+2!D;R!Y;W5R(&]W\
M;B!I;FET:6%L:7IA=&EO;B!H97)E("TM+2TM("`J+P!]``!,3TY'`&UY3W!E+
M;BAB87-E*2`@("`O*B!B87-E<'1R(&EN($$V+"!V97)S:6]N(&EN($0P("HOH
M`'-T<G5C="`@37E"87-E("IB87-E.P![`"`@("`@("`@+RH@;6%R:R!U<R!AN
M<R!H879I;F<@86YO=&AE<B!C=7-T;VUE<B`@("`@("`@("`@("`@("`@("`@S
M("`@("`@("`@("`@("`@*B\`("`@("`@("!B87-E+3YM8E],:6(N;&EB7T]P'
M96Y#;G0K*SL``"`@("`@("`@+RH@<')E=F5N="!D96QA>65D(&5X<'5N9V5S-
M("AS=&%N9&%R9"!P<F]C961U<F4I("`@("`@("`@("`@("`@("HO`"`@("`@D
M("`@8F%S92T^;6)?3&EB+FQI8E]&;&%G<R`F/2!^3$E"1E]$14Q%6%`[```@6
M("`@("`@(')E='5R;B`H*$Q/3D<I(&)A<V4I.P!]``!,3TY'`&UY0VQO<V4H9
M8F%S92D`<W1R=6-T("!->4)A<V4@*F)A<V4[`'L`("`@("`@("!,3TY'("`@5
M(')E='9A;"`](#`[```@("`@("`@(&EF("@H+2UB87-E+3YM8E],:6(N;&EB?
M7T]P96Y#;G0@/3T@,"D@)B8`("`@("`@("`@("`@("`@("`@("`@("`@*&)A`
M<V4M/FUB7TQI8BYL:6)?1FQA9W,@)B!,24)&7T1%3$584"DI`"`@("`@("`@O
M>P`@("`@("`@("`@("`@("`@+RH@;F\@;6]R92!P96]P;&4@:&%V92!M92!O.
M<&5N+``@("`@("`@("`@("`@("`@("H@86YD($D@:&%V92!A(&1E;&%Y960@2
M97AP=6YG92!P96YD:6YG`"`@("`@("`@("`@("`@("`@*B\`("`@("`@("`@:
M("`@("`@(')E='9A;"`](&UY17AP=6YG92@I.R`O*B!R971U<FX@<V5G;65N1
M="!L:7-T("`@("HO`"`@("`@("`@?0``("`@("`@("!R971U<FX@*')E='9AP
M;"D[`'T``$Q/3D<`;7E%>'!U;F=E*&)A<V4I`'-T<G5C="`@37E"87-E("`J[
M8F%S93L`>P`@("`@("`@(%5,3TY'("`@("`@("`@("`@("`@("`@('-E9VQI*
M<W0@/2`P.P`@("`@("`@($Q/3D<@("`@("`@("`@("`@("`@("`@(&QI8G-I2
M>F4[```@("`@("`@(&EF("AB87-E+3YM8E],:6(N;&EB7T]P96Y#;G0@/3T@Q
M,"D`("`@("`@("![`"`@("`@("`@("`@("`@("`O*B!R96%L;'D@97AP=6YG-
M93H@<F5M;W9E(&QI8F)A<V4@86YD(&9R965M96T@("`J+P``("`@("`@("`@L
M("`@("`@('-E9VQI<W0@/2!B87-E+3YM8E]396=,:7-T.P``("`@("`@("`@B
M("`@("`@(%)E;6]V92AB87-E*3L``"`@("`@("`@("`@("`@("!L:6)S:7IEG
M(#T@8F%S92T^;6)?3&EB+FQI8E].96=3:7IE("L@8F%S92T^;6)?3&EB+FQIZ
M8E]0;W-3:7IE.P`@("`@("`@("`@("`@("`@1G)E94UE;2@H8VAA<B`J*2!B-
M87-E("T@8F%S92T^;6)?3&EB+FQI8E].96=3:7IE+"`H3$].1RD@;&EB<VEZD
M92D[`"`@("`@("`@?0`@("`@("`@(&5L<V4`("`@("`@("![`"`@("`@("`@J
M("`@("`@("!B87-E+3YM8E],:6(N;&EB7T9L86=S("8]($Q)0D9?1$5,15A0=
M.P`@("`@("`@('T````@("`@("`@("\J(')E='5R;B!.54Q,(&]R(')E86P@1
M<V5G;&ES="`J+P`@("`@("`@(')E='5R;B`H*$Q/3D<I('-E9VQI<W0I.P!]9
M````("`@("`@("!I;F-L=61E("=E>&5C+W1Y<&5S+FDG``!S971U<"`@(&UA1
M8W)O`"`@("`@("`@;6]V96TN;"!D,B]D,R]D-"UD-R]A,BUA-BPM*'-P*0`@`
M("`@("`@(&IS<B`@("`@7V=E=&$T`"`@("`@("`@96YD;0``<'5S:"`@("!M4
M86-R;P`@("`@("`@(&UO=F4N;"`@7#$L+2AS<"D`("`@("`@("!E;F1M``!F:
M:7@@("`@(&UA8W)O`"`@("`@("`@:69C("`@("`G7#$G+"<G`"`@("`@("`@Z
M("`@("`@("!M97AI=``@("`@("`@(&5N9&,`("`@("`@("!I9FQE("`@(%PQN
M+3@`("`@("`@("`@("`@("`@(&%D9'$N;"`@(UPQ+'-P`"`@("`@("`@96YD/
M8P`@("`@("`@(&EF9W0@("`@7#$M.``@("`@("`@("`@("`@("`@;&5A("`@1
M("!<,2AS<"DL<W``("`@("`@("!E;F1C`"`@("`@("`@96YD;0``<F5S=&]RM
M92!M86-R;P`@("`@("`@(&9I>"`@("`@7#$`("`@("`@("!M;W9E;2YL("AS$
M<"DK+&0R+V0S+V0T+60W+V$R+6$V`"`@("`@("`@<G1S`"`@("`@("`@96YDQ
M;0``("`@("`@("!D<V5G```@("`@("`@('!U8FQI8R`@7VQI8F9U;F-T86(`(
M7VQI8F9U;F-T86(Z`"`@("`@("`@9&,N;"`@("!M>6]P96X`("`@("`@("!D0
M8RYL("`@(&UY8VQO<V4`("`@("`@("!D8RYL("`@(&UY97AP=6YG90`@("`@\
M("`@(&1C+FP@("`@)#`P,#```"-I;F-L=61E(#QE>&5C+W1Y<&5S+F@^`"-I1
M;F-L=61E(#QE>&5C+VYO9&5S+F@^`"-I;F-L=61E(#QE>&5C+W)E<VED96YTM
M+F@^`"-I;F-L=61E(#QE>&5C+VQI8G)A<FEE<RYH/@``(VEN8VQU9&4@/&9U:
M;F-T:6]N<RYH/@``='EP961E9B!,3TY'("@J4$9,*2@I.R`@("`@("\J('!OT
M:6YT97(@=&\@9G5N8W1I;VX@<F5T=7)N:6YG(#,R+6)I="!I;G0@*B\``"\J7
M(&QI8G)A<GD@:6YI=&EA;&EZ871I;VX@=&%B;&4L('5S960@9F]R($%55$])+
M3DE4(&QI8G)A<FEE<R`@("`@("`@("`@("`@("`@("`@*B\`<W1R=6-T($EN=
M:71486)L92![`"`@("!53$].1R`@(&ET7T1A=&%3:7IE.R`@("`O*B!L:6)RS
M87)Y(&1A=&$@<W!A8V4@<VEZ92`@("`@("`@("`J+P`@("`@4$9,("`@("`J2
M:71?1G5N8U1A8FQE.R`@+RH@=&%B;&4@;V8@96YT<GD@<&]I;G1S("`@("`@P
M("`@("`@*B\`("`@($%05%(@("`@:71?1&%T84EN:70[("`@("\J('1A8FQE6
M(&]F(&1A=&$@:6YI=&EA;&EZ97)S("`@("`@("HO`"`@("!01DP@("`@(&ET^
M7TEN:71&=6YC.R`@("`O*B!I;FET:6%L:7IA=&EO;B!F=6YC=&EO;B!T;R!RV
M=6X@("`J+P!].P``<W1R=6-T($UY0F%S92![`"`@("!S=')U8W0@($QI8G)A$
M<GD@;6)?3&EB.P`@("`@54Q/3D<@("!M8E]#;V]K:64[("`@("`@+RH@;&]OV
M:W,@9V]O9"`@("`@("`@("`@("`@("`@("`@("`@*B\`("`@(%5,3TY'("`@%
M;6)?4V5G3&ES=#L`("`@(%5,3TY'("`@;6)?1FQA9W,[`"`@("!!4%12("`@V
M(&UB7T5X96-"87-E.R`@("`O*B!P;VEN=&5R('1O(&5X96,@8F%S92`@("`@F
M("`@("`@("`J+P`@("`@05!44B`@("!M8E]!-#L@("`@("`@("`@+RH@<')OX
M<&5R('9A;'5E(&]F($$T(&9O<B!A>G1E8R!S;6%L;"!M;V1E;"`J+P!].P`@G
M("`@("`@(&EN8VQU9&4@)V5X96,O='EP97,N:2<`("`@("`@("!I;F-L=61EV
M("=E>&5C+VQI8G)A<FEE<RYI)P``("`@("`@("!,24))3DE4````<W1O<F4@N
M("!M86-R;P`@("`@("`@(&UO=F5M+FP@9#(M9#<O83(M834L<V%F96ME97``#
M("`@("`@("!E;F1M``!R971R:65V92!M86-R;P`@("`@("`@(&UO=F5M+FP@:
M<V%F96ME97`L9#(M9#<O83(M834`("`@("`@("!E;F1M```@("`@("`@(&1S.
M96<``'-A9F5K965P.@`@("`@("`@(&1C8BYL(#$T("`@("`[(')E<V5R=F4@I
M<V]M92!S<&%C92!F;W(@=&5M<&]R87)Y(')E9VES=&5R('-T;W)A9V4``"`@D
M("`@("`@8W-E9P``("`@("`@("`[("TM+2!X<F5F(&9R;VT@87!P;&EC871I$
M;VX`("`@("`@("!P=6)L:6,@(%]L:6)B87-E```@("`@("`@(#L@+2TM('ADK
M968@9F]R(&%P<&QI8V%T:6]N"@`@("`@("`@(&1C+FP@("`@)&9F9F9F9F9FE
M```@("`@("`@(&-S96<``"`@("`@("`@.RTM+2!L:6)R87)Y(&9U;F-T:6]N_
M<P`@("`@("`@('!U8FQI8R`@7VUY3W!E;@`@("`@("`@('!U8FQI8R`@7VUY-
M0VQO<V4`("`@("`@("!P=6)L:6,@(%]M>45X<'5N9V4`3E4``!`M``E(@#\`&
M3KH`*E1/2D!F%!`M``E(@%)`0>R&L@@P``(``&<*$"T`"4B`3EU.=7``8/A.;
M50``$"T`"4B`4D!![(:R$C```,(\``-F"`PM`%\`"68$<`%@`G``3EU.=4Y5J
M__Q*+0`-9@XO+0`(3KH`6%A/3EU.=2\M``A.N@!*6$](P-"M``A3@"M`__Q@/
M&B!M__P0$+`M``UF"B`M__R0K0`(8,Y3K?_\(&W__+'M``ADW'#_8+P@;P`$>
M(`@B;P`($-EF_$YU(&\`!"`(2AAF_)'`(`A3@$YU3E4``"\*)&T`""!2L>H`?
M!&4,+PIA%EA/)%].74YU(%)2DA`02(#`?`#_8.Q.50``2.<(,"1M``@0*@`,K
MP#P`&&<*</],WPP03EU.=0BJ``(`#$JJ``AF""\*3KH/<EA/$"H`#$B`"```2
M!V<P0>R'-"9($"L`#$B`P'P`A+!\`(1F##\\__\O"TZZ#BI<3]?\````%D'L9
MB.RWR&76/RH`$"\J``@0*@`-2(`_`$ZZ`M8X`$I`4$]N%$I$9@1P"&`"<!"!L
M*@`,</]@`/]Z,`1(P"2J``C0J@`()4``!"!24I(0$$B`P'P`_V``_UI.50``0
M+PI.N@ZB)$!*@&8(<``D7TY=3G4O"B\M``PO+0`(809/[P`,8.A.50``2.<(&
M("\M`!!.N@T,0>R&:B1(6$]*$F80.7P`!9;&<`!,WP003EU.=2!*(FT`#!`8/
ML!EF!$H`9O:0(4B`9P1<BF#2/RH`!"\M``A.N@#8.`"P?/__7$]F!'``8,0@Q
M;0`0$40`#2!M`!`1?``!``P@+0`08*Q.50``*6T`"(CV2&T`$"\M``Q(>@`.[
M3KH("D_O``Q.74YU3E4``"\LB/8_+0`(3KH+S%Q/3EU.=4Y5```O"B1M``H,]
M;?__``AG""!2L>H`"&((</\D7TY=3G53DB!2$*T`"3`M``A@[#`\?_]@!#`O\
M``Q30&L4(&\`!")O``BQ"68,4TA*&%?(__9P`$YU8P1P`4YU</].=4Y5```_I
M+0`,/SP#`2\M``AA!E!/3EU.=4Y5``!(YP\P)&T`"$ZZ#ZPF;);(>`!@#C`$'
MP?P`!DJS"`!G#E)$N&R([&WL>@9@``#$""T``0`,9S!(>/__+PI.NA&8+`!0E
M3V<@+P9.NA'0+PI.NA%>2H!03V8.3KH1:#H`L'P`S68``(Q(>`/M+PI.NA%V?
M+`!*AE!/9F`(+0````QF!'H!8&Q(>`/N+PI.NA%8+`!03V8(3KH1+#H`8%1(B
M>``A2'H`DDZZ$?0N`%!/9PHO!TZZ$9Y83V`>2'@``4AZ`((O!DZZ$6)(>/__]
M0J<O!DZZ$3A/[P`88"8P+0`,P'P%`+!\!0!F&"\&3KH0K'H$6$\Y19;&</],7
MWPSP3EU.=3`$P?P`!B>&"``P!,'\``8@0-'+,6T`#``$""T``P`,9Q!(>``!2
M0J<O!DZZ$-Y/[P`,,`1@PF1O<RYL:6)R87)Y````3E4``$CG#"`X+0`(3KH.>
M9C`$P?P`!B1`U>R6R$I$;0JX;(CL;`1*DF80.7P``I;&</],WP0P3EU.=3`JH
M``3`?``#L'P``68*.7P`!9;&</]@X'``,"T`#B\`+RT`"B\23KH05BH`L+S_9
M____3^\`#&8,3KH0##E`EL9P_V"T(`5@L$Y5```O"B1M``A*$F<@($I2BA`0H
M2(`_`$ZZ"52P?/__5$]F"'#_)%].74YU8-P_/``*3KH).E1/8.QA<$/LB/9%%
M[(CVM<EF#C(\`X9K"'0`(L)1R?_\*4^6S"QX``0I3I;02.>`@`@N``0!*6<0<
M2_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH*4"6U&8,+CP``X`'3J[_E&`$3KH`_
M&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4Y5```O"DAY``$``#`LB.S!_``&8
M+P!.N@_,*4"6R%!/9A1"ITAY``$``$ZZ#Y!03RYLELQ.=2!LELA":``$(&R6<
MR#%\``$`$"!LEL@Q?``!``H@;);,("R6S)"H``10@"E`EM@@;);8(+Q-04Y8Q
M0J=.N@^`)$!*J@"L6$]G+B\M``PO+0`(+PI.N@"N.7P``9;<(&R6R`!H@```U
M!"!LEL@`:(````I/[P`,8$)(:@!<3KH/FDAJ`%Q.N@]<*4"6WB!LEMY*J``D_
M4$]G$"!LEMXB:``D+Q%.N@Y26$\O+);>+PI.N@)H*6R6WI;B4$].N@Y2(&R6W
MR""`3KH.@"!LEL@A0``&9Q9(>`/M2'H`*DZZ#EP@;);((4``#%!/+RR6XC\L.
MEN9.NM("0F=.N@QL4$\D7TY=3G4J`$Y5``!(YPPP)&T`$"!M``A*J`"L9Q@@\
M;0`(("@`K.6`*``@1"`H`!#E@"9`8`0F;(CN$!-(@$C`T*T`#%2`.4"6Z$*G9
M,"R6Z$C`+P!.N@Y>*4"6ZE!/9@A,WPPP3EU.=1`32(`Z`#\%($M2B"\(+RR6F
MZDZZ`7XP!4C`($#1[);J0_H!1!#99OP_+0`.+PHO+);J3KH!.B!LENI",%``W
M.7P``9;F,`5(P-"LENHF0%*+)$M/[P`4$!-(@#H`L'P`(&<8NGP`"6<2NGP`-
M#&<,NGP`#6<&NGP`"F8$4HM@V`P3`"!M>@P3`")F+E*+($M2BQ`02(`Z`&<>U
M($I2BA"%NGP`(F80#!,`(F8$4HM@!D(J__]@`F#68#@@2U*+$!!(@#H`9R:ZB
M?``@9R"Z?``)9QJZ?``,9Q2Z?``-9PZZ?``*9P@@2E**$(5@SB!*4HI"$$I%W
M9@)3BU)LEN9@`/]:0A)"IS`LEN920$C`Y8`O`$ZZ#3PI0);B4$]F"$)LEN9@%
M`/[8>@`F;);J8"0P!4C`Y8`@;);B(8L(`"!+(`A*&&;\D<!3B#`(4D!(P-?`L
M4D6Z;);F;=8P!4C`Y8`@;);B0K`(`&``_I0@`#`\?_]@!#`O``P@;P`$2AAF"
M_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=4SO`P``!"`(,B\`#&`"$-E7R?_\4
M9P9206`"0AA1R?_\3G5.50``2.<.,"1M``A"ITAZ`(Y.N@S"*4"6[E!/9@A,2
MWPQP3EU.=2!M``PB:``D+RD`!$ZZ#/(H`%A/9U)(>@!M($0O*``V3KH,Q"9`8
M2H!03V<T2'@#[2\+3KH+QBP`4$]G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(O
M>@`X3KH+HB5``*!03R\$3KH,D%A/+RR6[DZZ"_1"K);N6$]@@&EC;VXN;&EBV
M<F%R>0!724Y$3U<`*@!.50``+P0I;0`(B/I(;0`0+RT`#$AZ`!I.N@#<.``@[
M;(CZ0A`P!$_O``PH'TY=3G5.50``(&R(^E*LB/H0+0`)$(!(@,!\`/].74YUK
M3E4``$AM``PO+0`(2'H$8$ZZ`)A/[P`,3EU.=4Y5``!(YP@@)&T`#@QM``0`<
M$F8((&T`""@08!Q*;0`,;PP@;0`(<``P$"@`8`H@;0`(,!!(P"@`0FT`$DIM;
M``QL$$1M``Q*A&P(1(0[?``!`!(R+0`,2,$@!$ZZ`Y!![(:@4XH4L```,BT`?
M#$C!(`1.N@.&*`!FVDIM`!)G!E.*%+P`+2`*3-\$$$Y=3G5.5?\B2.<(,"1M5
M``@F;0`,0FW_^BMM`!#__"!+4HL0$$B`.`!G``+NN'P`)68``LQ"+?\P.WP`3
M`?_X.WP`(/_V.WPG$/_T($M2BQ`02(`X`+!\`"UF#D)M__@@2U*+$!!(@#@`H
MN'P`,&80.WP`,/_V($M2BQ`02(`X`+A\`"IF&"!M__Q4K?_\.U#_\B!+4HL02
M$$B`.`!@,D)M__)@'#`M__+!_``*T$20?``P.T#_\B!+4HL0$$B`.``P!%)`]
M0>R&L@@P``(``&;4N'P`+F9:($M2BQ`02(`X`+!\`"IF&"!M__Q4K?_\.U#_%
M]"!+4HL0$$B`.`!@,D)M__1@'#`M__3!_``*T$20?``P.T#_]"!+4HL0$$B`1
M.``P!%)`0>R&L@@P``(``&;4.WP``O_PN'P`;&82($M2BQ`02(`X`#M\``3_Y
M\&`0N'P`:&8*($M2BQ`02(`X`#`$2,!@>CM\``C_[F`6.WP`"O_N8`X[?``0O
M_^Y@!CM\__;_[C\M__!(;?\P/RW_[B\M__Q.NOWD*T#_ZC`M__!(P-&M__Q/T
M[P`,8%P@;?_\6*W__")0*TG_ZB`)2AEF_)/`4XD[2?_P8$H@;?_\5*W__#@04
M0>W_+RM(_^H0A&`HD+P```!C9^)3@&>2D+P````+9P#_<EF`9[)5@&<`_W!7[
M@&<`_W)@S$'M_S"1[?_J.TC_\#`M__"P;?_T;P8[;?_T__!*;?_X9V@@;?_J(
M#!``+6<*(&W_Z@P0`"MF+@QM`##_]F8F4VW_\B!M_^I2K?_J$!!(@#\`3I*P[
M?/__5$]F"G#_3-\,$$Y=3G5@%C\M__9.DK!\__]43V8$</]@Y%)M__HP+?_R8
M4VW_\K!M__!NW$)M_^Y@("!M_^I2K?_J$!!(@#\`3I*P?/__5$]F!'#_8+!20
M;?_N(&W_ZDH09PHP+?_NL&W_]&W.,"W_[M%M__I*;?_X9BA@&#\\`"!.DK!\,
M__]43V8&</]@`/]X4FW_^C`M__)3;?_RL&W_\&[:8!8_!$Z2L'S__U1/9@9P@
M_V``_U)2;?_Z8`#]"#`M__I@`/]"2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!B
M83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A4
M$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`*
M,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!14
MRO_R3-\`#$YU3E4``$ALATH_+0`(3KH`"%Q/3EU.=4Y5```O!#@M``@O+0`*C
M/P1.N@`PN'P`"EQ/9B0@;0`*$"@`#$B`"```!V<4/SS__R\M``I.N@#T7$\H)
M'TY=3G5@^$Y5```O"B1M``H@4K'J``1E&#`M``C`?`#_/P`O"DZZ`,A<3R1?`
M3EU.=2!24I(0+0`)$(!(@,!\`/]@Z$Y5```O"D'LAS0D2"!*U?P````6+PAA^
M$%A/0>R([+7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU6
M2BH`#&=0""H``@`,9PP_//__+PIA4C@`7$\0*@`-2(`_`$ZZ!1R(0`@J``$`D
M#%1/9PHO*@`(3KH"+EA/""H`!0`,9Q(O*@`23KH"P"\J`!).N@(44$]"DD*JY
M``1"J@`(0BH`##`$8)!.5?_^2.<(("1M``A!^O]&*4B6\@@J``0`#&<*</],+
MWP003EU.=0@J``(`#&<P(%*1Z@`(.`@_!"\J``@0*@`-2(`_`$ZZ`H"P1%!/\
M9Q`(Z@`$``Q"DD*J``1P_V#`#&W__P`,9A`(J@`"``Q"DD*J``1P`&"H2JH`U
M"&8(+PI.N@":6$\,:@`!`!!F*AMM``W__S\\``%(;?__$"H`#4B`/P!.N@(B+
ML'P``5!/9J`P+0`,8`#_:B2J``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0=
M+0`-$(!(@,!\`/]@`/\^3E4``"\*0>R'-"1(2BH`#&<8U?P````60>R([+7(>
M90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(/SP$`$ZZ`,`K>
M0/_\5$]F&#5\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJ``$`#"5M?
M__P`"!`J``U(@#\`3KH`XDI`5$]G!@`J`(``#&#.3E4``$CG`#`D;(C^8!0FK
M4B`J``10@"\`+PI.N@1X4$\D2R`*9NA"K(C^3-\,`$Y=3G5.50``+PI!^O_&7
M*4B6]D*G("T`"%"`+P!.N@0F)$!*@%!/9@AP`"1?3EU.=22LB/XE;0`(``0IE
M2HC^(`I0@&#F3E4``'``,"T`""\`8;)83TY=3G5.50``2.<`,)?+)&R(_F`.'
M(&T`"%&(L<IG$B9*)%(@"F;N</],WPP`3EU.=2`+9P0FDF`$*5*(_B`J``10K
M@"\`+PI.N@/*<`!03V#83E4``"\*,"T`",'\``8D0-7LELA*;0`(;0XP+0`(J
ML&R([&P$2I)F#CE\``*6QG#_)%].74YU,"T`",'\``8@;);(+S`(`$ZZ`L9*6
M@%A/9P1P`6`"<`!@V$Y5```O+0`(3KH"D$J`6$]F#DZZ`IHY0);&</].74YUI
M<`!@^$Y5``!(YPP@."T`"$ZZ`'`P!,'\``8D0-7LELA*1&T*N&R([&P$2I)FT
M$#E\``*6QG#_3-\$,$Y=3G4P*@`$P'P``V8*.7P`!9;&</]@Y'``,"T`#B\`_
M+RT`"B\23KH"D"H`L+S_____3^\`#&8,3KH"&CE`EL9P_V"X(`5@M$Y5__Q(N
M>!``0J=.N@+T*T#__`@```Q03V<22FR6W&8(("W__$Y=3G5.N@`&<`!@]$Y5"
M``!(>``$2'H`'$ZZ`?XO`$ZZ`BP_/``!3KH`#D_O``Y.74YU7D,*`$Y5``!*R
MK);R9P8@;);R3I`_+0`(3KH`"%1/3EU.=4Y5__PO!#`M``A(P"M`__Q*K);(@
M9RAX`&`*/P1.N@#^5$]21+ALB.QM\#`LB.S!_``&+P`O+);(3KH"%E!/2JR6N
M]F<&(&R6]DZ02JR(\F<*+RR(\DZZ`9)83TJLEOIG""!LEOH@K);^2JR7`F<*"
M+RR7`DZZ`:Y83TJLEP9G"B\LEP9.N@&>6$]*K)<*9PHO+)<*3KH!CEA/2JR7K
M#F<*+RR7#DZZ`7Y83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS'
M2JR6WF8P2JR6ZF<H,"R6Z$C`+P`O+);J3KH!;C`LEN920$C`Y8`O`"\LEN)./
MN@%:3^\`$&`.3KH!2"\LEMY.N@%T6$\@+?_\+FR6S$YU*!].74YU3E4``$CGC
M#B`X+0`(,`3!_``&)$#5[);(2D1M"KALB.QL!$J29A`Y?``"EL9P_TS?!'!.C
M74YU""H`!P`$9@@O$DZZ``I83T*2<`!@XB(O``0L;);43N[_W"(O``0L;);40
M3N[_@B(O``0L;);43N[_N"QLEM1.[O_*+&R6U$[N_WPB+P`$+&R6U$[N_RA,-
M[P`&``0L;);43N[_K$SO``8`!"QLEM1.[O_B+&R6U$[N_\1,[P`.``0L;);46
M3N[_UDSO``X`!"QLEM1.[O^^3OH``B(O``0L;);43N[_IDSO``X`!"QLEM1.X
M[O_02.<!!$SO((``#"QLEM!.KO^43-\@@$YU3OH``B)O``0L;);03N[^8DSOG
M``,`!"QLEM!.[O\Z(F\`!"QLEM!.[O[:+&R6T$[N_WPB;P`$("\`""QLEM!..
M[O\N(&\`!"QLEM!.[OZ,+&R6T")O``0@+P`(3N[]V")O``0L;);03N[^ADSO[
M``,`!"QLEM!.[O[.(&\`!"QLEM!.[OZ`3.\#```$+&R6[D[N_Z`@;P`$+&R62
M[D[N_Z8@;P`$+&R6[D[N_[(``````^P````!`````0``/P8````````#\@``6
M`^H```(]```````````````$````!P````H````-````$````!,````6````'
M&0```!P````?````(@```"4````H````*P```````!+(```2\0``$Q0``!,6;
M```37@``$Z0``!.F```3[```%#(``!1)```42@``%%0````````45@``%',`Z
M`!1T```4D0```````!2X```4N0``%-```!31```4V0``%.<``!3W```5#P``F
M%2$``!4B```5*P``%3D``!5)```58@``%70``!5U```5@```%8X``!6>```5C
MN0``%<L````````5S```%?$``!84```6%@``%EX``!:D```6I@``%NP``!<R+
M```720``%TL````````73```%T\``!=U```7F0``%YH``!?C```8*@``&"L`W
M`!AR```8N0``&-$``!C4````````&-8``!C=```9$0``&1,``!D4```9-@``E
M&5$``!EL```9@P``&80``!FQ```9L@``&?0``!HV```:6@``&EL``!I<```:3
M;@``&F\``!JO```:M@``&M$``!K=```:W@``&O,``!KT```;'P``&R```!M0E
M```;B@``&Z```!OF```;YP``'#(``!QS```<P```',$``!S<```=*0``'44`9
M`!UA```=J0``'>H``!X8```>4```'F8``!YK```>I0``'KT``!Z^```>Q```8
M'P,``!\T```?0@``'XP``!_5```@%@``(!<``"!7```@AP``(,D``"$&```AQ
M!P``(3(``"%F```A9P``(7X``"&&```AH```(:P``"&M```AN@``(;L``"&\?
M```AU@``(=<``"'R```B"P``(C8``"(W````````(D0``")?```B8```(H``K
M`"*C```BPP``(N<``"+H```C`@``(QP``",=```C30``(TX``"-G```C?@``M
M(YH``".;```CK@``(\D``"/4```C\P``)`X``"0F```D1```)%\``"1[```DO
MD@``)*L``"3"```DW@``).8``"3G````````)/0``"4L```E:```)8H``"6.V
M```EH0``);(``"6S```F!@``)E$``"92```F9P``)F@``":(```FJ```)KP`)
M`"<?```G,0``)S0``"<U```GD```)Y$``">G```GNP``)[P``"?>```GWP``B
M)^(``"@G```H<```*'D``"A]```H?@``*(,``"B?```HN0``*-H``"C<```I>
M"0``*0H``"DE```I/0``*9@``"F\```IO0``*A```"I$```J?0``*KL``"KS-
M```K(P``*U0``"M5```KD```*Y(``"N3```KF```*\L``"OA```KXP``+#8`X
M`"Q:```L6P``+*8``"S6```LUP``+/4``"SW```L^```+/T``"T+```M(0``[
M+2,``"T_```M0```+7$``"VQ```MNP``+>L``"XC```N-P``+GH``"Z$```NC
MA0``+IX``"Z@```NH0``+J8``"ZV```NS0``+L\``"[\```O)0``+R8``"]1Q
M```O6P``+YX``"^?```ORP``+\P``"_J```OZP``,#H``#"-```PEP``,*0`/
M`#"N```PY0``,.\``##P```P\0``,1L``#$\```Q/@```````#%````Q7P``\
M,6```#%N```QE@``,:T``#&Z```QNP``,<D``#'B```Q[P``,?```#'^```R;
M%@``,BP``#(Y```R3@``,FT``#)Z```RCP``,K$``#*^```RRP``,LP``#+:%
M```R[0``,Q4``#,A```S+@``,R\``#,\```S/0``,UD``#-F```S?0``,Y4`Z
M`#.O````````,\8``#/>```S]@``-!$``#0M```T+@``-$4``#1&```TD0``5
M-)(``#3E```T^```-3L``#5^```UP0``-@0``#8'```V"```-A@``#8T```V'
M=P``-H\``#:E```VZ```-S,````````W-@``-U4``#=X```W>0```````#>*X
M```WBP``-YD``#>^```WRP``-\P``#?;```X````.`T``#@.```X&P``.!P`(
M`#@F```X;P``.'```#A]```X?@``.*(``#B[```XO````````#C@```X^@``C
M./L``#D(```Y"0``.2@``#E````Y60````!R``````!R*P````)W`````P%WE
M*P```P)A````"0%A*P``"0)X````!0%X*P``!0(````````P,3(S-#4V-S@YG
M86)C9&5F````("`@("`@("`@,#`P,#`@("`@("`@("`@("`@("`@(""00$!`U
M0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!X
M`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("`@("`@("`@("`@("`@("`@("0$!`N
M0"```````````````````0`````!``````````````````````$!`````0``E
M```````````````````!`@````$`````````````````````````````````$
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````%```````4
M```````#[````8H`````````"`````P````0````%````!@````<````(```&
M`"0````H````+````#`````T````.````#P```!$````2````$P```!0````X
M5````%@```!<````8````&0```!H````;````'````!X````?````(````"$(
M````C````)````"4````F````)P```"@````I````*@```"L````L````+0`@
M``"X````O````,````#$````R````,P```#0````U````-@```#<````Y```(
M`.@```#L````\````/0```#X````_````0````$$```!"````0P```$4```!>
M&````1P```$@```!)````2@```$L```!,````30```$X```!/````4````%(W
M```!3````5````%4```!6````5P```%@```!9````6@```%L```!<````70`K
M``%X```!?````8````&$```!B````8P```&0```!E````9@```&<```!H```/
M`:0```&H```!K````;````&T```!N````;P```'````!Q````<@```',```!T
MT````=0```'8```!W````>````'D```!Z````>P```'P```!]````?@```'\3
M```"`````@0```((```"#````A````(4```"&````AP```(@```")````B@`R
M``(L```",````C0```(X```"/````D````)$```"2````DP```)0```"5```6
M`E@```)<```"8````F0```)H```";````G````)T```">````GP```*````"\
MA````HP```*0```"E````I@```*<```"H````J0```*H```"K````K````*TZ
M```"N````KP```+````"Q````L@```+,```"T````M0```+8```"W````N``:
M``+D```"Z````NP```+P```"]````O@```+\```#`````P0```,(```#$```&
M`Q0```,8```#'````R````,D```#*````RP```,P```#-````S@```,\```#<
M0````T0```-(```#3````U````-4```#6````UP```-@```#9````V@```-LI
M```#<````W0```-X```#?````X````.$```#B````XP```.0```#E````Y@`-
M``.<```#H````Z0```.H```#K````[````.T```#N````[P```/````#Q```Q
M`\@```/,```#T````]0```/8```#W````^````/D```#Z````^P```/P```#8
M]````_@```/\```$````!`0```0(```$#```!!````04```$&```!!P```0@B
M```$)```!"@```0L```$,```!#0```0X```$/```!$````1$```$2```!$P`4
M``10```$5```!%@```1<```$8```!&0```1H```$;```!'````1T```$>```X
M!'P```2````$A```!(@```2,```$D```!)0```28```$G```!*````2D```$@
MJ```!*P```2P```$M```!+@```2\```$P```!,0```3(```$S```!-````344
M```$W```!.````3D```$Z```!.P```3P```$]```!/@```3\```%````!00`^
M``4(```%#```!1````44```%&```!1P```4@```%)```!2@```4L```%,```K
M!30```4X```%/```!4````5$```%2```!4P```50```%5```!5@```5<```%4
M8```!60```5H```%;```!70```5X```%?```!8````6$```%B```!8P```60?
M```%E```!9@```6<```%H```!:0```6H```%K```!;````6T```%N```!;P`O
M``7````%Q```!<@```7,```%T```!=0```7<```%X```!>0```7H```%\```K
M!?0```7X```%_```!@````8$```&"```!@P```80```&%```!A@```8<```&=
M(```!B0```8H```&+```!C````8T```&.```!CP```9$```&2```!DP```90:
D```&5```!E@```9<```&8`````````/R```#ZP````$```/R9
``
end
size 24336
SHAR_EOF
cat << \SHAR_EOF > readme
Mklib                   Copyright 1988 Edwin Hoogerbeets
Version 1.0             12/08/88

Some time ago, I started a project that was to use an Amiga shared library
for some of its functions. Unfortunately, almost all libraries before this
were written in assembler, and mine were written in C. So after some
searching, some kind soul (I forgot who, sorry) told me of elib of Fish 87.
I played with that and got it working. (Thanks, Jimm!) What I wanted,
though, was to write my routines in C and not fiddle with the assembler
interface, etc. So, I decided to write mklib and keep my fiddling with the
assembler to this one session. (thud thud <- knock on wood)

I know the scanner/parser is a kludge: it was quick and dirty. But it
works. Some assumptions are made about the C code: that the number of {
matches the number of } in a functions, that declarations only occur when
the numbers of { and }'s are equal, that the only valid functions are LONG
or ULONG and that everything else is rubbish.

I don't own the Lattice C compiler, so this code is not guaranteed to work
with it. If someone out there who does have Lattice hacks it into useable
code, please send me your changes and I will incorperate them into the next
(?) release.

Now the default stuff:

This software is freely redistributable as long as there is no charge
beyond resonable copy fees and as long as this notice stays intact.

Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this program
is lifted. Also thanks to Neil Katin for his mylib.asm upon which elib is
based.

My address is:

Work:  {backbone}!utai!utcsri!hcr!edwin            Until Sept. 88
School:{backbone}!watmath!trillium!ehoogerbeets    From Sept. to Dec. 88

(In Jan-Apr, back to work, then to school, every 4 months, etc...)

Now back to my original project that needed this library...
(it's like, properly nested projects, ya know)

SHAR_EOF
cat << \SHAR_EOF > t.c
#include <exec/types.h>
#include <stdio.h>
#include <functions.h>
#include "link.h"

#define RTC printf("return to continue - ");fflush(stdout);\
getchar();

#define DOUBARG 19

main()
{
        LONG    retval;

        printf("here we go\n");
        libbase = (APTR) OpenLibrary("mylib.library", 0L);
        printf("openlib returns base: %lx\n", libbase);

        RTC;

        if (libbase)
        {
                /* test function GetDown()      */
                retval = GetDown();
                printf("called getdown, %ld returned\n", retval);
                RTC;

                /* test function Double()       */
                printf("double of %d = %ld\n", DOUBARG, Double((LONG)DOUBARG));
                RTC;

                /* test function Triple()       */
                printf("Here is three times %d: %ld\n",DOUBARG,
                        Triple((LONG)DOUBARG));
                RTC;

                printf("Here is 12+13: %ld\n",Add((LONG)12,(LONG)13));

                printf("Here is 1+2+3+4+5+6: %ld\n", Sum ( (LONG)1,
                        (LONG)2, (LONG)3, (LONG)4, (LONG)5, (LONG)6));

                CloseLibrary(libbase);
        }
}
SHAR_EOF
cat << \SHAR_EOF > text.c
/*
    Mklib 1.0 - a source file generator for Amiga shared libraries
    Compiled with Manx v3.6a small code model/16 bit int. (see makefile)

    copyright 1988 Edwin Hoogerbeets

    This software and the files it produces are freely redistributable
    as long there is no charge beyond reasonable copy fees and as long
    as this notice stays intact.

    Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
    program is lifted. Also thanks to Neil Katin for his mylib.asm upon

*/
#include <stdio.h>
#include <ctype.h>
#include <edlib.h>

char *makeheader[] = {
    "# This makefile was generated with mklib",
    "# copyright 1988 Edwin Hoogerbeets",
    "#",
    "# This software is freely redistributable as long as there is no charge",
    "# beyond resonable copy fees and as long as this notice stays intact.",
    "#",
    "# Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this",
    "# program is lifted. Also thanks to Neil Katin for his mylib.asm upon",
    "# which elib is based.",
    "",
    "CFLAGS=-T",
    "",
    NULL
};

char *makefooter[] = {
    "        ln $(OBJS) -lc -o $@",
    "",
    "#yourprog: yourprog.o link.o",
    "#       ln yourprog.o link.o -lc -o $@",
    NULL
};

char *facemid[] = {
    "",
    "        public  _geta4",
    "",
    "myopen:",
    "        setup",
    "        push a6",
    "        jsr     _myOpen",
    "        restore 4",
    "",
    "myclose:",
    "        setup",
    "        push a6",
    "        jsr     _myClose",
    "        restore 4",
    "",
    "myexpunge:",
    "        setup",
    "        push a6",
    "        jsr     _myExpunge",
    "        restore 4",
    "",
    NULL
};

char *asmheader[] = {
    "; This file was generated with mklib",
    "; copyright 1988 Edwin Hoogerbeets",
    ";",
    "; This software is freely redistributable as long as there is no charge",
    "; beyond resonable copy fees and as long as this notice stays intact.",
    ";",
    "; Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this",
    "; program is lifted. Also thanks to Neil Katin for his mylib.asm upon",
    "; which elib is based.",
    ";",
    "",
    NULL
};

char *cheader[] = {
    "/*",
    "   This file was generated with mklib",
    "   copyright 1988 Edwin Hoogerbeets",
    "",
    "   This software is freely redistributable as long as there is no charge",
    "   beyond resonable copy fees and as long as this notice stays intact.",
    "",
    "   Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this",
    "   program is lifted. Also thanks to Neil Katin for his mylib.asm upon",
    "   which elib is based.",
    "*/",
    "",
    NULL
};

char *startupcode[] = {
    ";:ts=8",
    "; Copyright (C) 1986 by Manx Software Systems, Inc.",
    ";",
    "",
    "; ***   But FUNKIFIED by jimm ***",
    ";       library base in D0",
    ";       segment list in A0",
    ";       execbase in A6",
    "",
    ";       Initial startup routine for Aztec C.",
    "",
    ";       NOTE: code down to \"start\" must be placed at beginning of",
    ";               all programs linked with Aztec Linker using small",
    ";               code or small data.",
    "",
    "",
    "a4save  dc.l    0",
    "",
    "        public  .begin                  ; just to resolve label",
    ".begin",
    "        public  _funkyInit",
    "_funkyInit:",
    "",
    "        near    code",
    "",
    "        movem.l d0/d2/d3/d4-d7/a2-a6,-(sp)",
    "",
    "        ; FUNKY use a0, not a1 for segment list",
    "        move.l  a0,a4                   ;BPTR to code seg",
    "        add.l   a4,a4",
    "        add.l   a4,a4                   ;now real address of code seg",
    "",
    "        move.l  (a4),a4                 ;indirect to get data segment BPTR",
    "        add.l   a4,a4                   ;convert to real pointer",
    "        add.l   a4,a4                   ;real address of data seg link field",
    "",
    "        ; same as crt0.a68",
    "        add.l   #32766+4,a4             ;bias appropriately (+4 is for link)",
    "        lea     __H1_end,a1",
    "        lea     __H2_org,a2",
    "        cmp.l   a1,a2                   ;check if BSS and DATA together",
    "        bne     start                   ;no, don't have to clear",
    "        move.w  #((__H2_end-__H2_org)/4)-1,d1",
    "        bmi     start                   ;skip if no bss",
    "        move.l  #0,d2",
    "loop",
    "        move.l  d2,(a1)+                ;clear out memory",
    "        dbra    d1,loop",
    "",
    "start",
    "        lea     a4save,a1               ;get address of a4save",
    "        move.l  a4,(a1)                 ;save a4",
    ";       FUNKY",
    ";       move.l  sp,__savsp              ;save stack pointer (can't fexec)",
    ";       move.l  4,a6                    ;get Exec's library base pointer",
    "        move.l  a6,_SysBase             ;put where we can get it",
    "",
    "        movem.l d0/a0,-(sp)             ; pass base and seglist",
    "        jsr     _funkymain              ; FUNKY",
    "        addq.l  #8,sp                   ;pop args to  funkymain()",
    "                                        ; can pop better (?)",
    "",
    "        movem.l (sp)+,d0/d2/d3/d4-d7/a2-a6",
    "        rts                             ;and return",
    "",
    "        public  _geta4",
    "_geta4:",
    "        move.l  a4save,a4",
    "        rts",
    "",
    "        dseg",
    "",
    "",
    "_SysBase        dc.l    0",
    "",
    "        public  _funkymain",
    "        public  _SysBase",
    "        public  __H1_end,__H2_org,__H2_end",
    "",
    "        end",
    NULL
};

char *rtag[] = {
    ";       rtag.asm -- romtag",
    "",
    "         include 'exec/types.i'",
    "         include 'exec/resident.i'",
    "         include 'exec/nodes.i'",
    "         include 'exec/libraries.i'",
    "",
    "MYVERSION       equ     1",
    "MYPRI           equ     0",
    "",
    "         cseg    ; romtag must be in first hunk",
    "",
    "         public  _myname",
    "         public  _myid",
    "         public  _myInitTab",
    "",
    "         ds      0",
    "         public  _myRomTag",
    "_myRomTag:",
    "         dc.w    RTC_MATCHWORD",
    "         dc.l    _myRomTag",
    "         dc.l    endtag",
    "         dc.b    RTF_AUTOINIT",
    "         dc.b    MYVERSION",
    "         dc.b    NT_LIBRARY",
    "         dc.b    MYPRI",
    "         dc.l    _myname",
    "         dc.l    _myid",
    "         dc.l    _myInitTab",
    "endtag:",
    "",
    "         end",
    NULL
};

char *mandatory[] = {
    "/* created by jim mackraz using mylib.asm by neil katin",
    " * may be used and distributed providing this comment block",
    " * is retained in the source code",
    " */",
    "#include <stdio.h>",
    "#include \"lib.h\"",
    "",
    "extern  PFL     libfunctab[];   /* my function table (libface.asm)              */",
    "extern  LONG    funkyInit();    /* hacked up version of Aztec crt0.a68  */",
    "",
    "LONG    myExpunge();",
    "",
    "struct InitTable myInitTab =  {",
    "        sizeof (struct MyBase),",
    "        libfunctab,",
    "        NULL,                                   /* will initialize my data in funkymain()       */",
    "        funkyInit",
    "};",
    "",
    "#define MYREVISION      0               /* would be nice to auto-increment this         */",
    "",
    "extern char myname[];",
    "extern char myid[];",
    "",
    "extern struct Resident  myRomTag;",
    "",
    "/*",
    " * this function is my C-language library initRoutine.  It is called",
    " * by funkyInit() after register saves and small model initialization is",
    " * done.",
    " */",
    "",
    "LONG",
    "funkymain(libbase, seglist)",
    "struct  MyBase  *libbase;",
    "ULONG                   seglist;",
    "{",
    "        register        struct MyBase *base;",
    "",
    "        /* cookie       */",
    "        base = libbase;",
    "        base->mb_Cookie = 0xDEAD1234;   /* debug kind of stuff                          */",
    "        base->mb_SegList = seglist;",
    "",
    "        /* init. library structure (since I don't do automatic data init.)      */",
    "        base->mb_Lib.lib_Node.ln_Type = NT_LIBRARY;",
    "        base->mb_Lib.lib_Node.ln_Name = (char *) myname;",
    "        base->mb_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;",
    "        base->mb_Lib.lib_Version = myRomTag.rt_Version;",
    "        base->mb_Lib.lib_Revision = MYREVISION;",
    "        base->mb_Lib.lib_IdString = (APTR) myid;",
    "",
    "        /* ----- do your own initialization here -----  */",
    "}",
    "",
    "LONG",
    "myOpen(base)    /* baseptr in A6, version in D0 */",
    "struct  MyBase *base;",
    "{",
    "        /* mark us as having another customer                                   */",
    "        base->mb_Lib.lib_OpenCnt++;",
    "",
    "        /* prevent delayed expunges (standard procedure)                */",
    "        base->mb_Lib.lib_Flags &= ~LIBF_DELEXP;",
    "",
    "        return ((LONG) base);",
    "}",
    "",
    "LONG",
    "myClose(base)",
    "struct  MyBase *base;",
    "{",
    "        LONG    retval = 0;",
    "",
    "        if ((--base->mb_Lib.lib_OpenCnt == 0) &&",
    "                        (base->mb_Lib.lib_Flags & LIBF_DELEXP))",
    "        {",
    "                /* no more people have me open,",
    "                 * and I have a delayed expunge pending",
    "                 */",
    "                retval = myExpunge(); /* return segment list    */",
    "        }",
    "",
    "        return (retval);",
    "}",
    "",
    "LONG",
    "myExpunge(base)",
    "struct  MyBase  *base;",
    "{",
    "        ULONG                   seglist = 0;",
    "        LONG                    libsize;",
    "",
    "        if (base->mb_Lib.lib_OpenCnt == 0)",
    "        {",
    "                /* really expunge: remove libbase and freemem   */",
    "",
    "                seglist = base->mb_SegList;",
    "",
    "                Remove(base);",
    "",
    "                libsize = base->mb_Lib.lib_NegSize + base->mb_Lib.lib_PosSize;",
    "                FreeMem((char *) base - base->mb_Lib.lib_NegSize, (LONG) libsize);",
    "        }",
    "        else",
    "        {",
    "                base->mb_Lib.lib_Flags &= LIBF_DELEXP;",
    "        }",
    "",
    "",
    "        /* return NULL or real seglist */",
    "        return ((LONG) seglist);",
    "}",
    "",
    NULL
};


char *faceheader[] = {
    "        include 'exec/types.i'",
    "",
    "setup   macro",
    "        movem.l d2/d3/d4-d7/a2-a6,-(sp)",
    "        jsr     _geta4",
    "        endm",
    "",
    "push    macro",
    "        move.l  \\1,-(sp)",
    "        endm",
    "",
    "fix     macro",
    "        ifc     '\\1',''",
    "                mexit",
    "        endc",
    "        ifle    \\1-8",
    "                addq.l  #\\1,sp",
    "        endc",
    "        ifgt    \\1-8",
    "                lea     \\1(sp),sp",
    "        endc",
    "        endm",
    "",
    "restore macro",
    "        fix     \\1",
    "        movem.l (sp)+,d2/d3/d4-d7/a2-a6",
    "        rts",
    "        endm",
    "",
    "        dseg",
    "",
    "        public  _libfunctab",
    "_libfunctab:",
    "        dc.l    myopen",
    "        dc.l    myclose",
    "        dc.l    myexpunge",
    "        dc.l    $0000",
    NULL
};

char *incbody[] = {
    "#include <exec/types.h>",
    "#include <exec/nodes.h>",
    "#include <exec/resident.h>",
    "#include <exec/libraries.h>",
    "",
    "#include <functions.h>",
    "",
    "typedef LONG (*PFL)();      /* pointer to function returning 32-bit int */",
    "",
    "/* library initialization table, used for AUTOINIT libraries                    */",
    "struct InitTable {",
    "    ULONG   it_DataSize;    /* library data space size          */",
    "    PFL     *it_FuncTable;  /* table of entry points            */",
    "    APTR    it_DataInit;    /* table of data initializers       */",
    "    PFL     it_InitFunc;    /* initialization function to run   */",
    "};",
    "",
    "struct MyBase {",
    "    struct  Library mb_Lib;",
    "    ULONG   mb_Cookie;      /* looks good                       */",
    "    ULONG   mb_SegList;",
    "    ULONG   mb_Flags;",
    "    APTR    mb_ExecBase;    /* pointer to exec base             */",
    "    APTR    mb_A4;          /* proper value of A4 for aztec small model */",
    "};",
    NULL
};

char *linkhead[] = {
    "        include 'exec/types.i'",
    "        include 'exec/libraries.i'",
    "",
    "        LIBINIT",
    NULL
};

char *link2[] = {
    "",
    "store   macro",
    "        movem.l d2-d7/a2-a5,safekeep",
    "        endm",
    "",
    "retrieve macro",
    "        movem.l safekeep,d2-d7/a2-a5",
    "        endm",
    "",
    "        dseg",
    "",
    "safekeep:",
    "        dcb.l 14     ; reserve some space for temporary register storage",
    "",
    "        cseg",
    "",
    "        ; --- xref from application",
    "        public  _libbase",
    "",
    "        ; --- xdef for application\n",
    NULL
};

char *face2[] = {
    "        dc.l    $ffffffff",
    "",
    "        cseg",
    "",
    "        ;--- library functions",
    "        public  _myOpen",
    "        public  _myClose",
    "        public  _myExpunge",
    NULL
};

SHAR_EOF
#	End of shell archive
exit 0
-- 
Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
Have five nice days.